Задание 4 - Обработка символьных данных (лабораторная по Си)

Лабораторная работа для школ и вузов по решению задач по обработке символьних данных и строк на языке C (Си). Перечень задач лабораторной работы (клик по ссылке направляет на решение задачи, если таковое имеется):

1. Пусть во входном потоке находится последовательность литер, заканчивающаяся точкой (коди-ровка ASCII):

  1. Определить, сколько раз в этой последовательности встречается символ ‘a’;
  2. Определить, сколько символов ‘e’ предшествует первому вхождению символа ‘u’ ( либо сколько всего символов ‘e’ в этой последовательности, если она не содержит символа ‘u’ );
  3. Выяснить, есть ли в данной последовательности хотя бы одна пара символов-соседей ‘n’ и ‘o’, т.е. образующих сочетание ‘n’ ‘o’ либо ‘o’ ‘n’;
  4. Выяснить, чередуются ли в данной последовательности символы ‘+’ и ‘-‘, и сколько раз каж-дый из этих символов входит в эту последовательность;
  5. Выяснить, сколько раз в данную последовательность входит группа подряд идущих симво-лов, образующих слово С++;
  6. Выяснить, есть ли среди символов этой последовательности символы, образующие слово char;
  7. Выяснить, есть ли в данной последовательности фрагмент из подряд идущих литер, образующий начало латинского алфавита (строчные буквы), и какова его длина. Если таких фрагментов несколько, найти длину наибольшего из них. Если такого фрагмента нет, то считать длину равной нулю;
  8. Выяснить, есть ли в данной последовательности фрагменты из подряд идущих цифр, изображающие целые числа без знака. Найти значение наибольшего из этих чисел. Если в этой последовательности нет ни одной цифры, то считать, что это значение равно нулю;
2. Пусть во входном потоке находится последовательность литер, заканчивающаяся точкой (коди-ровка ASCII). Вывести в выходной поток последовательность литер, измененную следующим образом:
  1. Заменить все символы ‘?’ на ’!’;
  2. Удалить все символы ‘-‘ и удвоить все символы ‘&’;
  3. Удалить все символы, не являющиеся строчными латинскими буквами;
  4. Заменить все прописные латинские буквы строчными (другие символы копировать в выход-ной поток без изменения);
  5. Заменить все строчные латинские буквы прописными (другие символы копировать в выход-ной поток без изменения);
  6. Каждую группу рядом стоящих символов ‘+’ заменить одним таким символом;
  7. Каждую группу из n рядом стоящих символов ‘*’ заменить группой из n/2 рядом стоящих символов ‘+’ (n >= 2); одиночные ‘*’ копировать в выходной поток без изменения;
  8. Удалить из каждой группы подряд идущих цифр все начальные незначащие нули (если группа состоит только из нулей, то заменить эту группу одним нулем);
  9. Удалить все комбинации символов the;
  10. Оставить только те группы цифр, которые составлены из подряд идущих цифр с возрастаю-щими значениями; все остальные цифры и группы цифр удалить (другие символы копиро-вать в выходной поток без изменения);
  11. Заменить все комбинации символов child комбинациями символов children;
  12. Удалить группы символов, расположенные между фигурными скобками { и }. Скобки тоже должны быть удалены. Предполагается, что скобки сбалансированы, и внутри каждой пары скобок других фигурных скобок нет.
3. Пусть во входном потоке находится последовательность литер, заканчивающаяся маркером конца $ (кодировка ASCII). Вывести в выходной поток последовательность литер, измененную следую-щим образом:
  1. Удалить из каждой группы подряд идущих цифр, в которой более двух цифр и которой пред-шествует точка, все цифры, начиная с третьей (например, a+12.3456-b-0.456789+1.3-45678 преобразуется в a+12.34-b-0.45+1.3-45678);
  2. Удалить из каждой группы цифр, которой не предшествует точка, все начальные нули (кроме последнего, если за ним идет точка либо в этой группе нет других цифр, кроме нулей; напри-мер, 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;
}



Реклама

Поддержать