如何在函数内部正确使用 While?
How can I properly use While inside a Function?
首先,我对编程还很陌生,这是我的第一个问题。我正在创建一个代码来计算梯形的面积,我需要做相同的 while()
3 次不同的时间来检查数字是否大于零,如果不是,它会继续询问数,直到它是。然后我决定创建一个 function()
以使代码 干净 和 不那么重复 ,问题是,我可能做错了什么,因为我只得到返回给变量的负数。
我截取了部分代码给大家看,也是为了测试。我总是先输入 negative 数字以激活 function()
内的 while()
,然后输入 positive 数字,但我打印的是负数而不是新数字。关于如何在 largeBase 变量中获取新数字的任何提示?这是代码:
#include <stdio.h>
int checkBelowZero(float x);
int main() {
float largerBase, x;
printf("\n\t\tTrapezoid's area calculation\n\n");
printf("Type the trapezoid's larger base: ");
scanf("%f", & largerBase);
checkBelowZero(largerBase);
printf("%.2f", largerBase);
return 0;
}
int checkBelowZero(float x) {
while (x <= 0)
{
printf("\nThe number has to be greater than zero (0).\n\nPlease, type it again: ");
scanf("%f", & x);
}
return x;
}
解决方案 1
函数参数是给定值的副本。如果修改参数的值,实际上并没有修改传递的原始变量。
但是,当按引用传递时,情况并非如此。如果将变量的地址传递给函数,然后调用指向该函数的指针,则可以修改传递的变量的真实值。我有 re-written 有问题的功能,所以你可以看看它是如何工作的:
// the parameter is expecting a pointer to something
void checkBelowZero(float *x) {
/*- to read the parameters value, call a pointer to it
- "x" is actually just a number which is the memory
location of the variable you passed. Calling a pointer
to it reads what's at that address, in this case the
value of your variable "largerBase".
*/
while (*x <= 0)
{
printf("\nThe number has to be greater than zero (0).\n\nPlease, type it again: ");
/* - Since "x" already contains the base address of
"largerBase", you shouldn't call the base address of
that
*/
scanf("%f", x);
}
}
确保修改原型
void checkBelowZero(float *x);
然后这样调用函数
checkBelowZero(&largerBase);
这确保传递我们变量的基地址。
解决方案 2
由于您正在 return 设置值 x
,您实际上可以将 largerBase
的值设置为函数的 return 值。
largerBase = checkBelowZero(largerBase);
请记住,x
不需要定义为变量。因为它是一个只能被它所属的函数访问的参数
首先,我对编程还很陌生,这是我的第一个问题。我正在创建一个代码来计算梯形的面积,我需要做相同的 while()
3 次不同的时间来检查数字是否大于零,如果不是,它会继续询问数,直到它是。然后我决定创建一个 function()
以使代码 干净 和 不那么重复 ,问题是,我可能做错了什么,因为我只得到返回给变量的负数。
我截取了部分代码给大家看,也是为了测试。我总是先输入 negative 数字以激活 function()
内的 while()
,然后输入 positive 数字,但我打印的是负数而不是新数字。关于如何在 largeBase 变量中获取新数字的任何提示?这是代码:
#include <stdio.h>
int checkBelowZero(float x);
int main() {
float largerBase, x;
printf("\n\t\tTrapezoid's area calculation\n\n");
printf("Type the trapezoid's larger base: ");
scanf("%f", & largerBase);
checkBelowZero(largerBase);
printf("%.2f", largerBase);
return 0;
}
int checkBelowZero(float x) {
while (x <= 0)
{
printf("\nThe number has to be greater than zero (0).\n\nPlease, type it again: ");
scanf("%f", & x);
}
return x;
}
解决方案 1
函数参数是给定值的副本。如果修改参数的值,实际上并没有修改传递的原始变量。
但是,当按引用传递时,情况并非如此。如果将变量的地址传递给函数,然后调用指向该函数的指针,则可以修改传递的变量的真实值。我有 re-written 有问题的功能,所以你可以看看它是如何工作的:
// the parameter is expecting a pointer to something
void checkBelowZero(float *x) {
/*- to read the parameters value, call a pointer to it
- "x" is actually just a number which is the memory
location of the variable you passed. Calling a pointer
to it reads what's at that address, in this case the
value of your variable "largerBase".
*/
while (*x <= 0)
{
printf("\nThe number has to be greater than zero (0).\n\nPlease, type it again: ");
/* - Since "x" already contains the base address of
"largerBase", you shouldn't call the base address of
that
*/
scanf("%f", x);
}
}
确保修改原型
void checkBelowZero(float *x);
然后这样调用函数
checkBelowZero(&largerBase);
这确保传递我们变量的基地址。
解决方案 2
由于您正在 return 设置值 x
,您实际上可以将 largerBase
的值设置为函数的 return 值。
largerBase = checkBelowZero(largerBase);
请记住,x
不需要定义为变量。因为它是一个只能被它所属的函数访问的参数