第五次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:1253601-20171111165528700-193640923.png

错误原因:for语句后多加了;
改正方法:去掉for语句后的;

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

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

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

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

错误信息6:1253601-20171112003241231-481206603.png
错误原因:计算公式不对
改正方法: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; 
}

运行结果
1253601-20171112131938919-312162066.png

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

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

运行结果
1253601-20171112132311841-1202057637.png

此程序首先定义了两个变量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、1253601-20171112133832091-2056818244.png

2、1253601-20171112133841966-545258638.png

3、1253601-20171112133856653-361882273.png

4、1253601-20171112133905450-972771480.png

1 2 之间的差别为缩格的不同,结果上二者完全相同,效果完全相同,因此证明循环体的认定与缩格并没有关系。
2 3之间的差别为括号的不同,结果上二者完全不同,一个为横排,一个为竖排,二者的区别在于大括号括起的位置不同
3 4之间的差别为在于括号的位置不同,结果导致4没有换行
循环体的认定与缩格形式是无关
输出格式与括号的位置与包含关系有关系

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

(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提交列表
1253601-20171112135052497-406731158.png

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

(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提交列表
1253601-20171112142250684-2105973537.png

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

(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提交列表
1253601-20171112145658450-76644994.png

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

(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提交列表
1253601-20171112150510231-444399755.png

(四)博客互评
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

转载于:https://www.cnblogs.com/ziluo/p/7819483.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值