Подпрограммы: Из заданного текста выбрать и напечатать те символы, которые встречаются в нем ровно один раз - 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
, что означает успешное завершение работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д