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

/* prototypes for functions */
void getstring(char *sentence);
int check(char *sentence, int missing[26]);
void showNegativeResults(int[]);

int main(void) {
    char sentence[1024] = {'\0'};
    int missing[26] = {0};

    printf("Enter sentence\n(ending with a period like this one).\n\n");
    getstring(sentence);

    printf("\nSentence: \"%s.\"", sentence);    

    if ( check(sentence, missing) )
        printf("\n\nThe sentence IS a pangram!\n\n");
    else
        showNegativeResults(missing);

    return 0;
}

void getstring(char *sentence) {
    int j = 0;
   while ((sentence[j] = getchar()) != '.')
      j++;
   sentence[j] = '\0';
}

int check(char *sentence, int missing[26]) {

    return 1; /* return a 1 if it is a pangram*/

    return 0; /*return 0 if it is not a pangram */
}

void showNegativeResults(int missing[26]) {
    int c;
    printf("\n\nThe sentence is NOT a pangram.\n");
    printf("Missing letters:");
    for(c = 0; c < 26; c++)
        if (missing[c])
            printf(" %c", ('a' + c));
    printf("\n\n");
}

文字列内の文字にアルファベットのすべての文字が含まれているかどうか、およびユーザーが欠落している文字を認識できないかどうかを解読する関数を実装するのに助けが必要です。

4

5 に答える 5

1

不変式について教えられましたか?これら 2 つの特殊なケースを一般化する不変条件を探すことをお勧めします。

  • 文のどの部分も見ていない場合は、すべての文字が欠落していると考える必要があります。

  • すべての文を見た場合、あなたが書いたように、missingデータ構造には文から欠落している文字が正確に含まれています。

isalphaまた、ANSI C 関数とを調べることをお勧めしますtolower

于 2012-05-27T20:14:31.157 に答える
1

宿題をせずに答え...

1) get the character
2) is it a "."
   a) check if you have all and return result.
   b) continue
3) is it greater than/equal "A" but less than/equal "Z" ( this defines a range of characters )
   a) add it to list return to (1)
   b) continue
4) is it greater than/equal "a" but less than/equal "z" ( another range, could be combined with the first )
   a) add it to list return to (1)
   b) continue
5) is it a " " ( a space .. but could be another range, could be combined with the first )
  a) continue 
6) error not a correct character and exit
于 2012-05-27T22:16:05.073 に答える
0

どの文字が含まれているかを示す入力文字列を繰り返し処理してから、欠落している文字を確認します。

int main()
{
    char str[] = "Some meaningful text";

    int freq[256];
    int i;

    for ( i = 0; i < 256; i ++) // clear frequency array
    {
        freq[i] = 0;
    }

    for (i = 0; str[i] != '\0'; i++) // parse input string
    {
        freq[str[i]]++;
    }

    for ( i = 0; i < 256; i ++)
    {
        if (freq[i]==0 && isalpha(i)) // find out which leters weren't typed
        {
            printf("%c letter wasn't typed!\n", (char)i);
        }
    }

    return 0;
}
于 2012-05-27T20:30:59.723 に答える
0

内部checkでは、文字列を繰り返し処理し、sentence遭遇した文字ごとに、その文字を に変更できmissingます1

最後に、欠落している文字は 0 でマークされます。missing少なくとも a が含まれている場合は0を返し0、そうでない場合は を返します1

完全なコードを書くつもりはありませんが、始めるためのヒントをいくつか示します。

1) を使用して正しい要素をマークできますcurrentCharacter - 'a'。これにより、 character のインデックスが返されますcurrentCharacter

2)次を使用して文字列を反復処理できます

char currentCharacter;
while( currentCharacter = *(sentence++) )
{
   //mark array here
}
于 2012-05-27T20:13:57.243 に答える
0

これについて考えることができる最も簡単な方法は、アルファベットの各文字をループして、その文字が文に含まれているかどうかを確認することです(文字が見つかるまで、または文の終わりに到達するまで文をループします)。文字が文に含まれていない場合は、番号 (欠落している文字に対応する) を配列に追加します。

ここに作業関数があります:

int check(char *sentence, int missing[26]) 
{
  int missIndex = 0; //the index for the missing array;
  bool iWasFound; //was the letter found?  (used in the loops below)

  for(char i = 'A'; i <= 'Z'; i++)
  {
    iWasFound = false;

    for(int j = 0; j < 1024; j++)
    {
      if(toupper(sentence[j]) == i)
      {
        iWasFound = true;
        break;
      }
    }

    //if we did not find the letter, add the corresponding number to the missing array
    if(!iWasFound)
    {
      missing[missIndex] = (int)(i - 'A');
      cout << (int)(i - 'A') << " | " << missing[missIndex] << std::endl;
      missIndex++;
    }
  }

  if(missing[0] == -1)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}

何か説明が必要な場合はお知らせください

于 2012-11-21T02:38:34.177 に答える