ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 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