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

(一)改错题:
错误信息一:
1242741-20171110214425747-752333554.png
错误原因:
1242741-20171110215049919-55779467.png
if语句后面加了分号,if后面不能有分号。
改正方法:去掉if语句后面的分号。

错误信息二:
1242741-20171110215542653-1143000202.png
错误原因:
1242741-20171110215823294-1699024961.png
if括号中出现了逗号,括号中不能有逗号,应该用分号。
改正方法:把逗号改成分号。

改正这两个错误后编译无错误,然后运行发现错误。

错误信息三:
1242741-20171110220411091-2107530571.png
错误原因:
1242741-20171110222609669-1688748728.png
if后面没有加花括号,是导致运行错误的原因之一。
改正方法:在if后面加花括号。正确如图:
1242741-20171110222900294-1698103586.png

错误信息四:
1242741-20171110223048825-130953361.png
错误原因:与题中给出的公式不一样。
改正方法:
1242741-20171110223305825-298075329.png
按照题中给出的公式改正。

错误信息五:
1242741-20171110223423684-1684754762.png
错误原因:
1242741-20171110223723638-1944195052.png
fahr定义的是整型,但是输出时用的是%3.0f,celsius 输出时用的是%6.1f,celsius输出时应保留了一位小数,
改正方法:
1242741-20171110224154450-1971455564.png
把%3.0f改成%d %6.1f改成%.1f。

错误信息六:
1242741-20171110224558403-494427251.png
错误原因:fahr每次增加2℉,而fahr++是每次增加的是1℉。
改正方法:把fahr++改成fahr=fahr+2,如图:
1242741-20171110224858934-1589050787.png

正确源程序:

#include <stdio.h>
# include <math.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("%d %.1f\n", fahr, celsius); 
 }
    return 0; 
}

经过以上错误改正,进行运行。如图所示:
1242741-20171110225204106-1049381341.png
1242741-20171110225212403-2144474290.png

(二)学习总结:
1.详细描述程序的执行过程,即说明程序的每一步是执行的哪条代码,执行顺序如何。循环需描述前两次循环和最后一次循环的详细执行过程。最后说明程序实现的功能是什么。
1242741-20171110231121309-1076247539.png

程序的执行过程:
(1)先定义i,num,odd,even位整型。
(2)将0赋值给odd。
(3)将0赋值给even。
(4)进行循环语句for括号里的第一条语句i=1,i=1语句只执行一次后面不再循环。进行循环语句中的第二条,i<=10.i=1,复符合判断语句i<10.继续进行循环体,输入num,如果num为偶数even加一。否则奇数odd加一。
(5)进行循环体,输入num,如果num为偶数even加一。否则奇数odd加一。
(6)回到i++语句,i=2,复符合判断语句i<=10.继续进行循环体,输入num,如果num为偶数even加一。否则奇数odd加一。
(7)回到i++语句,i=3,复符合判断语句i<=10.继续进行循环体,输入num,如果num为偶数even加一。否则奇数odd加一。
.
.
.
之后一直进行循环,直到i=11时,不符合判断语句i<10时,循环结束,输出结果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; 
}

运行以上程序,结果如下:
1242741-20171110231829075-559402452.png
此代码中增量运算符在单独使用时,结果都是将其加1,前缀和后缀形式并没有明显的区别。

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

运行以上程序,结果如下:
1242741-20171110232830606-691838226.png
执行过程:
(1)先定义ij为整型。
(2)将2赋值给i,将2赋值给j。
(3)最后输出有后缀的i,输出有前缀的j。
i++,后缀的执行顺序是先输出原有的值然后在进行加运算。
++j,前缀的执行顺序是先进行加的运算然后输出运算后得到结果。
说明前缀和后缀还是有区别的,这两条输出语句执行完后,i和j的值分别是2和3。

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

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

此程序运行结果:
1242741-20171111224937059-841672990.png

(2)

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

此程序运行结果:
1242741-20171112074437169-1957384771.png

(3)

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

此程序运行结果:
1242741-20171112075528106-1879435414.png

(4)

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

此程序运行结果:
1242741-20171112075915638-927679365.png

运行结果有什么不同?
(1)(2)(4)的运行结果都是横向的*****而(3)是竖向的。
循环体的认定与缩格形式是否有关?
(1)(2)的代码中的缩格形式不同但是运行结果都一样,所以可以得出循环体的认定与缩格形式无关。
与{}是否有关?
可以从(3)(4)对比中看出,运行结过得不同于{}是有关的。(3)(4)中花括号里的内容不一样导致运行结果不一样,
如何正确判断一个循环语句中的循环体?
循环体语句下一行花括号中的语句就是一个循环体,一个分号就代表一条语句的结束所以没有花括号的 的情况小就找离循环语句最近的一个分号,在这个分号之前就是的语句就是一个循环体。
哪几种格式是正确的缩进格式?
我认为(3)(4)种是正确的缩进格式。

4.对其他你认为需要进行总结的内容进行总结。
自我总结:
(1)循环体语句可以说单条语句也可以是复合语句,无论循环体有几条语句,最好都加大括号。
(2)增值运算符单独使用时,前缀和后缀形式运算结果都是一样的,前缀++i(先执行i+1,再使用I值)后缀i++(先使用I值再执行i+1)再一行语句中,一个变量只出现一次增量或减量运算符。
(3)for语句中表达式中的分号不能省略,缺少表达式2时会形成无限循环,表达式2只要其值为非零,就执行循环
体。
(4)如果每次循环完后,循环变量的值加1,可以有两种表达方式:i=i+1,i++.

(三)实验总结:
1.统计学生平均成绩与及格人数
(1)题目:
本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数。题目保证输入与输出均在整型范围内
(2)流程图:
1242741-20171112102733434-986380326.png
(3)源代码:

# include <stdio.h>
int main(void)
{
 int i,N,count,g,sum;
 double average;5
 54
 77
 773

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

(4)实验分析:
问题1:
1242741-20171112105732919-1526675488.png
输不出结果。
原因:
1242741-20171112105801450-94181580.png
i=i++,格式错误。
改正方法:
把i=i++改成i++,或是i=i+1

问题2:
1242741-20171112105947825-580822930.png
与正确答案不一样小数点后面的数为0
原因:
1242741-20171112110622950-1647982772.png
average没有double装换
改正方法:
1242741-20171112110905106-180906951.png
在sum/N前加上(double)

问题3:
1242741-20171112111019216-824523355.png
原因:没有考虑当学生人数为0时
1242741-20171112111321919-1859410347.png
改正方法:
1242741-20171112111342934-1263711560.png
把计算average的公式放到for循环体中。
(5)本题PTA提交列表:
1242741-20171112103526731-933330937.png

2.到底是不是太胖了
(1)题目:
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%)。已知市斤是公斤的两倍。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。输入第一行给出一个正整数N(≤ 20)。随后N行,每行给出两个整数,分别是一个人的身高H(120 < H < 200;单位:厘米)和真实体重W(50 < W ≤ 300;单位:市斤),其间以空格分隔。为每个人输出一行结论:如果是完美身材,输出You are wan mei!;如果太胖了,输出You are tai pang le!;否则输出You are tai shou le!。
(2)流程图:
1242741-20171112125939763-1070943384.png
(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)实验分析:

3.统计学生成绩:
(1)题目:
本题要求编写程序读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:
•大于等于90分为A;
•小于90且大于等于80为B;
•小于80且大于等于70为C;
•小于70且大于等于60为D;
•小于60为E
(2)流程图:
1242741-20171112133712716-1279905071.png
(3)源代码:

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

(4)实验分析:
问题1:
1242741-20171112133936481-1903973874.png
做流程图的时候E不能被赋值。
原因:在raptor中e不能被赋值。
解决办法:用F代替E。
(5)本题PTA提交列表:
1242741-20171112130614606-489764681.png

4.找出最小值:
(1)题目:
输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔。在一行中按照“min = 最小值”的格式输出n个整数中的最小值。
(2)流程图:
1242741-20171112140911981-43268963.png
(3)源代码:

# include <stdio.h>
int main(void)
{
    int i,min,n,k;
scanf("%d",&n);
scanf("%d",&k);
min=k;
for(i = 1;i<=n;i++)
{
    scanf("%d",&k);
    if(k<min)
    {
        min = k;
    }
}
printf("min = %d",min);
return 0;

 }

(4)实验分析:
问题一:
1242741-20171112141226200-1727762357.png
原因:
没有给min赋初值。
解决方法:
1242741-20171112141602669-105857366.png
在for循环之前输入一个数,并把这个数赋值给min.

(5)本题PTA提交列表:
1242741-20171112131058356-98330747.png

(四)博客互评:
(1)http://www.cnblogs.com/yiqiekaoziji/p/7821155.html
(2)http://www.cnblogs.com/luyu0322-/
(3)http://www.cnblogs.com/ying-7/p/7818967.html

转载于:https://www.cnblogs.com/wangqi1998/p/7816711.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值