(一)改错题

输出华氏摄氏温度转换表:输入两个整数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语句括号后面的分号删掉。
错误(二):

错误原因:在for语句后面括号中,分别表示fahr初值,判断范围以及步长的语句之间应该用分号分开,而不是逗号。
改正方法:将for语句后括号中判断语句前后的两个逗号改成分号。
改正后经编译无错误,如图所示:

输入给出的样例1后,输出结果有错误,如图所示:

错误(三):

错误原因:

发现第16行的输出语句中对应华氏度数的格式化输出符号有问题,在声明时以及输出时均为int型,但是输出时却格式化为浮点型。
改正方法:将对应华氏度的输出符号改为整形输出的“%d”,对应摄氏度的符号改为符合样例数据的“%.1f”。
改正后,继续输入给定的样例1,结果发现:

错误(四):

错误原因:源代码第五行定义的celsius属于double类型,而第十四行所定义的式子全部为整型,转换错误。
改正方法:在第十四行的代码celsius=后面加(double)进行强行转换。
改正后如图所示:

再次进行编译无错误,输入样例1,发现结果仍旧与给定输出样例不符:

错误(五):

错误原因:经仔细对源代码进行检查发现在for语句的循环体中没有加大括号。
改正方法:将for语句的循环体放进大括号里,其中printf语句也包括在内。
改正后如图所示:

错误(六):

错误原因:改正后,编译无错误,输入样例1,结果与预期不符,题中输出样例为2行,但源代码运行后输出结果为4行。原题中给出的循环,华氏度的温度增加2,而在源代码的for语句中,每次循环华氏度只增加1。
改正方法:将循环后华氏度的增量改变为+2。
改正后如图所示:

输入样例1,结果与预期相符:

输入样例2,结果与预期相符:

经过多次改正后的代码:
#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 =(double) 5 /9 * (fahr - 32.0); 
            printf("%d %.1f\n", fahr, celsius); 
	    }
       

       return 0; 
    }

(二)学习总结

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)先声明变量,然后再给代码赋初值;
(2)进入循环语句,开始输入数字,循环次数为10;
(3)在循环语句中输入一个数就要进行一次判断,判断该数是为奇数还是偶数,若为奇数,在奇数个数上加1(偶数一样),最后输出奇数和偶数的个数。
(4)前两次的循环,先输入一个数,判断奇数还是偶数。然后再次输入一个数,进行第二次循环,继续判断奇数和偶数。
当输入第十个数就是最后一次循环,仍然判断是奇数还是偶数。
(5)最后程序实现的是判断并计算输入的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; 
}

回答:运行此程序,结果如图所示:

第一条输出语句是先运行,后加一;而第二天语句是先进行加一,后运行。对于此程序而言,前缀与后缀的形式影响到了输出(前缀是先进行加减,后运行;后缀是先运行,后进行加减。)。两条输出语句执行完后,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>循环体的认定与缩进格式没有关系,而是与{}有关系。
<2>判断一个循环语句中的循环体看{}。
<3>第四个是正确的循环题缩进格式。
4.对其他你认为需要进行总结的内容进行总结。
(1)for语句中的判断语句是为了让程序能够有限次的进行循环,如果for语句中没加任何判断语句,就会进行无限循环;
(2)切记for循环语句应该用大括号括起来;
(3)for语句中三个语句中间用分号隔开;
(4)循环体结束后进行输出,输出语句在循环体外。
(三)实验总结

1.统计学生平均成绩与及格人数
(1)题目:
本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数。题目保证输入与输出均在整型范围内。

(2)流程图:



(3)源代码及其输入样例运行结果:


(4)实验分析:
问题1:存在除数为0的情况;
原因:注意看题,输入的人数可能为0;
解决办法:加入条件判断句(if语句),判断输入人数是否为0,再执行循环体语句。
问题2:计算及格人数的时候不正确;
原因:系统会随机给及格人数的变量赋初值;
解决办法:在定义变量的时候给变量赋初值。
(5)PTA提交列表:

2.到底是不是太胖了

(1)题目:
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。
真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%)。
已知市斤是公斤的两倍。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。

(2)流程图:



(3)源代码及其输入样例运行结果:


(4)实验分析:
问题1:输出结果一直不对;
原因:存在整型与小数之间的转换;
解决办法:定义变量的时候,注意变量属于int还是double型(注意:整型/整型=整型)。
(5)PTA提交列表:

3.统计学生成绩

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

(2)流程图:



(3)源代码及其输入样例运行结果:


(4)实验分析:
问题1:运用“if”语句需要判断的太多;
原因:分数间包括的较多;
解决办法:运用“swich语句”,将分数除以10以后,再进行运算。
(5)PTA提交列表:

4.找出最小值

(1)题目
本题要求编写程序,找出给定一系列整数中的最小值。

(2)流程图:

(3)源代码及其输入样例运行结果:


(4)实验分析:
问题1:在比较大小的问题中,将输入的第一个数赋min或者max应该放在循环体的什么位置;
原因:给min或max一个初始值便于与后来输入的各个数进行比较;
解决办法:将赋值语句放在循环体外,因此循环体应该进行输入(n-1)次。
(5)PTA提交列表:

(四)博客互评
1.李晓晓:http://www.cnblogs.com/Reloaded/p/7795161.html
评价:解释的内容颇为详细,使我了解到的东西很多,有自己的独特的思想和思路,向他学习。
2.刘苗苗:http://www.cnblogs.com/liumiaomiao520/p/7795587.html
评价:条理清晰,内容完全,重点的东西标注详细,没有出现格式不完美的情况,继续加油!
3.范凯华:http://www.cnblogs.com/fkh1/p/7812032.html
评价:整体内容工整,没有出现特别大的问题,注意实验分析内容不大完整,提出个小小的建议:下次截屏的时候可以只要运算结果,截全屏会显得很大,但是不大美观,继续努力哦!