ПРАКТИЧЕСКАЯ ЧАСТЬ. Пример 1. Написать программу определения длины заданных строк и их распечатки, а также определения размера строк в байтах.
Пример 1. Написать программу определения длины заданных строк и их распечатки, а также определения размера строк в байтах. Для решения поставленной задачи применим библиотечную функцию strlen() и оператор sizeof. Программный код решения примера
В программе функция strlen() возвращает длину строки, причем последняя должна заканчиваться символом окончания строки [2]. Символ конца строки не учитывается. Для работы с функцией strlen() необходимо подключить заголовок <string.h>. Оператор sizeof во время компиляции программы получает размер типа или значения. Для определения размера типа он используется со скобками, например sizeof(char), а для определения размера конкретного значения скобки могут не применяться. В программе использована функция puts(),которая записывает строку, адресуемую, например, параметром str, в стандартное выходное устройство – дисплей.Символ конца строки преобразуется в разделитель строк. Рис. 6.1. Определение длины и размерности строк Задание 1 1. В строке str2[] уберите символ завершения строки. Проанализируйте и объясните результат. 2. Вместо функций puts() примените функции printf(). 3. Задайте явную инициализацию строк как одномерных массивов. Сравните результаты длины и размерности строк. 4. При явной инициализации одномерных массивов в заданных строках не указывайте символы конца строки. Проанализируйте результат выполнения программы. 5. Напишите программу циклического заполнения символьного массива, соответствующего фамилии пользователя (студента). 6. Определите размерности типов char, int, float, double, long int, long double. Пример 2. Написать программу копирования одной заданной строки в другую. При решении используем библиотечную функцию strcpy_s(), для которой подключим заголовок <string.h>. Программный код решения примера
Рис. 6.2. Пример копирования строк Задание 2 1. В программе для строк добавьте символ окончания строки. Проанализируйте результат выполнения программы. 2. Скопированную строку выведите на экран дисплея с разрядкой (с пробелами) между символами. 3. Произведите копирование одной строки в другую при их задании через клавиатуру. 4. Введите с клавиатуры две строки, различающиеся одним символом. Напишите программу по определению индексов двух различных символов для введенных строк. Длину строк возьмите не менее 7 символов. 5. Произведите копирование одной строки в другую без применения функции strcpy(). 6. С клавиатуры введите свою фамилию (буквами латинского алфавита), выведите ее на консоль в прямом и обратном порядке, например Ivanov, vonavI. Пример 3. Написать программу преобразования десятичной системы счисления в двоичную. Исходное десятичное число считать целым без знака.
Программный код решения примера
В программе использован квалификатор (спецификатор) типа const, который указывает компилятору, что символьный массив не может изменяться в программе. Рис. 6.3. Перевод десятичного числа в двоичное число Задание 3 1. Проверьте работу программы с помощью инженерного калькулятора (см. calc через Пуск ® Выполнить). 2. Подсчитайте число итераций цикла для преобразования числа 13 в двоичное число. 3. Вместо цикла do – if примените цикл if. 4. Напишите программу преобразования двоичного числа в десятичное число. Проверьте работу программы с помощью инженерного калькулятора. 5. Напишите программу для преобразования десятичных чисел в числа с основанием 3 и 8. Пример 4. С помощью функции strcat() присоединить одну строку к другой с пробелом и без. Пусть имеются строки str1 и str2. Функция strcat() присоединяет к строке str1 копию строки str2 и завершает строку str1 нулевым символом [2]. Процесс присоединения называется конкатенацией. Программный код решения примера
Рис. 6.4. Результат конкатенации двух строк Задание 4 1. Дополните программу присоединением трех строк, например имени, отчества и фамилии пользователя с учетом необходимых пробелов. 2. Примените посимвольный ввод строк и произведите их конкатенацию с выводом на дисплей ее результата. 3. Произведите конкатенацию имени и фамилии пользователя с помощью операторов цикла, т. е. без помощи функции strcat_s(). Предусмотрите пробел между именем и фамилией. 4. Присоедините к своему имени свою фамилию, записанную в обратном порядке. Пример 5. Для заданного двухмерного символьного массива сравнить длину строк друг с другом и вывести результат сравнения: 1-я строка меньше или больше 2-й, строки равны между собой. Для сравнения используем библиотечную функцию strcmp(), которая сравнивает в лексикографическом порядке две строки и возвращает целое значение, зависящее от результата сравнения [2]. Если первая строка меньше второй, то возвращается значение меньше нуля, если строки равны (по длине), то возвращается нуль, если первая строка больше второй, то возвращается число больше нуля. Программный код решения примера
Рис. 6.5. Лексикографическое сравнение двух строк Задание 5 1. Произведите последовательное изменение букв во второй строке: каждую строчную букву замените прописной, записывая при этом оставшиеся буквы строчными. Проанализируйте результат выполнения программы. 2. Протестируйте программу при изменении длины одной из строк, т. е. когда в одной строке нет запятой. 3. Внесите изменения в программу для совпадения двух строк. 4. В символьный массив добавьте еще одну строку. Произведите сравнение между собой всех трех строк массива. 5. Напишите программу по выводу на консоль информации о человеке с помощью пароля, который вводится с клавиатуры. Информация должна содержать имя, фамилию, год, месяц и число рождения, место рождения. В качестве пароля возьмите свою фамилию с учетом регистра (т. е. прописные или строчные буквы). Пример 6. Написать программу создания символьного трехмерного массива, когда, например, на одной странице имеются три строки и на второй также три строки. Предусмотрите изменение регистра в выводе на экран строк, когда строчные буквы становятся прописными и наоборот. Для перевода регистра используем библиотечные функции tolower() и toupper() с подключением библиотеки <ctype.h>. Программный код решения примера
В программе используется трехмерный массив размера 3 × 2 × 80. Это означает, что прямоугольная таблица (массив) данных размера 3 × 80 как бы скрепляется 2 раза, например по заданному числу страниц. Следует обратить внимание на вывод страниц. В первом случае используется построчный со спецификатором %c, а во втором – посимвольный со спецификатором %c. Кроме того, в первом случае к заданному массиву обращение происходит только по одной размерности, а во втором – используются все три размерности массива. Третий размер (число 80) взят для того, чтобы выбранные строки не превышали ширину дисплея. Рис. 6.6. Вывод страничных данных трехмерного массива Задание 6 1. Примените функцию tolower() для перевода в строчные буквы. 2. Для построчного вывода 1-й страницы используйте две размерности заданного массива. 3. В программу добавьте нумерацию строк, например 1), 2), 3). 4. Предусмотрите вывод всей первой страницы, а для второй страницы – только 1-й и 3-й строк. 5. Напишите программу с обработкой трехмерного символьного массива размера 2 × 3 × 80. 6. Сделайте вывод строк с заглавными первыми буквами. Пример 7. В символьной строке находятся слова и два числа, разделенные пробелами или запятыми. Выделить из строки слова и числа, разместить их в отдельных массивах. При этом считанные числа и слова разместить в дополнительных символьных массивах. Вывести значения сформированных символьных массивов. Произвести преобразование строковых (символьных) чисел к числам с плавающей точкой (тип double). Если после десятичной точки находится нуль (или нули), то число определить как целое, в противном случае – как число с плавающей точкой. При решении примера используем библиотечные функции: isalpfa() для определения буквы во входном потоке (с подключением библиотеки ctype.h); isspace() – для определения пробелов во входном потоке (с подключением библиотеки ctype.h); isdigit() – для определения цифры во входном потоке (с подключением библиотеки ctype.h); atof() – для преобразования строки чисел в число с плавающей точкой (с подключением библиотеки stdlib.h); atoi() – для преобразования строки чисел в целое число (с подключением библиотеки stdlib.h); modf() – для выделения целой и дробной части числа (с подключением библиотеки math.h); strlen() – для определения длины строки (с подключением библиотеки string.h) [см.: 3].
Программный код решения примера
В программе функция modf() возвращает величину дробной части числа (переменная r) и целой части (от переменных b3, b4 взяты их адреса, т. е. &b3, &b4). Анализ массива с индексами цифр исходного символьного массива дает возможность выделить индексацию двух чисел входного потока. Функция gets_s() автоматически добавляет символ конца строки '\0', поэтому при объявлении размерности символьного массива следует предусмотреть одно место для '\0'. Для переносимости программ размерность массива в функции gets_s() определена с помощью функции sizeof(). Рис. 6.7. Пример выделения чисел из строки
Задание 7 1. Условие оператора if сделайте короче. 2. Введите свою фамилию (буквами латинского алфавита), год рождения (числом), месяц рождения (словом) и приблизительную массу с точностью до долей килограмма. 3. Вместо переменных и массива типа double примените тип float. Проверьте работоспособность программы. 4. Вместо оператора break примените оператор безусловного перехода goto. Проверьте работоспособность программы. 5. Напишите программу при вводе строки с несколькими словами и одним числом (с десятичной точкой или без нее). 6. Напишите программу при вводе строки с несколькими словами и тремя числами (с десятичной точкой или без нее). Пример 8. Написать программу, в которой генерируется строка символов заданного размера (более трех) и для которой определяется подстрока из трех символов, вводимая пользователем. В случае, когда подстрока не обнаружена, предусмотреть генерирование случайной строки поиска 1 000 раз, и программа должна искать подстроку до первого совпадения. Программный код решения примера
В программе случайная генерация букв происходит по их числовым кодам. Интервал чисел определяется между кодами букв 'a' и 'z'. Рис. 6.8. Пример определения подстроки в строке
Задание 8 1. Условие нахождения подстроки в строке выполните с помощью оператора goto. 2. В случае положительного поиска подстроки в строке определите количество итераций цикла с предельным значением 1 000. 3. Предусмотрите, чтобы вводимые буквы могли быть и нижнего и верхнего регистров. 4. В программе сделайте ввод с клавиатуры количества циклов формирования строки, в которой следует найти заданную подстроку. 5. Сделайте поиск подстроки в строке, которую сформировали случайно один раз. Если подстрока не будет найдена, предусмотрите ввод количества попыток поиска для генерируемых строк (в 15 символов). Контрольные вопросы 1. Какой размер одномерного символьного массива должен быть объявлен для записи в него строки из 5 символов? 2. Как организуются многомерные символьные массивы в языке С? 3. Как организуется индексирование символьных массивов в языке С? 4. Как следует объявить символьный массив для записи в него трех строк различной длины? 5. Как следует организовать посимвольное заполнение одномерного массива? 6. Сколько потребуется операторов цикла для вывода на консоль двухмерного символьного массива (строк различной длины)? 7. Какие функции используются для считывания с консоли символьных массивов? 8. Для каких функций включаются в программу заголовочные файлы ctype.h и string.h? 9. Что такое лексиграфическое упорядочивание строк?
|