while (1/n>=1e-6)
这里是整除
应该是
while (1.0f/n>=1e-6)
1 / n 的结果是整数, 要 1.0 / n
文件打开后需要销毁通讯录,把在程序中所写的通讯录保存至文件中
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);
}
对于遇到输出和正确答案不同的问题,建议可以进行程序调试,一步步运行定位问题。 首先,可以使用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; }
通过以上调试信息,可以在程序运行时得到更多的信息,方便定位问题。