Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DOROGOVA.pdf
Скачиваний:
245
Добавлен:
05.06.2015
Размер:
853.4 Кб
Скачать

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

Подводя итог всего сказанного, отметим, что вопрос о проверке допустимости индексов массива оставлен на рассмотрение программиста, при необходимости можно определить пользовательский тип "массив" и заложить в программу проверку пересечения его границ.

5.6. Приемы работы с массивами в вычислительных задачах

Пример: Задать сначала количество элементов массива, а затем и сам массив (данные ввести с клавиатуры). Вычислить его сумму.

#include <stdio.h> void main

{

int i , j , n=1;

float s , b , x[100] ; while (n>100)

{printf ("\n Введите количество элементов (меньше\ 100): "); scanf ("%d ",&n);

}

printf ("Введите значение элементов: \n"); for (b=0.0 , i=0 ; i<n ; i++)

{printf ("x[%d]= ",i) ; scanf ("%f ",&x[i]) ;

s=s+x[i] ; // вычисление суммы массива

}

printf ("\n сумма массива=%f ",s) ;

}

Результат работы программы:

Введите количество элементов (меньше 100): Введите значение элементов:

x[0] = 8 x[1] = 7 x[2] = 6 x[3] = 5 x[4] = 4

Сумма массива=30.

Пример: Ввести ежедневные данные о температуре в массив (ввод с клавиатуры). Вычислить среднее арифметическое значение элементов введенного массива.

void main()

{

// количество дней в месяце (размер массива) int month[31];

int i, sum; float mid; sum = 0.0;

for (i = 0; i < 31; i++) // ввод значений температуры

{

printf("Введите значение температуры t%d= ", i); scanf("%d", &temp[i]);

}

/*подсчет среднего арифметического*/ for (i = 0; i < 31; i++)

sum += month [i]; mid = sum / 31.0;

printf("Среднее значение температуры составляет: %f\n", mid);

}

В первом цикле for(…) вводятся данные в массив month[]. Обратите внимание на то, что цикл содержит две строки, первая из которых, функция printf(…) является, так называемым "приглашением"-

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

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

Представленный алгоритм решения имеет один недостаток. Как известно, количество дней в различных месяцах варьируется от 28 до 31. Программа же не делает различий и всегда требует ввести 31 значение, что не позволяет провести правильный ввод данных, а следовательно, и расчет будет неверен. Этот недостаток легко исправляется введением граничного значения при вводе данных. В следующем примере процедура ввода прекратится, когда окажутся, введены значения всех элементов массива, или раньше, если вы введете граничное значение 777. Такой алгоритм позволяет использовать любое количество элементов массива от 0 до 31.

Вместо цикла for предыдущей программы теперь используется цикл do...while, и инструкция i = 0; , которая выполняется в начале каждого цикла, чтобы индекс массива, всегда указывал на первый элемент.

void main()

{

int month[31]; int i, sum=0; float mid;

/*загрузка значений в массив*/ i = 0;

do

{

printf("Введите значение температуры t%d,\ для прекращения введите 777: ", i); scanf("%d", &month[i]);

}

while (i < 31 && month[i-1] != 777); /*подсчет среднего арифметического*/ index = 0;

do

{

sum += month[i]; i++;

}

while (i < 31 && month[i-1] != 777); mid = sum / i;

printf("Среднее значение температуры\ составляет: %f\n\n", mid);

}

Новым условием продолжения всех циклов do…while является логическое выражение

(i < 31 && month[i-1] != 777), которое истинно, то есть принимает ненулевое значение, если выполняется одно из условий:

i < 31 или month[i-1] != 777.

Пример: В двумерный массив последовательно записываются числа от 1 до 12. #include <iostream.h>

void main()

{int i,j,mas[3][4],num=1; for (i=0;i<3;i++)

{

for (j=0;j<4;j++,num++)

{mas[i][j]=num;

cout <<mas[i][j]<<'\t';

}

cout<<'\n';

}

}

В двумерном массиве позиция любого элемента определяется двумя индексами. Если представить его в виде матрицы, то один индекс означает строку, другой столбец. Если доступ к элементам массива предоставлять в порядке, в котором они реально хранятся в памяти, то правый индекс (j) будет изменяться быстрее, чем левый (i).

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

5.7. Строка как массив символов

Любая строка текста, например "чижик-пыжик, где ты был?", представляет собой массив символов. Во

внутреннем представлении компилятор завершает такой массив специальным граничным символом "\0", благодаря чему любая программа может легко обнаружить конец строки. Поэтому строка занимает в памяти на один символ больше, чем записано между двойными кавычками. Следует учитывать это обстоятельство при определении длины строки, а именно указывать количество элементов на единицу больше действительной длины строки.

Все правила работы с массивами, рассмотренные ранее, распространяются и на строки, в частности:

при определении строки вы присваиваете ей имя и указываете максимальное количество символов, которое может в ней содержаться;

нумерация элементов строки, то есть ее символов, начинается с нуля.

Пример: Объявление массива для хранения строки из 10-ти символов. char str[11];

Объявленный размер 11 позволяет сохранить нулевой символ.

Мы с вами уже пользовались строками, при выводе текстов на экран дисплея, например: printf("Hellow, World!"). "Hellow, World!" – это строчная константа или литерал, который всегда записывается в "двойных кавычках". Кавычки не являются частью строки, а служат только для ее ограничения. Компилятор автоматически помещает в конец литерала нулевой символ.

Пример: Внутреннее представление литерала "константа" – это массив символов с нулевым символом в конце.

'к' 'о' 'н' 'с' 'т' 'а' 'н' 'т' 'а' '\0'

Не путайте символьную константу, например 'x', со строкой, содержащей один символ – "x": 'x' – код символа х;

"x" – строка из 2-х символов ('х' '\0').

Литералы можно использовать для инициализации массива типа char, то есть строки текста, например: char str[] = "строка";

После чего элементы строки получают свои начальные значения: str[0] = 'с'

str[1] = 'т' str[2] = 'р' str[3] = 'о' str[4] = 'к' str[5] = 'а' str[6]= '\0'

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

Пример: Ввод и отображение строки. void main()

{

char str[60]; int i;

printf("Введите строку: "); scanf("%s", str);

for (i = 0; i < 60; i++) printf("%c\n", str[i]);

}

Формат %s функии scanf() позволяет вводить строку символов, ввод заканчивается после нажатия клавиши <ENTER>.

%s рассматривает строку как единое целое, поэтому не требует индексации массива str[], напротив формат %c в функции printf() работает с отдельными символами, поэтому требует перебора элементов строки в цикле с индексацией каждого элемента.

Если в действительности было введено меньше 60-ти символов, элементы массива, следующие за нулевым символом, содержат случайные величины.

Пример: Программа вычисляет среднюю (за неделю) температуру воздуха. Исходные данные должны вводиться во время работы программы.

// Вычисление средней (за неделю) температуры воздуха

#include <stdio.h> #include <conio.h>

void main ()

{

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

// названия дней недели мАссив строковых констант char *day[] = {"Понедельник","Вторник","Среда", "Четверг","Пятница","Суббота","Воскресенье"};

float t[7]; // температура

float sum; // сумма температур за неделю float sred; // средняя температура за неделю int i;

printf("\nВведите температуру воздуха:\n"); for (i = 0; i <= 6; i++)

{printf("%s->", day[i]); scanf("%f", &t[i]); sum += t [i]; i

}

sred = sum / 7;

printf("\nСредняя температура за неделю: %2.1f", sred); printf("\nДля завершения работы нажмите <Enter>");

getch();

}

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]