第一次作业

一.题目

分支结构中题目7-9高速公路超速处罚

1.实验代码 

 1 #include<stdio.h>
 2 int main()
 3 {
 4     float speed,limit,t;//定义两个浮点型变量 
 5     scanf("%f %f",&speed,&limit);//分别输入车速及限速 
 6     int x,y;//定义两个整形变量 
 7     t=(limit*1.1);
 8     x=(int)t;//将limit*1.1的值放入x中 
 9     t=(limit*1.5);
10     y=(int)t;//将limit*1.5的值放入y中 
11     if(speed<x){printf("OK"); //判断车速是否超过或达到限速的1.1倍 
12     } //未超速,则输出“OK”
13     else if((speed<y)&&(speed>=x))//判断车速是否超过或达到限速的1.5倍
14     {printf("Exceed %.0f%%. Ticket 200",((speed-limit)/limit)*100);
15     }//车速达到或超出本车道限速的10%则处200元罚款
16     else if(speed>=y)//判断车速是否超过或达到限速的1.5倍
17     {printf("Exceed %.0f%%. License Revoked",((speed-limit)/limit)*100);
18     }//车速达到或超出限速50%,就要吊销驾驶证
19     return 0;
20 }

2.设计思路

(1)

第一步:输入两个float型变量 speed 及 limit 。

第二步:将limit*1.1及limit*1.5的值分别放入整形变量x和整形变量y中

第三步:判断是否speed<x,若是则未超速,输出“OK” printf("OK");若不是进入下一步判断

第四步:判断是否speed>=x 并且 speed <y,若是则输出超速百分比并罚款200元

·printf("Exceed %.0f%%. Ticket 200",((speed-limit)/limit)*100);若不是进入下一步判断

第五步:判断是否speed>y,若是则输出超速百分比并吊销驾照

printf("Exceed %.0f%%. License Revoked",((speed-limit)/limit)*100)

(2)

3.本题调试过程碰到问题及解决办法

问题:当speed=110 , limit=100时,speed<limit*1.1,通过输出 limit*1.1 的值发现当limit=100时 limit*1.1 大于110,导致判断错误。

解决方法:因为speed和limit都是float型变量,浮点数之间不能直接进行比较,所以将limit*1.1及limit*1.5赋给t,使limit*1.1及limit*1.5的值变为int型,再将转化后的值赋给t,再把t赋给x及y,这样就完成了将数值从float型到int型的转化

,接下来通过比较speed和x,y的大小来判断超速的情况及是否处罚,处罚的程度。

循环1中7-3 统计素数并求和

1.实验代码

 1 #include <stdio.h>
 2 #include <math.h>
 3 int main()
 4 {
 5   int t=0;//储存素数的个数 
 6   int i,p;//循环变量 
 7   int sum=0;//素数之和
 8   int m,n;//输入的上下边界 
 9   int e;//中间变量 
10   int c=1;//定义c作为判断是否为素数的条件
11   scanf("%d %d",&m,&n);//输入m,n上下边界
12   if(m>=n){e=m;m=n;n=e;}//将两个数大的赋给n,小的赋给m 
13   for(i=m;i<=n;i++)//从m到n循环寻找素数 
14    {
15        c=0;//若c的值不变,说明i为素数,若变为1,则i不为素数 
16        for(p=2;p<i;p++)//从2到i-1做整除 
17        {
18            if((i%p)==0)//若i能被p整除,说明i不为素数 
19            {
20                c=1;//c的值变为1,代表i不为素数 
21                 
22               }
23        }
24        if(c==0&&i!=1)//若i不能被整除且不为1,c的值不变,说明i为素数 
25        {
26        sum=sum+i;//素数相加 
27        t=t+1;//素数个数加1 
28        }
29   }
30   printf("%d %d\n",t,sum);//输出素数的个数及素数之和 
31   return 0;
32 }

2.设计思路

(1)

第一步:定义m,n两个整形变量储存输入的上下边界。定义整形变量i,p作循环变量,定义整形变量sum储存素数之和,定义整形变量c作为判断是否为素数,定义整形变量e为中间变量,定义整形变量t储存素数的个数。

第二步:输入两个数,将两个数中较大的放入n,较小的放入m。

第三步:设置两层循环,外层循环循环变量为i,i从m循环到n,外层循环语句第一步使c=0。

第四步:进入内层循环,内层循环循环变量为p,p从2循环到i,在内层循环中做判断,若i能被p整除,说明i不为素数,使c=。

第五步:在内层循环结束后,在外层循环中做判断,若c==0并且i!=1,说明i是素数,sum=sum+i;t=t+1,若不是,进入下次循环直至跳出循环

第六步:打印素数的个数及素数之和

(2)

3.本题调试过程碰到问题及解决办法

问题:当m=1时,输出的素数个数总多一个,素数之和比实际值大1。当m!=1时,结果正确。

解决办法:因为在原来的判断条件中并没有排除i==1的情况,所以将i==1也作为素数了,导致素数的个数及素数之和都比实际值大1,所以为了排除1对判断的影响,加入判断条件i!=1,这样就

将判断素数的条件改为“ c==0&&i!=1 ”解决了将1当作是素数处理的情况。

循环2中7-2 水仙花数

1.实验代码

 1 #include <stdio.h>
 2 #include <math.h>
 3 int main(){
 4   long n;// 输入的水仙花数位数
 5   long j,i;//循环变量
 6   long x,z;//上下边界
 7   long sum=0,a=0,t=0,c=0;//中间变量
 8   scanf("%ld",&n);//输入水仙花数的位数 
 9   x=pow(10,n-1);//上边界 
10   z=pow(10,n)-1;// 下边界 
11   for(i=x;i<=z;i++)//从下边界循环到上边界 
12   {
13     a=i;//将i赋给a 
14     sum=0;//每位数的n次幂之和 
15    for(j=1;j<=n;j++)
16   {
17     t=a%10;//取a的个位数 
18     a=a/10;//a整除以10 
19     sum=sum+pow(t,n);//加上这位的n次幂 
20     if(j==n&&sum==i)//判断循环n次后每位数的n次幂之和相加是否等于i 
21     {printf("\n%ld",i);
22     }
23     }
24   }
25   return 0;
26   }

2.设计思路

(1)

第一步:输入水仙花数的位数,求出该位数的最大值和最小值x和z。

第二步:设置两层循环,外层循环循环变量i从x到z,将i的值赋给a,并清零sum(sum表示位数的n次幂之和)。

第三步:内层循环循环变量j从1到n,先将a取余10得到t(t表示末位数),再将a整除以10,sum加上t的n次幂,后进行判断,如果j==n并且sum==i那么打印i。

(2)

3.本题调试过程碰到问题及解决办法

问题:当输入的水仙花位数为6,7时,程序运行超时。

解决办法:int类型的变量范围为-32768~32767,而当输入的水仙花位数大于int的范围时,所得到的水仙花数便超出了int的范围,所以不能输出结果,

而long的范围为-2,147,483,648 ~ 2,147,483,647,所以将所有变量的类型改为long,便能解决该问题

二.总结

1.学习内容:

(1)基本变量类型如int,float,char,以及这些变量的输入输出。printf 及scanf的使用。

(2)分支结构的运用,if else 语句的使用,以及进行多个判断的方法。

(3)循环结构的运用, do while 语句 以及 for 语句的使用,和多重循环的套用。

(4)如何构建函数,并调用函数,以及递归。

2.遇到问题:

(1)对各种变量的了解不够,导致因为变量的问题出现错误,例如第一题出现的两个浮点数之间不能直接比较的问题及第三题出现的变量取值范围的问题。

(2)在编写程序时不能有十分清晰的思路,不够熟练,导致出现各种不必要的代码和逻辑错误,例如第二题出现的没有考虑到1对判断的干扰,导致程序出错。

(3)在编写遇到问题时无从下手,不知道从哪里开始排查问题,并解决问题,遇到一些题目往往将简单的问题复杂化。

3.解决方法:

(1)通过反复课本查询相关知识点,以及上网查找资料,看网课学习更多的知识,知道了浮点数之间不能直接比较及转换不同类型的变量等知识。通过学习这些知识

加强了我对语句变量循环分支结构的理解。

(2)在编写程序时,先想出程序的基本框架和重要的实现功能的语句,再写出程序的详细,例如第二题可以先写出两个循环及素数的判断语句、

取每个位数的语句。之后详细补充程序,并进行修改。

(3)在编写程序前仔细审题,想清程序所要实现的功能。考虑清楚每个需要注意的点,不能想当然,要考虑清楚各种特殊情况,比如说0,1等特殊点,并且要考虑上下代码之间的相影响,

比如变量的值有没有被重复使用了,在第二题中,我就犯过没有重置变量使变量重复使用导致程序错误的情况。 

4.点评

夏雯钰同学的博客

徐凤隆同学的博客

王天奇同学的博客                                                                                                                                                                              

5.表格及折线图

 
周数 代码行数 时间 博客字数 涉及知识点
第9周 700 9 0 分支结构if else语句
第10周 800 10 1500 用is elseif 分支进行多个判断
第11周 900 12 0 循环结构dowhile和for语句
第12周 900 13 0 双重循环
第13周 1000 11 1000 函数,递归
posted @ 2018-11-29 12:49  许振豪  阅读(310)  评论(3编辑  收藏  举报