В алфавитном порядке напечатать (по одному разу) все строчные русские буквы, входящие в заданный текст - 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 + 'а');
    }
}

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

В этом коде:

  1. #include , #include , #include - подключают необходимые для работы функции и определения из заголовочных файлов.
  2. #define N 33 - определяют количество различных букв в русском алфавите (не считая буквы 'ё').
  3. *void AtLeastOnce(char );** - объявляют функцию с именем AtLeastOnce, которая принимает указатель на строку символов и не возвращает ничего.
  4. int main() - объявляют основную функцию программы, которая возвращает значение типа int (0 - успешно, 1 - ошибка).
  5. char buf[BUFSIZ]; - создают массив символов (строку) для ввода текста.
  6. setlocale(LC_ALL, Russian); - устанавливают русскую локаль для работы с русским текстом.
  7. system(chcp 1251 > nul); - устанавливают кодировку консоли ввода в 1251 (кириллица).
  8. puts(Введите строку:); - выводят приглашение для ввода строки.
  9. fgets(buf, BUFSIZ, stdin); - считывают строку из консоли ввода в массив buf.
  10. AtLeastOnce(buf); - вызывают функцию AtLeastOnce, передавая ей указатель на введенную строку.
  11. *void AtLeastOnce(char p)** - функция для перебора всех букв в строке и подсчета их количества.
  12. int AzBuki[N] = {}, i; - объявляют массив для подсчета количества букв и переменную для цикла.
  13. *while(p){** - пока не достигнут конец строки.
  14. if(p >= 'а' && p <= 'я'){ - если текущий символ является буквой русского алфавита.
  15. *AzBuki[p - 'а']++;** - увеличивают счетчик для соответствующей буквы в массиве.
  16. p++; - переходят к следующей букве.
  17. for(i = 0; i < N; i++){ - после перебора всех букв, выводят результат.
  18. if(AzBuki[i] > 0) - если количество вхождений данной буквы больше нуля.
  19. printf(%c, i + 'а'); - выводят букву на экран.
  20. } - завершают цикл.

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


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

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

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