第三次编程作业总结

    在这次作业中同学们犯的比较多的错误是逻辑错误,主要是在程序编写的过程中存在的流程错误,考虑问题时没有注意到特殊情况的处理。还存在着一些语法错误,导致程序出现编译错误。

    通过这次作业,对同学们提出两个十分必要的建议。一是编写代码时,希望同学们养成良好的代码风格,包括编写代码注释、代码块中的缩进、变量命名最好有意义、空行等来提高代码的可读性。有良好的代码风格,对于代码的调试、编写大型程序都是极其重要的,代码注释可以显著提高改bug和读程序的效率。二是,希望同学们在提交代码时,可以自定义一些测试用例,先在online judge上的测试区先对自己编写的代码进行测试,测试发现程序错误则对程序进行修改,直到测试时能通过自定义的测试用例再进行提交,如下图所示

image.png

选取了一些有良好编程风格的代码和一些编程风格不好的代码进行对比,请同学们注意好自己的代码格式。左边同学写了注释,并且注意了代码块中代码的缩进,空行的使用增加了代码的可读性。

 

 image 1.pngimage 2.png

下面对于各个题目中的问题做一个总结,请同学们自查。

 

7-14
 

段错误:错误写法scanf("%d",n),忘记取地址符。正确写法scanf("%d",&n)

编译错误: 错误写法2b-1,运算符不可少,正确写法2*b-1, 缺少相应的头文件#include<stdio.h>

格式错误,该题中有同学打印输出了多余的空格,被系统判为格式错误。在oj中不要输出多余的提示语句 如:printf("xxxx"),要按照题目的格式来编写程序,不要有多余的输出。以下这段代码输出了多余的空格,所以oj系统判定为错误。

image 3.png

运行超时:循环结束条件未设置正确,导致死循环。

逻辑错误:数组下标从0开始,[0,n), [1,n]存在n个元素 题目要求的n是不固定的,注意审题,一些同学把n固定为了5来进行程序的编写。特别要注意循环的边界,防止多循环一次或少循环一次。

 

7-12

逻辑错误:当y==0时候,x的y次幂为1,x == 0 时候, x的y次幂为,0这点很多同学未考虑,所以得80分, 变量未初始化就用于计算

逻辑错误: 运行超时,未考虑y为0的情况,导致死循环在编写循环时,要特别注意是否会死循环。

编译错误:输出格式错误,int型输出应该为 printf("%d",num); 而不是printf("%d",&c),注意不要把printf和scanf函数的用法搞混淆。

不要使用#include<cmath>,这是c++的头文件格式,c语言的头文件格式#include<math.h>

逻辑错误: if else 之后的语句,不管if else是否得到执行,都会被执行。

编译错误:语句缺少; if缺少括号 运算符书写错误等

 

7-15

格式错误: printf("%lld",d); d为long long 类型 ,输出格式错误

逻辑错误: if else 输出语句的位置 应该放在if else的{}内部,题目要求的是前n项和,给出的公式是An 不是Sn ,注意审题。

运行超时: 未控制好循环的结束条件,导致死循环

编译错误: 存在语法错误,变量未定义就使用,缺少结尾的分号,中英文分号混用

 

7-16

格式错误,用来存储百分比得数应该是float类型或者double类型,因为要保留两位小数,而不是int类型,读每一个数用的也是scanf,int型而不能用getchar(),char型可以使用getchar()函数

编译错误,==错用为=,除法/错用为\

格式错误,在用float型时输入两位小数应该是%.2f,double类型是%.2lf

这道题应该用的是while循环,循环条件是读取得数不为0,用设置一个大数来进行for循环虽然最后系统在判断时可能因为你设置得数比较大能过,但这种做法还是不可取对每一个读进来的数应该是先判断是不是0再进行操作,而不是先操作再判断是不是0

 

7-17

格式错误,在判断一个价格的区间时,不能只判断一边的大于等于情况,还要判断另一边的小于情况来确定价格减去多少钱,而且应该使用&&,而不是||

逻辑错误,忘记考虑到价格大于等于500的情况和小于100的情况

逻辑错误,在判断一行的价格之后对下一行价格重新计算总和时忘记对这个价格归零

这道题的逻辑其实是两个for循环结构,要注意两个for循环的缩进,两个循环不能使用同一个计数的int型;此外的错误点就是保证对所有的价格区间都能判断到,不遗漏

 

7-13

判断不够全面,比如中英文字母的判断是ASCII码'a'-'z'和'A'-'Z'两段,中间不是连续的

判断使用的是ASCII码,例如'0'<=c&&c<='9'而不能写成0<=c&&c<=9,这样就是判断ASCII码为0到9之间的字符了

格式错误,不能用int型来试图直接读取一个字符的ASCII码数

在书写代码中,不要使用break、continue、switch、goto

https://onlinegdb.com/2W-xXmnl6R

老师您能帮忙看看差十分差在哪里了么?

谢谢

请问一下第4题如何输入不确定个数的若干整数呢?

我是这样写的
scanf("%d", &x);
while (x!=0){
scanf("%d", &x)

 老师想问您一下第六题可以直接使用while((ch=getchar())!='\n')来开启循环么,

还是要用

scanf("%c",&ch)

ch=getchar()

while(ch!='\n')

第一种情况只给了80分

                                                                                

#include<stdio.h>
int main(void)
{
int t=0;
int a=0;
int b=1;
int n=0;
int f=0;
int g;
scanf("%d",&t);
for(a=1;a<=t;a++)
{
g=0;
scanf("%d",&n);
for(b=1;b<=n;b++)
{
scanf("%d",&f);
g+=f;
}
if(g>=100&&g<200)
{
printf("%d\n",g-30);
}
else if("g>=200&&g<300")
{
printf("%d\n",g-70);
}
else if("g>=300&&g<400")
{
printf("%d\n",g-110);
}
else if("g>=400")
{
printf("%d\n",g-160);
}
else
printf("error");
}
return 0;

}

老师好:

   请问能讲解一下题集3第三问的题意吗?我分别用递归和循环写了代码,结果都不能拿满分,不知道问题在哪里。

    更正:经过尝试,题目要求的是A1 + A2 + A3... + An

通过第二次编程作业的结果进行一个总结,包括出现的一些同学们经常犯的错误。

首先是同学们一些经常犯的错误:

①逻辑错误:应该使用 if , else if的分支结构,连续使用if(注意分支结构和连续使用多个if的区别),连续使用多个if if结构会进行多次判断,会造成错误答案。此外if 与 else同时使用,中间不能插入其他代码,else中有多条语句要执行时,用{}括起来。

②&&错用为&,||错用为|,==错用为=,中英文错用。

③运行时错误,输入格式与变量类型不符合。

④编译错误,int后不能直接定义一个范围的值,像是int y(1900<=y && y<=2500);和int a>=1900&&a<=2500;都是不被允许的。

⑤段错误,输入语句中缺少取地址符号&。

⑥此外相比于上一次的作业,这次作业中英文分号括号出现的错误很少,大部分的错误还是在if语句上,要搞懂if语句的逻辑,if和else if是一个分支的结构,举例说明,如果是if,else if,else这三个结构,那么最终只会执行一个的结果,而如果是if,if,else,前两个的if可能最后都会执行。

⑦在写if语句的时候,要注意缩进,保持代码的美观和直观,一眼就可以看到每个条件语句的分支。

最后以下一些具体的题目出现较多的错误:

7-7

逻辑错误,很多犯错的同学都是只简单的考虑了四年一闰的情况没有考虑百年不闰,四百年再闰的情况,还是对于闰年的逻辑判断不够明确,其实可以直接写出if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)这样一个语句就可以直接判断是不是闰年,符合四年一闰,百年不闰,四百年再闰的要求。

7-8

c语言浮点数取绝对值的函数为fabs,abs函数的参数为整型。注意包含相应的头文件,如:#include<math.h>。题目要求用double,使用float 判断浮点数是否为0不能使用==0来判断。做除法,要判断分母是否为0。使用绝对值函数错误,abs(int),fabs(),不能写数学绝对值符号。

7-9

在这道题目中,应该使用 if , else if的分支结构,因为运费只需付一次,连续使用if if (注意分支结构和连续使用多个if的区别),连续使用多个if if结构会进行多次判断,会造成错误答案。20 <= e < 30 编译器只会判断 20 <= e 不会对后面进行判断,存在逻辑错误。 || 与 &&乱用。题目要求的不是运费,而是运费+物品价格。边界判断错误, 注意审题,题目要求是小于等于还是小于。

7-10

变量类型使用不正确,应该使用double类型,使用int类型。变量重定义。sqrt拼写错误。逻辑错误:应该先判断是否能够构成三角形,再计算。必须等到变量输入值后,进行强制类型转换才有效。判断能否构成三角形,两边之和大于第三边,要判断所有的组合情况。要考虑不能构成三角形的情况。输入应该在计算前。多项式相乘在c语言中用*操作符,不可省略操作符,long double 输入为%llf。

7-11

逻辑错误,没有考虑完全情况,很多同学都没有考虑在比分为22的这种情况,常规时间内一队的比分可能为22但另一队的比分一定小于21,否则就是输出error,22也是常规时间内一队能获得的最大比分。

 

    在这次作业中,发现的问题大都是使用c语言的语法错误。下面对于这次编程作业中出现的问题做个总结。

    出现的问题主要有:

    1. 编译错误,表现形式为:在c语言中变量未定义就使用、英文分号和英文括号错用成中文、单词拼写错误,出现的词有float、#include等。

scanf、printf函数调用错误,scanf调用时,需要有取地址符&,例如:int a; scanf("%d", &a),这里的&不可缺少。printf要输出的字符串必须用双引号括起来。缺少分号,分号是c语言中一条语句的结束符,不可缺少。

    2. 格式错误,输出格式要与题目要求的不一致,如:缺少空格、输入输出中缺少逗号、不该有引号的地方使用了引号。导致格式错误的一个原因:很多同学把要求输出的一句话分开两句话输出结果导致少了空格。

    3. 段错误,输出char类型变量要使用%c占位符,%s为字符串的占位符。

    4. 计算错误,对要计算的公式书写错误。

     在此次作业中,很多同学在未改正程序存在的问题的情况下,多次对一个题目进行提交。同学们应该学会查看编译器输出的错误信息,对此进行分析,并进行修改后,确认无语法错误后进行提交。可以在本地编译器中尝试运行自己编写的程序,并进行测试和修改无误后再进行网络上的提交。

     查看错误技巧举例:下面这段代码存在问题,通过查看编译器报错信息,可知return 0后面的分号存在问题,仔细查看可以看出该分号为中文分号。

     捕获.PNG

    在这次作业中,第一题主要出现的问题是格式错误,如:main()函数的使用错误,main()函数有返回值,所以是int main(),而不是void main()。

    第二题中出现的问题主要是输出格式问题,输出与题目要求不一致, 空格换行与要求不一致,输出占位符不正确和段错误。

    第三题中出现的问题:格式错误,不该输出回车(\n)的时候输出回车,变量定义为double型写成float型。

    第四题中题目要求使用double类型,很多同学使用float类型,请同学们注意审题。

    第五题中,存在的问题为scanf输入,scanf输入时要按照括号里格式的原样输入,就是有逗号的时候输入时也要有逗号,没有的时候则不需要。

    希望同学认真分析代码出错的原因,如果有同学对于自己的代码问题有不清楚的地方,欢迎在网站上发帖讨论。希望同学们在做题时,遇到问题可以积极发帖,我们看到后会尽快回复。

What's STEM and what's difference among S, T, E, and M?

Science

Technology