Проверка, является ли предложение панграммой (предложением, содержащим все буквы алфавита)

#c

#c

Вопрос:

Мне нужно получить 10 слов и проверить, являются ли они панграммой (предложением, содержащим все буквы алфавита), или прекратить получать слова, если моя программа уже нашла панграмму, даже если пользователь не вставил 10 слов, и моя программа перестает получать слова после первого слова. Кто-нибудь знает почему?

 #include <stdio.h>
#include <string.h>
#include <stdbool.h>

#define MAX_NAMES 10
#define LONG 50

int main()
{
    char names[MAX_NAMES][LONG] = {0};
    bool flage = true;
    int i = 0, j = 0, k = 0;
    char allAlphabet[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    int countAlfa = 0;
    
    printf("Enter up to 10 words, try to make a pangram:n");
    for(i = 0; (i < MAX_NAMES) amp;amp; (flage == true); i  )
    {
        fgets(names[i], LONG, stdin);
        names[i][strcspn(names[i], "n")] = 0;
        for(j = 0; j < strlen(allAlphabet); j  )
        {
            if(names[i][k] = allAlphabet[j])
            {   
                countAlfa  ;
                k  ;
                j = 0;
            }
        }
        if(countAlfa == 26)
        {
            printf("It's a pangram?n");
            printf("Yes!n");
            flage = false;
        }
    }
    if(countAlfa != 26)
    {
        printf("It's a pangram?n");
        printf("Non");
    }
}


 

Комментарии:

1. if(names[i][k] = allAlphabet[j]) Похоже, вы хотели == бы этого. allAlphabet не является строкой, заканчивающейся 0, поэтому использование strlen для нее не будет работать.

2. Вы никогда не сбрасываете k в 0 и не прерываете цикл, когда k проходит мимо конца проверяемой строки. countAlfa увеличивается при каждом нахождении буквы, а не только уникальной буквы, поэтому ввод «abcde» дважды составляет countAlfa 10, а не 5, как должно быть. Возможно, вам захочется переместить проверку countAlfa == 26 внутри цикла сразу после увеличения countAlfa , иначе вы можете легко пройти мимо нее, и поскольку проверка == вместо >= нее fais.

Ответ №1:

2 проблемы

  1. В вашем коде были некоторые ошибки. Например, if(names[i][k] = allAlphabet[j]) выполняет присваивание, а не проверку эквивалентности. Вы хотели использовать == . Это приводило к путанице.
  2. Во-вторых, я запустил ваш код, и он сработал, если я набрал «abc …. wxyz». Однако, если бы я сделал это в обратном направлении, например, «zyxw … cba», это не сработало бы.

Вот программа, которую я написал, это то, что вы ищете. Пожалуйста, обратите внимание, я не проверяю переполнение массивов символов. Я просто пытаюсь привести вам рабочий пример, и я сделал емкости массивов достаточно большими, чтобы они работали без проверки.

 #define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

#define MAX_NAMES 10
#define LONG 100

int main()
{
    char names[MAX_NAMES][LONG] = { 0 };
    bool flage = true;
    int i = 0, j = 0, k = 0;
    char allAlphabet[] = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };
    unsigned allAlphabetLength = sizeof(allAlphabet) / sizeof(allAlphabet[0]);
    int countAlfa = 0;

    char buf[27];   // stores all the unique alphabetic characters found so far
                    // at a given point while searching through a string
    buf[0] = '';
    unsigned bufIndex = 0;

    char result[1000];
    result[0] = '';
    for (unsigned i = 0; i < MAX_NAMES; i  ) {
        fgets(names[i], LONG, stdin);   // get the current string
        names[i][strcspn(names[i], "n")] = 0;  // get rid of newline character
        strcat(result, names[i]);   // append current string to result array
        unsigned len = strlen(result); // get the length of the result array
        for (unsigned j = 0; j < len; j   ) {   // go through every character in the result array
                                                // add it to buf if it's alphabetic and hasn't 
                                                // been encountered before
            char ch = result[j];  // get the character
            if (!isalpha(ch))   // not alphabetical character. Just continue to next character
                continue;
            unsigned bufLen = strlen(buf);  // search through buf to see if the current alphabetic
                                            // character already exists in buf. If it doesn't, add
                                            // it to buf since we've now encountered a new alphabetic
                                            // character not seen before
            bool found = false;
            for (unsigned k = 0; k < bufLen; k  ) {
                if (buf[k] == ch) {
                    found = true;
                    break;
                }
            }
            if (!found) {
                buf[bufIndex  ] = ch;
                buf[bufIndex] = '';
            }
        }

        if (strlen(buf) == 26) {    // at the end, if buf is size 26 that means it encountered all 26 letters
                                    // of the alphabet
            printf("%s is a pangramn", result);
            break;
        }
        
    }

    return 0;
}
 

Пример вывода

 abcde blah blah blah
this is a sentence
fghijkl
this is another sentence
lmnopqrstuvwx
blah
yz
abcde blah blah blahthis is a sentencefghijklthis is another sentencelmnopqrstuvwxblahyz is a pangram
 

Комментарии:

1. if (len < 26) кажется неправильным. Код ожидает, что слова будут вводиться по одному в строке, поэтому все будет отклонено. === в вашем описании одна из проблем выглядит как опечатка для == .

2. Спасибо за то === , что я просто случайно вставил другое = . Я только что понял, что неправильно понял исходную проблему. Я думал, что он должен был проверять, является ли каждая строка панграммой. Я исправлю удаление моего сообщения и исправлю его.