Подпрограммы: Из заданного текста выбрать и напечатать те символы, которые встречаются в нем ровно один раз - C (СИ)
Формулировка задачи:
Доброго времени суток, господа. Часто посещаю ваш форум, но прямое общение понадобилось только сейчас. Итак, к делу.
Задача: Из заданного текста выбрать и напечатать те символы, которые встречаются в нем ровно один раз, в том порядке, как они встречаются в тексте. Использовать как минимум три подпрограммы(ввод, основная, вывод).
Задачка элементарная и решается за 5 минут, да и у вас решалась неоднократно поэтому:
Значение N(11) взято "от балды" и может быть иным. Так как в задаче не сказано сколько именно символов в тексте, считаю до точки. Именно из-за отсутствия размера у меня и возникают трудности.
Приведу некоторые мысли:
Листинг программы
- #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();
- }
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;
- }
Объяснение кода листинга программы
В этом коде:
- Объявлены две переменные:
buf
(строка символов) иptr
(указатель на символ в строке). - В цикле
while
происходит следующее:- Выводится приглашение для ввода строки.
- Считывается строка с помощью функции
fgets
в буферbuf
. - Проверяется, что строка не пустая.
- В цикле
for
происходит следующее:- Указатель
ptr
инициализируется начальным адресом строкиbuf
. - Для каждого символа в строке выполняется следующая проверка:
- Функция
strchr
ищет первый вхождение символа в строке и возвращает адрес первого вхождения, илиNULL
, если символ не найден. - Если текущий символ не найден в строке, то он печатается на экране.
- Функция
- Указатель
- Цикл
while
повторяется до тех пор, пока пользователь не введет пустую строку. - В конце программы возвращается
0
, что означает успешное завершение работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д