В алфавитном порядке напечатать (по одному разу) все строчные русские буквы, входящие в заданный текст - C (СИ)
Формулировка задачи:
Подскажите ошибку, которую допустила в программе.
Задание такое: Вводится текст, за которым следует точка. В алфавитном порядке напечатать (по разу) все строчные русские буквы, входящие в этот текст. (требуется написать программу на языке СИ)
#include <stdio.h> #include <malloc.h> int main() { char *user_input = malloc(sizeof(char)); char *output = malloc(sizeof(char)); int i = 0; int d = 0; int flag = 1; while (1) { scanf("%c", &user_input[i]); if (user_input[i] == '.') {user_input[i]='\0';break;} for (int j = 0; j < i; i++) { if (user_input[i] == output[j]) { flag = 0; break; } } if (flag) { output[d] = user_input[i]; d++; output =(char*) realloc(output, (d + 2) * sizeof(char)); } flag = 1; i++; user_input = (char*)realloc(user_input, (i + 1) * sizeof(char)); } printf("input %s",user_input); printf("output %s",output); char x; for (int m = 0; m < d; m++) { for (int j = d - 1; j > m; j--) { if (output[j - 1] > output[j]) { x = output[j - 1]; output[j - 1] = output[j]; output[j] = x; } } } output[d + 1] = '\0'; printf("%s", output); return 0; }
Решение задачи: «В алфавитном порядке напечатать (по одному разу) все строчные русские буквы, входящие в заданный текст»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <locale.h> #define N 33 void AtLeastOnce(char* ); int main() { char buf[BUFSIZ]; setlocale(LC_ALL, "Russian"); system("chcp 1251 > nul"); puts("Введите строку: "); fgets(buf, BUFSIZ, stdin); AtLeastOnce(buf); } void AtLeastOnce(char* p) { int AzBuki[N] = {}, i; while(*p){ if(*p >= 'а' && *p <= 'я'){ AzBuki[*p - 'а']++; } p++; } for(i = 0; i < N; i++){ if(AzBuki[i] > 0) printf("%c ", i + 'а'); } }
Объяснение кода листинга программы
В этом коде:
- #include
, #include , #include - подключают необходимые для работы функции и определения из заголовочных файлов. - #define N 33 - определяют количество различных букв в русском алфавите (не считая буквы 'ё').
- *void AtLeastOnce(char );** - объявляют функцию с именем AtLeastOnce, которая принимает указатель на строку символов и не возвращает ничего.
- int main() - объявляют основную функцию программы, которая возвращает значение типа int (0 - успешно, 1 - ошибка).
- char buf[BUFSIZ]; - создают массив символов (строку) для ввода текста.
- setlocale(LC_ALL,
Russian
); - устанавливают русскую локаль для работы с русским текстом. - system(
chcp 1251 > nul
); - устанавливают кодировку консоли ввода в 1251 (кириллица). - puts(
Введите строку:
); - выводят приглашение для ввода строки. - fgets(buf, BUFSIZ, stdin); - считывают строку из консоли ввода в массив buf.
- AtLeastOnce(buf); - вызывают функцию AtLeastOnce, передавая ей указатель на введенную строку.
- *void AtLeastOnce(char p)** - функция для перебора всех букв в строке и подсчета их количества.
- int AzBuki[N] = {}, i; - объявляют массив для подсчета количества букв и переменную для цикла.
- *while(p){** - пока не достигнут конец строки.
- if(p >= 'а' && p <= 'я'){ - если текущий символ является буквой русского алфавита.
- *AzBuki[p - 'а']++;** - увеличивают счетчик для соответствующей буквы в массиве.
- p++; - переходят к следующей букве.
- for(i = 0; i < N; i++){ - после перебора всех букв, выводят результат.
- if(AzBuki[i] > 0) - если количество вхождений данной буквы больше нуля.
- printf(
%c
, i + 'а'); - выводят букву на экран. - } - завершают цикл.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д