Подпрограммы: Из заданного текста выбрать и напечатать те символы, которые встречаются в нем ровно один раз - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, господа. Часто посещаю ваш форум, но прямое общение понадобилось только сейчас. Итак, к делу. Задача: Из заданного текста выбрать и напечатать те символы, которые встречаются в нем ровно один раз, в том порядке, как они встречаются в тексте. Использовать как минимум три подпрограммы(ввод, основная, вывод). Задачка элементарная и решается за 5 минут, да и у вас решалась неоднократно поэтому:
#include <conio.h>
#include <stdio.h>
#include <string.h>
const int N=11;
void main()
{
    int i,j,k,l=0,n=0,m=0;
    char s,tx[N],fin[N];
 
    for (i=0;(s=getchar())!='.';i++) {tx[i]=s;n++;}
 
    for(i=0;i<n;i++) 
    {
        k=0;
        for (j=0;j<n;j++) if (tx[j]==tx[i]) k++;
        if (k==1) {fin[l]=tx[i];l++;}
    }
    m=l;
    for (l=0;l<m;l++) printf_s("%c ",fin[l]);
    _getch();
}
Значение N(11) взято "от балды" и может быть иным. Так как в задаче не сказано сколько именно символов в тексте, считаю до точки. Именно из-за отсутствия размера у меня и возникают трудности. Приведу некоторые мысли:

1.

Подпрограмма input: 1.1. Формирует исходный массив tx, элементы которого - отдельные символы текста. 1.2. Находит n - индекс последнего символа, т.е. символа перед точкой. 1.3. Передает массив tx и целое число n в подпрограмму sravn.

2.

Подпрограмма sravn: 2.1. Получает от подпрограммы input массив tx и целое число n. 2.2. Заполняет массив fin символами, которые повторяются ровно один раз, и находит целое число m - индекс последнего символа в массиве fin. 2.3. Передает массив fin и целое число m подпрограмме output.

3.

Подпрограмма output: 3.1. Получает от подпрограммы sravn массив fin и целое число m. 3.2. Выводит массив fin. Вся загвоздка заключается в передаче m и n между подпрограммами. Именно здесь мне необходима ваша помощь. Под спойлером неработающий вариант.
#include <conio.h>
#include <stdio.h>
#include <string.h>
const int N=11;
void input(char a[N])
{
    int i,n=0;
    char s;
    for (i=0;(s=getchar())!='0';i++) {a[i]=s;n++;}
}
void sravn(char a[N],char b[N])
{   
    int i,j,k,l=0,n,m;
    for(i=0;i<n;i++) 
    {
        k=0;
        for (j=0;j<n;j++) if (a[j]==a[i]) k++;
        if (k==1) {b[l]=a[i];l++;}
    }
    m=l;
}
void output(char b[N])
{
    int l,m;
    for (l=0;l<m;l++) printf_s("%c ",b[l]);
}
void main()
{
    char tx[N],fin[N];
 
    input(tx);
    sravn(tx,fin);
    output(fin);
    _getch();
}
Почти готовый вариант, осталось только перевести ввод и вывод в отдельные подпрограммы.
#include <conio.h>
#include <stdio.h>
#include <string.h>
const int N=11;
 
void sravn(char a[N],char b[N], int n)
{   
    int i,j,k,l=0;
    for(i=0;i<n;i++) 
    {
        k=0;
        for (j=0;j<n;j++) if (a[j]==a[i]) k++;
        if (k==1) {b[l]=a[i];l++;}
    }
    b[l]='\0';
}
void main()
{
    char s,tx[N],fin[N];
    int i,n=0;
    
    for (i=0;(s=getchar())!='.';i++) {tx[i]=s;n++;}
    tx[i]='\0';
    
    sravn(tx,fin,n);
 
    for (i=0;fin[i]!='\0';i++) printf_s("%c ",fin[i]);
    _getch();
}
Готовая программа. Может стоит что-то улучшить? Я решил избавиться от m и n, из-за которых и возникали трудности, используя функцию strlen для вычисления длины строки.
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <locale.h>
const int N=100;
void input(char a[N])
{
    int i;
    char s;
    printf_s("Введите текст, оканчивающийся точкой.\n");
    for (i=0;(s=getchar())!='.';i++) a[i]=s;
    a[i]='\0';
}
void sravn(char a[N],char b[N])
{   
    int k,l=0;
    unsigned int i,j;
    for(i=0;i<(strlen(a));i++) 
    {
        k=0;
        for (j=0;j<strlen(a);j++) if (a[j]==a[i]) k++;
        if (k==1) {b[l]=a[i];l++;}
    }
    b[l]='\0';
}
void output(char b[N])
{
    unsigned int i;
    printf_s("\nСимволы, встречающиеся в тексте ровно один раз через пробел:\n");
    for (i=0;i<strlen(b);i++) printf_s("%c ",b[i]);
}
void main()
{
    char tx[N],fin[N];
 
    setlocale(LC_CTYPE, "Russian"); 
    input(tx);
    sravn(tx,fin);
    output(fin);
    _getch();
}

Решение задачи: «Подпрограммы: Из заданного текста выбрать и напечатать те символы, которые встречаются в нем ровно один раз»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
 
int main(void) {
    char buf[BUFSIZ], * ptr;
    
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' )
        for ( ptr = buf; *ptr; ++ptr )
            if ( strchr(buf, *ptr) == ptr && ! strchr(ptr + 1, *ptr) )
                printf("%c", *ptr);
    
    return 0;
}

Объяснение кода листинга программы

В этом коде:

  1. Объявлены две переменные: buf (строка символов) и ptr (указатель на символ в строке).
  2. В цикле while происходит следующее:
    • Выводится приглашение для ввода строки.
    • Считывается строка с помощью функции fgets в буфер buf.
    • Проверяется, что строка не пустая.
  3. В цикле for происходит следующее:
    • Указатель ptr инициализируется начальным адресом строки buf.
    • Для каждого символа в строке выполняется следующая проверка:
      • Функция strchr ищет первый вхождение символа в строке и возвращает адрес первого вхождения, или NULL, если символ не найден.
      • Если текущий символ не найден в строке, то он печатается на экране.
  4. Цикл while повторяется до тех пор, пока пользователь не введет пустую строку.
  5. В конце программы возвращается 0, что означает успешное завершение работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5
Похожие ответы