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