Опубликован: 14.12.2010 | Уровень: для всех | Доступ: свободно
Лекция 7:
Символьные массивы в языке С. Работа со строками
Задание 7
- Условие оператора while сделайте короче.
- Ввести свою фамилию (буквами латинского алфавита), год рождения (числом), месяц рождения (словом) и приблизительный свой вес с точностью до долей килограмма. Результат выполнения программы занесите в отчет лабораторной работы.
- Вместо переменных и массива типа double примените тип float. Проверьте работоспособность программы.
- Вместо оператора break примените оператор безусловного перехода goto. Проверьте работоспособность программы.
- Напишите программу при вводе строки с несколькими словами и одним числом (с десятичной точкой или без нее).
- Напишите программу при вводе строки с несколькими словами и тремя числами (с десятичной точкой или без нее).
Пример 8. Напишите программу, в которой генерируется строка символов заданного размера (более трех) и для которой определяется подстрока из трех символов, вводимой пользователем. В случае, когда подстрока не обнаружена, предусмотреть генерирование случайной строки поиска 1000 раз, и программа должна искать подстроку до первого совпадения.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
int main (void) {
int i, j, k, n,
N = 1000,
numA, numZ,
in,
ch_box[3];
char str[16],
str2[4];
srand((unsigned)time(NULL));
numA = (int)'a'; // числовой код латинской буквы а
numZ = (int)'z'; // числовой код латинской буквы z
printf("\n Enter a string of 3 letters: ");
in = scanf_s("%s", str2, sizeof(str2));
if ( in == 0 )
{
printf("\n Error input. Print any key: ");
_getch();
exit(1);
}
printf("\n\t substring is \"%s\"\n", str2);
for (n = 0; n < N; n++) {
for (i = 0; i < 15; i++)
str[i] = numA + rand() % (numZ - numA) + 1;
str[i] = '\0';
k = 0;
for (i = 0; i < 13; i++)
if (str2[0] == str[i] && str2[1] == str[i+1] && \
str2[2] == str[i+2])
{
ch_box[0] = i; ch_box[1] = i+1; ch_box[2] = i+2;
k++;
break; }
if (k > 0)
break;
}
if (k == 0)
printf("\n\t \"%s\" not found", str2);
else
printf("\n Substring \"%s\" found at positions %d, %d, %d", \
str2, ch_box[0]+1, ch_box[1]+1, ch_box[2]+1);
puts("\n");
for (k = 0; k < 15; k++)
printf(" %3d)", k+1);
puts("");
for (j = 0; j < 15; j++)
printf(" %3c ", str[j]);
printf("\n\n ... Press any key: ");
_getch();
return 0;
}букв. Интервал чисел определяется между кодом буквы 'a' и кодом буквы 'z'.
Возможный положительный результат выполнения программы показан на рис. 6.8.
Задание 8
- Условие нахождения подстроки в строке выполните с помощью оператора goto.
- В случае положительного поиска подстроки в строке, определите количество итераций цикла с предельным значением 1000.
- Предусмотрите, чтобы вводимые буквы могли быть и нижнего и верхнего регистров.
- В программе сделайте ввод с клавиатуры количество циклов формирования строки, в которой следует найти заданную подстроку.
- Сделайте поиск подстроки в строке, которую сформировали случайно один раз. Если подстроки не будет найдено, предусмотрите ввод количество попыток поиска для генерируемых строк (в 15 символов).
Контрольные вопросы
- Какой размер одномерного символьного массива должен быть объявлен для записи в него строки из 5 символов?
- Как организуются многомерные символьные массивы в языке С?
- Как организуется индексирование символьных массивов в языке С?
- На кого или на что возлагается контроль границ символьных массивов в языке С?
- Как следует объявить символьный массив для записи в него трех строк различной длины?
- Как следует организовать посимвольное заполнение одномерного массива?
- Сколько потребуется операторов цикла для вывода на консоль двухмерного символьного массива (строк различной длины)?
- Какие функции используются для считывания с консоли символьных массивов?
- Для каких функций включаются в программу заголовочные файлы ctype.h и string.h?
- Что такое лексиграфическое упорядочивание строк?
- Чем отличается сравнение строк при помощи оператора "==" (равно) и функции strcmp()?
