Функция для ввода трех целых чисел в 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), потому что это приведет вашу программу к неопределенному поведению
Надеюсь, поможет!