1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 25
Текст из файла (страница 25)
Кроме массивов, он работает и с другими видами коллекций (о которыхрассказывается, например, в главе 15, "Обобщенное программирование"). Крометого, f o r e a c h в состоянии работать и с многомерными массивами (т.е. массивами массивов), но эта тема выходит за рамки настоящей книги.Сортировка элементов в массиве — весьма распространенная программистская зада-'ча. То, что массив не может расти или уменьшаться, еще не означает, что его элементыне могут перемещаться, удаляться или добавляться.
Например, обмен местами двух элементов типа S t u d e n t в массиве может быть выполнен так, как показано в следующемфрагменте исходного текста:S t u d e n t temp = s t u d e n t s [i] ;s t u d e n t s [i]= students [j];students[j]= temp;//Сохраняемi-гостудентаЗдесь сначала во временной переменной сохраняется ссылка на объект в 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программадлясортировкимассиваSortStudents(classProgram{publics t a t i cvoidMain(string[]args){// СозданиеStudent[]ststudents[0]students[1]students[2]students[3]students[4]массива студентовu d e n t s = new S t u d e n t [ 5 ] ;= Student.NewStudent("Homer",0);= Student.NewStudent("Lisa",4.0);= Student.NewStudent("Bart",2.0);= Student.NewStudent("Marge",3.0);= Student.NewStudent("Maggie",3.5);Глава ft Объединение данных — классыи массивы135/ / Вывод н е о т с о р т и р о в а н н о г осписка:Console.WriteLine("Досортировки:");OutputStudentArray(students);// Сортируем с п и с о к с т у д е н т о в в с о о т в е т с т в и и с их// у с п е в а е м о с т ь ю(первыми в списке идут студенты с//лучшейуспеваемостью)Console.WriteLine("\пСортировкасписка\п");Student.Sort(students);/ / Вывод о т с о р т и р о в а н н о г оспискаConsole.WriteLine("ОтсортированныйOutputStudentArray(students);список:");//Ожидаем п о д т в е р ж д е н и япользователяConsole.WriteLine("Нажмите <Enter> для " +"завершенияпрограммы...");Console.Read();}// O u t p u t S t u d e n t A r r a y - выводит информацию о в с е х//студентахв массивеpublics t a t i cvoid OutputStudentArray(Student []students){foreach(Studentsinstudents){Console.WriteLine(s.GetString());}} }//Student//-описаниестудента,включающееегоимяиуспеваемостьclassStudent{publicstringsName;publicdoubledGrade////NewStudentобъектpublic-s t a t i c=0.0;возвращаетStudentновыйинициализированныйNewStudent(stringdoublesName,dGrade){S t u d e n t s t u d e n t = new S t u d e n t ( ) ;s t u d e n t .
s N a m e = sName;student.dGrade = dGrade;returnstudent;}////GetStringстрокуpublicstring-преобразуеттекущийобъекттипаStudentвGetString(){136Часть III. Объектно-основанное программирован»»strins +=s +=s +=returg s = "" ;dGrade;" - " ;sName;ns;}//////Sort - сортировка массива студентовубывания их у с п е в а е м о с т и при помощипузырьковой сортировкиpublics t a t i cvoidSort(Student[]в порядкеалгоритмаstudents){bool//bRepeatLoop;Циклвыполняетсядополнойсортировкиспискаdo{// Этот флаг принимает значение t r u e при наличии// хотя бы одного объекта не в порядке с о р т и р о в к иbRepeatLoop =false;// Цикл по в с е м у с п и с к уf o r ( i n t i n d e x = 0;indexindex++)студентов<(students.Length-1);{////ifЕсли два студента находятся в списке в неверномпорядке...(students[index].dGrade<students[index +1].dGrade){//...меняем их местами...Student to = s t u d e n t s [ i n d e x ] ;S t u d e n t from = s t u d e n t s [ i n d e x +students[index]= from;s t u d e n t s [ i n d e x + 1]= to;1];//.
. . и присваиваем флагу значение t r u e ,чтобы// программа выполнила очередной проход по// списку(итерации продолжаются,пока список не//будетполностью отсортирован)bRepeatLoop = t r u e ;}}}while(bRepeatLoop);}}Рассмотрим вывод данной программы, просто чтобы убедиться в ее работоспособности:До с о р т и р о в к и :О - Homer4 - Lisa2 - BartГлава 6.Объединение данных - классы и массивы1373 3.5Marge- MaggieСортировкаспискаОтсортированный4 - Lisa3.5- Maggie3 - Marge2 - Bart0 - HomerНажмите < E n t e r >список:длязавершенияпрограммы...Чтобы сберечь ваше и мое время, создание списка из пяти студентов просто закодировано непосредственно в программе. Метод N e w S t u d e n t () выделяет память и создает новый объект типа S t u d e n t , инициализирует его и возвращает вызывающей фун*ции.
Для вывода информации о всех студентах в списке используется функция OutputStudentArray().Затем программа вызывает функцию S o r t ( ) . После сортировки программа повтор»ет процесс вывода списка, чтобы вы могли убедиться, что теперь он упорядочен.Само собой, ключевым моментом в программе S o r t S t u d e n t s является мето]S o r t ( ) . Этот алгоритм выполняет проходы по списку до тех пор, пока список не будаполностью отсортирован, и при каждом таком проходе сравнивает два соседних объеммассива.
Если они находятся в неверном порядке, функция обменивает их местами и отмечает этот факт в специальной переменной-флаге, которая затем используется в уел»вии цикла, указывая, полностью ли отсортирован массив. На рис. 6.3-6.6 показано, ивыглядит список студентов после каждого прохода.HOMER0LISA4LISA4BART2BART2MARGE3MARGE3MAGGIE3,5MAGGIE3,5HOMER0Рис. 6.3. Список студентов до сортировки-*•— Homer проделал свой путь в конец спискаРис. 6.4. Список студентов после первого проходаРис. 6.5. Список студентов после второго проходаВ конечном итоге лучшие студенты, как пузырьки в воде, "всплывают" в верх спискав то время как наихудшие "тонут" и падают на дно. Потому такая сортировка и называетсяпузырьковой.138Часть III.
Объектно-основанное программированиеРис. 6.6. Список студентов после предпоследнегопрохода оказывается полностью отсортирован.Последний проход завершает сортировку, таккак никаких изменений при нем не вноситсяКлючевым моментом любой функции сортировки является возможность переупорядочения элементов внутри массива, присваивая ссылку из одного элемента другому. Заметим, что такое присваивание не создает копии объекта, а следовательно, является очень быстрой операцией.Глава 6.Объединение данных - классы и массивы139Глава 7Функции функций> Определение функции> Передача аргументов в функцию> Получение результата из функции> Передача аргументов программерограммисты нуждаются в возможности разбить большую программу на более мелкие части, с которыми легче совладать.
Например, программы, содержащиеся в предыдущих главах, уже достигли своего предельного размера, с которым какс единым целым может справиться один человек.С# позволяет разделить код на куски, известные как функции. Правильно спроектированные и реализованные функции существенно облегчают работу по написанию сложных программ.Рассмотрим следующий пример:classExamplepublic i n t n l n t ;public s t a t i c i n t n S t a t i c I n tpublic v o i d MemberFunction(){}Console.WriteLine("Это/ / H eстатический член// Статический член/ / H e статическая функцияфункция-член" ) ;^publicstaticvoidClassFunction()//Статическаяфункция{Console.WriteLine("Этофункциякласса");}Элемент n l n t является членом-данными, с которыми вы познакомились в главе 6,"Объединение д а н н ы х — классы и массивы".