C语言程序设计第五次作业——循环结构(1)

一、改错题

1.题目

输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉。计算公式如下:c = 5×(f-32)/9
其中,c表示摄氏温度,f表示华氏温度。

源程序(有错误的程序)
#include <stdio.h>
int main(void)
{    
    int fahr , lower, upper;  /* fahr表示华氏度 */
    double celsius;        /* celsius表示摄氏度 */ 

    printf("Enter lower:");
    scanf("%d",&lower);
    printf("Enter upper:");
    scanf("%d",&upper);
    printf("fahr  celsius\n");             /* 显示表头 */
    /* 温度转换 */
    for (fahr = lower , fahr <= upper, fahr ++) ;
        celsius = 5 /9 * (fahr - 32.0); 
        printf("%3.0f %6.1f\n", fahr, celsius); 

   return 0; 
}
错误信息1:

1242864-20171108095208434-819733861.png

错误原因:for (fahr = lower ; fahr <= upper; fahr ++)后面多了一个“;”
改正方法:删掉for (fahr = lower ; fahr <= upper; fahr ++)后面的“;”
错误信息2:

1242864-20171108100807294-162603077.png

错误原因:for (fahr = lower ; fahr <= upper; fahr ++)中括号里的表达式用了“,”隔离
改正方法:for (fahr = lower ; fahr <= upper; fahr ++)中括号里的“,”全部换成“;”
错误信息3:

1242864-20171109174443013-1120218276.png

错误原因:前面声明变量时fahr为整型,但输出时fahr的格式化输出符号错误,并且celsius的格式化输出格式也是有问题的,如图:

1242864-20171109174110497-649277140.png

改正方法:将printf("%3.0f %6.1f\n", fahr, celsius)改成printf("%d %.1f\n", fahr, celsius);
错误信息4:

1242864-20171109182053747-554492338.png

错误原因:经检查for语句后有多条语句,但是for后并未添加“{}”
改正方法:在13行和第16行插入“{}”
错误信息5:

1242864-20171109183156778-2147204914.png

错误原因:原题为每次循环的华氏度的温度增加2,而在错误的源代码的for语句中,每次循环中华氏度只增加1.
改正方法:将for语句中的“fahr++”改为“fahr += 2”
错误信息5:

1242864-20171109184309669-2109538343.png

错误原因:回过头检查计算公式不对
改正方法:celsius = 5 /9 * (fahr - 32.0)改为celsius = 5 * (fahr - 32.0) / 9
输入样例数据“32 35”,结果如图:

1242864-20171109190336700-2004272140.png

符合期望。
输入另一组样例数据“40 30”,结果如图:

1242864-20171109190634169-1016174404.png

符合期望。
与样例一样,再次输入两组数据检验,如图:

1242864-20171109191259981-1558653123.png

1242864-20171109191407497-1245052552.png

符合期望,认为改正完毕。
附上改正后的源代码:
#include <stdio.h>
int main(void)
{    
    int fahr,lower,upper;  /* fahr表示华氏度 */
    double celsius;       /* celsius表示摄氏度 */ 
    printf("Enter lower:");
    scanf("%d",&lower);
    printf("Enter upper:");
    scanf("%d",&upper);
    printf("fahr  celsius\n"); 
    /* 温度转换 */
    for (fahr = lower ; fahr <= upper; fahr += 2)
    {
        celsius = 5  * (fahr - 32.0) / 9; 
        printf("%d %.1f\n", fahr, celsius); 
    }
    return 0; 
}

二、学习总结

1.详细描述程序的执行过程,即说明程序的每一步是执行的哪条代码,执行顺序如何。循环需描述前两次循环和最后一次循环的详细执行过程。最后说明程序实现的功能是什么。

执行步骤:

(1)执行int的整型定义;
(2)给odd,even赋初值为0;
(3)执行for语句

①首先执行i = 1;

②输入num;

③进入if语句,若为真则执行 even++,若为假,则执行else语句中的odd++;

④回到for循环执行i++,此时的i=2;

⑤执行i <= 10为真;

⑥继续执行②③④;

⑦输入十次之后,i = 11,此时i <= 10为假,则跳出for循环语句,执行下一步;

(4)执行printf("%d %d",even,odd);

说明程序实现的功能:

此程序主要是让用户输入十个整数,然后程序判断,输出十个数中偶数有多少个,奇数有多少个。

2.增量运算符
(1)运行下面程序,结果是什么?增量运算符在单独使用时,前缀和后缀形式有区别吗?

①运行结果如下:

1242864-20171109202126684-1362650123.png

②在此程序中增量运算符的前缀和后缀并不影响程序的运算,但是如果单独看的话,i++是先拿自身去用,再自身加一,++j是先自身加一,再把结果拿去用

(2)运行下面的程序,结果是什么?两条输出语句的执行过程是怎样的?说明什么问题?这两条输出语句执行完后,i和j的值分别是多少?

①运行结果如下:

1242864-20171109202904981-711364828.png

②执行过程:

  • 首先执行整型定义;
  • 第二步执行i = 2,j = 2;
  • 第三步执行输出语句,先输出i的值,再执行i++;
  • 第四步执行++j,将j的值加1,再输出j,也就是输出为3。

③说明问题:

i++是先拿自身去用,再自身加一,++j是先自身加一,再把结果拿去用。执行完输出语句后i和j的值都是3。

3.有些循环语句后面有{},有些没有,有些语句有缩进,运行下面的四个小程序,运行结果有什么不同?循环体的认定与缩格形式是否有关?与{}是否有关?那么,应该如何正确判断一个循环语句中的循环体?下面的程序中,哪几种格式是正确的缩进格式。
运行源程序(1)的结果如下图:

1242864-20171110091140466-170177020.png

运行源程序(2)的结果如下图:

1242864-20171110091303325-1551635118.png

运行源程序(3)的结果如下图:

1242864-20171110091320075-2026648738.png

运行源程序(4)的结果如下图:

1242864-20171110091333559-1367428703.png

实验分析:

(1)(2)两程序的运行结果一致,所以从结果看循环体的认定与缩格形式无关

(3)(4)两程序比较,“{}”中所包含的内容并不相同,输出结果也不一样,所以认为循环体的认定与“{}”有关,因为循环结构执行的是“{}”里的内容

如果循环语句后加了“{}”则一个循环语句中的循环体为“{}”中的内容,如果循环语句后没有加“{}”则认为循环语句后的第一条语句为循环体语句

(1)(3)(4)为正确,(2)为错误,原因:

  • 因为(1)并没有“{}”,所以循环体只执行for语句后面的第一个语句,所以那个语句可以缩进表示循环体

  • (2)中的第二个printf语句并不是循环体,所以没必要缩进,所以(2)为错误

  • (3)(4)都有“{}”来表示循环体,所以正确

4.其他你认为需要进行总结的内容进行总结
(1)我们需要掌握的

①自增自减运算符,并且知道“++” 或“--”在数据前和在数据后区别及用法;

②复合赋值运算符;

③逗号运算符;

④for语句;

⑤为什么要使用循环,实现循环时,如何确定循环条件和循环体?

(2)我们在写程序时需要注意的

①for循环的()中表达式用“;”隔开,而不是用“,”;

②当利用循环求和时不要忘记给定义的和的变量赋初值;

③for循环语句里可以嵌套选择语句;

④当我们执行循环体语句时一定要看看题目有没有要求输出时换行,如果有要求一定要加上“\n”。

三、实验总结

1.求奇数分之一序列前N项和
(1)题目

本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和。

(2)流程图

1242864-20171110142601606-570727111.png

(3)源代码
#include <stdio.h>
int main()
{
    int N,i,a;
    double S,sum;
    scanf("%d",&N);
    a=N+N;
    sum = 0;
    for(i = 1;i <= a;i = i+2)
    {
        sum = sum + 1.0 / i;
    }
    printf("sum = %.6f",sum);
    return 0;
} 
(4)实验分析

问题1:

1242864-20171110110308950-851834271.png

原因:在for语句的()中的表达式2写成了“i <= N”,忽略了i每次是加2的,所以执行次数不对,答案也与题目不符

解决办法:将“i <= N”改成“i <= N + N”

问题2:

1242864-20171110111121325-953351522.png

原因:将“sum = sum + 1.0 / i”写成了“sum = sum + 1 / i”,导致运算为整型运算,运算不正确

解决办法:将“1”改成“1.0”,转换成小数

(5)本题PTA提交列表

1242864-20171110105030091-2070814404.png

2.奇偶分家
(1)题目

给定N个正整数,请统计奇数和偶数各有多少个?

(2)流程图

1242864-20171110142629997-179919025.png

(3)源代码
#include <stdio.h>
int main()
{
    int N,n,a,b,i;
    scanf("%d",&N);
    a = 0;
    b = 0;
    for(i = 1;i <= N;i++)
    {
        scanf("%d",&n);
        if(n % 2 == 0)
        {
            a = a + 1;
        }
        else
        {
            b =b + 1;
        }
    }
    printf("%d %d",b,a);
    return 0;
} 
(4)实验分析

问题1:

1242864-20171110113900731-414239031.png

原因:忘记了if语句的()中的等于号应该用两个

解决办法:将“if(n % 2 = 0)”改成“if(n % 2 == 0)”

(5)本题PTA提交列表

1242864-20171110113644263-1679618700.png

3. 统计字符
(1)题目

本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。

(2)流程图

1242864-20171110232156200-72574124.png
1242864-20171110232238153-711261542.png

(3)源代码
#include <stdio.h>
int main()
{
    int c = 0,d = 0,e = 0,f = 0,i;
    char a;
        for(i = 1;i <= 10;i++)
    {
        scanf("%c",&a);
        if((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'))
        {
            c = c + 1;
        }
        else if(a == '\n' || a == ' ')
        {
            d = d + 1;
        }
        else if(a >= '0' && a <= '9')
        {
            e = e + 1;
        }
        else
        {
            f = f + 1;
        }
    }
    printf("letter = %d, blank = %d, digit = %d, other = %d",c,d,e,f);
    return 0;
}
(4)实验分析

问题1:

1242864-20171110130102513-33657171.png

原因:字符判断没有给字符加“''”

解决办法:将错误程序改成if((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'))

问题2:在数字字符判断时将else if(a >= '0' && a <= '9')写成了else if(a >= '0' && a < '0')导致输出结果错误,如图:

1242864-20171110130732278-1842734182.png

原因:没有认识到数字字符就是一位数,而是以为不管几位数字,只要是数字就是一个字符

解决办法:将错误的程序改成else if(a >= '0' && a <= '9')

(5)本题PTA提交列表

1242864-20171110124808122-1990884915.png

1.求交错序列前N项和
(1)题目

本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。

(2)流程图

1242864-20171110142319450-2041836630.png

(3)源代码
#include <stdio.h>
#include <math.h>
int main()
{
    int N,i,a;
    double sum = 0;
    scanf("%d",&N);
    for(i = 1;i <= N;i++)
    {
    
        sum = sum - i * pow(-1,i) / (2 * i - 1);
    }
    printf("%.3f",sum);
    return 0;
}
(4)实验分析

问题1:第一次运行出现编译错误,错误如下:

1242864-20171110141338950-2140906672.png

原因:用了数学函数,但是没有写数学头文件

解决办法:在第二行写入#include <math.h>

此问题解决后并无其他问题,运行正常

(5)本题PTA提交列表

1242864-20171110141155356-1780425290.png

四、博客互评

我的评论同学的博客链接
程晓磊

http://www.cnblogs.com/8426224ll/p/7813670.html

评论内容:

①建议改错题改正完毕后再输入两组其他与样例不一样的数据测试程序的正确与否;
②raptor的截图最好不要把程序边框也截上,这样会显得raptor流程图模糊,也显得乱;
③第三个raptor流程图不对,这样写的话“0”和第一个选择结构里的条件无法比较,会出现程序错误;
④总体不错,看的出来用心,老铁,不客气!

刘恺煊

http://www.cnblogs.com/liukaixuan/p/7812027.html

评论内容:

①第三个raptor流程图不对,这样写的话“0”和第一个选择结构里的条件无法比较,会出现程序错误;
②其他方面不错,整体观看性非常好,非常工整,值得学习;
③老铁,不客气!

郭玉霖

http://www.cnblogs.com/HBQ521/p/7803633.html

评论内容:

①改错题的错误程序说一下错的原因包括解决方法,让人一看就明白;
②改错题改正完毕后再输入两组其他与样例不一样的数据测试程序的正确与否;
③文章中的源程序打字输入,这样要比截图整齐一点,给人的感觉会好很多;
④老铁,总体还是不错哒,加油,不客气!


这是我此次的博客作业

祝评论我博客的人当你想买东西的时候,打开钱包一看 钱够!

转载于:https://www.cnblogs.com/yjy751522356/p/7816925.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值