【问题标题】:Check whether a list of words make a Pangram检查单词列表是否构成 Pangram
【发布时间】:2022-01-23 12:42:04
【问题描述】:

我需要创建一个二维字符串数组并输入 hi,最多 10 个单词,而不是检查这些单词是否是 pangram。
如果单词是 pangram,程序需要停止接收单词。
例如:

the
five
boxing
wizards
jump
quickly
It's a pangram?
Yes

但它并没有停止,而是一直询问单词直到它达到 10。还说非 pangram 句子是 pangram。

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

     #define ROWS 10
     #define COL 50
     #define NUM_OF_LETTERS 26


     int main()
     {
        char words[ROWS][COL] = {0};
        char used []['z' - 'a' + 1] = {0};
        int i = 0;
        int j=0;
        int count = 0;

        printf("Enter up to 10 words try to make a pangram\n");
        while(i<ROW&& count < NUM_OF_LETTERS)
        {
            fgets(words[i], ROW, stdin);
            words[i][strcspn(words[i], "\n")] = 0;
            int len = strlen(words[i]);
        
            for(j=0;j<COL;j++)
            {
                if(strcmp(words[j] ,used[j]) == 0)
                {
                    count++;
                }
            }
            i++;
        }   
        printf("It's a pangram?\n");
        if (count >= NUM_OF_LETTERS)
        {
            printf("Yes!\n");
        }
        else
        {
            printf("No\n");
        }
        return 0;
    }

而且我不能使用指针。

【问题讨论】:

  • 供将来参考,我们知道它不起作用;如果它正常运行而您仍然将其发布在此处,那就太奇怪了。相反,您应该包括in your question,它 正在 做什么,以及它与您的期望有何不同(这也应该包含在您的问题中),以及您迄今为止所做的任何努力到目前为止调试您的程序。我立刻看到了一个巨大的问题。 words[][COL] = {0} 声明了一个 1xCOL 数组数组,因此,一旦您索引超过 words[0],您就会调用未定义的行为(例如,i >= 1 是 UB)。
  • 您检查输入是否是程序需要在输入循环内,而不是在它之后。或者它需要在两个地方,以防你填写单词列表。所以你需要使用函数来避免代码复制。
  • 我试过你说的但它只是计算字母,它需要检查字母的所有字符是否都在字符串中。那是我做不到的

标签: arrays c string multidimensional-array pangram


【解决方案1】:
  1. Pangram :
    pangram 或全字母句子是使用给定字母表的每个字母至少一次的句子。 Pangram - wiki

2。仅计算输入单词中字母的唯一外观。单词可以有大写和小写字母。

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

#define MAX_INPUT_WORDS 10
#define MAX_WORD_SIZE   50
#define UNIQUE_LETTERS  26

int main()
{
    char* uniq_chars = "abcdefghijklmnopqrstuvwxyz";
    //create a look-up table for characters in an alphabet set
    char alpha_lt[256] = {0};
    for (int ai = 0; '\0' != uniq_chars[ai]; ++ai)
        alpha_lt[ (unsigned) uniq_chars[ai]] = 1;

    char words [MAX_INPUT_WORDS][MAX_WORD_SIZE];

    printf ("\nEnter up to 10 words, try to make a Pangram:\n");
    int uniq_count = 0; // tracks count of unique characters so far
    int wcount = 0;
    for (int wi = 0 ; wi < MAX_INPUT_WORDS; ++wi) {
        while (1 != scanf ("%49s", words[wi]));
        ++wcount;
        //count the unique characters from alphabet-set
        for (int ci = 0; '\0' != words[wi][ci]; ++ci) {
            //Pangram can have letter from different cases.
            int ichar = tolower (words[wi][ci]); // to homogenise upper/lower cases
            if (alpha_lt[ichar]) {    // uniq character not yet counted
                ++uniq_count;
                alpha_lt[ichar] = 0; // remove from LT; to skip
                // counting during next occurance
            }
        }
        if (UNIQUE_LETTERS == uniq_count)
            break;
    }

    printf ("\nIs it a Pangram?\n");
    printf ((UNIQUE_LETTERS == uniq_count) ? "Yes!\n" : "No\n");
    for (int wi = 0; wi < wcount;)
        printf ("%s ", words[wi++]);
    printf ("\n");

    return 0;
}
  1. 标准英语的 Pangram 示例:
"Waltz, bad nymph, for quick jigs vex." (28 letters)  
"Glib jocks quiz nymph to vex dwarf." (28 letters)  
"Sphinx of black quartz, judge my vow." (29 letters)  
"How vexingly quick daft zebras jump!" (30 letters)  
"The five boxing wizards jump quickly." (31 letters)  
"Jackdaws love my big sphinx of quartz." (31 letters)  
"Pack my box with five dozen liquor jugs." (32 letters)  
"The quick brown fox jumps over a lazy dog" (33 letters)  

用于测试的 Pangram 无效:

ABCD EFGH IJK LMN OPQR STUVWXY Z  
abcdef g h i jklmnopqrstuvwxyz

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 2018-04-21
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 2021-10-23
    • 1970-01-01
    相关资源
    最近更新 更多