перебирая массив символов, чтобы найти вхождение каждой буквы в алфавите - PullRequest
1 голос
/ 07 мая 2019

все будет хорошо до определенного момента, как AG будет считаться хорошо.но он ударяет по букве вроде I или H и подбрасывает какое-то сумасшедшее число, например 1,7 миллиарда случаев, а затем пытается распечатать столько звездочек на диаграмме.Я бился головой об этом и не могу понять ... что не так с этим для цикла?рассматриваемый цикл for находится в шаге 2

#include <stdio.h>

#define MAXROWS 100
#define NUM_ALPHABETS 26

int main(){

        int count, i, j, k;

        char sentence[MAXROWS];
        char alphabets[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', '$
        int frequency[NUM_ALPHABETS];


// step 1:Write a function that reads a sentence from the keyboard (2 pts)
        printf("Please enter a sentence: \n");
        fgets(sentence, sizeof(sentence), stdin);

// step 2:Find out the frequency of the alphabets  in the sentence, ignore uppercase or lowercase in the sentence(4 pts)

        for(i = 0; sentence[i] != "\n"; i++) {
                for(j = 0; j < NUM_ALPHABETS; j++) {
                        if(tolower(sentence[i]) == tolower(alphabets[j])) {
                                frequency[j]++;
                        }
                }
        }


// step 3: Print the histogram as shown in the screenshot(4 pts)

        printf("%12s%12s%10s\n", "Alphabets", "Frequency", "Histogram");
        for(j = 0; j < NUM_ALPHABETS; j++) {
                printf("%12c%12d     ", alphabets[j], frequency[j]);
                for(k = 0; k < frequency[j]; k++) {
                        printf("*");
                }
                printf("\n");
        }

        return 0;
}

, он должен распечатать диаграмму, и он работает до определенной точки.но как только он попадет в какую-то случайную букву (это не одна и та же буква каждый раз), он будет насчитывать около миллиарда или 2 миллиардов вхождений (иногда даже отрицательных)

1 Ответ

0 голосов
/ 07 мая 2019

Вы полагаетесь на массив частоты [], который будет инициализирован равным 0 с?

Также вы можете записать шаг 2 как:

for(i = 0; sentence[i] != "\n"; i++) {
        if (isalpha(sentence[i]) {
                int index = tolower(sentence[i]) - 'a';
                frequency[index ]++;
        }
}

ps Смотрите ваши одиночные и двойные кавычки:

for(i = 0; sentence[i] != "\n"; i++)

Это должны быть одинарные кавычки вокруг \ n для обозначения символа.

Как уже отмечали другие, вам нужно инициализировать frequency.Есть три способа сделать это: предоставить инициализатор, написать цикл, который устанавливает каждый элемент на ноль, или вызвать memset().Этот код выполняет все три операции:

int frequency[26] = { 0 };
for (int i = 0; i < 26; i++)
    frequency[i] = 0;
memset(frequency, 0, sizeof(frequency));

Обратите внимание, что frequency назван неправильно, так как он фактически содержит количество вхождений каждой буквы, а не их частоту.Чтобы получить частоту, вам нужно разделить на общее количество прочитанных символов.MAXROWS также неправильно названо, поскольку «строка» является синонимом «строки»;Вы, вероятно, хотите назвать это MAXSENTENCELEN или что-то подобное вместо этого.

И последнее, но не менее важное, alphabets также названо неправильно, поскольку оно содержит только один алфавит, но на самом деле вы этого не делаетенужно вообще.Просто проверьте, является ли символ буквой, и, если это так, используйте разницу между ним и 'A' или 'a' в качестве индекса для frequency.Что касается бонусных баллов, найдите способ избежать проверки и вычитания ... (подсказка: числовое значение заглавной буквы и соответствующей строчной буквы в ASCII отличаются только на один бит)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...