ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.12.2025
Просмотров: 3235
Скачиваний: 1
{
/ / П р и г л а ш е н и е д л я в в о д а и н ф о р м а ц и и . Е д и н и ц а / / п р и б а в л я е т с я в с в я з и с т е м , ч т о и н д е к с а ц и я / / м а с с и в о в в С # н а ч и н а е т с я с н у л я
C o n s o l e . W r i t e ( " В в е д и т е и м я с т у д е н т а " + ( i + 1) + " : " ) ;
s t r i n g s N a m e = C o n s o l e . R e a d L i n e О ;
C o n s o l e . W r i t e ( " В в е д и т е с р е д н и й б а л л с т у д е н т а : " ) ; s t r i n g s A v g = C o n s o l e . R e a d L i n e О ;
d o u b l e dGPA = C o n v e r t . T o D o u b l e ( s A v g ) ;
/ / С о з д а е м о б ъ е к т |
н а о с н о в е в в е д е н н о й и н ф о р м а ц и и |
|
S t u d e n t t h i s S t u d e n t = n e w S t u d e n t ( ) ; |
||
t h i s S t u d e n t . s N a m e |
= |
s N a m e ; |
t h i s S t u d e n t . d G P A |
= |
d G P A ; |
/ / Д о б а в л я е м с о з д а н н ы й о б ъ е к т в м а с с и в
s t u d e n t s [ i ] = t h i s S t u d e n t ;
}
/ / У с р е д н я е м у с п е в а е м о с т ь с т у д е н т о в d o u b l e d S u m = 0 . 0 ;
f o r ( i n t i = 0 ; i < s t u d e n t s . L e n g t h ; i + + )
{
d S u m + = s t u d e n t s [ i ] . d G P A ;
}
d o u b l e d A v g = d S u m / s t u d e n t s . L e n g t h ;
/ / В ы в о д и м в ы ч и с л е н н о е з н а ч е н и е C o n s o l e . W r i t e L i n e ( ) ;
C o n s o l e . W r i t e L i n e ( " С р е д н я я у с п е в а е м о с т ь п о "
+s t u d e n t s . L e n g t h
+ " с т у д е н т а м - " + d A v g ) ;
/ / О ж и д а е м п о д т в е р ж д е н и я п о л ь з о в а т е л я
C o n s o l e . W r i t e L i n e ( " Н а ж м и т е < E n t e r > д л я " +
" з а в е р ш е н и я п р о г р а м м ы . . . " ) ;
C o n s o l e . R e a d ( ) ;
}
}
}
П р о г р а м ма предлагает пользователю ввести количество рассматриваемых студен после чего создает массив соответствующего размера, элементами которого являю ссылки н а объекты типа S t u d e n t .
После этого программа входит в цикл f o r , в котором происходит заполнение масс ва. Пользователю предлагается ввести имя каждого студента и его средний балл — данные используются для создания объекта S t u d e n t .
П о с л е заполнения массива программа входит во второй цикл, в котором усредняй] ся успеваемость студентов, а после вычислений полученный средний балл выводите] на экран .
132 |
Часть III. Объектно-основанное программирована |
Вот как выглядит типичный результат работы программы:
Введите |
к о л и ч е с т в о с т у д е н т о в |
|
|||
3 |
|
|
|
|
|
Введите |
и м я с т у д е н т а |
1 : R a n d y |
|
||
Введите |
с р е д н и й |
б а л л |
с т у д е н т а : |
3 . 0 |
|
Введите |
и м я с т у д е н т а |
2 : |
J e f f |
|
|
Введите |
с р е д н и й |
б а л л |
с т у д е н т а : |
3 . 5 |
|
Введите |
и м я с т у д е н т а |
3 : C a r r i e |
|
||
Введите |
с р е д н и й |
б а л л |
с т у д е н т а : |
4 . 0 |
|
Средняя |
у с п е в а е м о с т ь |
по |
3 с т у д е н т а м - 3 . 5 |
||
Нажмите |
< E n t e r > |
д л я |
з а в е р ш е н и я п р о г р а м м ы . . . |
||
Имя ссылочной переменной лучше делать состоящим из одного слова, как, на пример, s t u d e n t . В имя переменной желательно каким-то образом включить имя класса, как, например, b a d S t u d e n t , g o o d S t u d e n t и т.п. Имя массива (или другой коллекции) предпочтительнее делать простым и очевидным, таким как s t u d e n t s , p h o n e N u m b e r s или p h o n e N u m b e r s I n M y P a l m P i l o t . Как обычно, этот совет всего лишь отражает личное мнение автора— С# совер шенно безразлично, какие именно имена вы будете давать вашим переменным.
Рассмотрим еще раз, как именно вычисляется средняя успеваемость студентов: public c l a s s S t u d e n t
{
p u b l i c |
s t r i n g |
p u b l i c |
d o u b l e |
s N a m e ;
d G P A ; / / С р е д н и й б а л л
)
public |
c l a s s P r o g r a m |
||
( |
|
|
|
p u b l i c s t a t i c |
v o i d M a i n ( s t r i n g [ ] a r g s ) |
||
{ |
|
|
|
/ / |
. . . |
С о з д а е м м а с с и в . . . |
|
/ / У с р е д н я е м у с п е в а е м о с т ь |
|||
d o u b l e d S u m = 0 . 0 ; |
|||
f o r |
( i n t i = 0; i < s t u d e n t s . L e n g t h ; i + + ) |
||
{ |
|
|
|
dSum |
+ = |
s t u d e n t s [ i ] . d G P A ; |
|
}
d o u b l e d A v g = d S u m / s t u d e n t s . L e n g t h ; / / . . . П р о ч и е д е й с т в и я с м а с с и в о м . . .
} Цикл f o r проходит по всем элементам массива.
Переменная s t u d e n t s . L e n g t h содержит количество элементов в массиве.
Глава 6. Объединение данных - классы и массивы |
133 |
С# предоставляет программистам особую конструкцию f o r e a c h , которая спроекти рована специально для итеративного прохода по контейнерам, таким как массивы. Ош работает следующим образом:
/ / У с р е д н я е м у с п е в а е м о с т ь d o u b l e d S u m = 0 . 0 ;
f o r e a c h ( S t u d e n t s t u d |
i n s t u d e n t s ) |
{ |
|
d S u m + = s t u d . d G P A ; |
|
} |
|
d o u b l e d A v g = d S u m / |
s t u d e n t s . L e n g t h ; |
При первом входе в цикл из массива выбирается первый объект типа S t u d e n t и со храняется в переменной s t u d . При каждой последующей итерации цикл f o r e a c h вы бирает из цикла и присваивает переменной s t u d очередной элемент массива. Управле ние покидает цикл f o r e a c h , когда все элементы массива оказываются обработанными.
Обратите внимание, что в выражении f o r e a c h нет никаких индексов. Это позволяет существенно снизить вероятность появления ошибки в программе.
Программистам на С, С++ или Java цикл f o r e a c h покажется на первый взгляд неудобным, однако этот уникальный оператор С# (точнее, .NET) — простей ший способ организации циклической обработки всех элементов массива.
На самом деле цикл f o r e a c h мощнее, чем можно представить из приведенного примера. Кроме массивов, он работает и с другими видами коллекций (о которых рассказывается, например, в главе 15, "Обобщенное программирование"). Кроме того, f o r e a c h в состоянии работать и с многомерными массивами (т.е. масси вами массивов), но эта тема выходит за рамки настоящей книги.
Сортировка элементов в массиве — весьма распространенная программистская зада-' ча. То, что массив не может расти или уменьшаться, еще не означает, что его элементы не могут перемещаться, удаляться или добавляться. Например, обмен местами двух эле ментов типа S t u d e n t в массиве может быть выполнен так, как показано в следующем фрагменте исходного текста:
S t u d e n t t e m p = s t u d e n t s [ i ] ; / / С о х р а н я е м i - г о с т у д е н т а
s t u d e n t s |
[ i ] |
= s t u d e n t s [ j ] ; |
s t u d e n t s [ j ] |
= t e m p ; |
|
Здесь сначала во временной переменной сохраняется ссылка на объект в i-ой позиции массива s t u d e n t s , чтобы она не была потеряна при обмене, затем ссылка в i-ой пози ции заменяется ссылкой в j-ой позиции. После этого в j-ую позицию помещается ранее сохраненная во временной переменной ссылка, которая изначально находилась в i-ОЙ по зиции. Происходящее схематично показано на рис. 6.2.
Некоторые коллекции данных более гибки, чем массивы, и поддерживают до бавление и удаление элементов. С такими коллекциями вы познакомитесь в главе 15, "Обобщенное программирование".
734 |
Часть III. Объектно-основанное программирование |
Рис. 6.2. "Обмен двух объектов" на самом де ле означает "обмен ссылок на два объекта"
Приведенная ниже программа демонстрирует, как использовать возмож ность манипуляции элементами массива для их сортировки. В программе применен алгоритм пузырьковой сортировки. Он не слишком эффективен и плохо подходит для сортировки больших массивов с тысячами элементов, но зато очень прост и вполне применим для небольших массивов.
// S o r t S t u d e n t s
/ / Д е м о н с т р а ц и о н н а я п р о г р а м м а д л я с о р т и р о в к и м а с с и в а // о б ъ е к т о в
using S y s t e m ;
namespace S o r t S t u d e n t s
(
c l a s s P r o g r a m
{
p u b l i c s t a t i c v o i d M a i n ( s t r i n g [ ] a r g s )
{
/ / С о з д а н и е м а с с и в а с т у д е н т о в |
|
|
S t u d e n t [ ] |
s t u d e n t s = n e w S t u d e n t [ 5 ] ; |
|
s t u d e n t s [ 0 ] |
= S t u d e n t . N e w S t u d e n t ( " H o m e r " , |
0 ) ; |
s t u d e n t s [ 1 ] |
= S t u d e n t . N e w S t u d e n t ( " L i s a " , |
4 . 0 ) ; |
s t u d e n t s [ 2 ] |
= S t u d e n t . N e w S t u d e n t ( " B a r t " , |
2 . 0 ) ; |
s t u d e n t s [ 3 ] |
= S t u d e n t . N e w S t u d e n t ( " M a r g e " , |
3 . 0 ) ; |
s t u d e n t s [ 4 ] |
= S t u d e n t . N e w S t u d e n t ( " M a g g i e " , |
3 . 5 ) ; |
Глава ft Объединение данных — классы и массивы |
135 |
/ / В ы в о д н е о т с о р т и р о в а н н о г о с п и с к а : |
|
||
C o n s o l e . W r i t e L i n e ( " Д о |
с о р т и р о в к и : " ) ; |
||
O u t p u t S t u d e n t A r r a y ( s t u d e n t s ) ; |
|
|
|
/ / С о р т и р у е м с п и с о к с т у д е н т о в в с о о т в е т с т в и и с и х |
|||
/ / у с п е в а е м о с т ь ю ( п е р в ы м и в с п и с к е и д у т с т у д е н т ы с |
|||
/ / л у ч ш е й у с п е в а е м о с т ь ю ) |
|
|
|
C o n s o l e . W r i t e L i n e ( " \ п С о р т и р о в к а |
с п и с к а \ п " ) ; |
||
S t u d e n t . S o r t ( s t u d e n t s ) ; |
|
|
|
/ / В ы в о д о т с о р т и р о в а н н о г о с п и с к а |
|
|
|
C o n s o l e . W r i t e L i n e ( " О т с о р т и р о в а н н ы й |
с п и с о к : " ) ; |
||
O u t p u t S t u d e n t A r r a y ( s t u d e n t s ) ; |
|
|
|
/ / О ж и д а е м п о д т в е р ж д е н и я п о л ь з о в а т е л я |
||
C o n s o l e . W r i t e L i n e ( " Н а ж м и т е < E n t e r > д л я " + |
||
|
" з а в е р ш е н и я п р о г р а м м ы . . . " ) ; |
|
C o n s o l e . R e a d ( ) ; |
|
|
} |
|
|
/ / O u t p u t S t u d e n t A r r a y - в ы в о д и т и н ф о р м а ц и ю о в с е х |
||
/ / с т у д е н т а х в м а с с и в е |
|
|
p u b l i c |
s t a t i c |
|
v o i d O u t p u t S t u d e n t A r r a y ( S t u d e n t [ ] |
s t u d e n t s ) |
|
{ |
|
|
f o r e a c h ( S t u d e n t s i n s t u d e n t s ) |
|
|
{ |
|
|
C o n s o l e . W r i t e L i n e ( s . G e t S t r i n g ( ) ) ; |
|
|
} |
|
|
} }
/ / S t u d e n t - о п и с а н и е с т у д е н т а , в к л ю ч а ю щ е е е г о и м я и / / у с п е в а е м о с т ь
c l a s s |
S t u d e n t |
{ |
|
p u b l i c |
s t r i n g |
p u b l i c |
d o u b l e |
s N a m e ;
d G r a d e = 0 . 0 ;
/ / N e w S t u d e n t - в о з в р а щ а е т н о в ы й и н и ц и а л и з и р о в а н н ы й / / о б ъ е к т
p u b l i c s t a t i c S t u d e n t N e w S t u d e n t ( s t r i n g |
s N a m e , |
d o u b l e |
d G r a d e ) |
{ |
|
S t u d e n t s t u d e n t = n e w S t u d e n t ( ) ; |
|
s t u d e n t . s N a m e = s N a m e ; |
|
s t u d e n t . d G r a d e = d G r a d e ; |
|
r e t u r n s t u d e n t ; |
|
} |
|
/ / G e t S t r i n g - п р е о б р а з у е т т е к у щ и й о б ъ е к т т и п а S t u d e n t в / / с т р о к у
p u b l i c |
s t r i n g G e t S t r i n g ( ) |
{ |
|
136 |
Часть III. Объектно-основанное программирован»» |
s t r i n g |
s = "" ; |
||
s |
+= |
d G r a d e ; |
|
s |
+= |
" |
- " ; |
s |
+= |
s N a m e ; |
|
r e t u r n |
s ; |
||
} |
|
|
|
/ / |
S o r t - с о р т и р о в к а м а с с и в а с т у д е н т о в |
/ / |
у б ы в а н и я и х у с п е в а е м о с т и п р и п о м о щ и |
/ / п у з ы р ь к о в о й с о р т и р о в к и
вп о р я д к е
ал г о р и т м а
p u b l i c s t a t i c v o i d S o r t ( S t u d e n t [ ] |
s t u d e n t s ) |
{ |
|
b o o l b R e p e a t L o o p ; |
|
/ / Ц и к л в ы п о л н я е т с я д о п о л н о й с о р т и р о в к и с п и с к а d o
{
/ / Э т о т ф л а г п р и н и м а е т з н а ч е н и е t r u e п р и н а л и ч и и / / х о т я б ы о д н о г о о б ъ е к т а н е в п о р я д к е с о р т и р о в к и
b R e p e a t L o o p = |
f a l s e ; |
/ / Ц и к л п о в с е м у с п и с к у с т у д е н т о в |
|
f o r ( i n t i n d e x = |
0 ; i n d e x < ( s t u d e n t s . L e n g t h - 1 ) ; |
i n d e x + + ) |
|
{
/ / Е с л и д в а с т у д е н т а н а х о д я т с я в с п и с к е в н е в е р н о м
/ / п о р я д к е . . . |
|
||
i f |
( s t u d e n t s [ i n d e x ] . d G r a d e < |
||
|
|
|
s t u d e n t s [ i n d e x + 1 ] . d G r a d e ) |
{ |
|
|
|
|
/ / |
. . . м е н я е м и х м е с т а м и . . . |
|
|
S t u d e n t t o = s t u d e n t s [ i n d e x ] ; |
||
|
S t u d e n t f r o m = s t u d e n t s [ i n d e x + 1 ] ; |
||
|
s t u d e n t s [ i n d e x ] |
= f r o m ; |
|
|
s t u d e n t s [ i n d e x + 1 ] |
= t o ; |
|
|
/ / |
. . . и п р и с в а и в а е м ф л а г у з н а ч е н и е t r u e , ч т о б ы |
|
|
/ / п р о г р а м м а в ы п о л н и л а о ч е р е д н о й п р о х о д п о |
||
|
/ / с п и с к у ( и т е р а ц и и п р о д о л ж а ю т с я , п о к а с п и с о к н е |
||
|
/ / |
б у д е т п о л н о с т ь ю о т с о р т и р о в а н ) |
|
b R e p e a t L o o p = t r u e ;
}
}
}w h i l e ( b R e p e a t L o o p ) ;
}
}
Рассмотрим вывод данной программы, просто чтобы убедиться в ее работоспособности:
До сортировки :
О - Homer
4 - Lisa
2 - Bart
Глава 6. Объединение данных - классы и массивы |
137 |