0

I am trying to have the user type in a number between 1 and 8 to print out stuff on screen (height), if the number is lower than 1 or higher than 8 I would like for the program to prompt again for an input instead of it quitting out and say "invalid". I know I have to set it up with do on top and when on the bottom in C, my question is how would I go about it when I have 2 possible outcomes, i.e. too low or too high?

do {
    int height = get_int(Height: ");
    if (height < 1)
        ~ ~printf("invalid");
    else if (height > 8)
        ~ ~printf("invalid");
} when(???????) 

printf("valid")
2
  • Please format your code. You're also missing ; at the end of all your statements. Commented Feb 13, 2022 at 4:09
  • apologies, its more psudo code so to speak, mainly to try and get the point across but I will of course use ; at the end of statements. Commented Feb 13, 2022 at 4:21

4 Answers 4

2

The key is Logical OR operator (||) in logical operator.

A logical operator would :

  1. treats its operands as boolean values
    • treats a non-zero value operand as true
    • treats a zero value operand as false
  2. operates the boolean algebra on its operands
  3. returns the boolean algebra result
    • returns 1 for true boolean result
    • returns 0 for false boolean result

The Logical OR operator (||) :

lhs || rhs
  • Here, lhs and rhs are the 2 operands of OR(||) operator
  • The OR operator returns 1 if any of the following conditions is true:
    1. only lhs is true
    2. only rhs is true
    3. both lhs and rhs are true
  • In other words, the boolean algebra OR result is true if either lhs or rhs is true.

In your example, there are 2 conditions :

  1. height is less than 1
  2. height is larger than 8

if either of them is true, then the result is true (the loop will continue), so the expression in this example would be :

int height; /* move height outside the loop so it can be used in do-while condition */
do {
    height = get_int();

    if (height < 1)
        printf("invalid\n");
    else if (height > 8)
        printf("invalid\n");
} while(height < 1 || height > 8);

printf("valid\n");

Furthermore, since we have already done the logical condition in the loop, we can just add a flag variable instead:

int flag; /* record the boolean result */
do {
    int height = get_int();

    if (height < 1) {
        printf("invalid\n");
        flag = 1;
    } else if (height > 8) {
        printf("invalid\n");
        flag = 1;
    } else {
        flag = 0; /* !(height < 1 || height > 8) */
    }
} while(flag);

printf("valid\n");
Sign up to request clarification or add additional context in comments.

1 Comment

You've been such a great help, I was trying && but didn't realize the logical error there, and then my problem was that I didn't "save" height outside the loop for while() to use it. changed those two things and bam! now its working! such a cool feeling. now to finish the 2/3 left of this project lol.
1

Try this to see if it works for you.
If not, leave a comment to tell me what you really want.

#include <stdio.h>

int main()
{
    int height = 0;
    while (height < 1 || height > 8) {
        scanf("%d", &height);

        if (height >= 1 && height <= 8) {
            break;
        } else {
            printf("Invalid, please try again.\n");
        }
    }

    printf("Valid.\n");

    return 0;
}

Comments

1

A simple way of checking if the user has made an invalid choice would be to use a simple Boolean variable and set it to "false" when an invalid choice is made.

I have modified your own example code to include what I mean here:

bool valid = true;
do {
  valid = true; //reset valid to true at the beginning of the loop, otherwise it will remain false when the loop runs again
  int height = get_int("Height: ");
  if (height < 1)
    valid = false; //set valid to false when an invalid choice is made
  else if (height > 8)
    valid = false; //set valid to false when an invalid choice is made
} while (!valid) //if valid is not true ( or ==false), repeat. If valid is true or not equal to false, don't repeat and continue to the print statement below. 

print("valid");

Please note that I used the same get_int function you provided in your post. I am not aware of this function. For ways of reading integers (for example scanf) see other answers in this thread.

Comments

0

I hope this helps you.

#include <stdio.h>
#include <stdlib.h>
        
int main() { 
    int num;
    do {
        printf("Enter 0 to quit\n");
        printf("Print Enter number between 1 and 8\n");
        scanf("%d",&num);
        if (num > 8) {
            printf("Number to high\n");
        } else if (num < 0) {
            printf("Number to low\n");
        }

        if (num == 0) {
            printf("You quit the program goodby\n");
        } else {
            printf("Number within range\n");
        }
    } while(num != -0);

    return 0;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.