深入学习C语言的具体步骤
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入学习C语言的具体步骤相关的知识,希望对你有一定的参考价值。
我说明下我自己的情况,我在学校学过一学期C语言一学期C++,学过一学期汇编
语言,对计算机虽然不是很精通但也不是小白。我现在想深入点学习C语言,因为我根据我现在掌握的C语言知识和理解很难做出什么实用性的东西来,顶多也就是能编点小程序处理点数学问题,而且对程序效率的深层优化什么的也是不很明了。
我举例子来说,我个人是比较喜欢这样的学习方法的:就是先确定自己想完成一个什么功能的程序,然后一步步来实现,我以前编过一个贪吃蛇的程序,用了一晚上从准备到出来完整的程序,因为以前我从没编过关于图形界面的程序,所以开始很慢,但是用了一晚上算是实现了。虽然贪吃蛇的大体是实现了,但是程序运行起来并不是那么完美的,比如说在蛇转向的时候总会闪几下,我不知道这是为什么,因为从我的程序看来不应该闪的。我自己考虑可能是由于不了解系统的比较深的原理不能达到很好的显示效果(比如说双缓冲什么的,我听到过这个词但不知道具体什么意思)。还有昨天晚上我给自己定了个目标,就是编一个程序能实现把所有的小于指定数的素数写入一个记事本文件内保存。然后开始上网学习C语言简单的文件操作,最后程序也实现了是个比较简单的程序,虽然运行效率有点低,而且也遇到了一个之前不曾想到的问题。我大体说下。因为程序涉及文件读写操作,我的程序是每测试出一个数是素数就写进文件,然后关闭文件,这样势必运行慢了,因为在程序关闭文件时要把文件缓存的内容写进硬盘,硬盘读写相对慢就耽误程序的运行。于是我就想改进程序,先把素数写进缓存,等写了很多个素数直到缓存满了再写到硬盘。但是实现起来又遇到了问题,我把自己的程序改了下,打开文件不关闭,这样就不会每写一个素数都要写硬盘了,但是我发现只有我要求程序寻找小于5000(具体或许不是这个数,我没测试到底是几)的素数的时候程序运行正常,一旦要求程序运行查找很大的数以下的素数时总是报错,是系统错误。我想综其原因可能就是我对文件操作和系统缓冲的具体细节什么的不清楚。
我想问的是比较深入的学习C语言的步骤,一步步来,我想先确定各项目,比如先实现个什么程序,后实现个什么程序,我好有具体目标一步步来。最好不要只是给我推荐读什么书,因为我放假在家很难静下心来研究一本书的,而且我想如果我真是有心情一本一本书读下来也不用来这里问问题了。我对基本的C的语法什么的都了解了,就是想能深点学习,因为C语言毕竟不是只用来处理几个数学小问题就行了的。连操作系统都能用C写,我不求能到达那种专业的程度,毕竟不是一两天的事。我就是想能一步步更加深的学习C。另外我没专门学习过数据结构和算法,我也不想单独来学,我想在学习C和处理问题的道路上顺便用到后学习。
我想有过C学习经历的人都有经过我这一步的时候吧,有没有过来人讲一下他学习C的经验和根据我的情况给我些建议,我很感激。也不必非得回答我的问题,大家觉得根据我自己说的我的情况给我点具体可行的建议什么的就行了。我领会东西还算不笨,而且对计算机语言方面的学习能力也算比较强。我不是小气只是真的分不多,先谢谢了。还有我留下自己邮箱如果有什么东西或者想进一步交流可以给我发邮件:xuejianbest@hotmail.com
关于我编的程序的源代码没粘到这里,不过我发到了一个C语言论坛,帖子的地址是http://bbs.cyuyan.com.cn/viewthread.php?tid=2264&highlight=
有我的程序修改前后的源码
②、你的目的性较强,但是你也想有更加明确的目标,我可以给你讲一下怎么自己去寻找目标和路线以及怎样学习。
③、计算机专业领域一共有几个大方向,十几个分支方向,而每个分支方向又有几十个小方向,每一个方向的深入学习与熟练到一定火候都不是一朝一夕,互相之间也不是完全没联系的,但是你现在就应该选择一个大方向并在其中的一个小方向内深入(为什么要这么早就选择具体的分支方向?后面说)。
④、这里列出计算机的几个大方向(非编程开发类的我就不说了):
基本方向:
1、单片机、嵌入式方向
2、网络编程:涉及到服务器程序、客户端开发、脚本设计等。
3、系统编程:基础API开发、桌面开发、系统程序开发、服务程序
4、图形学:3D、2D、图像识别、人脸识别
5、音频:语音识别、音频解码、音频软件
6、编译原理:编译器设计、脚本解释器、虚拟机、非自然语言翻译系统
7、应用层开发:利用高层语言去开发表层应用
8、安全:反工程、病毒、反病毒、木马、反木马、软件破解、软件加壳
附加方向:
8、人工智能:遗传算法、神经网络、灰色系统等等
9、游戏设计:各种游戏引擎设计以及业务逻辑设计等
⑤、基本方向是你一定要选的,附加方向只是基于基本方向的一些锦上添花,但是不管你怎么选,最开始某些东西一定要深入而不是只是懂就够(当然你对自己要求似乎不会很低),我把这个列出来:
数据结构:下面其他理论的基础。
操作系统原理:理解操作系统的架构和细节,你才能对以后关于多线程、文件管理、内存管理、指令优先级等有一个正确理解和运用。
编译原理:能够升华你对计算机编程语言的理解,对以后出现的各种编译、解释、兼容、移植、优化、并发与并行算法等有一个深入理解。
数据库系统原理:这个是进入公司都要会的,也是大型软件开发的基础。
软件工程:这个是你能够在经验不足还能保证大项目正常完成的理论基础。
网络技术:这个是必须学的,因为目前几乎没有一款装几率很高的软件或者平台跟网络无关。
数学的话,主要是:离散数学、线性代数、高等数学、计算机图形学、概率论
以上几个基础就是你成为一个融汇各个主要分支牛人必须学的(当然不是指理论,而是理论+实践编码能力)
⑥以上都是大的基础,要一一攻破并深入学习,虽然网络时代计算机专业知识爆炸式的增长,但是以上几个基础掌握后,会发现,以后的什么新的理论和技术都是基于这些大基础,你就很容易理解了。
⑦我为什么开头不讲你要具体学什么怎么顺序学呢?因为那些技术你要掌握的话,根本可以自己解决,但是如果你由于兴趣,沉迷于一些自己可见的小范围技术的话,那么毕业后虽然也能找到不错的工作,薪水也可能高,但是不能成为一个大牛。
现在才开始讲学习顺序,虽然你说不要推荐书,不过我还是要用书来做顺序。
C语言是可以写很多核心和高级的东西,而不只是小东西,但是从你代码来看,居然用到了 goto,我不是说你那些程序用到GOTO有什么不好,而是一定要避免用GOTO,goto是错误之源,如果你有什么内容非要用到goto才能写到,说明你的编码技巧还有不少提高空间。
你的学习顺序应该是:
C:做一个超级马里奥出来,并能够读取文本脚本来更新关卡。
C++:写一个2D图形引擎,封装掉细节,实现面向对象设计和可复用设计,并且用到《设计模式》中提到的一些设计模式,这样才能算对C++有一个很好的掌握。
MFC:MFC技术虽然近期已经冷下来了,但是你能熟练掌握它,才能证明你的C++OO技术够纯熟,严格证明你掌握了MFC很简单,你只要用MFC做出一个杀毒引擎就差不多了。推荐的书有《深入浅出MFC》。
《Windows程序设计》:和MFC不同的是,用的是windows核心SDK,也就是API,这本书学完后,你才能从操作系统层面上算掌握了win32 平台下的机理(其实win64和win32大部分机理类似)。
C#:C#里集合了当代和前沿计算机科学里最先进的一些语法(虽然执行效率一直被人质疑),但是你学完C#并深入后,至少能够算是对计算机语言有一个更加深刻的理解了。如何证明你C#学的不错了?也很简单,再次写一个随便什么游戏,比如俄罗斯方块。如果更加证明自己呢?用它写一个P2P网络对战游戏。
(如果你注意的话,会发现我说的学习顺序都是沿着语言和某些技术的,为什么呢?因为这些语言和技术涉及到特定的领域技术和计算机理论思想,比如【真正】学完了C#的话,就不单指学完了C#,而是把多种语言范式都学习了一遍,以及现代的程序开发思维(因为里面用到了很多让你一劳永逸的技术))
以上5个步骤都是基础大步骤,要解决的话要没1-2年应该不够。
与此同时,要尽快选出文中你感兴趣的方向作为3-5年的长期方向,不要担心过早选择分支方向会有什么损失,因为计算机很多分支是相通的,只有你把分支方向深入进去,才能真正理解很多理论的实践意义。并且一旦你在某个分支领域形成了较强的优势(比如,到公司里只有你这方面最强),那么你就是稀缺人才。
关于大方向的步骤就不说了,你主要就是要把我说的这几个基础步骤先解决,同时平时要注重大方向理论结合实际去编码和开发。 参考技术A 1、入门后多看代码
在有一定基础以后一定要多看别人的代码。 注意代码中的算法和数据结构。 毕竟学C之后的关口就是算法和数据结构。提到数据结构,指针是其中重要的一环,绝大多数的数据结构是建立在指针之上的,如链表、队列、树、图等等,所以只有学好指针才能真正学好C。别的方面也要关注一下,诸如变量的命名、库函数的用法等等。有些库函数是经常用到的。对于这些函数的用法就要牢牢记住。
2、要自己动手
编程序是个实干的活,光说不练不行。刚开始学的时候可以多练习书上的习题。 对于自己不明白的地方,自己编个小程序实验一下是最好的方法,能给自己留下深刻的印象。 自己动手的过程中要不断纠正自己不好的编程习惯和认识错误。有一定的基础以后可以尝试编一点小游戏,照着编作为练习。基础很扎实的时候,可以编一些关于数据结构方面的东西。之后.....学汇编、硬件知识。
3、选择一个好的编译器
GCC或者VS都是一个号的选择
4、关于养成良好的编程习惯 参考技术B 看了下你写的素数代码,结构混乱,可阅读性差,我改了下
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int Judge(int num)
int i;
for (i=3; i<=sqrt(num); i+=2)
if (0 == num % i)
return 0;
return 1;
void main(void)
int num = 3;
int limit = 3;
FILE *fp;
fp = fopen("123.txt", "w");
printf("请输入数字 : ");
scanf("%d", &limit);
if (num > limit)
exit(0);
fprintf(fp, "%d ", 2);
do
if (Judge(num))
fprintf(fp, "%d ", num);
num += 2;
while (num <= limit);
fclose(fp);
另外一种算法
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void Judge(int num, int limit, int *data)
//筛选法 虽然浪费了点空间,但时间效率更高
int count;
int flag = (int)sqrt(limit);
while (num < limit + 1)
data[num++] = 1;
num = 2;
while (num < flag)
count = 2 * num;
while (count < limit + 1)
data[count] = 0;
count += num;
count = num + 1;
while (data[count] == 0 && count <= flag)
count++;
num = count;
void main(void)
int num = 2;
int limit;
int *data = NULL;
FILE *fp;
fp = fopen("123.txt", "w");
printf("请输入数字 : ");
scanf("%d", &limit);
if (num > limit)
exit(0);
data = (int *) malloc ((limit + 1) * sizeof(int));
if (NULL == data)
printf("申请内存失败!\n");
exit(1);
Judge(num, limit, data);
for (num=2; num<limit+1; num++)
if (data[num])
fprintf(fp, "%d ", num);
free(data);
data = NULL;
fclose(fp);
至于goto语句,蹦来跳去,用起来很爽,自我感觉良好,但有个问题,你无非也就跳了几行,眼睛能跟的上,错误很容易发现,改起来也容易,但跳个几百行,一旦出错,我相信很多程序员宁可重新设计结构写程序,也不愿修改程序。但我也不反对使用goto只是看情况而定。。。
你现在不过就是刚学完C程序设计,接下来应该学学数据结构,然后在学算法,要想开发东西出来,基础一定要扎实,一定要有耐心,比如你学完数据结构后,你就会知道CPU、缓存、栈内存是怎么处理数据,你甚至可以模仿他们的功能自己用C去写这些功能,最后可以学学操作系统等等 参考技术C 黄金语言是C就业前景也好.
虽然没有java,c#,这样的语言绚.但是1.中国奇缺精通这样语言的人.2.C语言是一种面向过程的计算机程序设计语言。最初为unix而生。它既有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛。 C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。 C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。 C语言在Linux操作系统下使用时,还可以访问mysql数据库。 参考技术D 把C学好点,以后你会明白的
以上是关于深入学习C语言的具体步骤的主要内容,如果未能解决你的问题,请参考以下文章