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

对源程序进行编译,采用每次修改第一个错误并重新编译的方法,记录每个错误的错误信息、分析错误原因并给出正确的语句。
改错题采用如下格式
 错误信息:

错误原因:for语句后面不用加分号
改正方法:删掉分号
 错误信息:

 错误原因:for语句中 三个条件句必须用分号隔开而不是逗号
 改正方法:将逗号改为分号
 错误信息(3):

错误原因:在定义变量时fahr为整型,而输出语句中fahr为浮点型,且题干中fahr均为整数,故需要该输出语句中的fahr输出类型
改正方法:把“printf("%3.0f %6.1f\n", fahr, celsius);”改为“printf("%d %6.1f\n", fahr, celsius); ”
错误信息(4):

错误原因:程序中 celsius 为浮点型,而运行的是整型,需要进行强制转换
改正方法:把celsius = 5 /9 * (fahr - 32.0); 改为 celsius = (double)5 /9 * (fahr - 32.0);
错误信息(5):

错误原因:for语句后面的语句并没有进入循环
改正方法:在for语句后面加大括号
错误信息(6):

错误原因:题干中要求每次增加2℉,而该循环中每次增加1,所以需要该每次增加的度数
改正方法:把for (fahr = lower ; fahr <= upper; fahr ++) 改为 for (fahr = lower ; fahr <= upper; fahr +=2)
正确格式:

运行:

(二)学习总结

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,赋初值
odd = 0;
even = 0;   
(3)给i赋初值,之后进入循环
 for(i = 1; i <= 10;i++)
(4)输入一个数
 scanf("%d",&num);
(5)判断输入的数是否为偶数
if(num % 2 == 0)
 (6)是偶数则给even加1,否则给odd加1
 if(num % 2 == 0)
  {
     even++;
   }
  else
   {
     odd++;
   }      
 (7)给i加1,判断此时的i是否大于10,若i小于10,则进入循环
  i <= 10;i++
 (8)输入一个数
 (9)判断输入的数是否为偶数
 (10)是偶数则给even加1,否则给odd加1
 (11)给i加1,判断此时的i是否大于10,若i小于10,则进入循环 
 (12)最后一步
(13)输入一个数
(14)判断输入的数是否为偶数 
(15)是偶数则给even加1,否则给odd加1 
(16)给i加1,判断此时的i大于10,则退出循环 
(17)输出此时even,和odd的值
  printf("%d %d",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; 
}


在这个程序中没有区别,但是 i++是先用i,再i加一,++j是先j加一,再拿去用
(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; 
}


第一步定义整形i,j;
第二步执行i = 2,j = 2;
第三步执行输出语句,先输出i的值,再执行i++;
第四步执行++j,将j的值加1,再输出j
i++是先用i,再i加一,++j是先j加一,再拿去用,执行完输出语句后i和j的值都为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)、(3)、(4)是正确的缩进格式,(2)中循环体不存在 缩进没有意义 背离了题意。
4.对其他你认为需要进行总结的内容进行总结。
(1)for循环的()中表达式用“;”隔开,而不是用“,”
(2)循环语句一定要放在大括号里面才能进行循环
(3)循环语句中会条件句,非零都为真,死循环很有用

(三)实验总结

本次实验总结,学号末位数是单数的同学完成循环结构(1)中的1、3、5、7题,学号末位数是双数的同学完成循环结构(1)中的2、4、6、8题。
格式如下:

1.求整数均值

(1)题目
本题要求编写程序,计算4个整数的和与平均值。题目保证输入与输出均在整型范围内。
(2)流程图

(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:for语句的()中的表达式2写成了“i <= N”,忽略了i每次是加2的,执行次数不对
解决办法:将“i <= N”改成“i <= 2*N”
(5)本题PTA提交列表

2.奇偶分家

(1)题目

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

(2)流程图

(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:格式错误
原因:a,b未赋初值
解决办法:循环语句前加上a=0,b=0
(5)本题PTA提交列表

  1. 统计字符

(1)题目

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

(2)流程图

(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)实验分析
问题2:在数字字符判断时,起初觉得只要是数字就是一个字符,于是诱导全宿舍写成了else if(a >= '0' && a < '0')
原因:数字字符就是一位数

解决办法:改成else if(a >= '0' && a <= '9')

(5)本题PTA提交列表

4.求交错序列前N项和

(1)题目

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

(2)流程图

(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:编译错误
原因:没有在初始位置输入数学头文件
解决办法:在第二行写入#include<math.h>
问题2:pow函数使用错误
原因:括号内只写了i
解决办法:改为pow(-1,i)
(5)本题PTA提交列表

四、博客互评
实验内容的每道题都按照上面的格式书写。

(四)博客互评

每个同学至少评论三篇其他同学的博客作业,依次列出你所评论的博客地址。对于同学对你的博客作业提出的问题,应积极进行回答,存在的错误应及时改正。希望大家能够在互评的过程中取长补短,共同进步。
1.姚纪远
奶昔同学 你的题号标错了谢谢
学习总结第一题。。。
我觉得你应该在步骤后附上执行该步骤的是哪条语句
幕曦
2.吉炎臣
臣臣
你这次写的比上次要好,写的条理非常清晰
第二题中i++和++j,我觉得你可以写的更清楚一些
比如到底差别在哪
吉炎臣
3.王映丹
思路清晰明了 但是实验分析写的有点少啦 下次可以再多写一点
王映丹

posted @ 2017-11-12 14:43  怀瑾握瑜兮丶  阅读(451)  评论(1编辑  收藏  举报