[编程开发] 大一新生,最近在学C语言,非常痛苦,怎么办?

[复制链接]
linjcong 发表于 2023-10-16 17:07:43|来自:中国 | 显示全部楼层 |阅读模式
我们的C语言课一周一次,课下会有编程作业。上课的时候,老师只是念PPT,所以我在实际操作时就会遇到各种各样奇奇怪怪的问题。也不会调试,自己搜了不少教程去看,做的时候却依然不得要领。我经常盯着我的程序看啊看看到大半夜,非常迷茫,也很痛苦,就是那种你实在是想不出任何办法来改善这种困境的痛苦。老师上课完全不讲基础知识,最近几周我逃课去找各种有名气的入门教程来看,像C primer plus,收获很大,但是实际做题时依然很绝望,不明白为什么会错,不明白该怎么构思。做计算机工作的前辈可以帮帮我吗?
全部回复5 显示全部楼层
raybvb09 发表于 2023-10-16 17:08:02|来自:中国 | 显示全部楼层
市面上有很多书。网上也有很多视频。但是唯独教如何调试的,很少很少。
原因我觉得其实也很简单。做对一件事情的方法或者流程可能只有几种,一个例程就能说明;但是做错的方法几乎是无穷的,写多少本书都不可能覆盖完整。
所以并没有什么捷径。唯一的方法就是自己多练习,多扩充知识面,尤其是关于计算机体系结构方面,工作原理方面的知识。不学习这些,仅仅是对着语言啃的话,出现这种情况非常正常。
yoki1366 发表于 2023-10-16 17:08:09|来自:中国 | 显示全部楼层
题主跟我当年一模一样!!都是这么过来的!
但是其它一大堆答主在那推荐一堆的 C 语言书,我只能说看书基本没用!
学习编程就是学一项技能,就像让你一直看科目一各种选择题,你能学会开车吗?
想学会开车,还是得自己上手去,知道如何启动、离合、刹车、油门怎么配合。
编程也是这样的!
初学者不要上来就去抱着书啃!!
初学者不要上来就去抱着书啃!!!!
初学者不要上来就去抱着书啃!!!!!!
借着这个机会,我也分享一下自己「系统学习C语言的路线」吧
首先,分享一份大学期间自己整理的电子书库,绝不是在网上那种打包下载的,而是自己需要学到某个方向知识的时候,去网上挨个找的,最后汇总而成。
汇集了编程语言(Java、C++、C、Python等等)、操作系统、计算机网络、系统架构、设计模式、程序员数学、测试、中间件 、前端开发、后台开发、网络编程、Linux使用及内核、数据库、Redis....等主流的编程学习书籍。
我整理的这些书大家可以在这里获取,对于学习计算机的同学帮助非常大,且十分系统
书单:书单推荐,少即是多(含下载方式)
第一阶段:初学少看书,多看视频

这真的是血泪教训,我大一会傻乎乎的去把课本看一遍,然后做课本后面编程练习题。
学得那叫一个艰难呀,大家都知道,课本为了保留其严谨性和全面性,往往都具有一个特点,那就是「不说人话」。

对于 C 语言,初学者有一个难点需要克服,就是容易遇到各种编译、链接错误,而且不知道怎么解决:




比如这种很初级的报错,但是初学者往往看到就慌了。
遇到这种情况,我的建议是仔细读报错的提示,解决方法往往就在这些 note 中,如果实在解决不了,就复制 note 去 Google 上搜。

这个阶段你需要三份资料:

  • 一是补 CS 基础概念,也就是计算机导论
  • 二是一本 C 语言的好书。
  • 三是一个优质的 C 语言视频
对于每一点,我都只推荐一份我觉得最合适的,避免你陷入选择困难症:

  • 计算机导论

CS 50,这是哈佛的一门计算机入门神课,忘了是在大一下还是大二看的了,当时觉得如获至宝。 链接如下:
https://cs50.harvard.edu/college/2021/spring
让我现在还记忆尤新的一个点,是这个老师讲到 binary search 的时候,直接举了查字典这个过程,然后现场手撕字典。。。




另外,这门课是用 C 语言作为教学语言的,非常难得。
因为现在国外很多 CS 名校的导论课都会采用类似 Python、Schema 这样的语言。
但其实你会发现,在 CS 50,不会讲多少 C 语言的语法,C 语言只是作为一种传递编程思想、引领你入门计算机的媒介。
而不是在教 C 语言。

  • C 语言视频
不多说了,推荐一个我以前在地铁都在刷的,浙大翁凯老师教授的,直接去中国大学 MOOC 搜索即可,这是链接:
https://www.icourse163.org/course/ZJU-199001
说到这,我不得不多说两句翁凯老师了,我看了好几门他的课,最直观的感受是:
讲解透彻、声音好听,而且特别注重细节,贴一张浙大匿名教室系统关于翁凯老师的评价吧:




一句话,翁凯老师是真的想把计算机内部原理、编程语言以深入浅出的方式教给大家。

  • C语言书
《C程序设计语言》,一本被称作 C 语言圣经的书。
在短小的篇幅中,涵盖了 <stdio.h>、<string.h> 中的大部分例子,习题也都是经典,从 hello world 开始,到二分查找、二叉树、快排、哈希表等,甚至还用递归下降写了词法分析,帮你理解复杂的声明。
不过要看懂里面的每一个例子,也是有一定难度的,需要有一点点基础,但是不妨碍作为入门书,可以多看几遍。
对了,一直说学编程要多写,但是很多初学者也不知道写什么。
在这里,我给出一些学完 C 语言基本语法后,可以练手的例子:

  • 链表
就用 C 语言把链表翻来覆去的写,从最基本的链表插入、删除、单向、双向、环装链表。
到链表反转、合并、分割等。
别看基础,但是很多同学到大四了,可能都写不对,这里考察是否足够细心、逻辑是否缜密。
会不会操作着就把链给断了。

  • 写点小东西
比如图书管理系统、俄罗斯方块、贪吃蛇之类。

这种代码量大多在 500 - 1000,会综合运用函数、文件操作、动态内存、指针这些关键的东西。

第二阶段:搞懂内存,看书、写代码





这个阶段,是需要掌握一些计算机系统知识才能学好的,比如虚拟地址就和操作系统相关了,而函数调用栈这些又和汇编相关。
又比如很多学了很久的同学,还不太清楚变量的声明和定义区别,extern 又有什么作用,这些实际上就需要理解内存分区的东西。

C 语言的核心就在于指针、内存,能不能学好、用好 C 语言,更多在于是否拥有扎实的计算机结构、存储、运算原理方面的知识。
所以强烈建议在学习 C 语言的同时去了解一下补码、数的二进制表示、内存、汇编等知识,尤其是内存和汇编,这两个对于深刻理解指针和熟练运用有很大的帮助。
我就不仔细介绍了,要介绍的书都在这张思维导图里了。


  • 深入学习指针
《C和指针》、《深入理解C指针》,真的是涉及指针方方面面的好书,墙裂推荐。

  • 编译、链接
这俩兄弟懂了其实也不能帮你提高写代码的水平,主要是对于一些编译、链接过程的报错,更加的明确,不至于懵。
比如链接过程中常见的错误是符号未找到(undefined reference)和符号重定义(redefinition)
当你熟悉链接过程,符号查找过程之后,解决对应的报错也会得心应手。


  • 汇编
C 语言之下就是汇编,会汇编,你就能直接把 C 语言衣服扒掉,看看背后的实现,比如大家都在讨论数组和指针有什么区别?
你去写个程序,然后 gcc -S 一下,看下汇编代码,你就会发现没啥区别。。。
汇编不需要会写,会看懂部分记得,大可不必去刻意的记住各种指令、寻址方式。


<hr/>

好了,今天的 C 语言学习之路就到这里了,其实还有很多东西没提,比如 Linux C方向的,主要是为了突出学习 C 语言本身,不想喧宾夺主,让大家迷失了方向。

另外,我推荐的这些书籍,我也都汇总了:



这一套学完,C 语言基本问题不大。
有需要的可以看看:书单:书单推荐,少即是多(含下载方式)
axwww 发表于 2023-10-16 17:08:53|来自:中国 | 显示全部楼层
不知道题主的学校有没有C语言的练习系统。就是有相应的编程题,如果没有推荐PTA练习系统。
https://pintia.cn
第二拥有一本简洁易懂的教材。个人推荐C Primer Plus.
第三C语言重点在于多练,但是多练的基础是你懂得所有的原理和方法,所以要多思考,比如可以一个题目用多种代码写出来。
第四我推荐免费的mooc课程:国家精品课浙大翁恺《C语言程序设计》
第五(这是后话):学好数据结构
第六:一定要考一个PAT等级证书 真的很管用!在任何方面!
翁恺老师真的是我男神啊啊啊啊 讲课风格真的爱了
我的C语言启蒙就原始于他 @翁恺 @陈越姥姥
很通俗易懂、事无巨细
希望我的偶像陈越姥姥和翁恺男神可以给我点赞。 @陈越姥姥
希望题主能够掌握C语言
一定要自己多敲!
qkw6358 发表于 2023-10-16 17:09:31|来自:中国 | 显示全部楼层
我来回答一些题主吧,题主你说你觉得学C语言学的很痛苦,我觉得应该是你没有融入进去,可能因为你们老师的影响,他没有很好的帮你打开编程之门。
  本人大一的时候也和你一样经历了类似的困惑,感觉老师讲的一般,都是传术,而不是传道,只是简单的介绍语法定义,而并没有从设计语言的角度去讲解,当时上课也是一度很迷茫。
  后来朋友给我推荐了网课,浙大翁恺老师讲的,当时听着个课真的是耳目一新的感觉,翁恺老师思路清晰,循循善诱,很多的知识点在之前的小例子里已经埋下伏笔,不知不觉发现自己接受新知识的速度也变快了,个人感觉翁恺老师讲的角度是占在一定高度去看待C的,从设计语言的角度是讲C的,而并不是在某些细节做过多的讨论,这种思路很适合初学者,一直听翁恺老师的课听到指针,发现有点难懂了。
  然后又看了看西工大姜学峰老师的视频,这个老师讲的很深,有很多超前的知识,你会一下子感觉对问题的理解有了深刻的认识,比如函数是怎么调用的,函数在调用的时候,函数栈帧是怎么变化的?程序加载到内存里,变成程序映像,过程是怎么样的?不同类型的变量,加不加static,在内存里的位置是不同的,它们都在什么位置?为什么初始化i为char *i=“hello”之后,不能写*i='b' ; ?初始化和赋值有什么不一样?为什么运算符有副作用和值?这些姜学峰老师都会讲,他在讲逻辑运算符&&和||的时候,也讲了布尔代数,在之后学字符串的时候也讲了KMP算法,当然只是大概讲了讲思想,但是很有启发,还讲了些贪心算法,动态规划的小知识,这些如何用C去实现,翁恺老师在讲原码,补码,反码的时候,也讲了这些码制引入的真正含义——解决计算机对负数的处理,让计算机可以以加法的方式去处理减法。这些让我逐渐感觉到编程的乐趣,和C语言的魅力,这两个老师讲的深度已经远远超过我们学校的要求水平了,但是我依旧学的不亦乐乎,像一个第一次看见海的孩子,开心的捡起海边的珍珠,不肯撒手。
  之后又看了哈工大苏小红老师的C语言课,从她的课里我知道了什么叫“缓冲区溢出”以及“缓冲区溢出攻击”,知道了gets()函数是不安全的(从此再也没用过gets)。
  最后我想说,其实网络上的资源真的很丰富,有很多厉害的老师,对于刚刚接触编程的人来说,选一个好的老师入门,某种程度上真的很重要。其实我还是很感谢各种MOOC的,如果没有它们,我在这种普通大学里拿着还是ANSI C的教材学习二十几年前的技术,MOOC某种程度上确实打开了我的思维。
  我认为好的老师应该是承上启下的,他不仅仅教你目前的知识,还会帮你展望下未来。从这些老师的课上学到的一些东西,帮我打开了视野,比如各种码制的转换,编码的思想,使我对数字电路接受起来变得容易了一些,学习C的时候讲的一些算法思想,比如KMP,这些在数据结构里也会用到,等学习数据结构的时候就不会那么陌生了。所以,我觉得题主你之所以很烦恼,可能是因为你没有找到一个合适的点,然后融进去,我觉得你要是觉得你们老师讲的不好,完全可以自学+MOOC。
  其实我认为悟道比悟术重要的多,理解一种思想,在才是本质,有了这种思想,类比迁移,很多东西接受的都很快。比如C是面向过程的语言,它的这种面向过程的思想,以及之后要学的C++的那种面向对象的思想,这种思想其实才是一种大一统,具体的语言语法,不过是这种思想的具体阐述罢了。一些自己的小建议,希望能帮到你。
server100 发表于 2023-10-16 17:10:24|来自:中国 | 显示全部楼层
跟我当年太像了,怒答!解决办法只有一个,就是亲手码代码。
我特别理解你的心情,当年入门学C,有无数问题。1/3.0,1/3不一样究竟是什么设计?scanf回车会留在缓冲区,gets似乎不会?刷OJ时的噩梦,那么我是不是要总结哪些会留哪些不会?我要从i=0和i=1往后选十个元素,那么循环判断条件各自是什么,是i≤20还是<20?这个结论在for和while 中有没有区别?第9个元素序号却是8,好麻烦啊,为什么数组序号不能从1开始?有些问题,找不到原因,书上一两句话的解释看不懂(实际上以后你会懂,现在不懂没关系)。但是当时我觉得,一定是我概念理解不够透彻!所以我也找了很多知乎推荐的名书,不断钻研概念,看着觉得很有道理(虽然K&R第一页的UNIX下编译C代码我就不知道在干嘛),别人的代码似乎能看懂,然而自己的代码总是有无尽的问题。我从来没觉得有这么难学的东西,就是你理解了,成绩依然很差,有太多细节要考虑,有太多规则要记。最后在苦恼中拿了60分飘过。。。
然后我们小学期有五周的编程实践课,每周两个大题目让你做(顺便吐槽我校编程教学,教的时候根本不管你,然后我还在C语言错综复杂的语法中挣扎的时候,实验就都是递归,各种数据结构,甚至简单算法,平时作业都是ACM    OJ上的题,对比我国外大学的同学,真的很过分。。。)。
我深深感觉到这次再不想办法可能要挂了,很绝望,怒了,于是冲到图书馆随便抓了本C语言的书,是个叫前桥和弥的日本人写的,也不在乎经不经典了,这五周,每晚吃完饭,背上笔记本到当时还没空调的夏夜35度蚊虫乱飞的自习室,七点一坐就到十一点。书上的代码,不管三七二十一,先码到机器里跑一跑再说。
我发现这么做有奇效,于是五周后我这门课拿了满绩,从此打开编程大门,那本书对我而言这也变得像初恋一样。。。
事后总结,编程这东西跟你高考所有课程的学习模式都不一样,编程有太多经验性的东西,这些东西只能通过亲手码代码来获得,你理解能力再好也没用。看别人代码很简单的东西,自己想从无到有写出来却很难,即使一句
#include <stdio.h>,那个#要不要打?那个.h和stdio是什么意思?这整句话的每一个构成都有什么意义?你亲手打和单纯的看代码,思考的信息量完全不同的。但是,你对哪个细节的原理不清楚,并不妨碍你写程序,你会体会到,编程的能力,是用逻辑解决问题的能力,不是记住所有语法细节的能力,后者只是熟练的副产物。
而且你肯定会有这样的感觉,比如想写一个冒泡排序,原理你是懂的,面对空白的文档和闪动的光标却突然无从下手,即使写起来,也感觉万千思维在脑海流窜却无法捕捉到条理。这还是你亲手写过的代码太少,缺少从零架构程序的经验。
千言万语就是,请亲手把代码码出来并且让它能跑!
而且你这情况,请从最基础的部分开始,不要眼高手低。再不济,请把书上那些程序一字字抄上去,抄的时候注意思考。编译运行,可能你抄都会有不少错误,不过这时你大脑就已经在形成模式了,很快你会发现你自己写时会顺畅很多。然后你会对talk is cheap show me the code有醍醐灌顶的理解。学编程,不管怎么样,写起来,请~
btw,人肉debug或者printf大法虽然直接,但真的效率极低。你现在程序简单,开始接触一些调试工具对以后很有好处。

快速回帖

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则