(一)改错题

输出华氏摄氏温度转换表:输入两个整数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:





错误原因:

for循环语句里面的每一条完整的语句后面用分号隔开。

改正方法:

把for里面的逗号该成分号。

错误信息2:



错误原因:

for小括号后面不能加分号

改正方法:

for语句最后面的分号去掉

错误信息3:

错误原因:

编程和题目中描述不符,题中说的是fahr每次增加2

改正方法:

把for括号里面的fahr++改成fahr+=2

错误信息4:

错误原因:

输出的值不对,经检验循环的不对。

改正方式:

在for的下一行加一个大括号,把celsius和printf语句放入其中如下



错误信息5:



错误原因:

公式错误

改正方法:



错误信息6:





错误原因:

fahr定义的是int类型的,而最后输出的是double类型的输出方式

改正方法:

把最后printf括号里面的fahr改成%3d

经检验改正好变成正确





再次输入几组数据进行验证:



正确代码如下:

 #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.0 *(fahr-32)/9;
printf("%3d %6.1f\n", fahr, celsius);
}
return 0;
}![](http://images2017.cnblogs.com/blog/1242641/201711/1242641-20171110153726888-1337583983.png)

(二)学习总结

1.有如下程序:

#include <stdio.h>
int main()
{
int i,num,odd,even;
odd = 0;
even = 0;
for(i = 1; i <= 10;i++)
{
scanf("%d",&num);
if(num % 2 == 0)
{
even++;
}
else
{
odd++;
}
}
printf("%d %d",even,odd);

return 0;

}

改程序执行的过程为:

1、先定义int类型都有 i num odd even。

2、将odd even分别初始值都为0.

3、进行循环语句第一步i=1时这条语句只在第一次执行一次,后面将不再执行。在循环语句执行完一次后每次i+1直到i>0时循环语句结束。

4、如果说循环语句的条件成立那么输入一个整形值也就是上面定义的num。

5、下面进行条件语句如果num和2求余为零,那么另一层意思就是说当上面num输入的值为偶数时even+1(even++包括上面的i++下面的odd++都表示相应代表的字母+1因此要在初始化赋予他们的值为0)

6、否则,也就是说num输入的时奇数时odd+1

7、然后返回i=i+1这条语句依次进行,不难发现此时的i=2.

8、继续读出一个输入的值和2求余,如果为0那么even+1否则odd+1.

9、一直循环直到当i=10时,输出一个值判断和2求余的结果余数为0时even+1否则odd+1.

10、当i=11时,此时已经不满足循环语句的条件所以循环语句结束,不在进行下面的内容。循环结构完毕进入下一环节

11、分别输出even和odd的值。

这个编程的功能为:

不难发现这个程序是在判断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;
}

运行结果为:



增量运算符在单独使用时前缀后缀的形式当然有区别。比如此题:

不难看出,如果说单独使用前缀后缀并无区别这两者之间。

(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;
}

结果为:



两条语句执行的过程:

1、定义两个整形变量分别为 i j

2、定义它们的初始值i=2 j=2

3、分别输出i j的值,但是i 和 j前后缀的方式不同。

(a、i为后缀,则执行的顺序为先输出原有的值,再输出后在进行i+1这项,所以在输出时i的值为2)

(b、j的值为前缀,则执行的顺序为先进行j=j+1,在输出此时j该有的值,因此在输出时输出j的值为3)

说明问题:

前缀后缀放的位置不同则执行的顺序也不相同,得出来的结果有差异也是正常放在前面的前缀就先+1在其基础上输出该值。后缀就是在输出后在执行+1这项,因此得到的值和上面原有的值一样。

i和j的值分别为2 3

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

(1)

#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
printf("*");
printf("\n");
return 0;
}

(2)

#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
printf("*");
printf("\n");
return 0;
}

(3)

#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
{
printf("*");
printf("\n");
}
return 0;
}

(4)

#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
{
printf("*");
}
printf("\n");
return 0;
}

以上四种编程结果分别如下1-4

1、

2、

3、

4、

从运行结果上看1、2、4运行的结果都一样都是“”3和这三个有很大的差距是竖着四个“”连接而成。

循环体的认定与缩格形式是否有关:

经过上面验证的1、2来进行对比可以看出循环体认定与缩格形式没有关系,输出结果都一样。

与{}是否有关?:

与{}有关,从2、3对比可以看出结构形式完全一样,只不过在循环体系3中有个大括号而2没有。但是从结果上看就可以看出有大大的不同输出的结果差异很大。2还是横着4个
相连而3就是竖着4个
相连从这里就可以看出他们两者之间的循环语句在运行时的不同在第二个 代码中无大括号他只是进行据他最近的并且在最后有分号隔开的语句来进行循环,因为在前面我们学过,一个分号代表一个语句的结束,他们有大括号的括住范围那么他也就执行就近的语句来进行循环。但是第三个代码中有大括号括住尽管在大括号的第一条语句的最后有 分号隔开那么他也会在接着进行第二条语句,让整个循环体在这两条完整的语句中循环。所以在最后输出的结果也就是大大的不同了。然而我们对比完2、3接下来我们对比一下3、4这两个编程中都涉及到了循环体系中的大括号,但是不难发现这两个括号括住的内容不相 同,这也是他们两者之间循环体的不同进而更明显的表现出输出的结果不同。在第三个中把第二个printf换行的这个括在了大括号内也就说明了每次进行的循环体都要输出一次结果并且都需要换行,但是在第四个中把第二个printf换行放在了最后这也就是说明在每次循环中不用换行只是到最后循环完毕进行一次换行即可,也反映到了输出的结果上面为什么时一行
的原因,而第三个则是竖着一排*的。

该如何正确判断一个循环语句中的循环体?:

1、首先先找循环体语句

2、找到循环体语句后找下一行的大括号从哪到哪,被括在这其中的就是该循环体中要被循环的部分

3、如果说没有找到循环语句下面的括号,那么你需要找的就是离循环语句中最近的分号了,当出现分号是语句结束,在这之前的体系就是循环中要被循环的那部分。

以上那个是正确的缩进:

我认为3、4位正确的缩进格式。

问题总结:

不难看出循环体的认定与缩进格式没有什么关系

加不加大括号会影响循环的内容

在做循环体时在最后一定要注意printf的位置该放在循环体里面还是外面。

4、对其他内容的总结

再循环这节课中我们学到了很多的知识,要明白循环语句的执行方式也就是上面所列举的我就不说了。上面也说了大括号的作用,建议是只要以后写到了循环体系一律加大括号哪怕是就是只循环就近这个语句也要加上,这样自己看的也清晰明了,在自己检查时一看就明白了那里是循环体系。记住前缀后缀的结合方式并且知道优先级的情况。良好的变成建议:在一行语句中,依次变量只出现一次增量,减量运算符。在循环for语句后面不可以加分号。理解明白逗号运算符和逗号表达式的结果该如何计算即可。在进行循环时里面出现的变量首先考虑下用不用定义初始值让改值有意义。如果说不在循环体之前初始化的话他出现的数则为随机数。

(三)实验总结

(1)题目

7-2 统计学生平均成绩与及格人数

(2)流程图





(3)源代码

#include<stdio.h>
#include<math.h>
int main (void)
{
int N,i,a,count;
double average,sum;
average=0;
count=0;
sum=0;
scanf("%d",&N);
if(N==0)
{
printf("average = 0.0\ncount = 0");
}
else
{
for(i=1;i<=N;i++)
{
scanf("%d",&a);
sum=sum+a;
if(a<60)
{
count=count;
}
else
{
count=count+1;
}
}
average=(double)sum/N;
printf("average = %.1f\ncount = %d",average,count);
}
return 0 ;
}



(4)实验分析

问题:

流程图输不出结果

原因:

没有赋储值

解决办法:

在流程图的最前面加上了初值为多少

问题:

本应5次输出结果但运行起来要输入六次

原因:

i=i+1应该放在循环语句的最后进行,并且把i>N改成了i>=N即可。

问题:

count给了初始值但是count值还是无法输出

原因:

count放在了最后了先求其平均数了,缺少数据

解决办法:

先判断及格人数,在计算平均值。

问题:

在C++中平均值的结果不对

原因:

整形/整形得出来的还是整形

解决办法:

再求平均数时,强行转化为double类型的

(5)本题的PTA提交列表

(1)题目

7-4 到底是不是太胖了

(2)流程图





(3)源代码

#include<stdio.h>
#include<math.h>
int main (void)
{
int N,H,W,i,standard,a;
scanf("%d",&N);
standard=0;
a=0;
for(i=1;i<=N;i++)
{
scanf("%d %d",&H,&W);
standard = (H-100)*0.9*2; a = W-standard;
if(a<standard*0.1&&a>-standard*0.1)
{
printf("You are wan mei!\n");
}
else if (a>=standard*0.1)
{
printf("You are tai pang le!\n");
}
else
{
printf("You are tai shou le!\n");
} }
return 0 ;
}

(4)实验分析

问题:



原因:

循环语句

放的位置不对,应该先循环在输入,结果放到了循环之前。

解决办法:

把算数部分放到循环里面先判断i和N的大小。

问题:



只有两次输出

原因:

i的位置不对,导致输出时只有两次的输出结果。

解决办法:

把i=i+1放到输出的后面。

问题:

C++中的判断的结果不准确

原因:

在计算时程序中会有误差

解决问题:

一步步的写运算方式,会减少误差的产生。

(5)本题PTA的提交列表

(1)问题

7-6 统计学生成绩

(2)流程图







(3)源代码

#include<stdio.h>
#include<math.h>
int main (void)
{
int N,A,B,C,D,E,i;
double grade;
A=B=C=D=E=0;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
scanf("%lf",&grade);
if(grade>=90&&grade<=100)
{
A++;
}
else if (grade<90&&grade>=80)
{
B++;
}
else if (grade<80&&grade>=70)
{
C++;
}
else if (grade<70&&grade>=60)
{
D++;
}
else
{
E++;
}
}
printf("%d %d %d %d %d",A,B,C,D,E);
return 0 ;
}



(4)实验分析

问题:

在使用Raptor时最一开始定义的E=0不能定义

原因:

在raptor中E为我们数学中的那个函数有特定的值越为2.7多,所以无法变量。

解决办法:

把E=0改成了F=0.虽然我把E改成了F但是所代表的并没有变化,raptor中的F也就是C++中的E。

问题:



没有输出结果

原因:

忘了写最后输出的内容

解决办法:

在最后循环完毕后加上了输出ABCDF的值。

(5)本题PTA的提交列表

(1)题目

7-8 找出最小值

(2)流程图





(3)源代码

#include<stdio.h>
#include<math.h>
int main (void)
{
int n,i,b;
double min,t;
scanf("%d%lf",&n,&min);
for(i=1;i<=n-1;i++)
{
scanf("%d",&b);
if(min>=b)
{
t=b;
b=min;
min=t;
}
else
{
min=min;
}
}
printf("min = %.0f",min);
return 0 ;
}



(4)实验分析

问题:



原因:

输入的字母与比较的字母不同,在输入时不能命名为min,所以在写raptor时我就直接命名的为m了

解决办法:

让前后的字母都一致,这样才有办法比较。

问题:



原因:

在输出时输入的格式不对,并且也找不到min的值

解决办法:

把最后输出时的格式改成了“”min= “+m+”“因为在前面命名的是m并不是min,所以输不出来结果。

(5)本题PTA的提交



(四)博客互评

范凯华:http://www.cnblogs.com/fkh1/p/7812032.html

姚纪远:http://www.cnblogs.com/yjy751522356/p/7816925.html

卢玉http://www.cnblogs.com/luyu0322-/p/7809912.html

C语言程序设计第五次作业--循环结构(1)的更多相关文章

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

    (一)改错题 1.题目:输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下: c = 5 ...

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

    一.改错题 1.题目 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下:c = 5×( ...

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

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

  4. C语言程序设计第六次作业——循环结构(2)

    C语言程序设计第六次作业--循环结构(2) 之前的博客园图片没处理好,对大家说一声抱歉.希望大家能够多多指出我的错误,我来认真修改 ^ - ^ !. (1)改错题 序列求和:输入一个正实数eps,计算 ...

  5. C语言程序设计第六次作业--循环结构(2)

    (一)改错题 序列求和:输入一个正实数eps,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精确到最后一项的绝对值小于eps(保留6位小数). 输入输出样例: Input e ...

  6. C语言程序设计第六次作业--循环结构2

    (一)改错题 序列求和:输入一个正实数eps,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精确到最后一项的绝对值小于eps(保留6位小数). 输入输出样例: Input e ...

  7. C语言第五次作业——循环结构

    C语言程序设计第五次作业--循环结构(1) (一)改错题 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增 ...

  8. C语言程序设计第五次作业

    一.实验内容     1.输入两个正整数m和n(要求m<=n), 求m!+(m+1)!+(m+2)!-+n!    2.输出1000以内的所有完数.所谓完数是指这个数恰好等于除他本身外的所有因子 ...

  9. C语言程序设计第三次作业--选择结构(1)

    Deadline: 2017-10-29 22:00 一.学习要点 掌握关系运算符和关系表达式 掌握如何判断两个实数相等 掌握常用数学函数的使用 掌握逻辑运算符和逻辑表达式 理解逻辑运算的短路特性 掌 ...

随机推荐

  1. 【非官方】Surging 微服务框架使用入门

    前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与Surging的RPC框架,在.NET 4.0框架 ...

  2. Vue.js自己从官网整理的东东

    1.采用简洁的模板语法来声明渲染数据: <div id="app"> {{ message }} </div> var app = new Vue({ el ...

  3. node框架koa

    node的两大常见web服务器框架有express和koa,之前已经介绍过express了现在来介绍下koa吧~ koa也是express团队的出品,意在利用es7新出的async来告别"回 ...

  4. node框架express

    见识到原生nodeJs服务器的恶心后,我们来用下简单好用的框架吧~ 服务器无非主要提供接口和静态文件读取,直接上代码: const express = require('express'); cons ...

  5. LeetCode & Q20-Valid Parentheses-Easy

    Stack String Description: Given a string containing just the characters '(', ')', '{', '}', '[' and ...

  6. Spring知识点回顾(01)Java Config

    Spring知识点回顾(01) 一.Java Config 1.服务和服务注入 2.Java 注解 :功能更强一些 3.测试验证 二.注解注入 1.服务和服务注入 2.配置加载 3.测试验证 三.总结 ...

  7. 新概念英语(1-31)Where's Sally?

    新概念英语(1-31)Where's Sally? Is the cat climbing the tree ? A:Where is Sally, Jack ? B:She is in the ga ...

  8. ssh_maven的搭建之dao层的开发

    之前都是使用我们传统的方式进行引入jar包,现在我们使用maven进行管理依赖,这样,我们的jar就不需要我们进行管理,而且,我们的maven还可以进行项目构建,一个项目从编写源代码到编译,测试,运行 ...

  9. (第一章)对程序员来说CPU是什么

    这几天,看到一本书,<程序是怎么跑起来的>,觉得之前都没有完整的看完一本书,现在要从这本书开始,慢慢的培养自己写读书笔记的习惯,不能度过去就忘了. 学习是一个螺旋上升的过程,不要指望一下子 ...

  10. python--IO模块

    IO模块 一 IO模型 分为: 1 阻塞IO (accept recv) 2 非阻塞IO 3  IO多路复用(监听多个链接) 4 异步IO 5 驱动信号模型(不经常使用) 1 阻塞IO (blocki ...