Books / 3_C#_2005_для_чайников_(Дэвис-2008)
.pdf/ / О ж и д а е м п о д т в е р ж д е н и я |
п о л ь з о в а т е л я |
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 ( ) ; |
|
Вот как выглядит вычисление среднего для чисел от 1 до 5: |
|
Введите к о л и ч е с т в о у с р е д н я е м ы х |
ч и с е л : 5 |
Введите |
ч и с л о |
Введите |
ч и с л о |
Введите |
ч и с л о |
Введите |
ч и с л о |
Введите |
ч и с л о |
ти п а
ти п а
ти п а
ти п а
ти п а
d o u b l e |
№ 1 : |
1 |
d o u b l e |
№ 2 : |
2 |
d o u b l e |
№ 3 : |
3 |
d o u b l e |
№4: |
4 |
d o u b l e |
№ 5 : |
5 |
3 я в л я е т с я с р е д н и м и з ( 1 + 2 + 3 + 4 + 5 ) / 5 Нажмите < E n t e r > д л я з а в е р ш е н и я п р о г р а м м ы . . .
Программа V a r i a b l e A r r a y A v e r a g e начинается с вывода приглашения пользова телю указать количество значений, которые будут введены далее и которые требуется усреднить. Введенное значение сохраняется в переменной n u m E l e m e n t s типа i n t . В представленном примере здесь оказывается введено число 5.
Затем программа выделяет память для нового массива d A r r a y с указанным количе ством элементов. В данном случае программа это делает для массива, состоящего из пя ти элементов типа d o u b l e . Программа выполняет n u m E l e m e n t s итераций цикла, счи тывая вводимые пользователем значения и заполняя ими массив.
После того как пользователь введет указанное им ранее число данных, программа ис пользует тот же алгоритм, что и в программе F i x e d A r r a y A v e r a g e для вычисления среднего значения последовательности чисел.
В последней части генерируется вывод среднего значения вместе с введенными чис лами в привлекательном виде (по крайней мере с моей точки зрения).
Этот вывод не так уж и прост, как может показаться. Внимательно проследите, как именно программа выводит открывающую скобку, знаки сложения, числа последовательности и закрывающую скобку.
Программа V a r i a b l e A r r a y A v e r a g e , возможно, не удовлетворяет вашим пред ставлениям о гибкости. Может статься, что вам бы хотелось позволить пользовате лю вводить числа, а после ввода какого-то очередного числа дать команду вычис лить среднее значение введенных чисел. Кроме массивов, С# предоставляет про граммисту и другие типы коллекций; некоторые из них могут при необходимости увеличивать или уменьшать свой размер. В главе 15, "Обобщенное програм мирование", вы познакомитесь с такими альтернативами массивам.
Свойство Length
В программе V a r i a b l e A r r a y A v e r a g e для заполнения массива использован цикл for:
Глава 6. Объединение данных - классы и массивы |
129 |
/ / О б ъ я в л я е м м а с с и в н е о б х о д и м о г о р а з м е р а
d o u b l e t ] d A r r a y = n e w d o u b l e [ n u m E l e m e n t s ] ;
/ / Н а к а п л и в а е м з н а ч е н и я в м а с с и в е
f o r ( i n t i = 0; i < n u m E l e m e n t s ; i + + )
{
/ / П р и г л а ш е н и е |
п о л ь з о в а т е л ю д л я в в о д а ч и с е л |
C o n s o l e . W r i t e ( " В в е д и т е ч и с л о т и п а d o u b l e № " + |
(i |
+ 1) + |
" : »,),,; |
s t r i n g s V a l = C o n s o l e . R e a d L i n e О ; |
||
d o u b l e d V a l u e = |
C o n v e r t . T o D o u b l e ( s V a l ) ; |
|
/ / В н о с и м ч и с л о в м а с с и в |
||
d A r r a y [ i ] = d V a l u e ; |
|
|
} |
|
|
Массив d A r r a y объявлен как |
и м е ю щ и й длину n u m E l e m e n t s . Таким образом, по |
нятно, почему цикл выполняет именно n u m E l e m e n t s итераций для прохода по массиву. Вообще говоря, не слишком-то и удобно таскать повсюду вместе с массивом пер(
менную, в которой хранится его |
длина. Но, к счастью, это не является неизбежными |
у массива есть свойство L e n g t h , |
которое содержит его длину, так что d A r r a y . Lengtkl |
в данном случае содержит то же значение, что и n u m E l e m e n t s .
Таким образом, предпочтительнее использовать такой вид цикла f o r :
/ / Н а к а п л и в а е м з н а ч е н и я в м а с с и в е
f o r ( i n t i = 0 ; i < d A r r a y . L e n g t h ; i + + )
О т л и ч ие массивов фиксированной и переменной д л и н ы
С первого взгляда бросается в глаза, насколько отличается синтаксис массивов фик|
сированной и переменной длины: |
|
|
d o u b l e [ ] |
d F i x e d L e n g t h A r r a y = |
{ 5 , 2 , 7 , 3 . 5 , 6 . 5 , 8 , 1 , 9 , 1 , 3 } ; |
d o u b l e t ] |
d V a r i a b l e L e n g t h A r r a y |
= n e w d o u b l e [ 1 0 ] ; |
Однако C# пытается сэкономить ваши усилия, а потому позволяет Использовать ита| кой код для выделения памяти для массива с его одновременной инициализацией:
d o u b l e t ] d F i x e d L e n g t h A r r a y =
n e w d o u b l e [ 1 0 ] { 5 , 2 , 7 , 3 . 5 , 6 . 5 , 8 , 1 , 9 , 1 , 3 } ;
Здесь память выделяется как для массива переменной длины, но его инициализац выполняется так же, как и для массива фиксированной длины .
Программистам очень часто приходится работать с наборами пользовательских объ ектов (классов). Скажем, программе для университета требуется некая структура, описы-] вающая студентов, например, такая:
p u b l i c 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 ; / / С р е д н и й б а л л
}
130 |
Часть III. Объектно-основанное программирование |
Этот простейший класс содержит только имя студента и его успеваемость. В следующем фрагменте объявляется массив из n u m ссылок на объекты типа S t u d e n t :
Student [ ] s t u d e n t s |
= n e w S t u d e n t [ n u m ] ; |
Выражение n e w |
S t u d e n t [num] объявляет не массив объектов S t u d e n t , |
а массив ссылок на объекты S t u d e n t .
Итак, каждый элемент s t u d e n t s [ i ] представляет собой ссылку на нулевой объект, так как С# инициализирует новые, неопределенные объекты значением n u l l . Можно сформулировать это и иначе, сказав, что ни один из элементов s t u d e n t s [ i ] после вы полнения рассматриваемого оператора n e w не ссылается на объект типа S t u d e n t . Так что сначала вы должны заполнить массив следующим образом:
for ( i n t i = 0; |
i < s t u d e n t s . L e n g t h ; i + +) |
{ |
|
s t u d e n t s [ i ] |
= n e w S t u d e n t ( ) ; |
}
Теперь в программе можно вводить свойства отдельных студентов таким образом:
s t u d e n t s [ i ] |
= n e w S t u d e n t ( ) ; |
|||
s t u d e n t s |
[ i ] |
. s N a m e |
= |
"My N a m e " ; |
s t u d e n t s |
[ i ] |
. dGPA |
= |
dMyGPA; |
Все это можно увидеть в программе A v e r a g e S t u d e n t G P A , которая полу чает информацию о студентах и вычисляет их среднюю успеваемость.
//A v e r a g e S t u d e n t G P A
/ / В ы ч и с л я е т с р е д н ю ю у с п е в а е м о с т ь м н о ж е с т в а с т у д е н т о в . using S y s t e m ;
namespace |
A v e r a g e S t u d e n t G P A . |
f |
|
p u b l i c |
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 ;
/ / С р е д н и й б а л л
}
p u b l i c |
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 ) |
{
/ / О п р е д е л я е м к о л и ч е с т в о с т у д е н т о в
C o n s o l e . W r i t e L i n e ( " В в е д и т е к о л и ч е с т в о с т у д е н т о в " ) ; s t r i n g s = C o n s o l e . R e a d L i n e ( ) ;
i n t n N u m b e r O f S t u d e n t s = C o n v e r t . T o I n t 3 2 ( s ) ; / / В ы д е л я е м м а с с и в о б ъ е к т о в S t u d e n t
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 [ n N u m b e r O f S t u d e n t s ] ;
/ / З а п о л н я е м f o r ( i n t i =
м а с с и в
0; i < s t u d e n t s . L e n g t h ; i + + )
Глава 6. Объединение данных - классы и массивы |
131 |
{
/ / П р и г л а ш е н и е д л я в в о д а и н ф о р м а ц и и . Е д и н и ц а / / п р и б а в л я е т с я в с в я з и с т е м , ч т о и н д е к с а ц и я / / м а с с и в о в в С # н а ч и н а е т с я с н у л я
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 |
3 |
- M a r g e |
3 . 5 |
- M a g g i e |
С о р т и р о в к а с п и с к а |
|
О т с о р т и р о в а н н ы й с п и с о к : |
|
4 |
- L i s a |
3 . 5 |
- M a g g i e |
3 |
- M a r g e |
2 |
- B a r t |
0 |
- H o m e r |
Н а ж м и т е < E n t e r > д л я з а в е р ш е н и я п р о г р а м м ы . . . |
Чтобы сберечь ваше и мое время, создание списка из пяти студентов просто закоди ровано непосредственно в программе. Метод N e w S t u d e n t () выделяет память и созда ет новый объект типа S t u d e n t , инициализирует его и возвращает вызывающей фун* ции. Для вывода информации о всех студентах в списке используется функция Out- p u t S t u d e n t A r r a y ( ) .
Затем программа вызывает функцию S o r t ( ) . После сортировки программа повтор» ет процесс вывода списка, чтобы вы могли убедиться, что теперь он упорядочен.
Само собой, ключевым моментом в программе S o r t S t u d e n t s является мето] S o r t ( ) . Этот алгоритм выполняет проходы по списку до тех пор, пока список не буда полностью отсортирован, и при каждом таком проходе сравнивает два соседних объем массива. Если они находятся в неверном порядке, функция обменивает их местами и от мечает этот факт в специальной переменной-флаге, которая затем используется в уел» вии цикла, указывая, полностью ли отсортирован массив. На рис. 6.3-6.6 показано, и выглядит список студентов после каждого прохода.
HOMER |
0 |
|
L I S A |
L I S A |
4 |
|
B A R T |
B A R T |
2 |
|
MARGE |
MARGE |
3 |
|
M A G G I E |
M A G G I E |
3,5 |
|
HOMER |
|
|
|
|
|
|
|
|
4
2
3
3,5
0 -*•— Homer проделал свой путь в конец списка
Рис. 6.3. Список студен |
Рис. 6.4. Список студентов после первого прохода |
тов до сортировки |
|
Рис. 6.5. Список студентов после второго прохода
Вконечном итоге лучшие студенты, как пузырьки в воде, "всплывают" в верх списка
вто время как наихудшие "тонут" и падают на дно. Потому такая сортировка и называ ется пузырьковой.
138 |
Часть III. Объектно-основанное программирование |