【问题标题】:I am trying to find the scrabble value of a word using C program我正在尝试使用 C 程序查找单词的拼字游戏值
【发布时间】:2018-11-28 00:39:27
【问题描述】:

我总是将输入的每个字母的值设为 1,而我应该得到代码中描述的值。请帮助找出我的代码中的错误。

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

char c;

char num (char c);

int main () {
    int sum;

    printf("Enter a word:");

    c=0;

        while (c=getchar() != '\n') {
            c=toupper(c);
            sum+=c;
        }

    printf("Scrabble value : %d",sum);

    return(0);
}

char num (char c) {

    if (c=='A'||c=='E'||c=='I'||c=='L'||c=='N'||c=='O'||c=='R'||c=='S'||c=='T'||c=='U') c=1;
    if (c=='D'||c=='G') c=2;
    if (c=='B'||c=='C'||c=='M'||c=='P') c=3;
    if (c=='F'||c=='H'||c=='V'||c=='W'||c=='Y') c=4;
    if (c=='K') c=5;
    if (c=='J'||c=='X') c=8;
    if (c=='Q'||c=='Z') c=10;

    return(c);
}

【问题讨论】:

  • 你在代码中哪里使用num(char c) ;-) ?
  • 表达式c=getchar() != '\n' 是,由于operator precedence,等于c=(getchar() != '\n')。这意味着c 的值将是01,仅此而已。另请注意,getchar 返回一个int,这对于检查EOF 很重要。最后,您需要检查EOF 或一般错误。

标签: c char parentheses operator-precedence getchar


【解决方案1】:

简而言之,这对你有用(调用 num;在 while 中修复 getchar 调用;将 sum 初始化为 0;没有错误处理):

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

char c;

char num (char c);

int main () {
    int sum = 0;

    printf("Enter a word:");

    c=0;

        while ((c=getchar()) != '\n') {
            c=toupper(c);
            sum+=num(c);
        }

    printf("Scrabble value : %d",sum);

    return(0);
}

char num (char c) {

    if (c=='A'||c=='E'||c=='I'||c=='L'||c=='N'||c=='O'||c=='R'||c=='S'||c=='T'||c=='U') c=1;
    if (c=='D'||c=='G') c=2;
    if (c=='B'||c=='C'||c=='M'||c=='P') c=3;
    if (c=='F'||c=='H'||c=='V'||c=='W'||c=='Y') c=4;
    if (c=='K') c=5;
    if (c=='J'||c=='X') c=8;
    if (c=='Q'||c=='Z') c=10;

    return(c);
}

【讨论】:

  • 捕捉“_”和“”之类的东西(当然在拼字游戏中是禁止的)会改善这一点。
  • @Yunnosch 当然,但我明确写了没有错误处理;-)
  • 非常感谢。我理解我在优先顺序上的错误。
  • @NikhilBoddupalli 欢迎您!不过也谢谢其他人,我只是总结了一下。
  • 你应该把 char c 改成 int。
【解决方案2】:

为了得到这个干净,初始化总和:

int sum = 0;

确定值的函数逻辑看起来不错(可能与返回值不同),
但是您不断更改参数c。这实际上并没有破坏任何东西,但看起来有些混乱。我建议将所有c= something 更改为return something;

要进行默认处理,请将return(c); 更改为return 0;

而且你永远不会调用你的函数。

改变

sum+=c;

sum+=num(c);    

从一些程序员老兄的(绝对必要的)评论中挑选(学分),
由于运算符优先级,表达式c=getchar() != '\n' 等于c=(getchar() != '\n')。这意味着c 的值将是01,仅此而已。另请注意,getchar 返回一个 int,这对于检查 EOF 很重要。最后,您需要检查EOF 或一般错误。

【讨论】:

  • 如果没有来自某些程序员老兄的 getchar() 括号修复,这也不足以正常工作。
  • @YesThatIsMyName 这就是为什么我一意识到就加入了评论。但是,仅使用它也无济于事。
【解决方案3】:

其他人已经回答了这个问题,但仅供参考,这是您编写更好的查找函数的方法:

int get_val (char c)
{
  const int VALUES ['Z' - 'A' + 1] =
  {
    ['A' - 'A'] = 1,
    ['B' - 'A'] = 3,
    ['C' - 'A'] = 3,
    ...
  };

  return VALUES[c - 'A'];
}

【讨论】:

  • 回复关于 EBCDIC 的强制性传入 BS 评论:“你们之前都听说过,在代码中的任意位置添加:_Static_assert('Z'-'A' == 25, "Crap not supported");”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
相关资源
最近更新 更多