Типичная ошибка программирования 2 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Типичная ошибка программирования 2



Тема 1.4 Массивы

Лекции

1. Одномерные массивы (последовательности): описание, инициализация, основные приемы обработки (2 часа)

2. Двумерные массивы (матрицы): описание, инициализация, основные приемы обработки (2 часа)

3. Символьные строки (2 часа)

Практические занятия

1. Обработка одномерных массивов (4часа)

2. Обработка двумерных массивов (4 часа)

3. Обработка символьных строк (4 часа)

Контрольная работа (4 часа)

Массив — это последовательная группа ячеек памяти, имеющих одинаковое имя и одинаковый тип. Чтобы сослаться на отдельную ячейку или элемент массива, мы указываем имя массива и номер позиции отдельного элемента массива. На рис.1 показан массив целых чисел, названный с. Этот массив содержит 12 элементов. На любой элемент массива можно сослаться, указывая имя массива и номер позиции элемента, заключенный в квадратные скобки ([ ]). Первый элемент каждого массива — это нулевой элемент. Таким образом, первый элемент массива с, указывают как с[0], второй элемент — как с[1], седьмой — как с[6] и вообще i-ый элемент массива с указывают как C[i-1]. Имена массивов должны удовлетворять тем же требованиям, которые предъявляются к другим именам переменных.

Рис.1 – Массив из 12-ти элементов

 

Номер позиции, указанный внутри квадратных скобок, называется индексом. Индекс должен быть целым числом или целым выражением. Если программа использует выражение в качестве индекса, то выражение вычисляется с целью определения индекса. Например, если мы предположим, что переменная а равна 5, а переменная b равна 6, то оператор с[а + Ь] += 2;

добавляет 2 к элементу массива с[11]. Заметим, что имя индексированного массива является целой L-величиной — оно может быть использовано в левой части оператора присваивания. Проанализируем массив с на рис.1 более детально. Имя массива — это с. Его двенадцать элементов обозначены как с[0], с[1], с[2],...,с[11]. Значение с[0] равно 45, значение с[1] равно 6, значение с[7] равно 62, значение с[11] равно 78. Чтобы напечатать сумму значений, содержащихся в первых трех элементах массива с, мы должны были бы написать co u t < < с [ 0 ] + с [ 1 ] +с[2] << e n d l; Чтобы разделить значение седьмого элемента массива с на 2 и присвоить результат переменной х, мы должны были бы написать х = с [6] / 2;

 

Типичная ошибка программирования 1

Важно отметить различие между «седьмым элементом массива» и «элементом массива семь». Поскольку индексы массива начинаются с 0, «седьмой элемент массива» имеет индекс шесть, тогда как «элемент массива семь» имеет индекс 7 и на самом деле является восьмым элементом массива. Это — источник ошибок типа завышения (или занижения) на единицу.

Квадратные скобки, внутри которых записывается индекс массива, на самом деле рассматриваются в C++ как операция индексации. Квадратные скобки имеют тот же уровень старшинства, что и круглые скобки. Таблица на рис.2 показывает приоритеты и ассоциативность тех операций, с которыми мы уже познакомились к настоящему моменту. Операции расположены сверху вниз в порядке понижения старшинства с указанием их ассоциативности и типа.

Рис.2 – Приоритеты и ассоциативность операций

 

Объявление массивов

Массивы занимают область в памяти. Программист указывает тип каждого элемента, количество элементов, требуемое каждым массивом, и компилятор может зарезервировать соответствующий объем памяти. Чтобы указать компилятору зарезервировать память для 12 элементов массива целых чисел с, используется объявление

int с [12];

Память может быть зарезервирована для нескольких массивов с помощью одного объявления. Следующее объявление резервирует память для 100 элементов массива целых чисел b и 27 элементов массива целых чисел х.

int b [100], х [27];

Массивы могут быть объявлены и для хранения других типов данных. Например, для хранения строки символов можно использовать массив типа char.

Примеры использования массивов

 

В программе на рис.3 используется структура повторения for для присвоения начальных нулевых значений элементам массива п, содержащего десять целых чисел, и для печати массива в табулированном формате. Первый оператор вывода выводит на экран заголовки столбцов, печатаемых структурой for. Напомним, что setw указывает ширину поля, в котором будет выведено следующее значение.

Рис.3 – Присваивание нулевых начальных значений элементам

 массива (часть 1 из 2)

Рис.3 – Присваивание нулевых начальных значений элементам

массива (часть 2 из 2)

 

Элементам массива можно присваивать начальные значения (инициализировать их) в объявлении массива с помощью следующего за объявлением списка (заключенного в фигурные скобки) одинаковых по смыслу и разделенных запятыми начальных значений. Программа на рис.4 присваивает десять начальных значений элементам массива целых чисел и печатает массив в табулированном формате.

Если начальных значений меньше, чем элементов в массиве, оставшиеся элементы автоматически получают нулевые начальные значения. Например, элементам массива n на рис.3 можно присвоить нулевые начальные значения с помощью объявления

int n [10] = {0 };

которое явно присваивает нулевое начальное значение первому элементу и неявно присваивает нулевые начальные значения оставшимся девяти элементам, потому что здесь начальных значений меньше, чем элементов массива. Напомним, что автоматически массивы не получают нулевые начальные значения неявно. Программист должен присвоить нулевое начальное значение, по крайней мере, первому элементу для того, чтобы автоматически были обнулены оставшиеся элементы. Метод, использованный на рис.3, можно применять повторно во время выполнения программы.

Передача массивов в функции

Чтобы передать массив в качестве аргумента в функцию, укажите имя массива без каких-либо квадратных скобок. Например, если массив hourlyTemperatures объявлен как

int hourlyTemperatures [2 4 ];

то оператор вызова функции

modifyArray (hourlyTemperatures, 24);

передает массив hourlyTemperatures и его размер функции modifyArray. При передаче массива в функцию его размер часто передается, чтобы функция могла обрабатывать заданное число элементов в массиве. В главе 8, когда мы познакомимся с классом Array, мы будем встраивать размер массива внутрь типа, определяемого пользователем — каждый объект Array, который мы создадим, будет «знать» свой собственный размер. Таким образом, при передаче объекта Array функции нет необходимости передавать ей в качестве аргумента размер массива.

C++ автоматически передает массивы функциям, используя моделируемый вызов по ссылке — вызываемые функции могут изменять значения элементов в исходных массивах источника вызова. Значение имени массива является адресом первого элемента массива. Поскольку в функцию передается начальный адрес массива, вызываемая функция знает, где хранится массив. Поэтому, когда вызываемая функция модифицирует элементы массива в теле функции, она модифицирует реальные элементы массива в их истинных ячейках памяти.

Хотя массивы как целое передаются моделируемым вызовом по ссылке, отдельные элементы массива передаются вызовом по значению подобно простым переменным. Такие отдельные простые элементы данных называются скалярами или скалярными параметрами. Чтобы передать в функцию элемент массива, используйте индексированное имя элемента массива как аргумент в вызове функции. В главе 5 мы покажем, как можно моделировать вызов по ссылке для скаляров (т.е. отдельных переменных и элементов массива).

Чтобы функция могла принять массив, переданный через вызов функции, список параметров функции должен указывать на необходимость принятия массива. Например, заголовок функции modifyArray мог бы быть записан как

void modifyArray(int b[], int arraySize)

указывая, что modifyArray ожидает принятия массива целых чисел в параметре b, и количество элементов массива в параметре arraySize. Размер массива в квадратных скобках указывать не нужно. Если он включен, компилятор его проигнорирует. Поскольку массивы передаются моделируемым вызовом по ссылке, то вызываемая функция, используя имя массива b, в действительности будет работать с истинным массивом в источнике вызова (массив hourlyTemperatures в предыдущем вызове).

Отметим необычный вид прототипа функции для modifyArray

void modifyArray (int [], int); Этот прототип мог бы быть записан в виде void modifyArray (int anyArrayName[], int anyVariableName)

но, компиляторы C++ игнорируют имена переменных в прототипах.

Напомним, что прототип сообщает компилятору количество аргументов и типы каждого аргумента (в порядке их ожидаемого появления).

Программа на рис. 14 демонстрирует различие между передачей всего массива и его отдельных элементов. Программа сначала печатает пять элементов массива целых чисел а. Далее массив а и его размеры передаются функции modifyArray, где каждый элемент массива а умножается на 2. Затем а повторно печатается в main. Как показывают выходные данные, элементы а действительно модифицируются функцией modifyArray. Затем программа печатает значение а[3] и передает его функции modifyElement. Функция modifyElement умножает свой аргумент на 2 и печатает его новое значение. Заметим, что при повторной печати элемента а[3] в main он не модифицировался, потому что отдельные элементы массива передаются вызовом по значению.

В ваших программах возможна ситуация, когда функции нельзя позволять модифицировать элементы массива. Поскольку массивы всегда передаются моделируемым вызовом по ссылке, модификацией значений в массиве управлять затруднительно. C++ имеет спецификацию типа const для предотвращения модификации значений массива в функции. Когда параметр массив предварен спецификатором const, элементы массива в теле функции становятся постоянными и любая попытка модифицировать элементы массива в теле функции приводит к ошибке при трансляции. Сообщение об этой ошибке дает программисту возможность исправить программу так, чтобы она не пыталась модифицировать элементы массива.

Программа на рис.15 демонстрирует спецификацию const. Функция tryToModifyArray определяется с параметром const int b[ ], который указывает, что массив b — постоянный и не может быть модифицирован. В выходных данных показаны сообщения об ошибках, вырабатываемые компилятором Borland C++. Каждая из трех попыток функции модифицировать элементы массива приводит к ошибке компилятора «Постоянный объект не может быть модифицирован».

Рис.14 – Передача функциям массивов и отдельных элементов массива (часть 1 из 3)

Рис.14 – Передача функциям массивов и отдельных элементов массива (часть 2 из 3)

Рис.14 – Передача функциям массивов и отдельных элементов массива (часть 3 из 3)

Рис.15 – Демонстрация спецификации типа const

 

Сортировка массивов

Сортировка данных (т.е. размещение данных в определенном порядке, таком как возрастание или уменьшение) является одним из наиболее важных применений компьютеров. Банк сортирует все чеки по номеру счета, чтобы в конце каждого месяца можно было подготовить индивидуальные банковские отчеты. Телефонные компании сортируют свои списки счетов по фамилиям, а внутри них — по имени и отчеству, что позволяет легко найти номера телефонов. В сущности, каждая организация должна сортировать некоторые данные, а во многих случаях очень значительные объемы данных. Сортировка данных представляется интригующей проблемой, которая является объектом наиболее интенсивных исследований в области компьютерных наук. В этой главе мы обсудим простейшие известные способы сортировки.

Программа на рис.16 сортирует значения массива а из 10 элементов в возрастающем порядке. Используемая при этом техника получила название пузырьковая сортировка или сортировка погружением, потому что наименьшее значение постепенно «всплывает», продвигаясь к вершине (началу) массива, подобно пузырьку воздуха в воде, тогда как наибольшее значение погружается на дно (конец) массива. Этот прием требует нескольких проходов по массиву. При каждом проходе сравнивается пара следующих друг за другом элементов. Если пара расположена в возрастающем порядке или элементы одинаковы, то мы оставляем значения как есть. Если же пара расположена в убывающем порядке, значения меняются местам в массиве.

Сначала программа сравнивает а[0] и а[1], затем а[1] и а[2], потом а[2] и а[3] и т.д. до тех пор, пока проход не закончится сравнением а[8] и а[9]. Хотя элементов 10, производится только девять сравнений. При выбранном способе последовательных сравнений большое значение может перемещаться в массиве вниз на много позиций за один проход, но малое значение может быть передвинуто вверх только на одну позицию. При первом проходе наибольшее значение гарантированно опустится на место нижнего элемента массива а[9]. При втором проходе второе наибольшее значение гарантированно опустится на место а[8]. При девятом проходе девятое наибольшее значение опустится на место а[1]. Это оставляет наименьшему значению место а[0], так что для сортировки массива из 10 элементов нужно только девять проходов.

Сортировка выполняется с помощью вложенного цикла for. Если необходима перестановка, она выполняется тремя присваиваниями

hold = a [i];

а [ i ] = а [ i + 1 ];

a[i + 1] = hold;

где дополнительная переменная hold временно хранит одно из двух переставляемых значений. Перестановку нельзя выполнить двумя присваиваниями

a[i] = а [i + 1];

а [ i + 1] = а [ i ];

Если, например, a[i] равно 7, a a[i + 1] равно 5, то после первого присваивания оба значения будут 5, а значение 7 будет потеряно. Следовательно, необходима дополнительная переменная hold.

Главное достоинство пузырьковой сортировки заключается в простоте ее программирования. Однако, пузырьковая сортировка выполняется медленно. Это становится очевидным при сортировке больших массивов. В упражнениях мы разработаем более эффективные варианты пузырьковой сортировки и введем некоторые гораздо более эффективные, чем пузырьковый, способы сортировки. В более серьезных курсах по методам вычислений сортировка и поиск изучаются более углубленно.

Рис.16 – Пузырьковая сортировка массива (часть 1 из 2)

Рис.16 – Пузырьковая сортировка массива (часть 1 из 2)

 

Учебный пример: вычисление среднего значения, медианы и моды с использованием массивов

Часто компьютеры используются для обработки и анализа результатов обследований и голосований. Программа на рис.17 использует массив response, которому в качестве начальных значений присвоено 99 (размер представлен именованной константой responseSize) значений ответов при обследовании. Каждый ответ является числом от 1 до 9. Программа вычисляет среднее значение, медиану и моду 99 значений.

Среднее — это среднее арифметическое 99 значений. Функция mean вычисляет среднее путем суммирования 99 элементов и деления результата на 99.

Медиана — это «середина». Функция median определяет медиану, вызывая функцию bubbleSort, чтобы отсортировать массив ответов в порядке их возрастания, и выбирая средний элемент answer[responseSize / 2] отсор-- тированного массива. Заметим, что если массив содержит четное число элементов, медиана должна вычисляться как среднее значение двух элементов в середине массива. Функция median этой возможности не обеспечивает. Функция print Array вызывается для вывода на экран массива response.

Мода — это наиболее часто встречающееся значение среди 99 ответов. Функция mode определяет моду, подсчитывая количество ответов каждого типа и выделяя затем наиболее часто встречающийся ответ. Этот вариант функции mode не обрабатывает случай равного числа нескольких ответов (см. упражнение 14). Функция mode строит также гистограмму, чтобы помочь определить моду графически. Рис.18 содержит выходную информацию прогона программы. Этот пример включает наиболее общие операции, необходимые обычно при работе с массивами, включая передачу массивов функциям.

Рис.17 – Программа анализа данных обследования (часть 1 из 3)

Рис.17 – Программа анализа данных обследования (часть 2 из 3)

Рис.17 – Программа анализа данных обследования (часть 2 из 3)

 

Многомерные массивы

Массивы в C могут иметь много индексов. Обычным представлением многомерных массивов являются таблицы значений, содержащие информацию в строках и столбцах. Чтобы определить отдельный табличный элемент, нужно указать два индекса: первый (по соглашению) указывает номер строки, а второй (по соглашению) указывает номер столбца. Таблицы или массивы, которые требуют двух индексов для указания отдельного элемента, называются двумерными массивами. Заметим, что многомерный массив может иметь более двух индексов. Компиляторы C поддерживают по меньшей мере 12- мерные массивы. Рис. 21 иллюстрирует двумерный массив а. Массив содержит три строки и четыре столбца, так что, как говорят, — это массив три на четыре. Вообще, массивы с m строками и n столбцами называют массивами m на n. Каждый элемент в массиве а определяется именем элемента в форме а[ i 1 [ j 1; а — это имя массива, a i и j — индексы, которые однозначно определяют каждый элемент в а. Заметим, что имена элементов первой строки имеют первый индекс 0; имена элементов в четвертом столбце имеют второй индекс 3.

Рис.21 – Двумерный массив с тремя строками и четырьмя столбцами

 

Резюме

C++ хранит списки значений в массивах. Массив — это последовательная группа связанных ячеек памяти. Эти ячейки связаны тем, что все они имеют одно и то же имя и один и тот же тип. Чтобы сослаться на отдельную ячейку или элемент массива, нужно указать имя массива и индекс.

Индекс может быть целым числом или целым выражением. Если программа использует в качестве индекса выражение, то выражение вычисляется, чтобы определить конкретный элемент массива.

Важно различать ссылку на седьмой элемент массива и элемент массива семь. Седьмой элемент массива имеет индекс 6, тогда как элемент массива семь имеет индекс 7 (в действительности, это восьмой элемент массива). Это источник ошибок типа завышения (или занижения) на единицу.

Массивы занимают место в памяти. Чтобы зарезервировать память для 100 элементов массива целых значений b и 27 элементов массива целых значений х, программист пишет int b [100], х [27];

Массив типа char можно использовать для хранения строки символов.

Элементам массива можно задавать начальные условия тремя способами: в объявлении, присваиванием или при вводе.

Если в списке инициализации начальных значений меньше, чем элементов массива, остающиеся элементы массива принимают нулевые начальные значения.

C++ не предотвращает ссылок на элементы, находящиеся за пределами массива. • Массиву символов можно задавать начальные условия, используя литеральную константу. • Все строки заканчиваются нулевым символом (’\0’).

Символьным массивам можно задавать начальные значения с помощью символьных констант в списке инициализации.

К отдельным символам строки, хранящимся в массиве, можно обращаться прямо, используя запись индексов массива.

Для передачи массива функции нужно передать ей имя массива. Чтобы передать функции единственный элемент массива, просто передайте имя массива и после него индекс (заключенный в квадратные скобки) данного элемента.

Массивы передаются функциям с помощью моделируемого вызова по ссылке — вызываемые функции могут модифицировать значения элементов в исходных массивах оператора вызова. Значение имени массива — это адрес первого элемента массива. Поскольку в функцию передается начальный адрес массива, вызываемая функция знает, где хранится массив.

Чтобы принять аргумент-массив, список параметров функции должен указывать, что передается массив. Размер массива в скобках после имени массива указывать не обязательно.

В C++ имеется спецификация типа const, которая запрещает модификацию значений массива в функции. Когда параметру-массиву предшествует спецификатор const, элементы массива становятся константами в теле функции и любая попытка модифицировать элементы массива внутри тела функции приводит к ошибке трансляции.

Массив можно сортировать, используя технику пузырьковой сортировки. Выполняется несколько проходов массива. На каждом проходе сравниваются пары последовательных элементов. Если элементы пары расположены в нужном порядке (или элементы равны), они оставляются на своих местах. Если требуемый порядок нарушен, значения переставляются местами. Для небольших массивов пузырьковая сортировка приемлема, но для больших массивов она неэффективна по сравнению с другими, более сложными алгоритмами сортировки.

Линейный поиск сравнивает каждый элемент массива с ключом поиска. Поскольку в массиве нет определенного порядка, одинаково вероятно, что значение будет найдено как в первом элементе, так и в последнем. Поэтому в среднем программа должна сравнить с ключом поиска половину элементов массива. Метод линейного поиска хорошо работает для небольших массивов и применим для несортированных массивов.

Двоичный поиск исключает половину элементов массива после каждого сравнения. Алгоритм выделяет средний элемент массива и сравнивает его с ключом поиска. Если они равны, ключ поиска найден и возвращается индекс массива этого элемента. В противном случае задача поиска сокращается на половину массива.

В наихудшем случае двоичный поиск в массиве из 1024 элементов потребует всего 10 сравнений.

Массивы можно использовать для представления таблиц значений, содержащих информацию, расположенную в виде строк и столбцов. Для идентификации отдельного элемента таблицы указываются два индекса: первый (по соглашению) определяет строку, в которой находится элемент, а второй (по соглашению) определяет столбец, содержащий этот элемент. Таблицы или массивы, требующие для идентификации отдельного элемента указания двух индексов, называются двумерными массивами.

Когда мы передаем одномерный массив в качестве аргумента функции, в списке параметров функции скобки массива могут быть пусты. Размерность первого индекса многомерного массива тоже не нужно указывать, но размерности всех последующих индексов указывать необходимо. Компилятор использует эти размерности для того, чтобы определить расположение в памяти элементов многомерного массива.

Чтобы передать функции одну строку двумерного массива, которая принимается как одномерный массив, просто передается имя массива и вслед за ним первый индекс.

 

Терминология


Упражнения для самопроверки

Тема 1.4 Массивы

Лекции

1. Одномерные массивы (последовательности): описание, инициализация, основные приемы обработки (2 часа)

2. Двумерные массивы (матрицы): описание, инициализация, основные приемы обработки (2 часа)

3. Символьные строки (2 часа)

Практические занятия

1. Обработка одномерных массивов (4часа)

2. Обработка двумерных массивов (4 часа)

3. Обработка символьных строк (4 часа)

Контрольная работа (4 часа)

Массив — это последовательная группа ячеек памяти, имеющих одинаковое имя и одинаковый тип. Чтобы сослаться на отдельную ячейку или элемент массива, мы указываем имя массива и номер позиции отдельного элемента массива. На рис.1 показан массив целых чисел, названный с. Этот массив содержит 12 элементов. На любой элемент массива можно сослаться, указывая имя массива и номер позиции элемента, заключенный в квадратные скобки ([ ]). Первый элемент каждого массива — это нулевой элемент. Таким образом, первый элемент массива с, указывают как с[0], второй элемент — как с[1], седьмой — как с[6] и вообще i-ый элемент массива с указывают как C[i-1]. Имена массивов должны удовлетворять тем же требованиям, которые предъявляются к другим именам переменных.

Рис.1 – Массив из 12-ти элементов

 

Номер позиции, указанный внутри квадратных скобок, называется индексом. Индекс должен быть целым числом или целым выражением. Если программа использует выражение в качестве индекса, то выражение вычисляется с целью определения индекса. Например, если мы предположим, что переменная а равна 5, а переменная b равна 6, то оператор с[а + Ь] += 2;

добавляет 2 к элементу массива с[11]. Заметим, что имя индексированного массива является целой L-величиной — оно может быть использовано в левой части оператора присваивания. Проанализируем массив с на рис.1 более детально. Имя массива — это с. Его двенадцать элементов обозначены как с[0], с[1], с[2],...,с[11]. Значение с[0] равно 45, значение с[1] равно 6, значение с[7] равно 62, значение с[11] равно 78. Чтобы напечатать сумму значений, содержащихся в первых трех элементах массива с, мы должны были бы написать co u t < < с [ 0 ] + с [ 1 ] +с[2] << e n d l; Чтобы разделить значение седьмого элемента массива с на 2 и присвоить результат переменной х, мы должны были бы написать х = с [6] / 2;

 

Типичная ошибка программирования 1

Важно отметить различие между «седьмым элементом массива» и «элементом массива семь». Поскольку индексы массива начинаются с 0, «седьмой элемент массива» имеет индекс шесть, тогда как «элемент массива семь» имеет индекс 7 и на самом деле является восьмым элементом массива. Это — источник ошибок типа завышения (или занижения) на единицу.

Квадратные скобки, внутри которых записывается индекс массива, на самом деле рассматриваются в C++ как операция индексации. Квадратные скобки имеют тот же уровень старшинства, что и круглые скобки. Таблица на рис.2 показывает приоритеты и ассоциативность тех операций, с которыми мы уже познакомились к настоящему моменту. Операции расположены сверху вниз в порядке понижения старшинства с указанием их ассоциативности и типа.

Рис.2 – Приоритеты и ассоциативность операций

 

Объявление массивов

Массивы занимают область в памяти. Программист указывает тип каждого элемента, количество элементов, требуемое каждым массивом, и компилятор может зарезервировать соответствующий объем памяти. Чтобы указать компилятору зарезервировать память для 12 элементов массива целых чисел с, используется объявление

int с [12];

Память может быть зарезервирована для нескольких массивов с помощью одного объявления. Следующее объявление резервирует память для 100 элементов массива целых чисел b и 27 элементов массива целых чисел х.

int b [100], х [27];

Массивы могут быть объявлены и для хранения других типов данных. Например, для хранения строки символов можно использовать массив типа char.

Примеры использования массивов

 

В программе на рис.3 используется структура повторения for для присвоения начальных нулевых значений элементам массива п, содержащего десять целых чисел, и для печати массива в табулированном формате. Первый оператор вывода выводит на экран заголовки столбцов, печатаемых структурой for. Напомним, что setw указывает ширину поля, в котором будет выведено следующее значение.

Рис.3 – Присваивание нулевых начальных значений элементам

 массива (часть 1 из 2)

Рис.3 – Присваивание нулевых начальных значений элементам

массива (часть 2 из 2)

 

Элементам массива можно присваивать начальные значения (инициализировать их) в объявлении массива с помощью следующего за объявлением списка (заключенного в фигурные скобки) одинаковых по смыслу и разделенных запятыми начальных значений. Программа на рис.4 присваивает десять начальных значений элементам массива целых чисел и печатает массив в табулированном формате.

Если начальных значений меньше, чем элементов в массиве, оставшиеся элементы автоматически получают нулевые начальные значения. Например, элементам массива n на рис.3 можно присвоить нулевые начальные значения с помощью объявления

int n [10] = {0 };

которое явно присваивает нулевое начальное значение первому элементу и неявно присваивает нулевые начальные значения оставшимся девяти элементам, потому что здесь начальных значений меньше, чем элементов массива. Напомним, что автоматически массивы не получают нулевые начальные значения неявно. Программист должен присвоить нулевое начальное значение, по крайней мере, первому элементу для того, чтобы автоматически были обнулены оставшиеся элементы. Метод, использованный на рис.3, можно применять повторно во время выполнения программы.

Типичная ошибка программирования 2

Забывают присвоить начальные значения элементам массива, требующим такого присваивания.

Рис.4 – Присваивание начальных значений элементам массива в

объявлении (часть 1 из 2)

Рис.4 – Присваивание начальных значений элементам массива в

объявлении (часть 2 из 2)

 

Следующее объявление массива

int n [5] = {32, 27, 64, 18, 95, 14};

вызвало бы синтаксическую ошибку, поскольку здесь список инициализации содержит шесть начальных значений, а массив имеет только 5 элементов.



Поделиться:


Последнее изменение этой страницы: 2021-04-14; просмотров: 77; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.143.9.115 (0.11 с.)