3

Trying to compile a simple switch statement with 5 choices. 1-4 produce calculations and output while #5 exits the program. I made a do/while loop so if choice 5 is entered the program will end. I get an error:

4_19.c: In function ‘main’:
4_19.c:95: error: ‘choice’ undeclared (first use in this function)
4_19.c:95: error: (Each undeclared identifier is reported only once
4_19.c:95: error: for each function it appears in.)

I don't know why it is saying its undeclared, because I declared it in the beginning. What did I do wrong? Thanx. Here is my code:

    /* C++ book. 4_19 The speed of sound in gases. 
Create a menu to choose between 4 gases. User then enters number of seconds
it took to travel to destination. The program will calculate how far the source was (from speed that is unique to gas density). Validate input of seconds from 0 to 30 seconds only. 
*/

#include <stdio.h>
int main(void)
{
    do
    {
        // Declare variables
        int choice;
        float speed, seconds = 0, distance;

        //Display program details and menu choice
        printf("\n");
        printf("Choose a gas that you would like to analyze.\n");
        printf("Medium                              Speed(m/s)\n");
        printf("1.Carbon Dioxide                    258.0\n");
        printf("2.Air                               331.5\n");
        printf("3.Helium                            972.0\n");
        printf("4.Hydrogen                          1270.0\n");
        printf("5.Quit Program");
        printf("Enter a choice 1-5: ");
        scanf("%i",&choice);
        while (choice < 1 || choice > 5)        // Validate choice input. 
        {   
            printf("You entered an invalid number. Choose 1,2,3, or 4 only.\n");
            printf("Enter a choice 1-5: ");
            scanf("%i",&choice);
        }

        // Switch statements to execute different choices
        switch(choice)
        {
            case 1:     // Carbon Dioxide
                printf("Enter number of seconds, from 0 to 30, that the sound traveled in carbon dioxide: ");
                scanf("%f", &seconds);
                while (seconds < 0 || seconds > 30)      // Validate time entered
                {
                    printf("The range of input for seconds is only from 0 to 30 seconds.\n");
                    printf("Please enter a valid number for number of seconds: ");
                    scanf("%f", &seconds);
                }
                speed = 258.0;
                distance = speed * seconds;
                printf("The distance from the source of the sound is %.2f meters in carbon dioxide.\n", distance);
                break;

            case 2:     // Air
                printf("Enter number of seconds, from 0 to 30, that the sound traveled in air: ");
                scanf("%f", &seconds);
                while (seconds < 0 || seconds > 30)      // Validate time entered
                {
                    printf("The range of input for seconds is only from 0 to 30 seconds.\n");
                    printf("Please enter a valid number for number of seconds: ");
                    scanf("%f", &seconds);
                }
                speed = 331.5;
                distance = speed * seconds;
                printf("The distance from the source of the sound is %.2f meters in air.\n", distance);
                break;

            case 3:     // Helium
                printf("Enter number of seconds, from 0 to 30, that the sound traveled in helium: ");
                scanf("%f", &seconds);
                while (seconds < 0 || seconds > 30)      // Validate time entered
                {
                    printf("The range of input for seconds is only from 0 to 30 seconds.\n");
                    printf("Please enter a valid number for number of seconds: ");
                    scanf("%f", &seconds);
                }
                speed = 972.0;
                distance = speed * seconds;
                printf("The distance from the source of the sound is %.2f meters in helium.\n", distance);
                break;

            case 4:     // Hydrogen
                printf("Enter number of seconds, from 0 to 30, that the sound traveled in hydrogen: ");
                scanf("%f", &seconds);
                while (seconds < 0 || seconds > 30)      // Validate time entered
                {
                    printf("The range of input for seconds is only from 0 to 30 seconds.\n");
                    printf("Please enter a valid number for number of seconds: ");
                    scanf("%f", &seconds);
                }
                speed = 1270.0;
                distance = speed * seconds;
                printf("The distance from the source of the sound is %.2f meters in hydrogen.\n", distance);
                break;

            case 5:
                printf("End of Program\n");
                break;
        }
    } while (choice != 5);

    return 0;
}
bdonlan
  • 224,562
  • 31
  • 268
  • 324
J-e-L-L-o
  • 315
  • 4
  • 9
  • 1
    It's always advisable to declare the variables outside the closed loops. – Arpit Jul 05 '11 at 03:41
  • 1
    Yes, this is true. I always declare the variables first. I added the do/while loop after I wrote the program to add an end program statement and just put the do braces in the wrong place. – J-e-L-L-o Jul 05 '11 at 03:53

4 Answers4

8

You have declared choice inside your do { } while loop; this means that it can only be accessed within those two braces. However, in your while(choice != 5) condition, you reference it again, outside the braces; this is an error. The solution is to move choice up one level, and declare it within the scope for main.

bdonlan
  • 224,562
  • 31
  • 268
  • 324
  • ahhhh... I edited the program afterwords to add more functionality to it, and didn't realize the scope of the do loop. I just had to move the variables. Thanx! – J-e-L-L-o Jul 05 '11 at 03:46
3

Move the declaration of choice outside of the loop. Right before the do.

choice is only scoped inside the loop. The while() clause is outside of the loop, so it can't access things that were declared inside the loop's curly braces itself.

poundifdef
  • 18,726
  • 23
  • 95
  • 134
2

Just declare choice before the do statement. This is because when you declare it within the do loop, its not visible in the while condition as the scope is local and within the loop only

Balanivash
  • 6,709
  • 9
  • 32
  • 48
1

I know it is super late to comment on this. However, if anyone runs into this problem in the future and finds this question. You need to declare variables outside of the brackets. Here is an example.

int main()
{
    char choice;  // Variables defined outside loop. With in the scope of main.
    double a, x, res;
    do
    {


        cout << "Enter a: ";
        cin >> a;
        cout << "Enter x: ";
        cin >> x;

        res = 5.00 * tanh(a, x) + 4.00 * cos(a, x);

        cout << "F = " << res << endl;
        cout << "Would you like to continue? ";
        cin >> choice;

    } while (choice == 'Y' || choice == 'y');

    return 0;
}
Geno C
  • 1,401
  • 3
  • 11
  • 26
  • Thanks for the code snippet. This doesn't really answer the user's question, which I think is really about where to declare his variable and possibly initialize ( which should be outside of the loop). Clearly stating this would make it lots easier. – Unpossible Apr 30 '20 at 19:31