我无法掌握指针的概念。我遇到了以下问题。
N的平方根可以通过使用公式NG = 0.5(LG + N / LG)的重复计算来近似,其中NG代表下一个猜测,LG代表最后一个猜测。编写一个使用此方法计算数字平方根的函数。最初的猜测将是LG的起始值。该程序将使用给定的公式计算NG的值。检查NG和LG之间的差异,看看这两个猜测是否几乎相同。如果是,则接受NG作为平方根;否则,下一个猜测(NG)成为最后一个猜测(LG)并重复该过程(为NG计算另一个值,检查差异,依此类推)。应重复循环,直到差值小于0.005。使用1.0的初始猜测。
必须尽可能在主函数和所有函数中使用指针编写程序。在main中声明指针平方根的数字指针,以及将由函数计算并返回/引用回到main的近似平方根答案。该函数将是一个void函数,因此近似的平方根答案必须返回/引用main作为函数的输出参数,即函数调用语句中的参数。您必须使用指针将要猜测的数字的实际值传递给函数。
在函数中,让用户输入一个“guess”数字,这是用户对传递给函数的数字的平方根的初始猜测。
(对于冗长的解释感到抱歉,我觉得我应该彻底解释)
我写了以下代码:
#include <stdio.h>
#include <math.h>
void fctn(double *nPtr,double *NGPtr){
double n;
nPtr=&n;
double NG;
double LG;
NGPtr=&NG;
printf("Enter guess\n");
scanf_s("%lf",&LG);
do{
NG=(.5*(LG+n/LG));
LG=NG;
}while(fabs(NG*NG-n)>.005);
}
int main(){
double *NGPtr;
double *nPtr;
printf("Enter number\n");
scanf_s("%lf",&nPtr);
fctn(NGPtr,nPtr);
double root=*NGPtr;
printf("The approximate root of the function is %f",root);
}
我想知道是否有人有任何关于它为什么不起作用的想法?谢谢你的阅读。
答案 0 :(得分:3)
double *nPtr;
printf("Enter number\n");
scanf_s("%lf",&nPtr);
让我们来看看这里发生了什么。首先,您声明指向double
的指针。该指针不指向任何地方。没有创建double
个对象,只有一个指针。然后,将&nPtr
(指向指针的指针)传递给scanf_s
,double
尝试将值读入指针。所以你要求用户输入一个内存地址!那不对。
您想要的是拥有一个double
对象,然后将其读入。为此,您应该声明double
(不是指针),然后将指向scanf_s
的指针传递给double n;
printf("Enter number\n");
scanf_s("%lf", &n);
:
NGptr
您也遇到与double NG;
类似的问题。它应该只是一个*NGPtr
。否则,当您执行fctn
时,您将取消引用一个不指向任何内容的指针。
我相信你会以错误的方式将你的论据传递给n
。声明建议NG
应该排在第一位,n
应该排在第二位。
由于您只需要在函数中使用void fctn(double n, double *NGPtr){
的值,您应该只按值传递它:
NG
将指针传递给void fctn(double n, double& NG){
是必需的,因为您希望在函数内修改它,但引用类型会更好:
fctn
然后,您在n
开头遇到了一系列问题。您不再需要创建NG
和double
{{1}},因为我们正在将它们传递给函数。
答案 1 :(得分:1)
没有给你代码:你永远不会“指出你的指针”。 (又称初始化它们)。您可能希望在main中使用实际双精度数并将指针传递给fctn
的双精度数。
答案 2 :(得分:1)
至少这会有问题
double n;
nPtr=&n;
因为您正在返回对临时对象的引用。
答案 3 :(得分:0)
必须尽可能使用指针编写程序 主要和所有功能。
这是家庭作业吗?如果是这样,您的老师必须尝试教您代码混淆。如果从字面上理解它,为什么不把它带到极端并使用函数指针?而不是直接调用fctn
,fabs
,printf
和scanf_s
,而是声明函数指针变量。
以下是使用函数指针调用printf的方法:
int (*output_function)(char const *, ...);
output_function = printf;
output_function("%s %d", "test", 123);
然而,“尽可能使用指针”的真正问题是,定义是无限递归,因为在C ++中,可以有指针指针,指向指针的指针,指向指向指针的指针指针等等......对程序中可以使用的指针数量没有实际限制。
这是一个指向函数指针的完整示例:
#include <stdio.h>
int main()
{
int (*output_function)(char const *, ...);
int (**pointer_to_output_function)(char const *, ...);
output_function = printf;
pointer_to_output_function = &output_function;
(*pointer_to_output_function)("%s %d", "test", 123);
}
这当然是可怕的C ++编程风格,但您提供的代码示例也是如此。如果这是一个真正的问题,请暂时忘掉指针。使用引用或按值传递,并使用<iostream>
代替printf
等。