qq_39492111 2018-04-04 06:46 采纳率: 100%
浏览 1373
已采纳

编译没有报错但是运行出错,求解决

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. void choice();
  5. void read();
  6. void add();
  7. void browse();
  8. void refer();
  9. void amend();
  10. void result();
  11. struct cost
  12. {
  13. char num[20];//编号
  14. char type[20];//类型
  15. char name[20];//经办人姓名
  16. char reason[200];//原因
  17. double amount;//收入金额
  18. char remarks[200];//备注
  19. double balances;//余额
  20. }all[100];
  21. int a;
  22. double b;
  23. int main()
  24. {
  25. char b;
  26. do
  27. {
  28. choice();
  29. printf("是否要继续使用?(yes/no)\n");
  30. scanf("%c", &b);
  31. } while (b!='n');
  32. printf("\n");
  33. printf("谢谢使用\n");
  34. return 0;
  35. }
  36. void choice()
  37. {
  38. char b;
  39. printf("********************************************\n");
  40. printf(" 班费收支管理系统\n");
  41. printf("请选择您所需要的服务,输入对应的序号:\n");
  42. printf(" 1.添加班费收支信息\n");
  43. printf(" 2.浏览所有班费收支信息\n");
  44. printf(" 3.查询班费收支信息\n");
  45. printf(" 4.修改班费收支信息\n");
  46. printf(" 5.直接查询余额信息\n");
  47. printf("********************************************\n");
  48. scanf("%c", &b);
  49. while (b !='1'&&b != '2'&&b != '3'&&b != '4')
  50. {
  51. printf("请重新输入有效数字\n");
  52. scanf("%c", &b);
  53. }
  54. switch (b)
  55. {
  56. case '1': add(); break;
  57. case '2': browse(); break;
  58. case '3': refer(); break;
  59. case '4': amend(); break;
  60. case '5': result(); break;
  61. }
  62. }
  63. void read()
  64. {
  65. FILE * fp, *NOM;
  66. if ((fp=fopen("Class_expense_information","rb")) ==NULL)
  67. {
  68. a = 0;
  69. fp = fopen("Class_expense_information", "wb");
  70. fwrite(&a, sizeof(int), 1, fp);
  71. fclose(fp);
  72. }
  73. }
  74. void add()
  75. {
  76. FILE * fp, *NOM;
  77. printf("请输入收支编号:\n");
  78. scanf("%s", all[a].num);
  79. printf("请输入经办人姓名:\n");
  80. scanf("%s", all[a].name);
  81. printf("请输入原因:\n");
  82. scanf("%s", all[a].reason);
  83. printf("请输入收支类型(in/out):\n");
  84. scanf("%s", all[a].type);
  85. printf("请输入金额:\n");
  86. scanf("%lf", all[a].amount);
  87. printf("请输入备注:\n");
  88. scanf("%s", all[a].remarks);
  89. switch (a)
  90. {
  91. case 0: fp = fopen("data", "wb"); break;
  92. default: fp = fopen("data", "ab"); break;
  93. }
  94. fwrite(&all[a], sizeof(struct cost), 1, fp);
  95. fclose(fp);
  96. a++;
  97. NOM = fopen("Class_expense_information", "wb");
  98. fwrite(&a, sizeof(int), 1, NOM);
  99. fclose(NOM);
  100. }
  101. void browse()
  102. {
  103. FILE *fp = NULL;
  104. int c;
  105. int sign = 1;
  106. double sum;
  107. fp = fopen("data", "rb");
  108. for (c = 0; c < a; c++)
  109. {
  110. fread(&all[c], sizeof(struct cost), 1, fp);
  111. printf("收支编号:%s\n", &all[c].num);
  112. printf("收支类型:%s\n", &all[c].type);
  113. printf("经办人姓名:%s\n", &all[c].name);
  114. printf("原因:%s\n", &all[c].reason);
  115. printf("金额:%lf\n", &all[c].amount);
  116. printf("备注:%s\n", &all[c].remarks);
  117. if (strcmp(all[c].type, "in") == 0) sign = 1;
  118. else if (strcmp(all[c].type, "out") == 0) sign = -1;
  119. sum = sum + (all[c].amount *sign);
  120. all[c].balances = sum;
  121. printf("余额:%lf\n", &all[c].balances);
  122. }
  123. }
  124. void amend() // 按不同字段查询班费信息
  125. {
  126. FILE *fp = NULL;
  127. int x, i, k, result[100];
  128. char key_world[20];
  129. begin3:
  130. k = 0;
  131. printf("\n");
  132. printf("1.按班费收支编号查询\n");
  133. printf("2.按班费收支类型查询\n");
  134. printf("3.按班费经办人姓名查询\n");
  135. printf("4.按班费收支原因查询\n");
  136. printf("5.返回上一级\n");
  137. printf("请输入你的选择:");
  138. begin2:
  139. scanf("%d", &x);
  140. printf("请输入要查询的关键字:");
  141. scanf("%s", key_world);
  142. fp = fopen("data", "rb");
  143. switch (x)
  144. {
  145. case 1:
  146. for (i = 0; i < a; i++)
  147. {
  148. fread(&all[i], sizeof(struct cost), 1, fp);
  149. if (strcmp(all[i].num, key_world) == 0)
  150. {
  151. result[k] = i;
  152. k++;
  153. }
  154. }
  155. break;
  156. case 2:
  157. for (i = 0; i < a; i++)
  158. {
  159. fread(&all[i], sizeof(struct cost), 1, fp);
  160. if (strcmp(all[i].type, key_world) == 0)
  161. {
  162. result[k] = i;
  163. k++;
  164. }
  165. }
  166. break;
  167. case 3:
  168. for (i = 0; i < a; i++)
  169. {
  170. fread(&all[i], sizeof(struct cost), 1, fp);
  171. if (strcmp(all[i].name, key_world) == 0)
  172. {
  173. result[k] = i;
  174. k++;
  175. }
  176. }
  177. break;
  178. case 4:
  179. for (i = 0; i < a; i++)
  180. {
  181. fread(&all[i], sizeof(struct cost), 1, fp);
  182. if (strcmp(all[i].reason, key_world) == 0)
  183. {
  184. result[k] = i;
  185. k++;
  186. }
  187. }
  188. break;
  189. case 5:
  190. return;
  191. break;
  192. default:
  193. printf("输入错误!请重新输入:");
  194. fflush(stdin);
  195. fclose(fp);
  196. goto begin2;
  197. break;
  198. }
  199. if (k == 0)
  200. {
  201. printf("没有查到相关的内容!\n");
  202. fclose(fp);
  203. goto begin3;
  204. }
  205. else
  206. {
  207. printf("\n\n查找到%d条记录:\n\n", k);
  208. for (i = 0; i < k; i++)
  209. {
  210. fread(&all[result[i]], sizeof(struct cost), 1, fp);
  211. printf("收支编号:%s\n", &all[result[i]].num);
  212. printf("收支类型:%s\n", &all[result[i]].type);
  213. printf("经办人姓名:%s\n", &all[result[i]].name);
  214. printf("原因:%s\n", &all[result[i]].reason);
  215. printf("金额:%lf\n", &all[result[i]].amount);
  216. printf("备注:%s\n", &all[result[i]].remarks);
  217. printf("当时余额:%lf\n", &all[result[i]].balances);
  218. }
  219. fclose(fp);
  220. }
  221. }
  222. void refer() // 修改班费信息
  223. {
  224. FILE * fp = NULL;
  225. int i, k, x, result[100];
  226. char key_world[20];
  227. printf("请输入你要修改的班费信息的编号:");
  228. scanf("%s", key_world);
  229. k = 0;
  230. fp = fopen("data", "rb");
  231. for (i = 0; i < a; i++)
  232. {
  233. fread(&all[i], sizeof(struct cost), 1, fp);
  234. if (strcmp(all[i].num, key_world) == 0)
  235. {
  236. result[k] = i;
  237. k++;
  238. }
  239. }
  240. fclose(fp);
  241. if (k == 0)
  242. {
  243. printf("没有查到相关的内容!\n");
  244. return;
  245. }
  246. else
  247. {
  248. printf("\n\n查找到%d条记录:\n\n", k);
  249. fp = fopen("data", "rb");
  250. for (i = 0; i < k; i++)
  251. {
  252. printf("记录%d:\n", i + 1);
  253. printf("收支编号:%s\n", &all[result[i]].num);
  254. printf("收支类型:%s\n", &all[result[i]].type);
  255. printf("经办人姓名:%s\n", &all[result[i]].name);
  256. printf("原因:%s\n", &all[result[i]].reason);
  257. printf("金额:%lf\n", &all[result[i]].amount);
  258. printf("备注:%s\n", &all[result[i]].remarks);
  259. printf("当时余额:%lf\n", &all[result[i]].balances);
  260. }
  261. close(fp);
  262. begin4:
  263. printf("请输入需要修改的记录的记录序号:");
  264. scanf("%d", &x);
  265. if (x > k)
  266. {
  267. printf("输入错误!");
  268. fflush(stdin);
  269. goto begin4;
  270. }
  271. else
  272. {
  273. printf("请输入班费编号:");
  274. scanf("%s", all[result[x - 1]].num);
  275. printf("请输入收支类型:");
  276. scanf("%s", all[result[x - 1]].type);
  277. printf("请输入经办人姓名:");
  278. scanf("%s", all[result[x - 1]].name);
  279. printf("请输入原因:");
  280. scanf("%s", all[result[x - 1]].reason);
  281. printf("请输入金额:");
  282. scanf("%lf", all[result[x - 1]].amount);
  283. printf("请输入备注:");
  284. scanf("%s", all[result[x - 1]].remarks);
  285. fp = fopen("data", "rb+");
  286. for (i = 0; i < a; i++)
  287. {
  288. if (i != result[x])
  289. {
  290. fwrite(&all[i], sizeof(struct cost), 1, fp);
  291. }
  292. else
  293. {
  294. fwrite(&all[result[x]], sizeof(struct cost), 1, fp);
  295. }
  296. }
  297. fclose(fp);
  298. }
  299. }
  300. }
  301. void result()
  302. {
  303. FILE *fp = NULL;
  304. int c;
  305. int sign = 1;
  306. double sum;
  307. fp = fopen("data", "rb");
  308. for (c = 0; c < a; c++)
  309. {
  310. fread(&all[c], sizeof(struct cost), 1, fp);
  311. if (strcmp(all[c].type, "in") == 0) sign = 1;
  312. else if (strcmp(all[c].type, "out") == 0) sign = -1;
  313. sum = sum + (all[c].amount *sign);
  314. all[c].balances = sum;
  315. printf("余额:%lf\n", &all[c].balances);
  316. }
  317. }

图片说明

展开全部

  • 写回答

5条回答 默认 最新

  • SecretGarden 2018-04-04 07:20
    关注

    所有的scanf函数中的变量,应该传入变量的地址,例如:
    将:

    1. printf("请输入金额:\n");
    2. scanf("%f", all[a].amount);

    改为:

    1. printf("请输入金额:\n");
    2. scanf("%f", &all[a].amount);

    另外,建议修改代码,消除所有的编译警告。你的问题也是因为你忽略警告造成的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)
编辑
预览

报告相同问题?

悬赏问题

  • ¥15 kubeasz部署遇到问题
  • ¥15 GUIDE to App Designer Migration Tool for MATLAB
  • ¥50 第三代非支配排序遗传算法(NSGA-Ⅲ)和多目标粒子群优化算法(MOPSO)的实现
  • ¥15 hbuilderx写一个这个网页🙏
  • ¥20 plant simulation与python com接口实时数据交互
  • ¥15 有关汽车的MC9S12XS128单片机实验
  • ¥15 求c语言动态链表相关课程有偿,或能将这块知识点讲明白
  • ¥15 FLKT界面刷新异常
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥50 单细胞测序拟时序分析
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部