c程度题,为什么我输出的和正确答案不同

img


我看了好久觉得我也没问题啊,能不能帮我看一下哪里出问题了,我找来找去没发现问题

while (1/n>=1e-6)
这里是整除
应该是
while (1.0f/n>=1e-6)

1 / n 的结果是整数, 要 1.0 / n

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7606911
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:c语言实现:输入一行字符串,统计该字符串中所有字符出现的个数,并找到出现次数最大的那个字符!!
  • 除此之外, 这篇博客: C语言拯救者 番外篇【通讯录】中的 我们退出程序后通讯录便被销毁了,我们又能否把我们所输入的名单保存至文件中,便于添加和查看? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    文件打开后需要销毁通讯录,把在程序中所写的通讯录保存至文件中

    void  DestoryContact(Contact* pc)
    {
    	free(pc->data);
    	pc->data = NULL;
    	pc->capacity = 0;
    	pc->sz = 0;
    	printf("销毁成功\n");
    }
    
    void SaveContact(const Contact* pc)
    {
    	FILE* pf =fopen("Contact.txt", "wb");//二进制方式写进去
    	if (pf == NULL)
    	{
    		perror("SaveContact::fopen");
    		return ;
    	}
    	//写文件
    	int i = 0;
    	for (i = 0; i < pc->sz; i++)
    	{
    		fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
    
    	}
    	printf("保存成功!\n");
    
    	//关闭文件
    	fclose(pf);
    	pf = NULL;
    }

     初始化通讯录 --文件版本

    把我们之前结束时保存的通讯录名单导入加载到程序中(初始化时)

    //初始化通讯录 --文件版本
    void LoadContact(Contact* pc)
    {
    	//打开文件
    	FILE*pf =fopen("Contact.txt", "rb");
    	if (pf == NULL)
    	{
    		perror("LoadContact::fopen");
    		return;
    	}
    	//读文件
    	PeoInfo tmp = { 0 };
    	while (fread(&tmp, sizeof(PeoInfo), 1, pf))//返回的数值比要求读写的count数据小,代表读写完成,如果返回0代表没读取到
    	{
    		//通讯录初始化也要扩容,防止数据大于初始值
    		CheckCapacity(pc);
    		pc->data[pc -> sz] = tmp;//读取一个信息放到sz中,因为默认sz=0
    		pc->sz++;
    	}
    	//关闭文件
    	fclose(pf);
    	pf = NULL;
    }
    
    void InitContact(Contact* pc)
    {
    	assert(pc);
    	pc->sz = 0;
    	pc->capacity = DEFAULF_SZ;
    	pc->data = (PeoInfo*)malloc(pc->capacity * sizeof(PeoInfo));
    	if (pc->data == NULL)
    	{
    		perror("InitContact:malloc");
    		return;
    	}
    	memset(pc->data, 0, pc->capacity * sizeof(PeoInfo));
    
    	//加载文件信息到通讯录中
    	LoadContact(pc);
    
    }

  • 您还可以看一下 王健伟老师的C语言入门篇课程中的 结构体变量定义、引用、初始化小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    对于遇到输出和正确答案不同的问题,建议可以进行程序调试,一步步运行定位问题。 首先,可以使用gdb这个工具进行调试,具体步骤如下: 1. 打开终端,输入gdb加上可执行文件名称,例如:gdb a.out。 2. 输入“r”或“run”命令启动程序。 3. 程序开始运行后,可以使用“b”或“break”命令在想要调试的代码行上下断点。 4. 使用“n”或“next”命令一步步执行代码。 5. 当代码执行到断点时,可以使用“p”或“print”命令查看变量的值。 6. 使用“q”或“quit”命令退出gdb。

    另外,建议在代码中添加适当的调试信息,例如打印变量的值、进入到函数的名称等,以方便定位问题。 例如,可以在Fib函数中添加以下代码:

    int Fib(int n) { printf("Enter Fib: n = %d\n", n); // 打印进入Fib函数的信息 if (n==1 || n==2) { return 1; }else { int ret = Fib(n-1) + Fei(n-2); // 修改调用函数的名称 printf("Fib(%d) = %d\n", n, ret); // 打印当前计算结果 return ret; } }

    同时,可以在main函数中添加以下代码,以便查看程序运行的整个流程:

    int main() { int n = 0; int ret = 0; scanf("%d", &n); ret = Fib(n); printf("%d\n", ret); printf("Program End!\n"); // 打印程序结束的信息 return 0; }

    通过以上调试信息,可以在程序运行时得到更多的信息,方便定位问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^