一.改错题
(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.错误信息:
错误原因:
改正方法:把所有“,”改为“;”。
2.错误信息:
错误原因:for语句后不用加;
改正方法:for后去掉;
3.错误信息:只能循环一次
错误原因:for后没有{}
改正方法: 将for下面的语句用{}括起来。
4.错误信息:
错误原因:int fahr 定义错误
改正方法: fahr定义为double
5.错误信息:
错误原因:celsius保留一位小数
%6.1f改为%.1f
6.错误信息:
错误原因:程序与题意不一样
改正方法: fahr = 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;
}
详细描述程序的执行过程,即说明程序的每一步是执行的哪条代码,执行顺序如何。循环需描述前两次循环和最后一次循环的详细执行过程。最后说明程序实现的功能是什么。
int i,num,odd,even;定义变量
odd = 0;
even = 0;
给odd even赋值
for(i = 1; i <= 10;i++)
进行循环,输入num。
如果num等于0
even+1
否则odd+1
一次结束后,i+1
当i=10是输出even和odd的值。
这个程序是统计偶数和技术的个数
(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++”,是先输出“i”的值,然后给“i”加上1,;对于“++j”,是先给j+1,得到然后再输出j的值。说明当增量运算符作为表达式的一部分时,前缀形式和后缀形式的执行过程是不一样的。执行完两条语句后得到的
i=3 j=2。
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;
}
第一和第二只有两个printf语句有区别,第二个printf缩进,但是输出的结果是一样,所以循环体的认定与缩格形式无关;
第二个和第三个程序的区别在于多了一个大括号{},但是输出的结果不同说明加个括号,结果不一样。说明与{}有关
第三个和第四个差一个大括号,单输出的结果不一样。所以和大括号有关。
4.对其他你认为需要进行总结的内容进行总结。
(1)在进行逗号运算的时候要从左往右一次运算。
(2)循环体语句既可以是单条语句也可以是复合语句
(3)无限循环中,通过在循环体中加break语句对循环进行控制。
(三)实验总结
1.(1)题目
7-1求奇数分之一序列前N项和:
(2)
(3)
#include <stdio.h>
int main()
{
int N;
double sum,i;
sum=0;
i=1;
scanf("%d",&N);
for(i=1;i < 2*N;i = i + 2)
{
sum=sum+1/i;
}
printf("sum = %.6f",sum);
}
(4)实验分析
问题1:输出的数老是不对
原因:sum的值是随机的
解决办法:加上sum=0
(5)
3.(1)题目
7-3 奇偶分家
(2)流程图
(3)源代码
#include <stdio.h>
int main()
{
int n,i,s,o,j;
i=0;
o=0;
j=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&s);
if(s % 2 == 0)
{
o=o+1;
}
else
{
j=j+1;
}
}
printf("%d %d",j,o);
}
此题没有问题
(5)
5.(1)题目
统计字符
(2)流程图
(3)源代码
#include<stdio.h>
int main()
{
char str[10];
int i=0,letter=0,blank=0,digit=0,other=0;
while(i<10)
{
str[i++]=getchar();
}
for(i=0;i<10;i++)
{
if(str[i]==' ')
{
blank++;
}
else if(str[i]=='\n')
{
blank++;
}
else if(str[i]>='0'&&str[i]<='9')
{
digit++;
}
else if(str[i]>='A'&&str[i]<='Z')
{
letter++;
}
else if(str[i]>='a'&&str[i]<='z')
{
letter++;
}
else
{
other++;
}
}
printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
return 0;
}
(4)实验分析
不知如何去定义一系列的变量
(5)
7.(1)
7-7 求交错序列前N项和
(2)
(3)源代码
#include <stdio.h>
int main()
{
int N,i;
double j,sum,a=0,b=0;
sum=0;
scanf("%d",&N);
for(i=1;i < N+1;i++)
{
j=i;
if(i%2==0)
{
a=a-(j/(2*j-1));
}
else
{
b=b+(j/(2*j-1));
}
}
sum=a+b;
printf("%.3f",sum);
}
(4)实验分析
问题1:输出的答案错误
原因:在进行负数项加和时出现错误
解决方法:去掉了a前多余的﹣号
(5)本题PTA提交列表
(四)博客互评
姚纪远 http://www.cnblogs.com/yjy751522356/p/7816925.html
吉炎臣 http://www.cnblogs.com/yahaha/p/7820452.html
曲儿说 http://www.cnblogs.com/abc15369938639/p/7810952.html