C语言实验:循环
【实验任务】
实验一:调试程序
1.1采用调试的方法改正下列程序中的错误,输出100到200之间的素数,代码如下(有错误),请调试。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, i, t;
for(n = 100; n < 200; n++)
{
t = 1;
for(i = 2; i < n/2; i++)//按照数学规则,如果在2~n-1中存在因子,则不是素数。
{
if(n%i = = 0)
{
t = 0;
break;
}
if(n%i != 0) printf("%d, ",n);//是素数则输出。
}
}
return 0;
}
1.2 采用调试的方法改正下列程序中的错误,输入两个正整数m和n(m<=n),计算并输出如下组合数,代码如下(有错误),请调试。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m, n, g, f, k, i, a;
printf("input m, n, (m<n):\n");
scanf("%d%d", m, n);
i = m-1;
while(i>1)
{
g = g*i;
i = i-1;
}
i = n-1;
while(i>1)
{
f = f*i;
i = i-1;
}
i = n-m-1;
while(i>1)
{
k = k*i;
i = i-1;
}
a = f/(g*k);
printf("%d", a);
return 0;
}
实验二:编程实现以下算法
输入一个正整数n,计算的前n项之和,注意使用调试。
实验三:计算房贷
- 某客户为购房办理商业贷款,选择按月等额还款方式,计算公式如下。在贷款本金(loan)和月利率(rate)一定的情况下,住房贷款的月还款额(money)取决于还款月数(month)。客户打算在5-30年的范围内选择还清贷款的年限,想得到一张“还款年限-月还款额”表以供参考,编写程序,输入贷款本金loan和月利率rate,输出“还款年限-月还款额”表,还款年限的范围是5-30年,输出是分别精确到年和元。
【实验内容】
实验一:代码调试
(一) 输出100到200之间的素数代码调试。
1、运行程序。发现结果中重复输出了若干个100-200之间的奇数。其中有素数也有非素数。
2、 设置断点调试。调试发现,当n为奇数时,总是会输出。检查代码发现,if语句写在内层for循环中,即奇数都至少输出一次。修改代码,将此if语句放到内层for循环之外。
3、再次进行调试,发现与预期运行过程一样。重新编译运行代码,运行结果正确。
(二) 输入两个正整数m和n(m<=n),计算并输出组合数调试。
1、运行程序。发现输入数字之后,并没有结果输出。
2、设置断点调试。调试过程中出现错误,发现输入过程中,scanf函数中少了“&”。
3、 修改代码之后,发现g,f,k的值很大,而且是随机的。所以需要修改代码给它们先赋值为1,再使用。
4、 由于n!=n*(n-1)!,所以三次循环之前i的初始值分别赋值为n,n-m,m。修改代码完成之后可以运行。结果如下。
实验二:算法编程
输入一个正整数n,计算的前n项之和。
1、首先分析题目,找出规律设计算法编程如下。
2、编译运行,发现这段代码有问题。
3、设置断点进行调试,观察变量变化。发现问题:k,s,t三个变量没有赋值,所以开始时候就有随机值。修改代码,进行变量初始化。
实验三:计算房贷
1、通过分析实际问题,写出代码如下。
2、运行代码报错,代码中使用了pow()函数,没有引入math.h头文件。修改代码之后,代码依旧报错。error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘{’ token|。
3、重新检查代码,发现函数声明时漏写了分号“;”。修改代码,可以正常运行,结果如下。
【代码与结果】
实验一 调试后代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, i, t;
for(n = 100; n < 200; n++)
{
t = 1;
for(i = 2; i < n/2; i++)//按照数学规则,如果在2~n-1中存在因子,则不是素数。
{
if(n%i==0)
{
t = 0;
break;
}
}
if(n%i != 0) printf("%d, ",n);//是素数则输出。
}
return 0;
}
实验一 调试后运行结果
实验二 实验代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i,sign = -1;
float k,s,t;
printf("Input a integer:");
scanf("%d",&n);
s = 0;k=0;t=0;
for(i=1;i<=n;i++)
{
k = 2*i-1;
sign = sign*(-1);
t = sign*i/k;
s += t;
}
printf("Sum is %f",s);
return 0;
}
实验二 运行结果
实验三 实验代码
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
void mone(int year,int loan,float rate);
float mon(int loan,float rate,int month);
int main()
{
int n,loan;
float rate;
printf("Input loan:");
scanf("%d",&loan);
printf("Input rate:");
scanf("%f",&rate);
for(n=5;n<=30;n++)
mone(n,loan,rate);
return 0;
}
void mone(int year,int loan,float rate)
{
int month;
float money;
month = year*12;
money = mon(loan,rate,month);
printf("Year:%d Money:%.12f\n",year,money);
}
float mon(int loan,float rate,int month)
{
float k,t,mo;
k = pow((1+rate),month);
t = rate*(1+k)/(k-1);
mo = loan * t;
return mo;
}
实验三 运行结果
【总结反思】
本节课做调试练习与算法编程的实验。对于本次实验课,收获最大的是对程序的调试的了解深入。在编程过程中,总是会出现各种报错,各种问题。通过报错信息、系统调试排查错误,不断学习新的知识去解决出现的bug,最后终于看到正常运行的结果。通过不断学习编程,可以解决实际问题。这个过程让我在编程时有成就感。
第一个实验求素数上次实验时接触过,这次正好又熟悉了一下调试的流程。上一次实验时调试时发现问题设置断点不合适,这次实验就在循环之前、判断前等关键位置设置断点,很快解决问题。在做后续实验时,对调试的操作方法也更加熟悉;并且在后面两个实验中进行练习。调试的过程是编程很重要的一部分。之前写代码总是盯着代码找问题,现在明白要解决问题就要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug。
通过几次实验课,可以明显感觉得到自己对于C语言的掌握更加深入了,主要是通过几次实践操作的方式熟悉的。与之前学习的C语言强记语法知识,按照课本做练习的方法不同,通过实验自己自主学习的能力也得到了提高。