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

(一)改错题
输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉。计算公式如下:
c = 5×(f-32)/9
其中,c表示摄氏温度,f表示华氏温度。
输入输出样例1:
  Enter lower:32
  Enter upper:35
  fahr celsius
  32 0.0
  34 1.1
输入输出样例2:
  Enter lower:40
  Enter upper:30
  fahr celsius
源程序(有错误的程序)

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:1242686-20171110162132981-809614864.png
错误原因:for循环中,末尾不用加分号
改正方法:将分号去掉,改为 for (fahr = lower , fahr <= upper, fahr ++)
错误信息2:1242686-20171110162713278-599728559.png
错误原因:for循环语句中,括号内部表达式用分号隔开
改正方法:将逗号改为分号,为 for (fahr = lower ; fahr <= upper; fahr ++)
错误信息3:1242686-20171110163124575-342354269.png
错误原因:编译没有问题,但输出结果错误,经查找,far定义为整浮点型型,输出格式为
改正方法:将输出%3.0f改为%3d
错误信息4:1242686-20171110170950872-444551423.png
错误原因:输出错误,继续找错,发现温度转化式有错误
改正方法:改为celsius = 5 * (fahr - 32.0) / 9;
错误信息5:1242686-20171110171720263-966926740.png
错误原因:输出结果不对,继续查找,发现for语句没有加大括号,致运行错误
改正方法:加上花括号为
for (fahr = lower , fahr <= upper, fahr ++) ;
{
celsius = 5 /9 * (fahr - 32.0);
printf("%3.0f %6.1f\n", fahr, celsius);
}
错误信息6:1242686-20171110172209263-397218816.png
错误原因:输出4组数据,经思考,每次fahr增加2,程序中增加1
改正方法: fahr ++改为fahr=fahr+2
1242686-20171110172546981-1738056739.png该测试数据输出正确
1242686-20171110172730044-914351152.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=fahr+2)
{
celsius = 5
(fahr - 32.0) / 9;
printf("%3d %6.1f\n", fahr, celsius);
}
return 0;
}
(二)学习总结

  1. 源程序
    1242686-20171110222024169-628918818.png
    执行过程:
    ①定义了四个整型变量 i,num,odd,even,并赋odd初值为0,赋even初值为0;
    ②进入for语句循环,赋 i 值为1;
    ③判断循环条件 i<=10,此时 i =1,i<10成立,进入循环;
    ④执行循环,输入一个整数,存储到num这个变量中;
    ⑤判断num与2求余是否为0;
    ⑥若为0,则执行even++,即even的值加一;若为假,即余数不为0,则执行odd++,即odd的值加1;
    ⑦判断完成后,执行i++,i值加1,此时i值为2;
    ⑧接着判断循环条件,i=2<10成立,进入循环;
    ⑨再次输入一个数,再次判断if条件
    ⑩循环十次之后,i值为11,此时i=11>10,跳出循环,执行输出语句,结束;
    实现的功能:
    对用户输入的十个数据进行奇偶判断,并输出奇偶数的个数
    2.增量运算符
    (1)运行下面程序,结果是什么?增量运算符在单独使用时,前缀和后缀形式有区别吗?
    程序

    include <stdio.h>

    int main()
    {
    int i,j;
    i = 2;
    j = 2;
    i++;
    ++j;
    printf("i = %d\n",i);
    printf("j = %d\n",j);
    return 0;
    }
    结果
    1242686-20171110224812575-356383397.png
    可见,增量运算符在单独使用时,前缀与后缀是一样的。
    (2)运行下面的程序,结果是什么?两条输出语句的执行过程是怎样的?说明什么问题?这两条输出语句执行完后,i和j的值分别是多少?
    程序:

    include <stdio.h>

    int main()
    {
    int i,j;
    i = 2;
    j = 2;
    printf("%d\n",i++);
    printf("%d\n",++j);
    return 0;
    }
    结果
    1242686-20171110225143325-2067136628.png
    输出语句的执行过程:第一条 先输出此时 i 的值,为2,在给 i 值加1;第二条 先给 j 值加1,在输出此时 j 的值,为3。
    说明增量运算符在作为表达式的一部分时,前缀与后缀是不一样的,前缀是先给变量加上或减去一个值,再参加运算;而后缀则是该变量先参加运算,再给该变量加上或减去一个值。
    两条输出语句执行完后,i 和 j 的值都为3。
    3.有些循环语句后面有{},有些没有,有些语句有缩进,运行下面的四个小程序,运行结果有什么不同?循环体的认定与缩格形式是否有关?与{}是否有关?那么,应该如何正确判断一个循环语句中的循环体?下面的程序中,哪几种格式是正确的缩进格式。
    (1)
    1242686-20171110230546059-2065585768.png
    结果为一行的五个
    (2)
    1242686-20171110230649278-1048540777.png
    结果仍为一行的五个

    (3)
    1242686-20171110230832763-1658418947.png
    结果为一列的五个
    (4)
    1242686-20171110230958591-873580409.png
    结果为一行的五个

    由此看出:循环体的认定与缩格形式无关,与{}有关;要正确判断一个循环语句中的循环体,要看{},看{}将那些内容包括在内;
    四种程序中,2、3、4都是正确的缩进格式。
    4.对其他你认为需要进行总结的内容进行总结。
    关于符合运算符,符合运算符的优点体现在它的方便,比如表达式 n=n+1就可以写成n+=1,大大提高了编程的效率,节省了时间。
    (三)实验总结
  2. 统计学生平均成绩与及格人数
    (1)题目
    本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数。题目保证输入与输出均在整型范围内。
    (2)流程图
    1242686-20171111001537778-1526760624.png
    (3)源代码

    include <stdio.h>

    int main ()
    {
    int i,N,G,count,sum;
    double average;
    scanf("%d",&N);
    count=0;
    sum=0;
    if(N == 0)
    {

    }
    else
    {
    for(i=1;i<=N;i++)
    {
    scanf("%d",&G);
    sum = sum + G;
    average = (double)sum / N;
    if(G>=60)
    {
    count = count + 1;
    }
    else
    {
    count = count;
    }
    }
    }
    printf("average = %.1f\n",average) ;
    printf("count = %d",count);

    return 0;
    }
    (4)实验分析
    问题:1242686-20171111002500028-1591779686.png
    原因:未给count赋初值
    解决办法:给count赋初值为0
    (5)本题PTA提交列表
    1242686-20171111002705950-1471397999.png
    1242686-20171111002724888-1290486120.png
    2.到底是不是太胖了
    (1)题目
    据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%)。已知市斤是公斤的两倍。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。
    (2)流程图
    1242686-20171111004633450-1487528795.png
    (3)源代码

    include <stdio.h>

    int main()
    {
    int i,N,H,W;
    double bz;
    scanf("%d",&N);
    for(i=1;i<=N;i++)
    {
    scanf("%d %d",&H,&W);
    bz = (H-100)0.92;
    if(W-bz<bz0.1 && bz-W<bz0.1)
    {
    printf("You are wan mei!\n");
    }
    else if(W-bz>=bz*0.1)
    {
    printf("You are tai pang le!\n");
    }
    else
    {
    printf("You are tai shou le!\n");
    }
    }

    return 0;
    }
    (4)实验分析
    问题1:完美情况时,只考虑了真实体重-标准体重>标准体重*0.1的情况
    原因:考虑不全面,没有仔细阅读题目要求
    解决办法:增添了缺少的步骤
    问题2:边界测试150错误
    原因:不了解程序的情况
    解决办法:老师帮忙
    (5)本题PTA提交列表
    1242686-20171111005540059-2136757413.png
    1242686-20171111005610497-1766900401.png
    3.统计学生成绩
    (1)题目
    本题要求编写程序读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:
    大于等于90分为A;
    小于90且大于等于80为B;
    小于80且大于等于70为C;
    小于70且大于等于60为D;
    小于60为E。
    (2)流程图
    1242686-20171111011144497-1235033198.png
    (3)源代码

    include <stdio.h>

    int main()
    {
    int N,A=0,B=0,C=0,D=0,E=0,i,grade;
    scanf("%d",&N);
    for(i=1;i<=N;i++)
    {
    scanf("%d",&grade);
    if(grade>=90 && grade<=100)
    {
    A++;
    }
    else if(grade>=80 && grade<90)
    {
    B++;
    }
    else if(grade>=70 && grade<80)
    {
    C++;
    }
    else if(grade>=60 && grade<70)
    {
    D++;
    }
    else
    {
    E++;
    }

    }
    printf("%d %d %d %d %d",A,B,C,D,E);

    return 0;
    }
    (4)实验分析
    本题只要仔细,不马虎,就不会有错,此题是循环中简单的一题
    (5)本题PTA提交列表
    1242686-20171111011352013-1382301106.png
    4.找出最小值
    (1)题目
    本题要求编写程序,找出给定一系列整数中的最小值。
    (2)流程图
    1242686-20171111012204059-1666547241.png
    (3)源代码

    include <stdio.h>

    int main()
    {
    int n,x,i,min;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
    scanf("%d",&x);
    if(i==1)
    {
    min=x;
    }
    else
    {
    if(min>x)
    {
    min=x;
    }
    else
    {
    min=min;
    }
    }
    }
    printf("min = %d",min);

    return 0;
    }
    (4)实验分析
    本题属于简单题,只要用心的话就可以做对,就可以无停顿的写下程序
    (5)本题PTA提交列表
    1242686-20171111012514731-937736944.png
    (四)博客互评
    郭玉霖的博客链接:http://www.cnblogs.com/HBQ521/
    姚庆虎的博客链接:http://www.cnblogs.com/yaole10086/
    T磊?的博客链接:http://www.cnblogs.com/8426224ll/

转载于:https://www.cnblogs.com/shaosiming/p/7811218.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值