老师,公告里说了考试时可以打开C语言开发环境,那可以在机考的时候开vscode来编程吗

1,变量未定义就使用,中英文符号混用,单词拼写错误,计算公式书写错误,如乘法表达式2x-1, 次方表达式 2^4。

解决方法:注意c语言语法,使用oj系统的测试用例或本地的编译器对代码进行运行测试,如有编译错误,注意观察错误信息,对错误进行定位。 2 * x - 1, 使用pow(2, 4) (包含头文件math.h)。

2,格式错误,输出格式与题目要求不一致。

解决方法:注意题目的输出格式要求,按要求进行输出,不要多输出或少输出。对于输出一段固定的话,可以直接将输出语句复制到输出语句的代码中。

3,类型使用错误,float double的使用错误。

解决方法:float double为单精度和双精度,精度不同,需要根据题目要求进行选择。

4,多个if条件分支导致可能会出现重复判断。

解决方法:使用if,多个else if条件分支保证只执行一个条件分支。

5,判断条件写为if(a==b==c)以及if(1<=a<=3)。

解决方法:正确书写为if(a==b&&b==c)以及if(a>=1&&a<=3),注意数学表达式和计算机表达式的区别,同理还有相乘时不要忘记*,是a*b,而不是直接写成ab。

6,浮点数判断等于0直接用==。

解决方法:浮点数是近似值,一般用精度判断,取绝对值函数fabs(x)<1e-6,这样就可以近似为0了。

7,定义错误int y(1900<=y&&y<=2500);int a>=1900&&a<=2500;以及赋值语句不能是不等式,例如n<=10000;这些都是不被允许的。

8,==错用为=,&&错用为&,||错用为|,常见书写错误,中英文逗号,分号不分,输入函数scanf里的读取类型写错,忘记&。

9,运行超时,未控制好循环变量,如忘记对循环变量进行操作:忘记i++、i--。以及循环次数问题注意,出现很多多一次或少一次的问题。

解决方法:循环体中注意对循环变量进行修改,注意循环结束条件,可以自己使用一个案例去模拟一下循环过程,看看是否会造成死循环的条件。注意循环的执行次数,可以使用一个例子进行测试,注意循环变量的取值范围。

10,判断一个字符是否在'a'-'z'和'A'-'Z'中,注意'a'-'z'和'A'-'Z'的ASCII码是两段,是不连续的,注意'0'和0的区别。

解决方法:判断字符ch是否在'0'和'9'之间,ch >= '0' && ch <= '9'。

11,错误:int类型越界问题。

解决方法:注意int类型变量的取值范围。

12,二层for循环使用同一个循环变量,导致死循环。

解决方法: 在使用嵌套的for循环的时候注意不要在多层for循环中使用同一个循环变量,每一层循环使用不同的循环变量。

13,定义数组时,例如int a[n]时n是不确定的例如n是接下来要读取的值,这样是错误的。

解决方法:如果事先不知道需要的空间大小,可以通过一些数据结构来实现,比如链表,通过动态分配空间,可以自由添加删除元素。

14,/n错用为/r。

解决方法:多个字符的连续输入的结束是\n。\n是在下一行输入输出\r是擦除本行前面的所有内容,光标回到本行第一字符开始输出。

15,函数缺少函数头,函数头书写错误:如缺少返回值、末尾有多余的分号,函数体中缺少return语句(对于返回值不为void类型的函数,return语句不可缺少)

解决方法:函数定义为:

// 返回类型 函数名 (参数列表)

return_type function_name( parameter list )

{

    body of the function // 函数体

return variable; // variable的类型为 return_type

}

函数声明为: return_type function_name(parameter list)。

 
    在这次编程作业中,出现比较多的错误是编译错误和逻辑错误,对于编译错误,请同学们在提交代码之前,使用测试用例先进行测试,或者使用本地编译器进行测试,能够发现相应的编译错误,对于逻辑错误,可以尽可能多地设计测试用例,进行测试。
 
6-1
编译错误:
  1. y=2x-1,在c语言中应该写成y=2*x-1
  2. 变量未定义就使用
  3. 1<= x <= 10,正确写法为 x >= 1 && x <= 10
  4. 函数缺少函数头,缺少返回类型,注意函数的语法

 

逻辑错误 :
  1. if else if else 多分支条件表达式书写错误
  2. 函数没有返回语句
  3. == 与 =误用,赋值运算符与比较运算符使用错误
  4. 函数原型书写错误,函数声明书写错误
  5. 多分支中的执行语句书写错误,导致最后的答案错误
格式错误:
  1. 所需提交的代码只需包括函数代码,无需其他的比如main函数。

这个题最多的错误是编译错误 ,其次是逻辑错误。

 

6-2

编译错误

  1. 函数头缺少返回值,函数头书写错误。
  2. break拼写错误。

逻辑错误

  1. 判断是否是闰年代码逻辑错误,注意运算符的优先级,不确定优先级可以使用括号来提高运算优先级。
  2. 逻辑错误,闰年是指(年份能够被4整除并且不能被100整除)或者 (年份能够被400整除)。
  3. 闰年2月是29天,平年为28天。

这个题出现的问题主要是判断闰年的逻辑代码错误。

 

6-3

编译错误:

  1. 函数名书写错误,导致函数只有声明,而找不到定义
  2. 书写函数时,在函数头后多加了分号
  3. 函数末尾缺少return语句
  4. scanf 拼写错误

逻辑错误

  1. 运行超时:表达式书写错误导致死循环
  2. 变量定义后未初始化就使用
  3. 变量未定义就使用
  4. 逻辑错误,if else的逻辑错误
  5. 类型错误,使用int类型来存储long long可能会导致溢出

 

6-4

编译错误:

  1. 变量重定义
  2. for语句语法错误
  3. 变量未定义就使用

逻辑错误:

  1. 循环变量未更改导致程序陷入死循环
  2. 循环条件编写错误

这个题目使用数组的同学试试不用数组如何解答这个问题。

 

6-5

部分错误:使用do while循环时没有考虑到指数为0的情况,因为do while循环一定会执行一次导致失去指数为0的值。

 

逻辑错误:多算了一次次方,导致结果错误。

 

逻辑错误:次方计算错误,x=x*x的循环是错误的,而是result=result*x;以及不用考虑指数为负数的情况,题目中的前提条件已经是非负整数。

 

编译错误:函数的返回值应该在循环终止之后,而不是在循环里面,这会每循环一次就要返回一次,导致编译错误。

 
6-6

逻辑错误:这道题主要注意的就是一个三角形从大范围到小范围。首先是判断能不能构成三角形,如果能,按照不规则,直角,等腰,等边三角形来判断。其实是在能构成三角形的时候,按照等边,等腰,直角,不规则三角形来判断。根据题目的要求是输出最小的范围。比如,如果是一个等腰直角三角形,应该输出的是等腰三角形,而不是直角三角形。但因为题目要求输入的是三个整数,所以其实不可能有这种情况。只是在判断的过程中先从最小的范围来判断。

 

逻辑错误:如果在判断是不是等腰三角形时的判断条件时(a==b||b==c||a==c)这样就会把等边三角形也输出成等腰三角形。

 

逻辑错误:缺少直角三角形的判断。

 

编译错误:判断等边三角形的条件时 (a==b==c)这样书写错误,应该是(a==b&&b==c)。

 

编译错误:==写成=。

 

编译错误:保证一个函数的返回值只有一个,有的同学在判断时多个if而没有用if多个else if导致函数会重复输出返回值。

 
6-7

运行超时:

  和之前一道判断是不是素数的题目类似,在求数的因子时,不能用1到其本身循环,否则会超时,要用1到其开根号,可以用求根号函数sqrt(n)。很多同学时循环到1到n/2,也是可以的。在使用1到sqrt(n)时,注意一个数i如果n%i==0成立,要把i和n/i都加入进去,所有满足的i和n/i都加入进去求和判断和n是否相等。

 

答案错误:

  注意打印完全数的所有因子时的最后一个因子时的格式。以及输出的时候是从小到大输出。

 

函数定义如下:

// 返回类型 函数名 (参数列表)
return_type function_name( parameter list )
{
    body of the function // 函数体
}

 

函数声明如下:

return_type function_name(parameter list);

What about

\((3.14)_{10} = (???.???????)_2\)

 

通过对大家第六次编程作业的查看情况,做出下面的总结。因为第六次作业只有五道题,而且题目也比较简单,大家的错误出现的比较少,很多都是一些部分错误,就是题目没有考虑完全,遗漏了一种情况,希望大家在之后的编程中要注意细节,考虑完整。下面是具体的题目出现的错误。

7-31

逻辑错误:遗漏了n本身的情况,进行i++的循环条件不是i>n,应该是i>=n

还有的根本没有考虑到求出来的值要满足大于等于n;

很多的错误都是没有看清楚题目,输入的是一个数n(0<n<10000),输出的是一个大于等于n且满足要求的最小值,这个值i不一定也非要满足(0<i<10000)的;

pta作业情况

第一次作业  
2021213188 0
2021213223 0
 
2021213181 0
2021213182 0
2021213234 0
2021213184 缺考
2021213199 缺考
 
2021213232 0
2021213234 0
2021213178 缺考
2021213181 缺考
2021213184 缺考
2021213199 缺考
2021213211 缺考
 
2021213152 0
2021213172 0
2021213181 0
2021213188 0
2021213204 0
2021213211 0
2021213224 0
2021213149 20
 
2021213211 0
2021213152 缺考
2021213172 缺考
2021213177 缺考
2021213178 缺考
2021213181 缺考
2021213182 缺考
2021213184 缺考
2021213199 缺考
2021213204 缺考
2021213234 缺考
 
2021213231 0
2021213158 0
2021213162 0
2021213164 0
2021213171 0
2021213178 0
2021213204 0
2021213212 0
2021213236 80
2021213151 缺考
2021213152 缺考
2021213166 缺考
2021213168 缺考
2021213172 缺考
2021213177 缺考
2021213181 缺考
2021213182 缺考
2021213184 缺考
2021213199 缺考
2021213202 缺考
2021213205 缺考
2021213206 缺考
2021213211 缺考
2021213219 缺考
2021213224 缺考
2021213227 缺考
2021213232 缺考
2021213234 缺考
 
2021213158 0
2021213171 0
2021213172 0
2021213180 0
2021213201 0
2021213220 0
2021213223 0
2021213226 0
2021213236 0
2021213149 缺考
2021213151 缺考
2021213152 缺考
2021213162 缺考
2021213163 缺考
2021213164 缺考
2021213166 缺考
2021213168 缺考
2021213175 缺考
2021213177 缺考
2021213178 缺考
2021213181 缺考
2021213182 缺考
2021213184 缺考
2021213199 缺考
2021213202 缺考
2021213204 缺考
2021213205 缺考
2021213206 缺考
2021213211 缺考
2021213212 缺考
2021213219 缺考
2021213224 缺考
2021213227 缺考
2021213230 缺考
2021213232 缺考
2021213234 缺考
2021213231 缺考

10月31日答疑

如何写表达式

how to write expression

// 3种逻辑表达式
// && || !
A && B   A || B  !A
   
B第二 || A第三 == true  B第二 && A第三 == false
B第二 || E第四 == true  B第二 && E第四 == false
C第一 || D第二 == true  C第一 && D第二 == false
C第五 || D第三 == true  C第五 && D第三 == false
E第四 || A第一 == true  E第四 && A第一 == false

A第三  E第四   C第五    D第二  B第一

11.7号答疑

C语言中的一些反智设计

反智,是指与我们日常学到的知识有冲突的处理方式,C语言这样设计的原因是节省代码容量

 

i++和++i

  • 对于普通的独立语句;i++和++i的效果是一样的,结果也一样

    i++; 等效于i = i + 1;

    ++i;等效于i = i + 1;

    int i = 0;
    i++;
    printf("%d\n", i); // i的值变为原来加1

    i = 0;
    ++i;
    printf("%d\n", i); // i的值变为原来加1
  • 对于赋值语句i++先执行赋值操作,然后i的值变为原来的加1,而++i是i的值先变为原来的值加1,然后执行赋值操作

C语言中的一些反智设计

所谓反智,是指与我们日常习得的知识有冲突的处理方式。C语言这么设计根本的理由是节省代码的容量!

  • 递增、递减:i++, ++i, i--, --i
    • i = i++ + ++i - --i - i--
    • 请问 i=?
    • 副作用导致算术运算的结合律不成立!
    • Evaluation Order
  • 加上:i+=e
  • 赋值与相等:v=e vs. a==b
  • 赋值语句表达式:(v = e)
    • ((v = e)==b)是什么意思?
  • 逗号表达式:e1, e2;
  • 条件表达式:a>b?a:b
  • 还有啥?
  • ...

 如何写出等价的表达式?

TIPS:

  • 避免不同类型的表达式嵌套!
  • 禁止有副作用的表达式嵌套使用!

DEGUB

CS50IDE平台、VSCode

  • 1,利用printf
  • 2,利用平台提供的功能

 

 

     在第五次编程作业中发现同学们最多的错误是输出格式问题,请同学们注意,下面对各个题的情况进行总结。

7-24

格式错误输出多了多余的空格,输出格式不对,比如题目要求空格分隔开数字,结果有同学用\t分隔。

输入格式错误输入long类型使用scanf("%d",n),应该使用scanf("%ld", n)。

逻辑错误在本题中有同学逻辑错误,体现为循环条件错误,导致如:1001只会输出11,跳过中间的0;循环条件未控制好,导致运行超时(死循环);题目要求顺序输出数字的各个位,通过对10求余,并且将数更新为这个数除以10,得到的为逆序输出的结果,题目要求的顺序,请注意审题这个题目有同学直接将输入以字符的格式来进行读入,然后用字符数组存储,然后进行输出操作,使用这种做法的同学希望也思考一下读入一个数字的情况。

编译错误语法错误,请同学们注意语法错误问题,这个问题希望可以在提交前使用本地编译器进行检查并改正,或者使用oj网站的测试用例来进行错误的发现。

 

7-25

输出格式错误请同学们仔细查看题目的输出格式要求,注意输出格式这个问题

逻辑错误循环条件编写错误,判断特殊情况的判断条件书写错误。题目要求将数字逆序,有同学直接将数字顺序输出,与题目不符,导致错误。

逻辑错误这道题要考虑特殊情况,应该使用if else双分支结构,有同学使用if单分支结构导致错误;if else结构使用不当,输出语句位置放置不当,printf函数使用错误,printf输出变量的值不需要取地址符号 &(注意不要和scanf的用法混淆),int越界问题

编译错误书写代码时,中英符号混用,语法错误。

 

7-26

逻辑错误:循环条件编写错误,循环条件书写错误导致循环进入死循环; if语句条件书写错误导致考虑情况不周全;循环遍历时,循环遍历每一个数时,计算这个数的各个数位的平方之和时,忘记将求和变量sum清0;内外层循环对同一循环变量进行操作导致循环陷入死循环或答案错误;输出顺序错误,题目要求从小到大输出;条件判断语句错写为赋值语句(注意==与=的区别); 循环范围书写错误导致遗漏情况

编译错误:变量未定义就使用;中英文符号混合使用

段错误数组元素访问越界,在c语言中对数组的中元素的访问要特别注意越界问题。

 

7-27

逻辑错误%错写为/,最后应该是平方数对一个10的次方数求余;

部分错误很多错误都是用平方数来直接对10求余,用得出的值来和原数进行比较,这样只能是部分正确。首先要确定的是原数的位数i,然后用平方数对10^i次方求余,然后再比较;

逻辑错误判断位数的循环条件写错;

编译错误字符未定义就使用

 

7-28

部分错误循环条件应该是<=,而不是<,缺失了一种全是一种动物的情况;

答案错误鸡、兔、蜻蜓的数量再循环中应该是从零开始逐渐加一,而不是逐渐减小的循环;

条件错误在判断是否符合鸡、兔、蜻蜓的数量的条件是脚的数量满足并且头的数量满足,缺一不可;

编译错误乘法是*,不可以省略,例如2*a,不能写出2a,不能是数学里的写法;

编译错误括号不匹配,多出了一边括号;

 

7-29

部分错误条件语句中判断的条件是<=的时候写出<,导致缺失一种情况;也不能直接写出==,因为做两道题,三道题,四道题的人数加起来可以小于总人数,剩下的人都是只做出一道题的;

运行超时因为这道题只要求出做两道,三道,四道的人数,所以只需要三重循环,而从做一道的人数开始用四重循环虽然最后也能求出来,但是会导致运行超时无法通过;

这道题的思路其实和鸡兔蜻蜓那道题一样,都是一个遍历,只是判断条件的改变;

    练习五的前4个题都涉及的操作是将一个数的数位分离开,这个操作可以通过如下代码来比较简洁的实现。

    digit

    最后两个题目使用的是枚举算法,也就是枚举每一种可能的情况,对该情况进行判断。