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

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

错误原因1:for语句格式错误
改正方法1:应该用分号";",不应该用逗号"," 并且for语句括号后不应该有分号";"

错误信息2:

错误原因2:fahr是整型,应用%d,而输出是double类型,并且celsius应保留一位小数
改正方法2:将printf("%3.f%6.1f\n")改为printf("%d%.1f\n"),在5/9前加上(double)

错误信息3:

错误原因3:for语句循环条件没有加上{ },无法循环
改正方法3:将celsius = 5 /9 * (fahr - 32.0);
printf("%3.0f %6.1f\n", fahr, celsius); 用{ }括起来

错误信息4:

错误原因4:题中要求每次增加2℉,所以fahr++是不对的
改正方法4:将fahr++改为fahr=fahr+2

编译后正确
输入样例1:

输入样例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; 
 }

详细描述程序的执行过程,即说明程序的每一步是执行的哪条代码,执行顺序如何。循环需描述前两次循环和最后一次循环的详细执行过程。最后说明程序实现的功能是什么。
①定义整型变量 i,num,odd,even
②将odd,even赋值为0
③i赋值为1,输入一个数字,将数字放在num里,判断数字和2求余是否等于0,如果等于0,even加1,否则,odd加1
④i加1等于2<10,再次进入循环,重复上面步骤,使再次输入一个数字,放在num里面,判断数字和2求余是否等于0,等于0,even加1,否则,odd加1
⑤一共输入10个数字,放在num里面,重复上面步骤,直到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; 
    }

输出结果如下:

i和j输出都为3,结果都加1
增量运算符在单独使用时没有区别,都是表示加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; 
}

输出结果如下:

第一条输出语句时先执行i,再执行i+1,第二条输出语句是先执行j+1,再输出j的值
说明在代码中前缀和后缀是有区别的,前缀是先执行加的命令再输出,而后缀就是先输出再执行加的命令
执行此段代码后,i=2,j=3

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

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

程序1运行结果:

(2)

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

程序2运行结果:

(3)

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

程序3运行结果:

(4)

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

程序4运行结果:

结果不同在"*"的排列方式不同
循环体的认定与缩格形式无关,与{ }有关
应该将循环体用{ }括起来
第1个和第4个源程序都是正确的,输出结果符合预期。但第4个源程序却更加的规范。
第3个源程序很规范也很正确,以后不管循环体有几条,都要加上{ },这是一种很好的习惯。

4.对其他你认为需要进行总结的内容进行总结。
在for语句中,要注意循环的括号中应该用; 隔开,而不是用 , 隔开。
并且由于现在定义变量变多了,程序也逐渐复杂,需要在一行代码后面加上注释,帮助我们更清楚的看明白程序。
for语句的一般格式是
for(表达式1;表达式2;表达式3)
{
循环体(表达式)
}
其中,表达式1为循环变量赋初值
表达式2为循环条件,若判断循环条件为真,则执行循环体,否则跳出循环
表达式3为循环条件的新赋值表达式,然后转回第二步循环

(三)实验总结(我的学号末位为奇数,总结1,3,5,7题)
1.求奇数分之一序列前N项和
(1)题目:本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和。
(2)流程图:

(3)源代码:

#include <stdio.h>
int main(void)
{
    int i,N;
    double sum,s;
    scanf("%d",&N);
    sum = 0;
    for(i = 1;i<=N;i = i+1)
    {
	    sum = sum+1.0/(i*2-1);
    }
	    s = sum;
    printf("sum = %.6f",s);

    return 0;
}

(4)实验分析
要记住给sum赋初值
(5)本题PTA提交列表

2.奇偶分家
(1)题目:给定N个正整数,请统计奇数和偶数各有多少个
(2)流程图:

(3)源代码:

    #include <stdio.h>
    int main(void)
    {
        int i,n,a,ou,ji;
        scanf("%d",&n);
        ji = 0;
        ou = 0;
        for(i=1;i<=n;i++)
        {
	        scanf("%d",&a);
	        if(a%2!=0)
	        {
	        ji++;	
	        }
	        else
	        {
	        ou++;
	        }
        }
        printf("%d %d",ji,ou);

        return 0;
    }

(4)实验分析
这道题难点在于在循环语句中嵌套判断语句,应注意声明变量ji和ou都是初值为0的
(5)本题PTA提交列表

3.统计字符
(1)题目:本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。
(2)流程图:

(3)源代码:

#include <stdio.h>
int main (void)
{
    int i,letter=0,blank=0,digit=0,other=0;
    char a;
    for(i=1;i<=10;i++)
    {
	    scanf("%c",&a);
	    if(a>='a' && a<='z' || a>='A' && a<='Z')
	    {
		    letter++;
	    }
	    else if(a==' ' || a=='\n')
	    {
		    blank++;
	    }
	    else if(a>='0' && a<='9')
	    {
		    digit++;
	    }
	    else
	    {
		    other++;
	    }
    }
    printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
    return 0;
 } 

(4)实验分析
问题1:输出之后答案错误
原因1:没有注意到a时字符型变量,应该用' ' 扩起来
解决方法1:将字符,数字和空格还有回车用单引号括起来,并且注意回车的表示方法
(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(void)
{
    int N,i;
    double sum;
    scanf("%d",&N);
	sum = 0;
    for(i=1;i<=N;i++)
    {
	    sum = sum+i/(2.0*i-1)*pow((-1),i-1);		
    }
    printf("%.3f",sum);

    return 0;
 } 

(4)实验分析
此题要注意的是每一项是正负相错开的,不知道为什么流程图中不能用pow函数,最后只能用flag,并且要注意flag变号是在赋值语句之前还是之后。
(5)本题PTA提交列表

(四)博客互评
李晓晓:(http://www.cnblogs.com/Reloaded/p/7795161.html)
李晓晓同学的改错题中的错误都用红笔勾出来了,这点值得我们学习,而学习总结中的实验分析for循环的步骤也很清楚,让我更加理解for循环的内容。
曲儿说:(http://www.cnblogs.com/abc15369938639/p/7810952.html)
我觉得曲儿说同学的错误可以改为截图错误部位,而不是把所有代码和错误原因放在一起,这样可能会更清楚,但是他的流程图部分做的很清楚。
luck you 😦http://www.cnblogs.com/LYFRRS/p/7807056.html)
这名同学的改错题将图中错误标识出来,我认为比李晓晓同学用红笔标出来更加清楚,但是源代码部分希望不要用截图方式,而是用markdown模式,具体如何使用老师已经做了详细介绍了。
T磊:(http://www.cnblogs.com/8426224ll/p/7813670.html)
学习总结中写for循环过程的那道题,思路很清晰,结构也非常整洁,但是建议改错题的错误全部改正完毕后再输入样例,测试结果是否正确。

posted @ 2017-11-11 15:09  王映丹  阅读(332)  评论(5编辑  收藏  举报