Опубликован: 14.12.2010 | Доступ: свободный | Студентов: 3125 / 711 | Оценка: 4.53 / 4.12 | Длительность: 26:28:00
Лекция 7:

Символьные массивы в языке С. Работа со строками

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >

Задание 7

  1. Условие оператора while сделайте короче.
  2. Ввести свою фамилию (буквами латинского алфавита), год рождения (числом), месяц рождения (словом) и приблизительный свой вес с точностью до долей килограмма. Результат выполнения программы занесите в отчет лабораторной работы.
  3. Вместо переменных и массива типа double примените тип float. Проверьте работоспособность программы.
  4. Вместо оператора break примените оператор безусловного перехода goto. Проверьте работоспособность программы.
  5. Напишите программу при вводе строки с несколькими словами и одним числом (с десятичной точкой или без нее).
  6. Напишите программу при вводе строки с несколькими словами и тремя числами (с десятичной точкой или без нее).

Пример 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.

Пример определения подстроки в строке

Рис. 6.8. Пример определения подстроки в строке

Задание 8

  1. Условие нахождения подстроки в строке выполните с помощью оператора goto.
  2. В случае положительного поиска подстроки в строке, определите количество итераций цикла с предельным значением 1000.
  3. Предусмотрите, чтобы вводимые буквы могли быть и нижнего и верхнего регистров.
  4. В программе сделайте ввод с клавиатуры количество циклов формирования строки, в которой следует найти заданную подстроку.
  5. Сделайте поиск подстроки в строке, которую сформировали случайно один раз. Если подстроки не будет найдено, предусмотрите ввод количество попыток поиска для генерируемых строк (в 15 символов).

Контрольные вопросы

  1. Какой размер одномерного символьного массива должен быть объявлен для записи в него строки из 5 символов?
  2. Как организуются многомерные символьные массивы в языке С?
  3. Как организуется индексирование символьных массивов в языке С?
  4. На кого или на что возлагается контроль границ символьных массивов в языке С?
  5. Как следует объявить символьный массив для записи в него трех строк различной длины?
  6. Как следует организовать посимвольное заполнение одномерного массива?
  7. Сколько потребуется операторов цикла для вывода на консоль двухмерного символьного массива (строк различной длины)?
  8. Какие функции используются для считывания с консоли символьных массивов?
  9. Для каких функций включаются в программу заголовочные файлы ctype.h и string.h?
  10. Что такое лексиграфическое упорядочивание строк?
  11. Чем отличается сравнение строк при помощи оператора "==" (равно) и функции strcmp()?
< Лекция 6 || Лекция 7: 12345 || Лекция 8 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов