第五次C语言作业

(一)改错题
输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉。计算公式如下:
c = 5×(f-32)/9 其中,c表示摄氏温度,f表示华氏温度。
源程序(有错误的程序)

#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语句后的;

错误信息2:
错误原因:for语句中括号里的表达式用了“,”隔离
改正方法:将“,”换成“;”

错误信息3:
错误原因:前面声明变量时fahr为整型,但输出时fahr的格式化输出符号错误,并且celsius的格式化输出格式也有问题
改正方法:将第15行printf("%3.0f %6.1f\n", fahr, celsius); 改成printf("%d %.1f\n",fahr,celsius);

错误信息4:
错误原因:for语句后有多条语句,但是for后未添加“{}”
改正方法:在13行和第16行插入“{}”

错误信息5:
错误原因:原题为每次循环的华氏度的温度增加2,而在错误的源代码中,每次循环中华氏度只增加1
改正方法:将for语句中的“fahr++”改为“fahr += 2

错误信息6:
错误原因:计算公式不对
改正方法:celsius = 5 /9 * (fahr - 32.0)改为celsius = 5 * (fahr - 32.0) / 9

(二)学习总结
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、定义了四个整形变量,即i,num,odd,even,
2、将odd的初始值赋为零
3、将oeven赋初始值赋为零
4、进入for循环,当输入的整形数据数量大于i的时候,跳出for循环语句
5、输入一个整型变量num
6、进入选择语句。判断输入的值能否被2整除
7、若判断结果为真,则执行even加一
8、若判断结果为假,则执行else语句,odd加一
9、回到for循环。判断i是否<=10.条件为真。继续执行for循环,条件为假,跳出循环
10、输出even和odd最后的结果

第一次循环:输入一个整形变量,判断是否能被2整除,判断为真则even加一;否则执行else语句,odd加一,I+1=2,2<10,继续for循环语句。
第二次循环:输入一个整形变量,判断是否能被2整除,判断为真则even加一,,否则执行else语句,odd加一 ,I+1=3,3<10,继续for循环语句。
最后一次循环:输入一个整形变量,判断是否能被2整除,判断为真则even加一,,否则执行else语句,odd加一,I+1=11,11>10,跳出for循环语句。

该程序的功能是输入10个整型数据,由系统判断该数值是奇数还是偶数,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,并且赋初值为2,只是i的增量运算符为后缀型,而j的增量运算符为后缀型。当执行i的增量运算符时,先执行输出语句,再对i执行增量操作层,所以i的值输出为2,即为增量前的值;而执行j的增量运算符时,首先对j执行增量操作,再执行输出命令,因此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 2 之间的差别为缩格的不同,结果上二者完全相同,效果完全相同,因此证明循环体的认定与缩格并没有关系。
2 3之间的差别为括号的不同,结果上二者完全不同,一个为横排,一个为竖排,二者的区别在于大括号括起的位置不同
3 4之间的差别为在于括号的位置不同,结果导致4没有换行
循环体的认定与缩格形式是无关
输出格式与括号的位置与包含关系有关系

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

(3)源代码

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

(4)本题PTA提交列表

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

(3)源代码

# include <stdio.h>
int main()
    {
    	int N,i,m,num1=0,num2=0;
    	scanf("%d",&N);
    	for(i=1;i<=N;i++)
    	{
    		scanf("%d",&m);
    		if(m%2==0)
    		num1++;
    		else
    		num2++;
    	}
    	printf("%d %d\n",num2,num1);
    	return 0;
    }

(4)本题PTA提交列表

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

(3)源代码

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

(4)本题PTA提交列表

7 求交错序列前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 deno=1,fl=1,i,n;
    double sum=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
	{
    sum+=1.0*fl/deno*pow(-1,i%2);
    fl++;
    deno=2*fl-1;
    }
    printf("%.3lf",sum);
    return 0;
}

(4)本题PTA提交列表

(四)博客互评
http://www.cnblogs.com/ying-7/p/7818967.html
http://www.cnblogs.com/english123-/p/7815142.html
http://www.cnblogs.com/XDD--/p/7820467.html

posted @ 2017-11-12 15:06  慕容紫落  阅读(339)  评论(1)    收藏  举报