Функция для ввода трех целых чисел в C

У меня проблемы с моей функцией getThreeIntegers. Как правильно написать его с помощью указателей и получить результат? Когда я запускаю его, все отображается как 0. Я борюсь с написанием правильного формата.

#include <stdlib.h>
#include <stdio.h>
#define pause system("pause")
#define cls system("cls")
#define flush fflush(stdin)

//Prototype Functions Here
void displayAverage(int n1, int n2, int n3);
void displayLowest(int n1, int n2, int n3);
void displayProduct(int n1, int n2, int n3);
void displaySum(int n1, int n2, int n3);
void getMenu();
char getUserChoice();
int getThreeIntegers(int *num1, int *num2, int *num3);

main() {
        //Declare Variables Here
        char choice = ' '; //used by menu
        int num1 = 0, num2 = 0, num3 = 0;

        do{
        choice = getUserChoice();
        switch(choice) {
            case 'A':
                getThreeIntegers(&num1, &num2, &num3);
                pause;
                break;
            case 'B':
                displaySum(num1, num2, num3);
                pause;
                break;
            case 'C':
                displayProduct(num1, num2, num3);
                pause; 
                break;
            case 'D': 
                displayAverage(num1, num2, num3);
                pause;
                break;
            case 'E':
                displayLowest(num1, num2, num3);
                pause;
                break;
            case 'F':
                printf("Goodbye! \n\n");
                pause;
                break;
            default:
                printf("Invalid Selection...\n\n");
                pause;
                break;
        } // end switch
    }while(choice != 'F');
} // end main

void displayAverage(int num1, int num2, int num3) {
    float average = 0.0;
    int sum = num1 + num2 + num3; 
    average = sum/3; 

        printf("The average of the integers is: %.2lf\n", average);

} //end displayAverage

void displayLowest(int num1, int num2, int num3) {
    int lowest;
    int a = 0, b = 0, c = 0; 

    if(a < b && a < c)
            lowest = a;
    printf("The lowest integer is: %i\n", a);
} // end displayLowest

void displayProduct(int num1, int num2, int num3) {
    int product;
    product = num1*num2*num3;
    printf("The product of the integers is: %i\n", product);
} // end displayProduct

void displaySum(int num1, int num2, int num3) {
    int sum;
    sum = num1 + num2 + num3;
    printf("The sum of the integers is: %i\n", sum);

} // end displaySum

void getMenu() { //displays menu onto output
    cls;
    printf("\t MAIN MENU\n");
    printf("*************************\n\n");
    printf("A. Enter three integers.\n");
    printf("B. Display the sum.\n");
    printf("C. Display the product.\n");
    printf("D. Display the average. \n");
    printf("E. Display the lowest number. \n");
    printf("F. Quit. \n\n");
    printf("*************************\n");
    printf("Enter user choice: "); 
    return; 
} // getMenu

char getUserChoice(){
   char result;
   getMenu(); //call to function
   scanf("%c", &result); //user enters their choice
   result = toupper(result); //converts char to capital
   flush;
   return result;
} // end getChoice

int getThreeIntegers(int *n1, int *n2, int *n3) {
    printf("Enter first integer: ");
    scanf("%i", &n1);
    printf("Enter second integer: ");
    scanf("%i", &n2);
    printf("Enter third integer: ");
    scanf("%i", &n3);
    flush;
    return n1, n2, n3; 
} //end getThreeIntegers 

2 ответа

Удалить амперсанд & до n1, n2, n3,

scanf хочет адрес памяти, куда он должен записать значение из пользовательского ввода. Здесь адрес n1и т. д. Если бы вы только что int n1тогда вы бы хотели получить адрес n1так что вам нужно использовать &, Тем не менее, так как у вас есть int * n1, n1 уже имеет адрес, где необходимо хранить целое число. Таким образом, нет необходимости использовать &,

Прежде всего измените прототип функции, изменив возвращаемое значение на void вместо int потому что значения передаются по их адресу, поэтому любое изменение будет влиять на них постоянно

void  getThreeIntegers(int *n1, int *n2, int *n3);

Теперь вам нужно внести изменения внутри блока функции, как показано ниже

void  getThreeIntegers(int *n1, int *n2, int *n3) { // change the return value to void 
    printf("Enter first integer: ");
    //you need to pass the address of the variable in scanf()
    //and as n1 hold the address you pass like it is 
    // delete the & sign from every variable in `scanf()`
    scanf("%i", n1);
    printf("Enter second integer: ");
    scanf("%i", n2);
    printf("Enter third integer: ");
    scanf("%i", n3);
    //flush;           // delete this line
    //return n1, n2, n3; // no need for return as the variable are passed by reference 
     // 
} //end getThreeIntegers 

Теперь, если вы определите, например, 3 целых числа a,b,c

int a=0,b=0,c=0;

вызов функции будет в это время:

getThreeIntegers(&a,&b,&c);

Что касается функции под названием displayLowest вы хотите получить самую низкую переменную из трех целых чисел, поэтому идея состоит в том, чтобы сравнить два целых числа после этого, вам нужно сравнить самое младшее из них с третьим, поэтому вот как вы можете записать ее в одну строку, используя троичный оператор ?:

void displayLowest(int num1, int num2, int num3) {

     printf("The lowest integer is: %i\n", (num1 < num2 ? num1 : num2) < num3 ? (num1 < num2 ? num1 : num2) : num3);

} // end displayLowest

Для функции displayProduc() Я думаю, что будет немного безопаснее, если вы определите переменную product с long long int тип, особенно потому, что он содержит произведение 3 целых чисел типа int! Таким образом вы уменьшите вероятность выхода за пределы!

Не забудьте, конечно, printf() для печати (обратите внимание на %lli)

printf("The product of the integers is: %lli\n", product);

и позвольте мне закончить этот ответ примечанием, которое следует иметь в виду

Никогда не используйте flush(stdin), потому что это приведет вашу программу к неопределенному поведению

Надеюсь, поможет!

Другие вопросы по тегам