Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Books / 3_C#_2005_для_чайников_(Дэвис-2008)

.pdf
Скачиваний:
86
Добавлен:
24.03.2015
Размер:
15.46 Mб
Скачать

/ / О ж и д а е м п о д т в е р ж д е н и я

п о л ь з о в а т е л я

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. Объектно-основанное программирование