layout: post
title: C语言复习之实验六
date: 2017-07-03 15:00:00 +08:00
tags: [C lang]
写在开始
这个代码相对来说还是比较简单的.
实验六 文件应用程序设计
一、实验目的
掌握文件应用程序设计的一般方法及其调试方法。
二、实验要求
1.仔细阅读下列实验内容,并编写出相应的C语言源程序。
2.在C语言运行环境下,编辑录入源程序。
3.调试运行源程序, 注意观察调试运行过程中发现的错误及改正方法。
4.掌握如何根据出错信息查找语法错误。
5.最后提交带有充分注释的源程序文件(扩展名为.c)。 要求该文件必须能够正确地编译及运行,并不得与他人作品雷同。
三、实验内容
以下两题,任选其一解答。
1.海萍夫妇为了彻底告别“蜗居”生活,痛下决心贷款120万元购买了一套三居室 。若贷款月利率为0.5%,还款期限为120个月,还款方式为等额本金还款法(即贷款期限内每期以相等的额度偿还贷款本金,贷款利息随本金逐期递减)。试求出每个月还款的本金、每个月的利息以及总利息分别是多少元。要求将输出结果写入到数据文件中。
2.若还款方式采用等额本息还款法(即贷款期限内每期以相等的额度偿还贷款本息,贷款利息随本金逐期递减)。试求出每个月还款的本金、每个月的利息以及总利息分别是多少元。要求将输出结果写入到数据文件中。
题目分析
这个题目应该就涉及两个知识点,一个是计算利息,另外一个就是输出数据到文件.
所以编写一个计算利息的函数然后把每月利息计算出来输出到文件里面就可以了.
因为感觉这个题没啥复杂度(除了找那几种利息计算方式怎么计算之外),所以我又特意用了一种更复杂的写法.(没事找事......)
我的代码
和之前一样,为了适配VS2017,我重写成了C++版.
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "omp.h"
//每月还款额=贷款本金×[月利率×(1+月利率) ^ 还款月数]÷{[(1+月利率) ^ 还款月数]-1}
FILE *fp;
//需要输入的数据: 总钱数, 总月数, 月利率,
//需要返回的数据: 总还款量
//需要中间打印的数据: 每月还款利息
//作为中间输入: 文件指针
double get_huankuan(double total_money, int total_months, double lilv, FILE * fp){
double need_back = 0;
if (total_months>0){
need_back = (1200000 - 10000 * total_months)*0.005 + get_huankuan(total_money, total_months-1, lilv, fp);
}
fprintf(fp, "第%d次还利息%lf元\n", total_months, (1200000 - 10000 * total_months)*0.005);
return need_back;
}
int main(int argc, char const *argv[]) {
fp = fopen("data.dat", "w");
fprintf(fp, "%s\n", "每月还本金为10000元");
fprintf(fp, "总还款额度为%lf元\n", get_huankuan(1200000, 120, 0.005, fp));
return 0;
}
写在最后
这段代码倒是没有发现BUG存在,至少我目前没有发现,一切运行稳定,然后我把输出和计算利息的函数写成了递归版本,所以如果深度过深的话容易堆栈溢出,因为这个真的不是尾递归,而是实实在在的递归,不过因为只有120的深度,所以我感觉应该不可能溢出的,除非人手工把栈调小,反正我目前测试不加任何优化的debug版也没有溢出.
写在所有的最后
这就是我所有的C语言实验的整理了,我估计一般人不会这么闲把这些代码刻意写复杂的,因为这些实验完全可以不用任何一个函数就能做出来.不过我感觉为了更深层次的了解面向过程编程和顺便折腾函数式编程,这点复杂度还是有必要的,反正我感觉平时很少有啥能顺便学习函数式编程的简单的程序,因为我一直认为题目总是很少,找不到什么比较好一点的题来顺便学习函数式编程,所以我就拿C语言的实验开刀了,试着写一些纯函数,但是我感觉也不是很像纯函数,然后惰性求值也没有实现,也就是尾递归现在会用了,感觉也算是不至于没有收获吧.整体来说就是这样了