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:


错误原因:
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

posted @ 2017-11-11 15:03  善感👄  阅读(516)  评论(6编辑  收藏  举报