- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Язык Си - руководство для начинающих - M. УЭИТ
Шрифт:
Интервал:
Закладка:
Массивы могут быть образованы из данных любого типа:
int nannies[22]; /* масснв, содержащий 22 целых чнсла */
char alpha[26]; /* масснв, содержащий 26 символов */
long big[500]; /*массив, содержащий 500 целых чисел типа long */
Раньше, например, мы говорили о строках, являющихся частным случаем массива типа char. (В общем массив типа char - это массив, элементами которого являются величины типа char. Строка - массив типа char, в котором нуль-символ ' ' используется для того, чтобы отмечать конец строки.)
РИС. 8.6. Массивы символов и строки
Числа, используемые для идентификации элементов массива, называются "подстрочными индексами" или просто "индексами". Индексами должны быть целые числа, и, как уже упоминалось, индексирование начинается с 0. Элементы массива размешаются в памяти последовательно, друг за другом, как показано на рис. 8.6.
РИС. 8.7. Размещение в памяти массивов с элементами типа char и int
Существует огромное количество возможностей применения массивов. Ниже приводится сравнительно простой пример. Предположим, вы хотите написать программу, осуществляющую ввод 10 различных результатов спортивной игры, которые будут обрабатываться позже. Используя понятие массива, вы сможете избежать придумывания 10 различных имен переменных - по одной для каждого счета. Кроме того, для чтения данных вы можете воспользоваться циклом for:
/* ввод счета*/
main( )
{
int i, score[10];
for (i = 0; i <= 9; i++)
scanf(" %d", &a[i]); /* ввод десяти результатов*/
printf("Введены следующие результаты :n" );
for (i = 0; i <= 9; i++)
printf(" %5d", a[i]); /* проверка правильности ввода*/
printf("n");
}
В понятие хорошего стиля программирования входит эхо-печать только что введенных величин. Она даст уверенность, что в программе будут обрабатываться те данные, для которых она предназначена.
Применяемый здесь способ гораздо более удобен, чем использование 10 различных операторов scanf() и 10 отдельных операторов printf() для ввода и проверки десяти результатов, определяющих число набранных очков. Цикл for обеспечивает очень простои и удобный способ использования индексов массивов.
Какого типа операции могли бы мы выполнить над этими данными? Мы могли бы найти их среднее, величину стандартного отклонения (мы знаем даже, как это сделать) и максимальное значение счета, а также произвести их сортировку в некотором порядке. Займемся двумя простейшими задачами: нахождением среднего и максимального результатов.
Чтобы вычислить среднее, мы можем добавить к нашей программе приведенный ниже фрагмент:
int sum, average;
for(i = 0, sum = 0; i <= 9; i++) /* две инициализации*/
sum + = a[i]; /* суммирование элементов массива */
average = sum/10; /*классический метод усреднения */
printf(" Средний результат равен %d.n", average);
Для нахождения максимального результата к программе можно добавить следующий фрагмент:
int highest;
for(highest = а[0], i = 1; i <= 9; i++)
if(a[i] > highest) highest = a[i];
printf ("Максимальный результат равен %d.n", highest);
Здесь мы начинаем с того, что полагаем переменную highest равной величине а[0]. Затем производится сравнение значения highest с каждым элементом массива. Когда обнаруживается, что некоторая величина больше текущего значения переменной highest, ей присваивается эта новая большая величина.
Теперь объединим все части программы. На псевдокоде алгоритм ее работы можно записать следующим образом:
ввод результатов.
эхо-печать результатов.
вычисление и печать среднего значения.
вычисление и печать максимального значения.
Кроме того, мы несколько обобщим нашу программу:
/* результаты*/
#define NUM 10
main( )
{
int i, sum, average, highest, score [NUM];
printf(" Укажите10 результатов. n");
for(i = 0; i < NUM; i++)
scanf(" %d" , &scorc[i]); /* ввод десяти результатов */
printf(" Введены следующие результаты:n");
for(i = 0; i<NUM; i++)
printf("%5d", score[i]);/* проверка правильности ввода*/
printf("n");
tor(i = 0, sum = 0; i < NUM; i++)
sum + = score[i]; /* суммирование элементов массива */
average = sum/NUM; /* классический метод усреднения */
printf(" Средний результат равен %d.n", average);
for(highest = score[0], i = 1; i < NUM; i++)
if(score[i] > highest) /* какая из величин больше*/
highest = score[i];
printf(" Максимальный результат равен %d.n", highest);
}
Мы заменили число 10 символической константой и воспользовались тем, что выражения i <=(NUM-1) и i < NUM эквивалентны.
Давайте сначала посмотрим, как это программа работает, а затем сделаем несколько замечаний.
Укажите 10 результатов:
76 85 62 48 98 71 66 89 70 77
Введены следующие результаты:
76 85 62 48 98 71 66 89 70 77
Средний результат равен 74. Максимальный результат равен 98.
Первый момент, который необходимо отметить, состоит в том, что мы использовали четыре различных цикла for. Вас может заинтересовать вопрос: является ли это на самом деле необходимым или мы можем некоторые из данных операций объединить в одном цикле? Такая возможность существует, и она позволила бы сделать программу более компактной. Однако мы побоялись следовать такому подходу (видите, какие мы впечатлительные люди!), поскольку это противоречит принципу модульности. Смысл, заключенный в данной фразе, состоит в том, что программа должна быть разбита на отдельные единицы, или "модули", причем каждый из них должен выполнять одну задачу. (Наша запись на псевдокоде отражает деление программы на четыре модуля.) Такое разбиение облегчает чтение текста программы. Возможно, еще более важным является то, что если отдельные части программы не перемешаны, ее коррекция или модификация упрощаются. Для этого необходимо только исключить из программы требуемый модуль, заменить его новым, а оставшуюся часть программы не изменять.
ПРОБЛЕМА ВВОДА
Существует несколько способов последовательного ввода набора данных, скажем чисел. Мы обсудим здесь некоторые из них, переходя от менее удобных к более удобным.
Вообще говоря, наименее удобный способ - это тот, который мы только что использовали; написание программы, допускающей ввод фиксированного числа элементов данных. (Такой способ, однако, прекрасно подходит для тех ситуаций, когда число входных данных никогда не изменяется.) Если число входных элементов данных изменяется, необходимо осуществить повторную компиляцию программы.
Следующий шаг состоит в том, чтобы спросить у пользователя, сколько элементов данных будет введено. Так как размер массива в программе фиксирован, она должна проверить, не превышает ли величина, содержащаяся в ответе пользователя, размер массива. Затем пользователь может начать ввод данных. Тогда начало нашей программы можно переписать следующим образом:
printf(" Сколько элементов данных вы будете вводить ?n");
scanf(" %d", &nbr);
while(nbr > NUM)
{
printf("Я смогу обрабатывать не больше %d элементов; пожалуйста, укажите");
printf("меньшую величину.n", NUM);
scanf("%d", &nbr);
}
/* гарантирует,
что nbr <= NUM - максимального размера массива */
for(i = 0; i <nbr; i++)
scanf("%d", &score[i]);
Мы можем продолжить движение в этом направлении, заменяя в каждом случае символическую константу NUM в программе (исключая наличие ее в директиве #define и в описании массива) переменной nbr. При таком способе различные операции будут выполняться только над теми элементами массива, в которые введены данные.
Недостатком указанного подхода является лежащее в его основе предположение, что пользователь не ошибается при подсчете элементов; если же при программировании полагаться на то, что пользователь всегда все делает правильно, программы оказываются ненадежными.

