C语言程序设计第三次作业--选择结构(1)
(一)改错题
1、错误信息:
错误原因:
在第九行 y = 1 / x后面无分号直接进行下面的错误。
2、错误信息:
错误原因:
else后面没有括号,要不去掉括号,要不改成else if
3、错误信息:
错误原因:
x为double类型,所以在输入时应该是%lf,同时在后面的x前面没有&
4、错误信息:
错误原因:
在输出后面对应的两个语句没有用逗号隔开同时x y也没有用逗号隔开
5、错误信息:
错误原因:
一个等号是赋值,两个等号才是等号的意思,这里应该表达的是相等的关系。
6、错误信息:
错误原因:
在最后语句输出时应该有一个分号结束该语句,所以应该在这个语句后面加一个分号。
7、错误信息:
错误原因:
发现上面没有相应的if,上去检查后发现if后面多了个分号导致的,应去掉才对。
8、错误信息:
错误原因:
没有程序的错误后开始运行,发现输出不对,经检验在第一次判断后面没有输出内容
9、错误信息:
错误原因:
和输入的格式不同,不用换行,把最后的\n去掉
10、错误信息:
错误原因:
printf应该在大括号里面。
11、错误信息:
错误原因:
在%lf前面不应该加一个等号,去掉才对
12、错误原因:
错误信息:
保留一位小数才对这个,这个前面保留了两位改成.1
最后改到完全正确后结果如下。
经多次检验,改程序正确无误。
(二)学习总结
1、if(a)if(b) x=x+1;else y=y+1;确切含义是·输入a,b都执行x=x+1这条语句,否则执行y=y+1.这个else和就近的配对也就是第二个输入b的这个。因为a,b是并且的关系所以说a,b应该用&&连接代码应改为:
if(c1=='a'&&c1=='b')
{
x=x+1;
}
else
{
y=y+1;
}
2、C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?
不能。
因为在C语言中都是“<”是一个级别的所以是,是依次从左向右进行x大于-10,那么前面的语句是对的,则输出的是1,1一定是小于10的所以是个恒成立的问题。如果x小于等于-10那么输出的是0,0也是一个恒小于10的。综上所述,这条语句不管怎么都是恒成立的无法判断。
正确的表达式为
(x>-10&&x<10)
3、运行程序
(1),输入123a,输出结果为:
最后输入a,没有定义字符型所以系统默认遇到非法字符,则认为输入结束。则会输出以下结果:
因为a,b都为int类型所以输入一个不为数字的字符将无法识别便默认为非法字符,所以会是输入结束。如果想输出a只需给一个字符类型的。
但是如果给出了该程序将无法输出两个数比如:123 123,如果这样输入将会得到上面的结果。
(2)运行程序2 输入程序123 45输出结果为
输入123a结果为
原因分析:
因为scanf()函数的返回值是成功读入数据的个数,如果没有读取任何数据,则返回0。在第一次输入123 45时分别给a,b都赋值了所以读入数据的个数为2,那么n的也就是2.而在第二次123a时,因为a,b都为int类型而a时字符型,所以系统默认为非法类型,直接停止。那么也就是说只有a被赋上了123 b却没有值所以只是成功读入数据为1,那么n的值也就是1了。综上所述得到了以上截图的结果。
(3)一开始自己写的过于复杂,太多步骤,比较繁琐。借鉴了同学的答案,结合了第二题的思想,懂得了变通,问了同学的建议,经过了仔细的修改并验证了多次写出了最终的代码。
经多次检验后的结果发现完全正确
4、对其他内容的总结:
首先我想说的就是懂得变通,就比如第三题的第三问,随题目说的是修改第一题没有说借鉴第二题的内容,可我就不会去思考跟第二题的关系。而是按照死板的方法进行了计算,虽然对了但是是相当的麻烦同时也浪费了不少自己的时间,所以说每道题和每道题都是有联系的,不只是简简单单的做好一个题就OK了而是要把每个题当中我们学到的知识好好运用一环扣一环也就是说的变通的问题。第二,细节是个大问题比如scanf后面的&的遗忘,“:”的遗忘,没有按照老师的要求输出格式的多一个空格少一个空格的问题等等虽然都是一个个微不足道的小事但还是时常得的忘掉,所以说要更加的记忆他们了。第三,在这节课中我们最主要的还是学习了if...else语句的使用方法把握好每一节课的重点,学会该如何使用他们,注意只有if后面可以跟括号并且括号后面还不能有分号等等,要从根本上了解这个语句的使用方法,学会什么时候该用什么时候不该用,什么时候用的方便简单什么时候用的麻烦不使用等。
(三)实验总结
(1)题目
7-2 计算分段函数
(2)流程图
经过多次的更改格式最后得出正确结果,然后再多次测验发现结果正确
(3)源代码
#include<stdio.h>
#include<math.h>
int main (void)
{
double x,y;
scanf("%lf",&x);
if(x>=0){
y=sqrt(x);
printf("f(%.2f) = %.2f",x,y);
}
else{
y=pow((x+1),2)+2*x+1/x;
printf("f(%.2f) = %.2f",x,y);
}
return 0 ;
}
(4)测试数据及结果
多次测验raptor和C++都正确,确保答案正确无误。
(5)实验分析
1、问题:
原因:
在该程序中涉及了数学算法,但是在开头却没有编译数学算法在内,所以改程序错误无法运行。
解决办法:
在第一个include的下一行再输入一个#include<math.h>即可,把该程序赋予给了一个数学算法。
2、问题:
在x<0时有一个(x+1)的平方,忘记了用什么表示。
原因:
下课没有及时复习,没有及时查阅课本书籍来解决问题。
解决办法:
借助了老师做的课件,并且去网上查了相关的内容进行学习。https://wenku.baidu.com/view/bdd3a4fb28ea81c758f57880.html
(1)题目
7-4 算术入门之加减乘除
(2)流程图
多次修改终于完善
(3)源代码
#include<stdio.h>
#include<math.h>
int main (void)
{
int a,b,c,d,e;
double f;
scanf("%d %d",&a,&b);
c=a+b;
d=a-b;
e=a*b;
f=(double)a/b;
if(a%b==0){
printf("%d + %d = %d\n",a,b,c);
printf("%d - %d = %d\n",a,b,d);
printf("%d * %d = %d\n",a,b,e);
printf("%d / %d = %.0f\n",a,b,f);
}
else if(a%b!=0){
printf("%d + %d = %d\n",a,b,c);
printf("%d - %d = %d\n",a,b,d);
printf("%d * %d = %d\n",a,b,e);
printf("%d / %d = %.2f\n",a,b,f);
}
return 0 ;
}
(4)测试数据及结果
在raptor中修改了多次测了多次的数据发现流程准确无误。
在C++中也多次测验发现也没有问题。
(5)实验分析
1、问题
2、原因
没有在输出时让字母输出来对应的变量
3、解决办法
在输出框中要在对应的字母前后加上“+”号并且要用英文半角的双引号括住。
1、问题
在C++对,却在pta上全错。
2、原因
没有看清格式,直接凭自己的直觉敲上去导致运行结果没有问题但是在提交作业是不对。
3、解决办法
将老师在pta中的格式复制粘贴到C++上改相应的字母即可。同时也要注意老师说明的保留几位小数等等一系列细节问题。
(1)题目
7-6 输出三角形面积和周长
(2)流程图
(3)源代码
#include<stdio.h>
#include<math.h>
int main (void)
{
int a,b,c;
double s,area,perimeter;
scanf("%d%d%d",&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a)
{
s=(a+b+c)/2.00;
area=(double)sqrt(s*(s-a)*(s-b)*(s-c));
perimeter=a+b+c;
printf("area = %0.2f; perimeter = %0.2f",area,perimeter);
}
else
{
printf("These sides do not correspond to a valid triangle");
}
return 0 ;
}
(4)测试数据及运行结果
测试了两组一个为三角形,一个不为三角形同时都输出了相应的内容,三角形的输出了对应的面积和周长而不是三角形的则输出了These sides do not correspond to a valid triangle。所以说经过了多次的测量该流程图及结果完全正确。
这两个是C++中运行的结果,同样的也依次输出了相应的内容并且结果完全正确。
(5)实验分析
1、问题
运行出不来正确结果。
2、原因
没有吧s定义成double类型,或者说没有吧s后面的除2写成2.00的形式,导致输出不对。
3、解决办法
把s定义成double类型,并且把2改成2.00的形式,这样出来的才是浮点数,最后的运行的数据结果才正确。
(1)题目
7-8 出租车计价
(2)流程图
(3)源代码
#include<stdio.h>
#include<math.h>
int main (void)
{
int t,g;
double km,yuan;
scanf("%lf %d",&km,&t);
g=t/5*2;
if(km<=3)
{
yuan=10+g;
printf("%.0lf",yuan);
}
if(km>3&&km<=10)
{
yuan=10+(km-3)*2+g;
printf("%.0f",yuan);
}
else if(km>10)
{
yuan=10+14+(km-10)*3+g;
printf("%.0f",yuan);
return 0 ;
}
(4)测试数据及运行结果
第一组数据 2.6 2
第二组数据5.1 4
第三组数据 12.5 9
在这个框图中大致可以分为三部分,第一个是公里数小于三公里,第二个三到十公里,第三个十公里以上,分别带入了不同的三个数三种情况多次测验后发现结果正确,流程图无误。
在代码中也依次进行了三组多次的测验,发现也都完全符合条件,准确无误。
(5)实验分析
1、问题
运行结果不对
2、原因
一直都有一个错误理解加减乘除求余都是一个等级的所以全部都是从左向右的,可事实并不是这样子的这个里面的和数学中的一样先乘除后加减的。
3、解决办法
询问了老师,老师及时的发现了错误对我进行了改正。
(四)PTA提交列表