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

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

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

Доброго времени суток, господа. Часто посещаю ваш форум, но прямое общение понадобилось только сейчас. Итак, к делу. Задача: Из заданного текста выбрать и напечатать те символы, которые встречаются в нем ровно один раз, в том порядке, как они встречаются в тексте. Использовать как минимум три подпрограммы(ввод, основная, вывод). Задачка элементарная и решается за 5 минут, да и у вас решалась неоднократно поэтому:
Листинг программы
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. const int N=11;
  5. void main()
  6. {
  7. int i,j,k,l=0,n=0,m=0;
  8. char s,tx[N],fin[N];
  9. for (i=0;(s=getchar())!='.';i++) {tx[i]=s;n++;}
  10. for(i=0;i<n;i++)
  11. {
  12. k=0;
  13. for (j=0;j<n;j++) if (tx[j]==tx[i]) k++;
  14. if (k==1) {fin[l]=tx[i];l++;}
  15. }
  16. m=l;
  17. for (l=0;l<m;l++) printf_s("%c ",fin[l]);
  18. _getch();
  19. }
Значение 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 между подпрограммами. Именно здесь мне необходима ваша помощь. Под спойлером неработающий вариант.
Листинг программы
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. const int N=11;
  5. void input(char a[N])
  6. {
  7. int i,n=0;
  8. char s;
  9. for (i=0;(s=getchar())!='0';i++) {a[i]=s;n++;}
  10. }
  11. void sravn(char a[N],char b[N])
  12. {
  13. int i,j,k,l=0,n,m;
  14. for(i=0;i<n;i++)
  15. {
  16. k=0;
  17. for (j=0;j<n;j++) if (a[j]==a[i]) k++;
  18. if (k==1) {b[l]=a[i];l++;}
  19. }
  20. m=l;
  21. }
  22. void output(char b[N])
  23. {
  24. int l,m;
  25. for (l=0;l<m;l++) printf_s("%c ",b[l]);
  26. }
  27. void main()
  28. {
  29. char tx[N],fin[N];
  30. input(tx);
  31. sravn(tx,fin);
  32. output(fin);
  33. _getch();
  34. }
Почти готовый вариант, осталось только перевести ввод и вывод в отдельные подпрограммы.
Листинг программы
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. const int N=11;
  5. void sravn(char a[N],char b[N], int n)
  6. {
  7. int i,j,k,l=0;
  8. for(i=0;i<n;i++)
  9. {
  10. k=0;
  11. for (j=0;j<n;j++) if (a[j]==a[i]) k++;
  12. if (k==1) {b[l]=a[i];l++;}
  13. }
  14. b[l]='\0';
  15. }
  16. void main()
  17. {
  18. char s,tx[N],fin[N];
  19. int i,n=0;
  20. for (i=0;(s=getchar())!='.';i++) {tx[i]=s;n++;}
  21. tx[i]='\0';
  22. sravn(tx,fin,n);
  23. for (i=0;fin[i]!='\0';i++) printf_s("%c ",fin[i]);
  24. _getch();
  25. }
Готовая программа. Может стоит что-то улучшить? Я решил избавиться от m и n, из-за которых и возникали трудности, используя функцию strlen для вычисления длины строки.
Листинг программы
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <locale.h>
  5. const int N=100;
  6. void input(char a[N])
  7. {
  8. int i;
  9. char s;
  10. printf_s("Введите текст, оканчивающийся точкой.\n");
  11. for (i=0;(s=getchar())!='.';i++) a[i]=s;
  12. a[i]='\0';
  13. }
  14. void sravn(char a[N],char b[N])
  15. {
  16. int k,l=0;
  17. unsigned int i,j;
  18. for(i=0;i<(strlen(a));i++)
  19. {
  20. k=0;
  21. for (j=0;j<strlen(a);j++) if (a[j]==a[i]) k++;
  22. if (k==1) {b[l]=a[i];l++;}
  23. }
  24. b[l]='\0';
  25. }
  26. void output(char b[N])
  27. {
  28. unsigned int i;
  29. printf_s("\nСимволы, встречающиеся в тексте ровно один раз через пробел:\n");
  30. for (i=0;i<strlen(b);i++) printf_s("%c ",b[i]);
  31. }
  32. void main()
  33. {
  34. char tx[N],fin[N];
  35. setlocale(LC_CTYPE, "Russian");
  36. input(tx);
  37. sravn(tx,fin);
  38. output(fin);
  39. _getch();
  40. }

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

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

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

В этом коде:

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

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


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

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

15   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы