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

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:

原因:for循环中条件连接应该用“;”英文分号

改正:把 for (fahr = lower , fahr <= upper, fahr ++) ;中的逗号改为英文半角的分号

错误信息2:

原因:for语句后面没有花括号,在 for (fahr = lower ;fahr <= upper; fahr ++) ;中最后的分号导致循环无法向下进行,在for循环中是没有最后的分号的

改正:把 for (fahr = lower ;fahr <= upper; fahr ++) ;中最后的分号去掉

错误信息3:

原因:由输入的数据得出结论for循环根本就没有执行根据for语句的语法规定,循环体语句只能是一条语句;所以把celsius = 5 /9 * (fahr - 32.0);
printf("%3.0f %6.1f\n", fahr, celsius); 括起来组合成一个复合语句

改正:

for{celsius = 5 /9 * (fahr - 32.0); 
printf("%3.0f %6.1f\n", fahr, celsius); }

错误信息4:

原因:出现类似结果一般是损失精度,数据类型不正确造成的( double celsius; 定义celsius为double类型的而celsius = 5 /9 * (fahr - 32.0);这样输出celsius是int类型的)

改正:把5或者9改为5.0,或9.0或在5前面加上(double)强制转型

错误信息5:

原因:printf("%3.0f %6.1f\n", fahr, celsius);fahr在前面是被定义为int类型的输出时应该是%d

改正:把printf("%3.0f %6.1f\n", fahr, celsius);改为printf("%3d %6.1lf\n", fahr, celsius);

错误信息6:

原因:根据题目要求 (每次增加2℉)找到for语句出了问题 for (fahr = lower ;fahr <= upper; fahr++) f++相当于fahr=fahr+1所以不符合题目要求

改正:把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; 
}

详细描述程序的执行过程,即说明程序的每一步是执行的哪条代码,执行顺序如何。循环需描述前两次循环和最后一次循环的详细执行过程。最后说明程序实现的功能是什么。

#include <stdio.h>//编译预处理命令 
int main()//1、C程序要去找main()从main函数处开始运行
{    
int i,num,odd,even; //2、定义变量 i,num,odd,even
odd = 0;//3、变量初始化把0分别赋值给odd和even 
even = 0;    
for(i = 1; i <= 10;i++)//4、执行for语句首先对循环变量i赋初值为1然后判断循环变量是否超过循环结束的终点若符合则继续循环执行下面的scanf语句不符合则跳出循环,设置步长表达式每循环一次i+1直到i>10。 
{
    scanf("%d",&num);//5、 在i<=10的情况下输入一个整数赋值给整形变量num 
    if(num % 2 == 0)//6、判断num是否能被2整除也就是判断num是否为偶数 
    {
        even++;//num为偶数even=even+1 
    }
    else//7、num不能被2整除 
    {
        odd++;//odd=odd+1 
    }       
}   
printf("%d %d",even,odd);//8、输出even,odd 
return 0;//9、结束函数调用返回0 
}//10、函数体结束 

前两次循环:i=1,i<=10为真输入5 6 7 8 9 1 2 3 4 11读取num=5执行if语句进行判断不能被2整除为假,执行else语句odd=1,i=2,i<=10为真读取num=6执行if语句进行判断能被2整除为真even=1,
最后一次:读取num=11执行if语句进行判断不能被2整除为假,执行else语句odd=6,i=11执行printf("%d %d",even,odd);语句输出 4 6
功能:判断输入的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; 
}

运行结果:

有区别:

include <stdio.h>

int main()
{    
int i,j,a,b;
i = 2;
j = 2;
a=1+i++;
b=1+ ++j;
printf("i = %d\n",a);
printf("j = %d\n",b);   
return 0; 
}

输出结果

简单来说i++就是在执行语句时先赋值后自增,上面例子i=2,a=1+2=3,然后i=3,而++j 是先自增后赋值,i=i+1=3,b=1+3=4

(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=2,输出 j=2,输出 j=j+1=3

说明了 i++ :先在i所在的表达式中使用i的当前值,后让i加1 ++i :让i先加1,然后在i所在的表达式中使用i的新值

执行完后i=3,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; 
}

运行结果:

由第一个和第二个看出循环体的认定与缩格形式无关,由第二个和第三个得出循环体的认定与{}有关,就第三个而言,printf("\n");只在循环结束后执行了一次,for后面只有一条语句的话可以不加{}但是有多条语句必须加{}使之构成复合句。
所以看循环体就看for后面有没有{}有的话{}里面就是循环体没有的话for下面第一个语句就是循环体。3、 4是正确的缩格形式。

4.对其他你认为需要进行总结的内容进行总结。

1、for语句中是用两个分号分隔三个表达式的但是for的后面没有分号,因为for要和后面的循环体构成完整的语句
2、continue结束本次循环,break结束循环
3、定义变量时一定要初始化分清数据类型像改错题中的声明fahr为int输出时却用%f
4、在一些循环语句中一些句子的位置不对就会导致整个程序的出错
5、在编写一些代码比较长的题时注意{}的格式否则会造成一些语句的混乱情况,书写的格式也很重要
6、在定义一些变量时要适当使用一些有意义的字母单词,以免变量多后出现混乱

(三)实验总结

(1)求奇数分之一序列前N项和

要求: 本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和。
(2)流程图

(3)源代码

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

(4)实验分析

问题:

原因:

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

循环次数出现问题

解决:for(i=1;i<=n;i=i+2)改为for(i=1;i<=2*n;i=i+2)

(5)pta提交列表

(1)奇偶分家

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

(2)流程图

(3)源代码

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

(4)实验分析

问题:

原因:

改正:

把scanf语句放到for循环第一层下面

(5)pta提交列表

(1)统计字符

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

(2)流程图

(3)源代码

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

(4)实验分析

问题:

原因:

逻辑运算符中的双目运算符&& || 所连接的是两个单独句子,所以把fu>='a'&&fu<='z' ,fu>='A'&&fu<='Z'两个句子括起来构成一个复合句再用||连接

改正:将if(fu>='a'&&fu<='z')||(fu>='A'&&fu<='Z')改为if((fu>='a'&&fu<='z')||(fu>='A'&&fu<='Z'))

(5)pta提交列表

(1)求交错序列前N项和

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

(2)流程图

(3)源代码

#include<stdio.h>
#include<math.h>
int main()
{
int i;
double sum,n;
sum=0;
scanf("%lf",&n);
for(i=1;i<=n;i++)
{
	sum=sum+pow(-1,i+1)*(i/(2.0*i-1));
}
printf("%.3f",sum);
}

(4)实验分析

问题:无但是其中有个地方在写流程图的过程中发现了程序的另外一种写法

sum=sum+pow(-1,i+1)(i/(2.0i-1));这个语句中调用了函数,有点复杂在前面可以使用标记变量

#include<stdio.h>
#include<math.h>
int main()
{
int i,flag;
double sum,n;
sum=0;
flag=-1;//定义标记变量 
scanf("%lf",&n);
for(i=1;i<=n;i++)
{
	flag=-1*flag;
	sum=sum+flag*(i/(2.0*i-1));//这样同样能实现正负交替出现的结果 
}
printf("%.3f",sum);
}

(5)pta提交列表

(四)博客互评

姚庆虎:http://www.cnblogs.com/yaole10086/p/7818383.html

浅温:http://www.cnblogs.com/123456lxl/p/7820519.html

赵晓辉:http://www.cnblogs.com/2205747462x/http://www.cnblogs.com/2205747462x/

郭zx:http://www.cnblogs.com/1234569ss/p/7801245.html

posted @ 2017-11-12 18:47  任佳鹏  阅读(344)  评论(2编辑  收藏  举报