Question

I have this program that works intended upon Eclipse using MinGW compiler for C, but not in PuTTy. If one runs this/compiles it using Eclipse and MinGW, again, it works just fine. However, in PuTTy, after inputting the difficulty, it jumps straight to the score output (0/however many questions to be asked). What am I doing wrong with my function call that might cause it to not properly work with all GCC compilers?

/*
 * quiz.c
 *
 *  Created on: Feb 7, 2014
 *      Author: Paul
 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* Generating random numbers:
 * Include stdlib.h
 * Include time.h
 * RAND_MAX is the largest positive (defaults to 2.14 billion)
 * the numbers generated are psuedo numbers, so it must be changed.
 *
 * Keep variable declarations at the top to squash Pendantic warnings.
 * */
int genQuestion(int);
int answerQuestion(int);
int response(int);

int main()
{
    int counter;
    int difficulty;
    int qcounter;
    int numCorrect;
    int question;


    /*
     * Disable buffering, because it would otherwise not display the
     * text. How annoying.
     */
    setbuf(stdout, NULL);

    while ((counter < 1) || (counter > 20))
    {
        printf("How many questions for the test (1-20)? ");
        scanf("%d",&counter);
        printf("\n");
    }

    while ((difficulty < 1) || (difficulty > 4))
    {
        printf("Select difficulty (1-4): ");
        scanf("%d",&difficulty);
        printf("\n");
    }

    while (qcounter < counter)
    {
        printf("Question %d: ", qcounter+1);
        question = genQuestion(difficulty);
        if (answerQuestion(question))
        {
            response(1);
            numCorrect++;
        }
        else
        {
            response(0);

            printf("The correct answer was %d\n", question);
        }

        qcounter++;
    }

    printf("Your score was %d / %d\n", numCorrect, counter);

    return 0;
}

int genQuestion(int diff)
{
    int gMin, n1;
    int gMax, n2;
    int rndOperator;
    int ans;

    setbuf(stdout, NULL);
    srand(time(NULL));
/* Set up the difficulties for minimum and maximum ranges.
 */

    if (diff == 1)
    {
        gMin = 1;
        gMax = 10;
    }
    else if (diff == 2)
    {
        gMin = 1;
        gMax = 50;
    }
    else if (diff >= 3)
    {
        gMin = 100;
        gMax = 200;
    }

    if (diff == 4)
    {
        n1 = rand() %gMax - gMin;
        n2 = rand() %gMax - gMin;
    }
    else
    {
        n1 = rand() %gMax + gMin;
        n2 = rand() %gMax + gMin;
    }

    rndOperator = rand() %4 + 1;

    /*
     * Legend:
     * 1 = +
     * 2 = -
     * 3 = *
     * 4 = /
     * Thus, if we divide, make sure the denominator "n2" isn't 0. If
     * it is, set it to 1 instead. This is our safeguard.
     */

    if (rndOperator == 1)
    {
        printf("%d + %d = ",n1,n2);
        ans = n1 + n2;
    }
    else if (rndOperator == 2)
    {
        printf("%d - %d = ",n1,n2);
        ans = n1 - n2;
    }
    else if (rndOperator == 3)
    {
        printf("%d * %d = ",n1,n2);
        ans = n1 * n2;
    }
    else if (rndOperator == 4)
    {
        if (n2 == 0)
            n2 = 1;

        printf("%d / %d = ",n1,n2);
        ans = n1 / n2;
    }
    return ans;
}

int answerQuestion(int answer)
{
    int userAns;

    setbuf(stdout, NULL);
    scanf("%d",&userAns);

    if (answer == userAns)
        return 1;
    else
    {
        return 0;
    }
}

int response(int amIRight)
{
    int liner;

    setbuf(stdout, NULL);
    srand(time(NULL));
    liner = rand() %3 + 1;
    if(amIRight == 1)
    {
        if (liner == 1)
            printf("Alrighty!\n");
        else if (liner == 2)
            printf("Well done!\n");
        else
            printf("Great work!\n");
    }
    else
    {
        if (liner == 1)
                printf("Sorry Charlie!\n");
            else if (liner == 2)
                printf("No can do!\n");
            else
                printf("Incorrect.\n");
    }
    return 0;
}
Was it helpful?

Solution

You are using your variables counter, difficulty, qcounter etc uninitialized.

 while ((counter < 1) || (counter > 20)) {
          ^Not initialized before entering the loop  

Your program invokes undefined behavior. Anything could happen. It may give different results on different compilers.

OTHER TIPS

It should work alright, I see that you are not initializing your variables

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top