如何使用数组和MACRO创建一个调查,告诉C中的评级和响应数?

时间:2016-02-13 17:06:06

标签: c

我正在尝试制作一个使用MACROS和数组的程序。它要求输入1-10的任何等级并创建一个图表。  评级回应    10 25    9 50    8 100     ......   -1239 0 等。 我遇到了大量的语法错误,无法弄清楚如何让这些代码完全运行。吼叫是我想出来的。有没有人知道我能解决什么,使用我开始的这个通用代码的想法使输出正确。谢谢!

$ cat file1
a
b
c

$ cat file2
foo
bar

$ cat file1 | cat file2 -
foo
bar
a
b
c

2 个答案:

答案 0 :(得分:3)

宏定义不是语句,通常最后不会有分号。

在完成任何其他语法检查之前,C语言中的宏会逐字扩展。所以当你定义

#define MAX_RESPONDANTS 20;
#define MIN_RESPONSE_VALUE 0; 
#define MAX_RESPONSE_VALUE 10;
#define TERMINATOR -1;

然后写

printf ("...", MIN_RESPONSE_VALUE, MAX_RESPONSE_VALUE, TERMINATOR);

它被扩展为

printf ("...", 0;, 10;, -1;);

我认为你会同意的是语法无效。

因此,您应该从宏定义中删除分号:

 #define MAX_RESPONDANTS 20

(顺便说一下,正确的拼写是“受访者”。)

我猜你可能已经在线路上遇到了类似的错误

const int RESPONSE_VALUES = MAX_RESPONSE_VALUE - MIN_RESPONSE_VALUE

并通过删除末尾的分号来“修复”它。但这已经扩展为

const int RESPONSE_VALUES = 10; - 0;

MIN_RESPONSE_VALUE实际上并未用于计算分配给RESPONSE_VALUES的值;它出现在它自己的声明中,其中说“计算0的负数,然后不用它做任何事情。”

奖金错误:

  • ratingCounters的大小为RESPONSE_VALUES,在本例中为10,但您在其中存储MAX_RESPONDANTS个值,即20。

  • 在行printf("response is","%d" ,RESPONSE_VALUES);中,前两个参数应该是单个字符串。如上所述,该行只会打印response is

  • else if (value = TERMINATOR)行中,您几乎肯定是==

答案 1 :(得分:0)

如问题评论中所述,发布的代码存在很多问题。

以下代码纠正了这些问题和其他几个问题

//#include <stdlib.h> -- not needed
#include <stdio.h>  // printf()

// notice no trailing `;` and surrounded by parens
#define MAX_RESPONDANTS    (20)
#define MIN_RESPONSE_VALUE (0)
#define MAX_RESPONSE_VALUE (10)
#define TERMINATOR         (-1)

int main(void)
{
    // -- not needed statement
    //const int RESPONSE_VALUES = MAX_RESPONSE_VALUE - MIN_RESPONSE_VALUE

    int value;
    int loopCount;

    // enter rating 1-10
    int ratingCounters[MAX_RESPONDANTS] = { 0 };

    // loopCount, responses[MAX_RESPONDANTS]; value;

    // corrected `for()` statement for all 3 parameters
    for (loopCount = 0; loopCount < MAX_RESPONDANTS; loopCount++)
    {
        // prompt user for each input value
        printf ("Please enter a value in range %d ... %d."
                " Use %d to end input: \n    ",
            MIN_RESPONSE_VALUE,
            MAX_RESPONSE_VALUE,
            TERMINATOR);

        // check for success
        if( 1 != scanf("%d", &value) )
        {
            loopCount--; // adjust for `for` loop increment
            continue;
        }

        if ( TERMINATOR == value )
        {
            break;
        }

        // only check for range after checking for exit
        if (value >= MIN_RESPONSE_VALUE && value <= MAX_RESPONSE_VALUE)
        {
            printf( "response is: %d", value );
        }

        else
        {
            printf("Outside valid range. Please input another number.\n");
            loopCount--; // adjust for `for` loop increment
            continue;
        }

        // got a good value so save it
        ratingCounters[loopCount] = value;
    } // end for loop

    printf("\n\nRating Number of Responses\n");
    printf("------ --------------------\n");

    return 0;
} // end function: main