Задание 4 - Обработка символьных данных (лабораторная по Си)
Лабораторная работа для школ и вузов по решению задач по обработке символьних данных и строк на языке C (Си). Перечень задач лабораторной работы (клик по ссылке направляет на решение задачи, если таковое имеется):
1. Пусть во входном потоке находится последовательность литер, заканчивающаяся точкой (коди-ровка ASCII):
- Определить, сколько раз в этой последовательности встречается символ ‘a’;
- Определить, сколько символов ‘e’ предшествует первому вхождению символа ‘u’ ( либо сколько всего символов ‘e’ в этой последовательности, если она не содержит символа ‘u’ );
- Выяснить, есть ли в данной последовательности хотя бы одна пара символов-соседей ‘n’ и ‘o’, т.е. образующих сочетание ‘n’ ‘o’ либо ‘o’ ‘n’;
- Выяснить, чередуются ли в данной последовательности символы ‘+’ и ‘-‘, и сколько раз каж-дый из этих символов входит в эту последовательность;
- Выяснить, сколько раз в данную последовательность входит группа подряд идущих симво-лов, образующих слово С++;
- Выяснить, есть ли среди символов этой последовательности символы, образующие слово char;
- Выяснить, есть ли в данной последовательности фрагмент из подряд идущих литер, образующий начало латинского алфавита (строчные буквы), и какова его длина. Если таких фрагментов несколько, найти длину наибольшего из них. Если такого фрагмента нет, то считать длину равной нулю;
- Выяснить, есть ли в данной последовательности фрагменты из подряд идущих цифр, изображающие целые числа без знака. Найти значение наибольшего из этих чисел. Если в этой последовательности нет ни одной цифры, то считать, что это значение равно нулю;
- Заменить все символы ‘?’ на ’!’;
- Удалить все символы ‘-‘ и удвоить все символы ‘&’;
- Удалить все символы, не являющиеся строчными латинскими буквами;
- Заменить все прописные латинские буквы строчными (другие символы копировать в выход-ной поток без изменения);
- Заменить все строчные латинские буквы прописными (другие символы копировать в выход-ной поток без изменения);
- Каждую группу рядом стоящих символов ‘+’ заменить одним таким символом;
- Каждую группу из n рядом стоящих символов ‘*’ заменить группой из n/2 рядом стоящих символов ‘+’ (n >= 2); одиночные ‘*’ копировать в выходной поток без изменения;
- Удалить из каждой группы подряд идущих цифр все начальные незначащие нули (если группа состоит только из нулей, то заменить эту группу одним нулем);
- Удалить все комбинации символов the;
- Оставить только те группы цифр, которые составлены из подряд идущих цифр с возрастаю-щими значениями; все остальные цифры и группы цифр удалить (другие символы копиро-вать в выходной поток без изменения);
- Заменить все комбинации символов child комбинациями символов children;
- Удалить группы символов, расположенные между фигурными скобками { и }. Скобки тоже должны быть удалены. Предполагается, что скобки сбалансированы, и внутри каждой пары скобок других фигурных скобок нет.
- Удалить из каждой группы подряд идущих цифр, в которой более двух цифр и которой пред-шествует точка, все цифры, начиная с третьей (например, a+12.3456-b-0.456789+1.3-45678 преобразуется в a+12.34-b-0.45+1.3-45678);
- Удалить из каждой группы цифр, которой не предшествует точка, все начальные нули (кроме последнего, если за ним идет точка либо в этой группе нет других цифр, кроме нулей; напри-мер, a-000123+bc+0000.0008-0000+0001.07 преобразуется в a-123+bc+0.0008-0+1.07).
Работоспособность всех программ проверена в CodeBlocks 16.01 (MinGW, Windows 10). Свои решения нерешённых программ и пожелания по улучшению существующих можете давать в комментариях внизу страницы.
Скачать файл лабораторной и все исходные коды программ в архиве:

№1.1: Определить, сколько раз в этой последовательности встречается символ ‘a’
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i, count = 0;
printf("Enter the string:\n");
fgets(str, 80, stdin);
if (strchr(str, '.')) {
for (i = 0; str[i] != '.'; i++)
if (str[i] == 'a')
count++;
printf("Number of characters 'a': %d", count);
} else {
printf("The sequence does not end with a '.'!");
}
return 0;
}
№1.2: Определить, сколько символов ‘e’ предшествует первому вхождению символа ‘u’ ( либо сколько всего символов ‘e’ в этой последовательности, если она не содержит символа ‘u’ )
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i, count = 0;
printf("Enter the string:\n");
fgets(str, 80, stdin);
if (strchr(str, '.')) {
for (i = 0; str[i] != '.'; i++) {
if (str[i] == 'e')
count++;
if (str[i] == 'u')
break;
}
printf("The number of 'e' characters before the first occurrence of the 'u': %d", count);
} else {
printf("The sequence does not end with a '.'!");
}
return 0;
}
№1.3: Выяснить, есть ли в данной последовательности хотя бы одна пара символов-соседей ‘n’ и ‘o’, т.е. образующих сочетание ‘n’ ‘o’ либо ‘o’ ‘n’
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i, count = 0;
printf("Enter the string:\n");
fgets(str, 80, stdin);
if (strchr(str, '.')) {
for (i = 0; str[i] != '.'; i++) {
if (str[i] == 'o' && str[i+1] == 'n')
count++;
if (str[i] == 'n' && str[i+1] == 'o')
count++;
}
if (count > 0)
printf("A pair 'no' or 'on' exists!");
else
printf("A pair 'no' or 'on' not exists!");
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№1.4: Выяснить, чередуются ли в данной последовательности символы ‘+’ и ‘-‘, и сколько раз каж-дый из этих символов входит в эту последовательность
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i, countP = 0, countM = 0, flag = 0;
char chr;
printf("Enter the string:\n");
fgets(str, 80, stdin);
if (strchr(str, '.')) {
for (i = 0; str[i] != '.'; i++) {
if (str[i] == chr)
flag = 1;
if (str[i] == '+'){
countP++;
chr = '+';
}
if (str[i] == '-'){
countM++;
chr = '-';
}
}
if (flag == 0)
printf("'+' and '-' alternate!\n");
else
printf("'+' and '-' not alternate!\n");
printf("Number of characters '+': %d\n", countP);
printf("Number of characters '-': %d", countM);
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№1.5: Выяснить, сколько раз в данную последовательность входит группа подряд идущих симво-лов, образующих слово С++
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i, count = 0;
printf("Enter the string:\n");
fgets(str, 80, stdin);
if (strchr(str, '.')) {
for (i = 2; str[i] != '.'; i++)
if (str[i-2] == 'C' && str[i-1] == '+' && str[i] == '+')
count++;
printf("Symbol occurs 'C++' once %d\n", count);
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№1.6: Выяснить, есть ли среди символов этой последовательности символы, образующие слово char
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i, flag = 0;
printf("Enter the string:\n");
fgets(str, 80, stdin);
if (strchr(str, '.')) {
for (i = 3; str[i] != '.'; i++)
if (str[i-3] == 'c' && str[i-2] == 'h' && str[i-1] == 'a' && str[i] == 'r')
flag = 1;
if (flag = 1)
printf("'char' in present.");
else
printf("'char' is not present.");
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№1.7: Выяснить, есть ли в данной последовательности фрагмент из подряд идущих литер, образующий начало латинского алфавита (строчные буквы), и какова его длина. Если таких фрагментов несколько, найти длину наибольшего из них. Если такого фрагмента нет, то считать длину равной нулю
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i, j, count = 0, countA = 0;
printf("Enter the string:\n");
fgets(str, 80, stdin);
if (strchr(str, '.')) {
for (i = 0; str[i] != '.'; i++) {
if (str[i] == 'a') {
countA = 0;
for (j = i; (int)str[j] < (int)str[j+1]; j++)
if ((int)str[j] < (int)str[j+1])
countA++;
}
if (countA > count)
count = countA + 1;
}
printf("Maximum sequence length: %d", count);
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№1.8: Выяснить, есть ли в данной последовательности фрагменты из подряд идущих цифр, изображающие целые числа без знака. Найти значение наибольшего из этих чисел. Если в этой последовательности нет ни одной цифры, то считать, что это значение равно нулю
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[80], numstr[80] = "";
int i, j, numM = 0, num, count = 0;
printf("Enter the string:\n");
fgets(str, 80, stdin);
if (strchr(str, '.')) {
for (i = 0; str[i] != '.'; i++) {
if ((int)str[i] >= 49 && (int)str[i] <= 57) {
count = 1;
for (j = i; (int)str[j+1] >= 48 && (int)str[j+1] <= 57; j++)
count++;
strncpy(numstr, "", 80);
strncpy(numstr, str + i, count);
num = atoi(numstr);
if (num > numM)
numM = num;
i = j;
}
}
printf("Maximum number: %d", numM);
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№2.1: Заменить все символы ‘?’ на ’!’
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i;
printf("Enter the string:\n");
fgets(str, sizeof(str), stdin);
if (strchr(str, '.')) {
printf("New line: \n");
for (i = 0; str[i] != '.'; i++) {
if (str[i] == '?')
printf("%c", '!');
else
printf("%c", str[i]);
}
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№2.2: Удалить все символы ‘-‘ и удвоить все символы ‘&’
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i;
printf("Enter the string:\n");
fgets(str, sizeof(str), stdin);
if (strchr(str, '.')) {
printf("New line: \n");
for (i = 0; str[i] != '.'; i++) {
if (str[i] != '-'){
if (str[i] == '&')
printf("&&");
else
printf("%c", str[i]);
}
}
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№2.3: Удалить все символы, не являющиеся строчными латинскими буквами
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i;
printf("Enter the string:\n");
fgets(str, sizeof(str), stdin);
if (strchr(str, '.')) {
printf("New line:\n");
for (i = 0; str[i] != '.'; i++)
if ((int)str[i] >= 96 && (int)str[i] <= 122)
printf("%c", str[i]);
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№2.4: Заменить все прописные латинские буквы строчными (другие символы копировать в выход-ной поток без изменения)
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
char str[80];
int i;
printf("Enter the string:\n");
fgets(str, sizeof(str), stdin);
if (strchr(str, '.')) {
printf("New line:\n");
for (i = 0; str[i] != '.'; i++)
if ((int)str[i] >= 65 && (int)str[i] <= 90)
str[i] = towlower(str[i]);
puts(str);
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№2.5: Заменить все строчные латинские буквы прописными (другие символы копировать в выход-ной поток без изменения)
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
char str[80];
int i;
printf("Enter the string:\n");
fgets(str, sizeof(str), stdin);
if (strchr(str, '.')) {
printf("New line:\n");
for (i = 0; str[i] != '.'; i++)
if ((int)str[i] >= 96 && (int)str[i] <= 122)
str[i] = towupper(str[i]);
puts(str);
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№2.6: Каждую группу рядом стоящих символов ‘+’ заменить одним таким символом
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i;
printf("Enter the string:\n");
fgets(str, sizeof(str), stdin);
if (strchr(str, '.')) {
printf("New line:\n");
for (i = 0; str[i] != '.'; i++) {
if (str[i] == '+' && str[i+1] == '+'){
printf("%c", '+');
while (str[i+1] == '+')
i++;
} else
printf("%c", str[i]);
}
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№2.7: Каждую группу из n рядом стоящих символов ‘*’ заменить группой из n/2 рядом стоящих символов ‘+’ (n >= 2); одиночные ‘*’ копировать в выходной поток без изменения
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i;
printf("Enter the string:\n");
fgets(str, sizeof(str), stdin);
if (strchr(str, '.')) {
printf("New line:\n");
for (i = 0; str[i] != '.'; i++) {
if (str[i] == '*' && str[i+1] == '*'){
printf("%c", '+');
i++;
}
else
printf("%c", str[i]);
}
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№2.8: Удалить из каждой группы подряд идущих цифр все начальные незначащие нули (если группа состоит только из нулей, то заменить эту группу одним нулем)
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i;
printf("Enter the string:\n");
fgets(str, sizeof(str), stdin);
if (strchr(str, '.')) {
printf("New line: \n");
for (i = 0; str[i] != '.'; i++) {
if (str[i] == '0' && (int)str[i-1] >= 49 && (int)str[i-1] <= 57){
while (str[i] == '0'){
printf("%c", str[i]);
i++;
}
}
if (str[i] == '0' && (int)str[i+1] >= 49 && (int)str[i+1] <= 57){
i++;
}
if (str[i] == '0' && str[i+1] == '0'){
while (str[i] == '0' && str[i+1] == '0')
i++;
if (!((int)str[i+1] >= 48 && (int)str[i+1] <= 57))
printf("%c", '0');
} else {
printf("%c", str[i]);
}
}
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№2.9: Удалить все комбинации символов the
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i;
printf("Enter the string:\n");
fgets(str, sizeof(str), stdin);
if (strchr(str, '.')) {
printf("New line: \n");
for (i = 0; str[i] != '.'; i++) {
if (str[i] == 't' && str[i+1] == 'h' && str[i+2] == 'e')
i = i + 2;
else
printf("%c", str[i]);
}
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№2.10: Оставить только те группы цифр, которые составлены из подряд идущих цифр с возрастаю-щими значениями; все остальные цифры и группы цифр удалить (другие символы копиро-вать в выходной поток без изменения)
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i;
printf("Enter the string:\n");
fgets(str, sizeof(str), stdin);
if (strchr(str, '.')) {
printf("New line: \n");
for (i = 0; str[i] != '.'; i++) {
if ((int)str[i] >= 48 && (int)str[i] <= 57
&& ((((int)str[i+1] >= 48 && (int)str[i+1] <= 57) && ((int)str[i] < (int)str[i+1]))
|| ((int)str[i-1] >= 48 && (int)str[i-1] <= 57) && ((int)str[i] > (int)str[i-1])))
printf("%c", str[i]);
if (!((int)str[i] >= 48 && (int)str[i] <= 57))
printf("%c", str[i]);
}
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№2.11: Заменить все комбинации символов child комбинациями символов children
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i;
printf("Enter the string:\n");
fgets(str, sizeof(str), stdin);
if (strchr(str, '.')) {
printf("New line: \n");
for (i = 0; str[i] != '.'; i++) {
if (str[i] == 'c' && str[i+1] == 'h' && str[i+2] == 'i' && str[i+3] == 'l' && str[i+4] == 'd'){
printf("children");
i += 4;
} else
printf("%c", str[i]);
}
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№2.12: Удалить группы символов, расположенные между фигурными скобками { и }. Скобки тоже должны быть удалены. Предполагается, что скобки сбалансированы, и внутри каждой пары скобок других фигурных скобок нет
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i;
printf("Enter the string:\n");
fgets(str, sizeof(str), stdin);
if (strchr(str, '.')) {
printf("New line: \n");
for (i = 0; str[i] != '.'; i++) {
if (str[i] == '{' && strchr(str+i, '}'))
while (str[i] != '}')
i++;
else
printf("%c", str[i]);
}
} else
printf("The sequence does not end with a '.'!");
return 0;
}
№3.1: Удалить из каждой группы подряд идущих цифр, в которой более двух цифр и которой пред-шествует точка, все цифры, начиная с третьей (например, a+12.3456-b-0.456789+1.3-45678 преобразуется в a+12.34-b-0.45+1.3-45678)
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i, j;
printf("Enter the string:\n");
fgets(str, sizeof(str), stdin);
printf("New line: \n");
if (strchr(str, '$')) {
for (i = 0; str[i] != '$' && i < strlen(str); i++){
if (str[i] == '.'){
printf("%c", '.');
i++;
j = i;
while ((int)str[j] >= 48 && (int)str[j] <= 57)
j++;
if (j-i > 2){
printf("%c%c", str[i], str[i+1]);
i += j-i-1;
} else {
printf("%c%c", str[i], str[i+1]);
i++;
}
} else
printf("%c", str[i]);
}
} else
printf("The sequence does not end with a '$'!");
return 0;
}
№3.2: Удалить из каждой группы цифр, которой не предшествует точка, все начальные нули (кроме последнего, если за ним идет точка либо в этой группе нет других цифр, кроме нулей; напри-мер, a-000123+bc+0000.0008-0000+0001.07 преобразуется в a-123+bc+0.0008-0+1.07)
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
int i, j;
printf("Enter the string:\n");
fgets(str, sizeof(str), stdin);
printf("New line: \n");
if (strchr(str, '$')) {
for (i = 0; str[i] != '$' && i < strlen(str); i++) {
if (str[i] == '0'){
j = i;
while (str[j] == '0')
j++;
if (str[i-1] == '.'){
for (; i <= j+1; i++)
printf("%c", str[i]);
} else if (str[j] == '.') {
printf("%c", '0');
i = j-1;
} else if (!((int)str[j] >= 49 && (int)str[j] <= 57)){
printf("%c", '0');
i = j-1;
}
} else
printf("%c", str[i]);
}
} else
printf("The sequence does not end with a '$'!");
return 0;
}