Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Нейбауэр А. Моя первая программа на С.doc
Скачиваний:
182
Добавлен:
02.05.2014
Размер:
3.75 Mб
Скачать

Слияние строк

Процедура слияния двух строк состоит в том, что символы, содержащиеся в одной строке, добавляются в конец другой, сдвигая нулевой символ. Этот процесс называется конкатенацией (concatenation). В стандарте языка Си K&R определена функция strcat(), работа которой продемонстрирована на рис.10.9. Символы из строки, которая передается функции в качестве второго параметра, добавляются в конец строки, передаваемой в качестве первого параметра.

Массивы строк

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

Двухмерный массив можно представить себе как таблицу, имеющую ряды и колонки. Такой массив следует определять с двумя индексами, один из которых определяет количество рядов таблицы, а второй устанавливает количество колонок. Ниже приведены инструкции, определяющие массив, имеющий 10 рядов и 20 колонок, то есть содержащий 200 целочисленных переменных:

int table[10][20];

Представим себе каждый элемент как целое число, занимающее собственную

Рис. 10.10. Определение массива строк

клеточку в таблице 10Ф20. Элемент table[0][0] находится в левом верхнем углу таблицы, а элемент table[0][1] занимает соседнюю клетку справа в том же ряду.

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

char names[10][20];

задает десять строковых переменных names длиной не больше 19 символов в каждой (рис.10.10).

Если вы хотите задавать строки путем ввода значений отдельных символов, следует использовать вложенные циклы. Внешний цикл будет повторяться 10 раз, по одному на каждую строку, а внутренний должен иметь 19 повторов для ввода значений одной строки. На рис.10.11 приведена программа, в которой вводятся значения 10 имен (строковых переменных) в массив, а затем все эти 10 строк с помощью цикла for последовательно выводятся на экран.

Для того чтобы ввести символ в строку, необходимо использовать оба индекса:

name[index][index2] = letter;

Первый индекс указывает номер нужной строки внутри массива, а второй определяет позицию символа внутри строки. Например, на рис.10.12 элемент name[0][3] является четвертым символом (буква м) первой строки ("Адам") в

Рис. 10.11. Программирование массива строк

Рис. 10.12. Строки и элементы массива строк

массиве имен. Чтобы вывести на экран строку целиком, нужен только один индекс, указывающий номер строки:

puts(name[index]);

К счастью, Си и Си++ позволяют ввести всю строку как единое целое, используя только один цикл, повторяющийся по одному разу на каждую строку массива:

main()

{

char name[10][20];

int index;

for (index = 0; index < 10; index++)

gets(name[index]);

for (index = 0; index < 10; index++)

puts(name[index]);

}

Проектирование программы

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

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

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

<>

Вопросы

  1. Что такое массив?

  2. Может ли массив содержать переменные нескольких типов?

  3. Как вы будете определять массив?

  4. Что такое двухмерный массив?

  5. Как вы будете определять двухмерный массив?

  6. Какова взаимосвязь между значением индекса и значением элемента массива?

  7. Как сравнить две строки?

  8. Как присвоить значение строковой переменной?

<>

Упражнения

  1. Напишите программу, в которой массивы используются для хранения имен, адресов и номеров телефонов 20 человек.

  2. Внесите в программу из упражнения 1 изменения так, чтобы иметь возможность ввода имени и последующего просмотра массива в поисках номера телефона соответствующего человека.

  3. Объясните, почему следующая программа написана неправильно:

main()

{

int temps(31);

int index, total;

for (index = 0; index < 31; index++)

{

printf("Введите значение температуры #%d: ", index);

scanf("%d", &temps(index));

}

high = temps(0);

low = temps(0);

index = 1;

while (index < 31)

{

if (temps(index) > high)

high = temps(index);

else

low = temps(index);

index++;

}

printf("Минимальное значение температуры равно %d\n", low);

printf("Максимальное значение температуры равно %d\n", high);

}