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:

错误原因:第13行的for语句中的三个表达式用逗号“,”进行了分隔。
改正方法:第13行的for语句中的三个表达式之间的逗号“,”改为分号“;” 。

输入样例1:

与结果不同。
输入样例2:

与结果不同。

错误信息2:

错误原因:第13行的 for 语句的最后有分号“;”。
改正方法:第13行的 for 语句最后的分号“;”去掉。

错误信息3:

错误原因:第14行到第15行的语句,没有用大括号括起来。
改正方法:第14行到第15行的语句,用大括号括起来。

错误信息4:

错误原因:第16行的输出语句中 fahr 与 celsius 对应错误。
改正方法:改变第16行的输出语句中 fahr 与 celsius 的对应。

错误信息5:

错误原因:第15行的赋值语句中先运算 5/9 导致结果为 0 。
改正方法:第15行的赋值语句中的 /9 放到最后。

错误信息6:

错误原因:第13行的for语句中的fahr应该每次加2。
改正方法:第13行的for语句中的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; 
}

详细描述程序的执行过程,即说明程序的每一步是执行的哪条代码,执行顺序如何。循环需描述前两次循环和最后一次循环的详细执行过程。最后说明程序实现的功能是什么。
答:
第一步执行 int i,num,odd,even; 定义整形变量。
第二步执行 odd = 0; 赋值。
第三步执行 even = 0; 赋值。
第四步执行 for(i = 1; i <= 10;i++) 代码,先执行 i = 1 ,再执行 i <= 10 。循环语句。
满足条件,进行循环。

第一次循环:
第一步执行 scanf("%d",&num); 输入一个数。
第二步执行 if(num % 2 == 0) 判断条件。
第三步如果为真执行 even++; 否则,第三步执行 odd++;
第四步执行 for(i = 1; i <= 10;i++) 代码,先执行 i++ 此时 i = 2 ,再执行 i <= 10 。为真。继续循环。

第二次循环:
第一步执行 scanf("%d",&num); 输入一个数。
第二步执行 if(num % 2 == 0) 判断条件。
第三步如果为真执行 even++; 否则,第三步执行 odd++; 代码。
第四步执行 for(i = 1; i <= 10;i++) ,先执行 i++ 此时 i = 3 ,再执行 i <= 10 。为真。继续循环。

最后一次循环:
第一步执行 scanf("%d",&num); 输入一个数。
第二步执行 if(num % 2 == 0) 判断条件。
第三步执行 如果为真执行even++; 否则,第三步执行 odd++;
第四步执行 for(i = 1; i <= 10;i++) 先执行 i++ 此时 i = 11 ,再执行 i <= 10 。为假。停止循环。
第五步执行 printf("%d %d",even,odd);输出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; 
}

运行结果:

增量运算符在单独使用时,前缀和后缀形式没有区别。

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

运行结果:

执行过程:
printf("%d\n",i++); 输出语句的执行过程为先把 i 的值输出,再执行 i = i+1 。
printf("%d\n",++j); 输出语句的执行过程为先执行 j = j+1 ,再把 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; 
}

(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)

循环体的认定与缩格形式无关,与{}是有关。
正确判断一个循环语句中的循环体的方式:
for 语句下的大括号围起来的语句,若无大括号则为 for 下的第一条语句。
第三四种格式是正确的缩进格式。

4.对其他你认为需要进行总结的内容进行总结。
1.应清楚理解for循环结构的运行步骤并熟练使用。
2.应熟练掌握运用自增自减运算符。

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

(3)源代码

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

(4)实验分析
问题:把输入语句放在了循环结构里面。
解决办法:把输入语句放在循环结构后面。

(5)本题PTA提交列表

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

(3)源代码

#include<stdio.h>
int main()
{
int N,i,S,J,O;
double H;
scanf("%d",&N);
J=0;
O=0;
for(i=1;i<=N;i++)
{
	scanf("%d",&S);
	H=S%2;
	if(H==0)
	{
		O=O+1;
	}
	else
	{
		J=J+1;
	}
}
printf("%d %d",J,O);
return 0;
}

(4)实验分析
问题:格式错误。
原因:输出语句%d之间没有空格。
解决办法:在最后的输出语句%d之间加了空格。

(5)本题PTA提交列表

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

(3)源代码

# include <stdio.h>
int main()
{
char a;
int s,letter = 0,blank = 0,digit = 0,other = 0,i;

for(i = 0;i < 10;i++)
{
	scanf("%c",&a);
	s = a;
	if(s >= 65 && s <= 90)
	{
		letter++;
	}
	else if(s >= 97 && s <= 122)
	{
		letter++;
	}
	else if(s == 32 || s == 10)
	{
		blank++;
	}
	else if(s >= 48 && s <= 57)
	{
		digit++;
	}
	else
	{
		other++;
	}

}

printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);

return 0;

}

(4)实验分析
问题1:编译错误。
原因:少了个分号。
解决办法:加上分号。

问题2:编译错误。
原因:else后面没加if。
解决办法:在else后面加上if。

(5)本题PTA提交列表

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

(3)源代码

# include <stdio.h>
int main()
{
int N,i,y;
double sum = 0.0;

scanf("%d",&N);
for(i = 1;i <= N;i++)
{
	y = i%2;
	if(y == 1)
	{
		sum = sum + i/((2.0*i)-1);
	}
	else
	{
		sum = sum - i/((2.0*i)-1);
	}
}
printf("%.3f",sum); 

return 0;

}

(5)本题PTA提交列表

(四)博客互评
1.http://www.cnblogs.com/abc15369938639/p/7810952.html
2.http://www.cnblogs.com/8426224ll/p/7813670.html
3.http://www.cnblogs.com/liukaixuan/p/7812027.html

posted @ 2017-11-11 00:19  Religious  阅读(216)  评论(2编辑  收藏  举报