Студопедия — ПРАКТИЧЕСКАЯ ЧАСТЬ. Пример 1. Написать программу определения длины заданных строк и их распечатки, а также определения размера строк в байтах.
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

ПРАКТИЧЕСКАЯ ЧАСТЬ. Пример 1. Написать программу определения длины заданных строк и их распечатки, а также определения размера строк в байтах.






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

Для решения поставленной задачи применим библиотечную функцию strlen() и оператор sizeof.

Программный код решения примера

#include <stdio.h> #include <conio.h> #include <string.h> int main (void) { char str[] = {'A','B','C','D','\0'}; char str2[] = "hello, world\0"; printf("\n\t The lines are:\n\n\t "); puts(str); printf("\t "); // Для отступа от края дисплея puts(str2); printf("\n\t The length of the 1st line (%c) is: %i\n", str, strlen(str)); printf("\t The size of the memory of the 1st line (%c) is: %i\n", str, sizeof str); printf("\n\t The length of 2-nd line (%c) is: %i\n", str2, strlen(str2)); printf("\t Memory size 2-nd line (%c) is: %i\n", str2, sizeof str2); printf("\n Press any key: "); getch(); return 0; }

В программе функция strlen() возвращает длину строки, причем последняя должна заканчиваться символом окончания строки [2]. Символ конца строки не учитывается. Для работы с функцией strlen() необходимо подключить заголовок <string.h>;. Оператор sizeof во время компиляции программы получает размер типа или значения. Для определения размера типа он используется со скобками, например sizeof(char), а для определения размера конкретного значения скобки могут не применяться.

В программе использована функция puts(),которая записывает строку, адресуемую, например, параметром str, в стандартное выходное устройство – дисплей.Символ конца строки преобразуется в разделитель строк.


Результат выполнения программы показан на рис. 6.1.

Рис. 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>;.

Программный код решения примера

#include <stdio.h> #include <conio.h> #include <string.h> int main (void) { char str1[] = "123456789"; char str2[] = "qwerty"; printf("\n\t The length of the line \"%c\" is: %d\n", str1, strlen(str1)); // Копирование с учетом размера str1 strcpy_s(str1, strlen(str1), str2); printf("\t After copying: "); puts(str1); printf("\n\t The length of the line \"%c\" is: %d\n", str1, strlen(str1)); printf("\n Press any key: "); getch(); return 0; }


Результат выполнения программы показан на рис. 6.2.

Рис. 6.2. Пример копирования строк

Задание 2

1. В программе для строк добавьте символ окончания строки. Проанализируйте результат выполнения программы.

2. Скопированную строку выведите на экран дисплея с разрядкой (с пробелами) между символами.

3. Произведите копирование одной строки в другую при их задании через клавиатуру.

4. Введите с клавиатуры две строки, различающиеся одним символом. Напишите программу по определению индексов двух различных символов для введенных строк. Длину строк возьмите не менее 7 символов.

5. Произведите копирование одной строки в другую без применения функции strcpy().

6. С клавиатуры введите свою фамилию (буквами латинского алфавита), выведите ее на консоль в прямом и обратном порядке, например Ivanov, vonavI.

Пример 3. Написать программу преобразования десятичной системы счисления в двоичную. Исходное десятичное число считать целым без знака.


 

Программный код решения примера

#include <stdio.h> #include <conio.h> int main (void) { const char D[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; int newNumber[80]; long int inputNumber; int i = 0, base = 2; printf("\n\t Enter a positive integer: "); scanf_s("%c", &inputNumber); // Прямой процесс преобразования десятичного числа в двоичное do { newNumber[i] = inputNumber % base; ++i; inputNumber /= base; } if (inputNumber!= 0); //Запись преобразованного числа в обратном порядке printf("\n\t Result after conversion: "); for (--i; i >= 0; --i) printf("%d", newNumber[i]); printf("\n\n Press any key: "); getch(); return 0; }

В программе использован квалификатор (спецификатор) типа const, который указывает компилятору, что символьный массив не может изменяться в программе.


Результат выполнения программы показан на рис. 6.3.

Рис. 6.3. Перевод десятичного числа в двоичное число

Задание 3

1. Проверьте работу программы с помощью инженерного калькулятора (см. calc через Пуск ® Выполнить).

2. Подсчитайте число итераций цикла для преобразования числа 13 в двоичное число.

3. Вместо цикла do – if примените цикл if.

4. Напишите программу преобразования двоичного числа в десятичное число. Проверьте работу программы с помощью инженерного калькулятора.

5. Напишите программу для преобразования десятичных чисел в числа с основанием 3 и 8.

Пример 4. С помощью функции strcat() присоединить одну строку к другой с пробелом и без.

Пусть имеются строки str1 и str2. Функция strcat() присоединяет к строке str1 копию строки str2 и завершает строку str1 нулевым символом [2]. Процесс присоединения называется конкатенацией.

Программный код решения примера

#include <stdio.h> #include <conio.h> #include <string.h> #define N 79 int main (void) { char str1[N+1], str2[N+1]; printf("\n\t Print 1 string of characters: "); gets_s(str1, N); // для MS Visual Studio printf("\t Print 2 string of characters: "); gets_s(str2, N); // для MS Visual Studio strcat_s(str1, N, str2); // для MS Visual Studio printf("\n\t Result after concatenation: %c\n", str1); printf("\n Press any key: "); getch(); return 0; }


Возможный результат выполнения программы представлен на рис. 6.4.

Рис. 6.4. Результат конкатенации двух строк


Задание 4

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

2. Примените посимвольный ввод строк и произведите их конкатенацию с выводом на дисплей ее результата.

3. Произведите конкатенацию имени и фамилии пользователя с помощью операторов цикла, т. е. без помощи функции strcat_s(). Предусмотрите пробел между именем и фамилией.

4. Присоедините к своему имени свою фамилию, записанную в обратном порядке.

Пример 5. Для заданного двухмерного символьного массива сравнить длину строк друг с другом и вывести результат сравнения: 1-я строка меньше или больше 2-й, строки равны между собой.

Для сравнения используем библиотечную функцию strcmp(), которая сравнивает в лексикографическом порядке две строки и возвращает целое значение, зависящее от результата сравнения [2]. Если первая строка меньше второй, то возвращается значение меньше нуля, если строки равны (по длине), то возвращается нуль, если первая строка больше второй, то возвращается число больше нуля.

Программный код решения примера

#include <stdio.h> #include <conio.h> #include <string.h> // для функции strcmp() #define n 2 #define m 80 int main (void) { int i, x; char str[n][m] = { "hello,", "Hello," }; printf("\n\t Array of strings:\n"); for (i = 0; i < n; ++i) printf("\t %d) %c\n\t (Length: %d)\n",i+1,str[i],strlen(str[i])); printf("\n\t Comparision of lines: "); for (i = 0; i < (n - 1); ++i) { x = strcmp(str[i], str[i+1]); printf("\n\t Return the function of \"strcmp()\": %d", x); if (x == 0) printf("\n\t Line %d is equal to %d-nd line.", i+1, i+2); else if (x > 0) printf("\n\t Line %d is not equal to %d-nd line.", i+1, i+2); else if (x < 0) printf("\n\t Line %d is not equal to %d-nd line.", i+1, i+2); } printf("\n\n Press any key: "); getch(); return 0; }


Результат выполнения программы показан на рис. 6.5.

Рис. 6.5. Лексикографическое сравнение двух строк

Задание 5

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

2. Протестируйте программу при изменении длины одной из строк, т. е. когда в одной строке нет запятой.

3. Внесите изменения в программу для совпадения двух строк.

4. В символьный массив добавьте еще одну строку. Произведите сравнение между собой всех трех строк массива.

5. Напишите программу по выводу на консоль информации о человеке с помощью пароля, который вводится с клавиатуры. Информация должна содержать имя, фамилию, год, месяц и число рождения, место рождения. В качестве пароля возьмите свою фамилию с учетом регистра (т. е. прописные или строчные буквы).

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

Для перевода регистра используем библиотечные функции tolower() и toupper() с подключением библиотеки <ctype.h>;.

Программный код решения примера

#include <stdio.h> #include <conio.h> #include <string.h> #include <ctype.h> #define n 3 #define m 2 #define N 79 int main (void) { int i, k; // Определение и инициализация символьного массива char str[n][m][N] = { {"department: fet", "Specialization: acouY"}, {"Course: 1st", "SURNAME: ivAnov"}, {"Group: 141", "nAmE: Peter"} }; // Построчный вывод 1-й страницы printf("\n\t 1 st page:\n"); for (i = 0; i < n; ++i){ printf("\t"); printf("%c\n", str[i]); } // Посимвольный вывод 2-й страницы printf("\n\t 2 nd page:\n"); for (i = 0; i < n; ++i) { printf("\t"); for (k = 0; k < N; ++k) printf("%c", toupper(str[i][m-1][k])); // или tolower() } printf("\n\n Press any key: "); getch(); return 0; }

В программе используется трехмерный массив размера 3 × 2 × 80. Это означает, что прямоугольная таблица (массив) данных размера 3 × 80 как бы скрепляется 2 раза, например по заданному числу страниц. Следует обратить внимание на вывод страниц. В первом случае используется построчный со спецификатором %c, а во втором – посимвольный со спецификатором %c. Кроме того, в первом случае к заданному массиву обращение происходит только по одной размерности, а во втором – используются все три размерности массива. Третий размер (число 80) взят для того, чтобы выбранные строки не превышали ширину дисплея.


Результат выполнения программы представлен на рис. 6.6.

Рис. 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].


 

Программный код решения примера

#include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <math.h> #define N 79 int main (void) { double r = 0.0, b3, b4; int i, j, k, m, n, A[N], n2, n3, n4; char str[N], str2[N], str3[N], str4[N]; // Множественная инициализация i = j = k = m = 0; // Обнуление символьных массивов for (n2 = 0; n2 < N; ++n2) str2[n2] = 0; for (n3 = 0; n3 < N; ++n3) str3[n3] = 0; for (n4 = 0; n4 < N; ++n4) str4[n4] = 0; printf("\n\t Print line with 2-nd numbers:\n\t "); gets_s(str, sizeof(str)/sizeof(str[0])); printf("\n\t The line is:\n"); printf("\t %c\n", str); if (str[i]!= '\0') { if (isalpha(str[i]) || isspace(str[i])) str2[j++] = str[i]; else if (isdigit(str[i]) || str[i] == '.') A[k++] = i; // массив индексов цифр потока else str2[j++] = str[i]; ++i; } printf("\n\t A string of words and symbols:\n\t"); puts(str2); if (k > 0) { n = 0; for (i = 0; i < k; ++i){ if (A[i + 1] - A[i] == 1) str3[n++] = str[A[i]]; else if (A[i+1] - A[i] > 1) {m = A[i+1]; str3[n++] = str[A[i]]; break;} } } printf("\n"); if (n > 0) { r = modf(atof(str3), &b3); if (!r) // если не нуль printf("\t The number is an integer: %d", atoi(str3)); else printf("\t The number is real (double): %lf\n", atof(str3)); } if (m > 0) { j = 0; for (i = m; i <= A[k - 1]; ++i) str4[j++] = str[i]; r = modf(atof(str4), &b4); if (!r) // если не ноль printf("\t The number is an integer: %d", atoi(str4)); else printf("\t The number is real (double): %lf\n", atof(str4)); } printf("\n\n Press any key: "); getch(); return 0; }

В программе функция modf() возвращает величину дробной части числа (переменная r) и целой части (от переменных b3, b4 взяты их адреса, т. е. &b3, &b4). Анализ массива с индексами цифр исходного символьного массива дает возможность выделить индексацию двух чисел входного потока. Функция gets_s() автоматически добавляет символ конца строки '\0', поэтому при объявлении размерности символьного массива следует предусмотреть одно место для '\0'. Для переносимости программ размерность массива в функции gets_s() определена с помощью функции sizeof().


Возможный результат выполнения программы показан на рис. 6.7.

Рис. 6.7. Пример выделения чисел из строки


 

Задание 7

1. Условие оператора if сделайте короче.

2. Введите свою фамилию (буквами латинского алфавита), год рождения (числом), месяц рождения (словом) и приблизительную массу с точностью до долей килограмма.

3. Вместо переменных и массива типа double примените тип float. Проверьте работоспособность программы.

4. Вместо оператора break примените оператор безусловного перехода goto. Проверьте работоспособность программы.

5. Напишите программу при вводе строки с несколькими словами и одним числом (с десятичной точкой или без нее).

6. Напишите программу при вводе строки с несколькими словами и тремя числами (с десятичной точкой или без нее).

Пример 8. Написать программу, в которой генерируется строка символов заданного размера (более трех) и для которой определяется подстрока из трех символов, вводимая пользователем. В случае, когда подстрока не обнаружена, предусмотреть генерирование случайной строки поиска 1 000 раз, и программа должна искать подстроку до первого совпадения.

Программный код решения примера

#include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <time.h> int main (void) { int i, j, k, n, in, N = 1000, numA, numZ, 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("%c", str2, sizeof(str2)); if (in == 0) { printf("\n Error input. Press any key: "); getch(); exit(1); } printf("\n\t substring is \"%c\"\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 \"%c\" not found", str2); else printf("\n Substring \"%c\" 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. В случае положительного поиска подстроки в строке определите количество итераций цикла с предельным значением 1 000.

3. Предусмотрите, чтобы вводимые буквы могли быть и нижнего и верхнего регистров.

4. В программе сделайте ввод с клавиатуры количества циклов формирования строки, в которой следует найти заданную подстроку.

5. Сделайте поиск подстроки в строке, которую сформировали случайно один раз. Если подстрока не будет найдена, предусмотрите ввод количества попыток поиска для генерируемых строк (в 15 символов).

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

1. Какой размер одномерного символьного массива должен быть объявлен для записи в него строки из 5 символов?

2. Как организуются многомерные символьные массивы в языке С?

3. Как организуется индексирование символьных массивов в языке С?

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

5. Как следует организовать посимвольное заполнение одномерного массива?

6. Сколько потребуется операторов цикла для вывода на консоль двухмерного символьного массива (строк различной длины)?

7. Какие функции используются для считывания с консоли символьных массивов?

8. Для каких функций включаются в программу заголовочные файлы ctype.h и string.h?

9. Что такое лексиграфическое упорядочивание строк?

 

 







Дата добавления: 2015-09-06; просмотров: 1490. Нарушение авторских прав; Мы поможем в написании вашей работы!



Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

Стресс-лимитирующие факторы Поскольку в каждом реализующем факторе общего адаптацион­ного синдрома при бесконтрольном его развитии заложена потенци­альная опасность появления патогенных преобразований...

ТЕОРИЯ ЗАЩИТНЫХ МЕХАНИЗМОВ ЛИЧНОСТИ В современной психологической литературе встречаются различные термины, касающиеся феноменов защиты...

Этические проблемы проведения экспериментов на человеке и животных В настоящее время четко определены новые подходы и требования к биомедицинским исследованиям...

Функциональные обязанности медсестры отделения реанимации · Медсестра отделения реанимации обязана осуществлять лечебно-профилактический и гигиенический уход за пациентами...

Определение трудоемкости работ и затрат машинного времени На основании ведомости объемов работ по объекту и норм времени ГЭСН составляется ведомость подсчёта трудоёмкости, затрат машинного времени, потребности в конструкциях, изделиях и материалах (табл...

Гидравлический расчёт трубопроводов Пример 3.4. Вентиляционная труба d=0,1м (100 мм) имеет длину l=100 м. Определить давление, которое должен развивать вентилятор, если расход воздуха, подаваемый по трубе, . Давление на выходе . Местных сопротивлений по пути не имеется. Температура...

Studopedia.info - Студопедия - 2014-2024 год . (0.012 сек.) русская версия | украинская версия