【问题标题】:Simple counters not working in C简单的计数器在 C 中不起作用
【发布时间】:2014-12-03 07:37:26
【问题描述】:

我是 C 的新手,遇到了一个问题,我认为你们中的一些人过去可能遇到过。我正在尝试编写一个让用户输入一堆成绩的程序,该程序会告诉您输入了多少 A、B、C、D、F。 然而,问题是我的成绩计数器无法正常工作。

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include<stdint.h>

//MACRO
#define F_Range (0-49)
#define D_Range (50-59)
#define C_Range (60-69)
#define B_Range (70-79)
#define A_Range (80-100)
#define A_COUNTer
#define B_COUNTer
#define C_COUNter
#define D_COUNTer
#define F_COUNTer
//Function Prototype
void display(void);

int main(int argc, char** argv) {
    {

        float input, F_Counter, D_Counter, C_Counter, B_Counter, A_Counter;
        printf("Total Number of grades 'A' (80-100) = %.2f",A_Counter);
        //the rest of the displays would go here
        do
        {
            fflush (stdin);
            scanf("%f",&input); //Get input from user
            if (input == F_Range);
            {
                F_Counter++;
            }
            if (input == D_Range);
            {
                D_Counter++;
            }
            if (input == C_Range);
            {
                C_Counter++;
            }
            if (input == B_Range);
            {
                B_Counter++;
            }
            if (input == A_Range);
            {
                A_Counter++;
            }

        }

        while (input != 999);
        //Exit
        {

        }
        return 0;
    }
}

【问题讨论】:

  • 请自行在此处添加相关代码。访问受限的人可能无法访问其他网站。
  • 首先你有两个“{”在main的开头和两个“}”,虽然这不是错误,但这不是必需的
  • 好的,我以后就在这里贴代码。谢谢不知道,我已经注意到了。
  • input == F_Range,这在 c 上是如何工作的?
  • @Typical 如果对您有帮助,请接受我的回答

标签: c loops counter


【解决方案1】:

好的,所以当你开始使用#define x y 时,你只需说“用'y'更改对'x'的所有引用”这样当你有时

#define C_Range (60-69)

然后

 if (input == C_Range );

它迭代为

 if (input == (60-69));

这是没有意义的,加上你有“;”在if 声明的末尾 这也没有意义

改为使用:

#define F_RangeLow 0
#define F_RangeHigh 49

和 if 语句

 if (input >= F_RangeLow &&  input <= F_RangeHigh )

现在你要做的另一件事是用 0 启动计数器。那是因为你想从 0 开始计数...

float F_Counter=0;

main 的开头不需要 2 个“{” 这已经足够了:

int main(int argc, char** argv) {
.
.
.
}

【讨论】:

    【解决方案2】:

    您的计数器变量未初始化。因此,它们具有未知值。所以你必须把float input, F_Counter, D_Counter, C_Counter, B_Counter, A_Counter;改成float input, F_Counter=0, D_Counter=0, C_Counter=0, B_Counter=0, A_Counter=0;

    【讨论】:

    • 我做到了。问题还是一样。计数器不会更新。保持在 0
    • 你是说宏的范围方面不起作用?
    【解决方案3】:

    您的代码存在多个主要问题。

    首先是您的 Range 宏没有扩展到工作代码:

    #define F_Range (0-49)
    …
    if (input == F_Range);
    

    这扩展为:

    if (input == (0-49));
    

    只有当input-49 时才成立。如果你想检查 input 是否在 0 到 49 之间,你必须明确地这样做:

    if (input >= 0 && input <= 49)
    

    鉴于您目前对 C 的理解水平,最好暂时不要使用宏。不用管它们,写出完整的代码,一旦你牢牢掌握了语言,就可以开始使用宏了。


    下面一行:

    printf("Total Number of grades 'A' (80-100) = %.2f",""A_Counter);
                                                        ^^
    

    有一对杂散的引号。 (这甚至可以编译吗?)


    另外:

    • 上面提到的if 语句的末尾有一个分号,这使它无法正常工作。
    • 您的计数器变量未初始化为零。

    【讨论】:

      【解决方案4】:
      float input, F_Counter, D_Counter, C_Counter, B_Counter, A_Counter;
      

      main() 上下文中,您正在递增这些值,但它们都没有被初始化。当您有未初始化的变量时,您有未定义的行为。

      这些值应该像

      一样初始化
      float input =0,F_Counter=0;/* similarly for the rest */
      

      使用宏检查范围也需要固定 (0-49) 并不意味着您正在检查范围从 0 到 49 。在这些情况下应使用比较运算符。

      【讨论】:

        【解决方案5】:
        #include <stdio.h>
        #include <conio.h>
        #include <stdlib.h>
        #include <stdint.h>
        
        #define S_(x) #x
        #define S(x) S_(x)
        #define RANGE_S(x) S((x##_Range))
        #define COUNTER(x) x##_Counter
        #define DISP(x) \
        printf("Total Number of grades '%c' %s = %d\n",\
            CHAR(x), RANGE_S(x), COUNTER(x))
        #define CHECK(var, x) atoi(S(x##_Range)) <= var
        #define CHAR(x) *#x
        
        #define F_Range  0-49
        #define D_Range 50-59
        #define C_Range 60-69
        #define B_Range 70-79
        #define A_Range 80-100
        
        void display(void);
        
        int main(int argc, char** argv) {
            float input;
            int COUNTER(A)=0, COUNTER(B)=0, COUNTER(C)=0, COUNTER(D)=0, COUNTER(F)=0;
        
            while(scanf("%f", &input)==1 && input != 999.f){
                if (CHECK(input, A)){
                    ++COUNTER(A);
                } else if(CHECK(input, B)){
                    ++COUNTER(B);
                } else if(CHECK(input, C)){
                    ++COUNTER(C);
                } else if(CHECK(input, D)){
                    ++COUNTER(D);
                } else if(CHECK(input, F)){
                    ++COUNTER(F);
                }
            }
            DISP(A);
            DISP(B);
            DISP(C);
            DISP(D);
            DISP(F);
            return 0;
        }
        

        【讨论】:

          【解决方案6】:

          尝试这样的事情

          #define F_Range(x) (x>=0 && x<=49)?true:false
          #define D_Range(x) (x>=50 && x<=59)?true:false
          #define C_Range(x) (x>=60 && x<=69)?true:false 
          #define B_Range(x) (x>=70 && x<=79)?true:false 
          #define A_Range(x) (x>=80 && x<=89)?true:false 
          

                  scanf("%f",&input); //Get input from user
                  if (F_Range(input));
                  {
                      F_Counter++;
                  }
                  else if (D_Range(input))
                  {
                      D_Counter++;
                  }
                  else if (C_Range(input))
                  {
                      C_Counter++;
                  }
                  else if (B_Range(input))
                  {
                      B_Counter++;
                  }
                  else if (A_Range(input))
                  {
                      A_Counter++;
                  }
          

          【讨论】:

          • 为什么是多余的? true : false?这使得宏变得比它们需要的更复杂。
          • 并记住这种宏,宏的一个参数在扩展代码中被计算两次,所以像 'F_Range(x++)' 这样传递 'x' 不会产生副作用
          • if (F_Range(input)); remove ;
          猜你喜欢
          • 1970-01-01
          • 2020-10-17
          • 2017-01-07
          • 2017-02-09
          • 1970-01-01
          • 2016-05-22
          • 1970-01-01
          • 1970-01-01
          • 2022-12-22
          相关资源
          最近更新 更多