devil0 发表于 2023-10-14 11:59:32

学了四年算法,码了五万行代码,但是大一期末C语言模拟及不了格怎么办?

http://pic1.zhimg.com/v2-de8edb8ea97ddca11b51071f5cf1ae54_r.jpg

谁给的我自信

http://pic4.zhimg.com/v2-f6405a4b34c4137c60955e3a9f1b555f_r.jpg

伤心试题

山东大牛 发表于 2023-10-14 12:00:16

如果你问的是学了四年算法,C语言100分考不到90分以上,我觉得这问题还没那么离谱,但你说不能及格这就离谱,你说的及格真的是60分的意思吗?
考试不及格那是啥意思?是对这门课的理解有严重缺陷,或者平时根本就没学习过才会产生的。
所以我的疑问是:C语言课本你到底有没有认真读过哪怕一遍呢?就算做错这一道宏定义题,也不至于不及格吧?
你不会是被某些人忽悠瘸了,认为C语言跟C++是同一种语言吧?
任何一个有多年编程经验的程序员,学习一门新语言只要看一遍书,都不会考不及格的。虽然未必能得高分。但只求及格,能是问题?
如果你的目标是及格,我的建议只有你花一天时间好好把课本看一遍。

linjcong 发表于 2023-10-14 12:00:55

竞赛生就是会遇到这种问题:总感觉自己语言课、数据结构课、算法课可以水过去,毕竟已经学了这么多年算法和数据结构了,但是课上总是又会教一些自己不知道的东西…
这个时候就会陷入一种很尴尬的地步,一方面觉得自己很强(我都能写主席树了,我同学还在学数组);另一方面又会被课上一些简单但是搞竞赛时没见过的知识点打脸。(啊?原来new出来的内存需要delete?[狗头])
怎么办呢?
虚心学习!!!
简单不代表不重要,你搞竞赛没见过操作并不代表真实场景中用不到。竞赛虽然让你领先很多同学一大截,但是虚心学习才是正道。
就比如说这个宏,你就没有搞清宏展开时的规则。你竞赛的时候不会遇到这种问题,因为竞赛时你可以不用宏函数。但这不代表找工作的时候他们不会考你宏,也不代表你以后工作的时候不会真的遇见有关宏的问题。
所以主要就是虚心学习,抽时间看一看老师的PPT:虽然大部分基础都会了,但是还要查缺补漏一下。

ybhl 发表于 2023-10-14 12:01:10

看了很多安慰题主的,我来浇一盆凉水。
你搞竞赛实现算法用的不是C语言,所以你对C语言的特性不了解,这样的话,不是很正常嘛?因为你应该掌握的知识确实没有掌握,别说你竞赛几年,就算你Java水平超过高斯林,你不熟悉C语言是事实,不及格不是理所当然吗?就算柯洁,你让他去下五子棋,他也未必能下好呀。
如果你是因为题偏没拿到高分,吐槽一下完全可以理解。但如果是连及格都做不到,那你的C语言基础绝对是有问题的,即便有些题出的怪,那些题所占的分值必然也是少数,不可能让你连及格线都达不到。
看图片,你之前用的是c++。盲猜一下,你虽然之前用过C语言(也可能只用过c++,毕竟就八个文件,还可能是这学期写的),但没有系统的学习过C语言的特性,你自己都没发现你的C语言知识其实全是窟窿。然后这学期学C语言,你觉得C++你已经会了,C语言不也是差不多嘛,结果课没有认真听,作业也没有认真做,最后模拟考才发现,自己在C语言的各种特性的细节上面,其实还有很多盲区。
说句不太好听的,如果你之前搞算法的时候把链表二叉树搞明白了,用C语言实现一遍,你会学不会C语言的指针?你把各种基础排序算法撸一遍,数组还是问题?图片里面那道题,不外乎就是一个带参宏和一个三目运算符,这些都是C语言里面很基础的东西,真的有那么难吗?
严格来说,虽然所有合法的C语言程序都是合法的c++程序,但是它们有很多地方侧重点也是不一样的,比如,你习惯了cout的简单,就很可能懒得再去研究printf函数的格式控制符了,就算你参加竞赛,估计也未必会抠printf比cout快出来那一点。
现在,你最重要的事情是摆正你的心态,大学之前的那些积累,荣耀也好,黑历史也罢,真的不要太过在意。如果你的那些没有基础的同学知识是100的话,你因为大学之前积累,可能知识量有120,看起来比别人多20%的知识储备很多,但是,你们毕业的时候,人均知识量少说也得有1000以上,你这多出来的20点,真的不够成为你骄傲的资本。
你现在才大一,打好基础很重要,忘掉你之前的那些底子吧,等你学了编译原理、计算机组成原理和操作系统之后,你才会明白,C语言的格式控制符之类的看起来没啥用的东西,为啥要这么设计。
提前给你打个预防针,你学算法的底子,除了数据结构可能还有点用之外,其他课很可能根本用不上,但是他们真的很重要......

gxggxy103 发表于 2023-10-14 12:01:19

答案错了,j未定义,所以过不了编译根本不会输出。建议直接和老师对线(
抖完机灵再说一句,这题还是不错的,我不认为它和那种i+++++i的题是一回事。题目中因为宏直接替换的特性导致的问题确实是初学者容易犯的,称不上是什么奇技淫巧。写算法题只用到了语言的一小部分,对这个不熟悉很正常,真正写大一点的C语言项目基本都要用到宏。
至于说宏是糟糕语法特性的,即使C++也不能完全用其他语法特性替代宏,更别说没有模板的C了。

aspxbs 发表于 2023-10-14 12:01:46

就这个题目而言,基本功稍微有些不扎实。要是说题主能力不够那自然是不公平的,但是这里体现出来的是宏定义和函数定义的概念模糊导致的。
如果M是个函数,那它就会是m,因为书写规范一般规定宏用大写,函数用小写。
宏的根本在于,完全替代。打个比方,有个人叫“张奥斯特洛夫斯基没卡普里奥”,但是太长了领导记不住,就喊“小张”,“小张”就宏定义了后面的一长串。后面凡是提到“小张”,就是“张奥斯特洛夫斯基没卡普里奥”,这时候程序突然写了一条:
请调取“小张”的第二个字;那你答案写“张”就错了,而是要写“奥”,因为宏定义是在预处理阶段就被替换掉的。换句话说,这段代码在预处理阶段就被处理成了:
请调取“张奥斯特洛夫斯基没卡普里奥”的第二个字;对应到这道题
# define M(a,b) (a)>(b)?(a):(b)
int main()
{   
    int i=10,j=15;printf("%d\n", 10*M(i,j));
    return 0;
}预处理结束后就变成了:
int main()
{   
    int i=10,j=15;printf("%d\n", 10*(i)>(j)?(i):(j);
    printf("Hello World");

    return 0;
}答案就选A,10 了。因为10*10,确实比15要大,因此,输出的是i。
可能这些地方自己写代码并不一定会用到,但是这种东西出来,很可能理解错别处借鉴来的代码。
页: [1]
查看完整版本: 学了四年算法,码了五万行代码,但是大一期末C语言模拟及不了格怎么办?