C语言实验(四):循环(输出100到200之间的素数、计算房贷等)

【实验任务】
实验一:调试程序

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项之和,注意使用调试。在这里插入图片描述

实验三:计算房贷
  1. 某客户为购房办理商业贷款,选择按月等额还款方式,计算公式如下。在贷款本金(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语言强记语法知识,按照课本做练习的方法不同,通过实验自己自主学习的能力也得到了提高。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值