1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 23
Текст из файла (страница 23)
Возможно, вам больше поимвится использовать н е модификатор c o n s t , а модификатор r e a d o n l y :publicreadonlyi n tnDaysInYear=366;Как и при применении модификатора c o n s t , после того как вы присвоите констинициализирующее значение, оно не может быть изменено нигде в программе. Xотяпричины этого совета носят слишком технический характер, чтобы описывать их встоящей книге, при объявлении констант предпочтительно использовать модификатreadonly.Для констант имеется собственное соглашение по именованию.
Вместо именованих так же, как и переменных (как в примере с n D a y s I n Y e a r ) многие программыпредпочитают использовать прописные буквы с разделением слов подчеркиваниямиD A Y S _ I N _ Y E A R . Такое соглашение ясно отделяет константы от обычных переменных.В в а ш е м р а с п о р я ж е н и и е с т ь п е р е м е н н ы е , х р а н я щ и е о т д е л ь н ы е е д и н с т в е н н ы е значен и я .
К л а с с ы м о г у т и с п о л ь з о в а т ь с я д л я о п и с а н и я с о с т а в н ы х о б ъ е к т о в . Н о в а м нужна е щ е124Часть III. Объектно-основанное программироваодна конструкция для хранения множества объектов, например, коллекции старинныхавтомобилей Билла Гейтса. Встроенный класс A r r a y представляет собой структуру, которая может содержать последовательности однотипных элементов (чисел типа i n t ,double, объекты V e h i c l e и т.п.).Зачем нужны массивыРассмотрим задачу определения среднего из десяти чисел с плавающей точкой. Каждое из 10 чисел требует собственной переменной для хранения значения типа d o u b l e(усреднение целых чисел может привести к ошибке округления, описанной в главе 3,"Объявление переменных-значений"):doubledoubledoubledoubledoubledoubledoubledoubledoubledoubledOdld2d3d4d5d6d7d8d9==========5;2;7;3.5;6.5;8;1;9;1;3;Теперь нужно просуммировать все эти значения и разделить полученную сумму на 10:double dSum = dO + dl + d2 + d3 + d4 +d5 + d6 + d7 + d8 + d 9 ;double dAverage = dSum / 1 0 ;Перечислять все элементы — очень утомительно, даже если их всего 10.
А теперьпредставьте, что вам надо усреднить 10000 чисел...Массив фиксированного размераК счастью, вам не нужно отдельно именовать каждый из элементов. С# предоставляетв распоряжение программиста массивы, которые могут хранить последовательности значений. Используя массив, вы можете переписать приведенный выше фрагмент следующим образом:double[]dArray ={5,2,7,3.5,6.5,8,1,9,1,3} ;Класс A r r a y использует специальный синтаксис, который делает его болееудобным в применении.
Двойные квадратные скобки [] указывают на способдоступа к отдельным элементам массива:dArray[0]dArray[1]с о о т в е т с т в у е т dOсоответствует dlНулевой элемент массива соответствует do, первый — dl и так далее.Номера элементов массива — 0, 1, 2, ... — известны как их индексы.(пава 6. Объединение данных- классы и массивы125В С# индексы массивов начинаются с 0, а не с 1. Таким образом, элементс индексом 1 не является первым элементом массива.
Не забывайте об этом!Использование d A r r a y было бы слабым улучшением, если бы в качестве индекса массива нельзя было использовать переменную. Применять цикл f o r существенно проще, чем записывать каждый элемент вручную, что и демонстрирует программа F i x e d A r r a y A v e r a g e .11'FixedArrayAverage//Усреднениемассивачисел// использованием циклаnamespaceFixedArrayAverageusingразмерафиксированногосSystem;publicclassProgram{publicstaticdouble[]voidMain(string[]dArray ={5, 2, 7, 3 .
5 ,6.5,8,args)1,9,1,3};// Н а к о п л е н и е суммы э л е м е н т о в// м а с с и в а в п е р е м е н н о й dSumd o u b l e d S u m = 0 ,f o r ( i n t i = 0; i < 10; i + + \IdSum =dSum +dArray[i];// Вычисление среднего значенияd o u b l e d A v e r a g e = dSum / 1 0 ;Console.WriteLine(dAverage);// Ожидаем п о д т в е р ж д е н и я п о л ь з о в а т е л яConsole.WriteLine("Нажмите <Enter> для " +"завершения программы.. .
" ) ;Console.Read();Программа начинает работу с инициализации переменной d S u m значением 0. Затемпрограмма циклически проходит по всем элементам массива d A r r a y и прибавляет гак d S u m . По окончании цикла сумма всех элементов массива хранится в d S u m . Раздели!ее на количество элементов массива, получаем искомое среднее значение.Проверка границ массиваПрограмма F i x e d A r r a y A v e r a g e должна циклически проходить по массиву из 10элементов.
К счастью, цикл разработан так, что проходит ровно по 10 элементам массива. Ну а если была бы допущена ошибка и проход был бы сделан не по 10 элементам, а по иному их количеству? Следует рассмотреть два основных случая.126Часть III. Объектно-основанное программированиеЧто произойдет при выполнении 9 итераций? С# не трактует такую ситуацию какошибочную. Если вы хотите рассмотреть только 9 из 10 элементов, то как С# можетуказывать вам, что именно вам нужно делать? Конечно, среднее значение при этомбудет неверным, но программе это неизвестно.Что произойдет при выполнении 11 (или большего количества) итераций?В этом случае С# примет свои меры и не позволит индексу выйти за дозволенные пределы, чтобы вы не смогли случайно переписать какие-нибудь важные данныевпамяти.
Чтобы убедиться в этом, измените сравнение в цикле f o r , заменив 10 на 11:for ( i n t i = 0 ; i < 1 1 ; i + + )При выполнении программы вы получите диалоговое окно со следующим сообщением об ошибке:IndexOutOfRangeException was u n h a n d l e dIndex was o u t s i d e t h e b o u n d s o f t h e a r r a y .Здесь C# сообщает о происшедшей н е п р и я т н о с т и — исключении I n d e x O u t O f R a n g e E x c e p t i o n , из названия которого и из поясняющего текста становится понятна причина ошибки, — выход индекса за пределы допустимого диапазона.
(Кромеэтого, выводится детальная информация о том, где именно и что произошло, но покато вы не настолько знаете С#, чтобы разобраться в этом.)Массив переменного размераМассив, используемый в программе F i x e d A r r a y A v e r a g e , сталкивается с двумясерьезными проблемами:его размер фиксирован и равен 10 элементам;что еще хуже, значения этих элементов указываются непосредственно в текстепрограммы.Значительно более гибкой была бы программа, которая могла бы считывать переменнойколичество значений, вводимое пользователем, ведь она могла бы работать не только сопределенными в программе F i x e d A r r a y A v e r a g e значениями, но и с другими множествами значений.Формат объявления массива переменного размера немного отличается от объявления«ива фиксированного размера:doublet] d A r r a y = n e w d o u b l e [ N ] ;Здесь N — количество элементов в выделяемом массиве.Модифицированная версия программы V a r i a b l e 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//Вычисление с р е д н е г о з н а ч е н и я м а с с и в а , р а з м е р к о т о р о г о//указывается п о л ь з о в а т е л е м в о в р е м я р а б о т ы п р о г р а м м ы .[// Накопление в в е д е н н ы х д а н н ы х в м а с с и в е п о з в о л я е т[//обращаться к н и м н е о д н о к р а т н о , в ч а с т н о с т и , д л я г е н е р а ц и и[//привлекательно в ы г л я д я щ е г о в ы в о д а н а э к р а н .Гюва 6, Объединение данных - классы и массивы127namespaceVariableArrayAverage{usingSystem;publicclassProgram{publics t a t i cvoidMain(string[]args){// Сначала считывается количество чисел типа double,// которое пользователь намерен ввести для усредненияConsole.Write("Введите количество усредняемых чисел:");s t r i n g sNumElements = C o n s o l e . R e a d L i n e О ;i n t numElements = Convert.ToInt32(sNumElements);Console.WriteLine();//Объявляемdouble[]//массивdArrayНакапливаемfor(inti==необходимогоnewзначения0;i<размераdouble[numElements];вмассивеnumElements;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 sVal = C o n s o l e . R e a d L i n e ( ) ;double dValue = Convert.ToDouble(sVal);//}ВносимdArray[i]число=вмассивdValue;// Суммируем'numElements'/ / п е р е м е н н о й dSumd o u b l e dSum = 0;for(inti=0;i<значенийnumElements,-измассивавi++){dSum=dSum+dArray[i];}// Вычисляем среднееd o u b l e d A v e r a g e = dSum/numElements;/ / Выводим р е з у л ь т а т н а э к р а нConsole.WriteLine();Console.Write(dAverage+ " является среднимиз("+ d A r r a y [ 0 ] ) ,for(inti=1;i<numElements,-Console.Write("+i++){"+dArray[i]);}Console.WriteLine(")128/"+numElements);Часть III. Объектно-основанное программирован// Ожидаем п о д т в е р ж д е н и я п о л ь з о в а т е л яConsole.WriteLine("Нажмите <Enter> для " +"завершения программы...");Console.Read();Вот как выглядит вычисление среднего для чисел от 1 до 5:ВведитеколичествоусредняемыхВведитеВведитеВведитеВведитеВведитечислочислочислочислочислоdoubledoubledoubledoubledoubleтипатипатипатипатипа№1:№2:№3:№4:№5:чисел:5123453 является с р е д н и м и з( 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 с указанным количеством элементов.