如果发挥出C语言的威力

fredshao 2012-06-23 03:01:44
感觉自己现在只能用C语言写些简单的程序,比如写个命令行界面的信息管理啦,什么的,C语言很强大,几乎可以做任何事情,
我想知道,如何用C直接去操控硬件,或者做一些很有深度的东西。
比如说操作系统,LINUX,内核部分是用C实现的等等
怎样去学习这方面的东西,不让自己的C语言水平只停留在一般水平。
看世界编程语言排行,C语言第一,占那么大的份额,主要用在了哪些方面?
...全文
459 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
codesnail 2012-06-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
C实现算法、操作系统、数据结构、编译器,这才是C的领域

大部分和用户直接接触的东西用C做都说明用错了语言
[/Quote]
嵌入式也是一大块,呵呵
赵4老师 2012-06-27
  • 打赏
  • 举报
回复
//输出PROG中有但LIST中没有的文本行,即集合PROG-LIST
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <search.h>
#define MAXLINES 1000000
#define MAXCHARS 256
char buf[MAXLINES][MAXCHARS];
char P[256]="PROG";//程序Program需要的文件列表
char L[256]="LIST";//dir /b /s生成的实际文件列表List
FILE *fp,*fl;
int c,n,L1,hh;
int ignore_case=0;
char ln[MAXCHARS];
int icompare(const void *arg1,const void *arg2) {
return stricmp((char *)arg1,(char *)arg2);
}
int compare(const void *arg1,const void *arg2) {
return strcmp((char *)arg1,(char *)arg2);
}
int main(int argc,char **argv) {
if (argc>1) strcpy(P,argv[1]);//命令行参数1覆盖PROG
if (argc>2) strcpy(L,argv[2]);//命令行参数2覆盖LIST
if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写
if ((fl=fopen(L,"rt"))==NULL) {
fprintf(stderr,"Can not open %s\n",L);
fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);
return 1;
}
if ((fp=fopen(P,"rt"))==NULL) {
fclose(fl);
fprintf(stderr,"Can not open %s\n",P);
return 2;
}
n=0;
hh=0;
while (1) {
if (fgets(ln,MAXCHARS,fl)==NULL) break;//
hh++;
L1=strlen(ln)-1;
if ('\n'!=ln[L1]) {//超长行忽略后面内容
fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",L,hh,MAXCHARS);
while (1) {
c=fgetc(fl);
if ('\n'==c || EOF==c) break;//
}
}
while (1) {//去掉行尾的'\n'和空格
if ('\n'==ln[L1] || ' '==ln[L1]) {
ln[L1]=0;
L1--;
if (L1<0) break;//
} else break;//
}
if (L1>=0) {
strcpy(buf[n],ln);
n++;
if (n>=MAXLINES) {
fclose(fl);
fclose(fp);
fprintf(stderr,"%s up to %d lines",L,MAXLINES);
return 3;
}
}
}
fclose(fl);
if (ignore_case) qsort(buf,n,MAXCHARS,icompare);
else qsort(buf,n,MAXCHARS,compare);
hh=0;
while (1) {
if (fgets(ln,MAXCHARS,fp)==NULL) break;//
hh++;
L1=strlen(ln)-1;
if ('\n'!=ln[L1]) {//超长行忽略后面内容
fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",P,hh,MAXCHARS);
while (1) {
c=fgetc(fp);
if ('\n'==c || EOF==c) break;//
}
}
while (1) {//去掉行尾的'\n'和空格
if ('\n'==ln[L1] || ' '==ln[L1]) {
ln[L1]=0;
L1--;
if (L1<0) break;//
} else break;//
}
if (L1>=0) {
if (ignore_case) {
if (NULL==bsearch(ln,buf,n,MAXCHARS,icompare)) printf("%s\n",ln);
} else {
if (NULL==bsearch(ln,buf,n,MAXCHARS,compare)) printf("%s\n",ln);
}
}
}
fclose(fp);
return 0;
}
赵4老师 2012-06-27
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
赵4老师 2012-06-27
  • 打赏
  • 举报
回复
参考Linux源代码
《刺杀希特勒》、《Doom》、《Quake》系列源代码。
jiandingzhe 2012-06-27
  • 打赏
  • 举报
回复
楼主要求的已经超出了C语言本身,你得学相应的领域,比如嵌入式编程、操作系统等等。
volcan1987 2012-06-27
  • 打赏
  • 举报
回复
学习下,字数补丁
majia2011 2012-06-27
  • 打赏
  • 举报
回复
数学是计算机,c语言哲学成分更多一些,跟人看法
荷叶茶蛋 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]
说什么思想,一小部分是智商,一大部分就是数学
[/Quote]
++
w346581442 2012-06-26
  • 打赏
  • 举报
回复
说什么思想,一小部分是智商,一大部分就是数学
灼眼的超哥 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

引用 3 楼 的回复:

引用 1 楼 的回复:
楼主去下载个linux0.1版本。一万行的代码,基本是C写的。告诉你怎么用C驱动X386的机器。


广义的算法是如构建程序,一步一步的实现你的想法(程序的功能)

想法与语言无关

如果你没有想法,如何写文章

如果你不懂词法句法,如何将汉字组和成语句、段落,进一步组成可以表达你思想的文章

中国人会汉语,但,有……
[/Quote]
编程语言也是如此,编程技术的水平,主要看是看思想如何。
灼眼的超哥 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 1 楼 的回复:
楼主去下载个linux0.1版本。一万行的代码,基本是C写的。告诉你怎么用C驱动X386的机器。


广义的算法是如构建程序,一步一步的实现你的想法(程序的功能)

想法与语言无关

如果你没有想法,如何写文章

如果你不懂词法句法,如何将汉字组和成语句、段落,进一步组成可以表达你思想的文章
[/Quote]
中国人会汉语,但,有多少人能够像那些著名作家那样用汉字写出优秀的文章呢?
shiliwu405 2012-06-26
  • 打赏
  • 举报
回复
每个回复认真都看了,学习了
猪头小哥 2012-06-24
  • 打赏
  • 举报
回复
点到位了。
[Quote=引用 5 楼 的回复:]

C实现算法、操作系统、数据结构、编译器,这才是C的领域

大部分和用户直接接触的东西用C做都说明用错了语言
[/Quote]
pathuang68 2012-06-24
  • 打赏
  • 举报
回复
建议楼主去做嵌入式编程(比如物联网),还蛮好玩的。
tcpln2009 2012-06-24
  • 打赏
  • 举报
回复
每个回复认真都看了,学习了!
qq120848369 2012-06-23
  • 打赏
  • 举报
回复
那么多开源代码, 你有能力就去读, 没能力就去读书打基础.
wizard_tiger 2012-06-23
  • 打赏
  • 举报
回复
C语言比较擅长做底层。
22too 2012-06-23
  • 打赏
  • 举报
回复
我要努力的学习c
csxuedn 2012-06-23
  • 打赏
  • 举报
回复
搞底层的才是公司的香饽饽啊……深有体会……
蛮牛儿 2012-06-23
  • 打赏
  • 举报
回复
你买块单片机玩玩看就知道了,然后再弄块Arm板子耍耍,呵呵
加载更多回复(6)
大家都是抱着对算法与数据结构极大的兴趣才参加集训的,我们也希望大家学有所成,但是刚刚接触信息学领域的同学往往存在很多困惑,不知道从何入手学习,在这篇向导里,我希望能将自己不多的经验与大家分享,希望对各位有所帮助. 一、语言是最重要的基本功 无论侧重于什么方面,只要是通过计算机程序去最终实现的竞赛,语言都是大家要过的第一道关.亚洲赛区的比赛支持的语言包括C/C++与JAVA.虽然JAVA在应用极为广泛,但是其运行速度不可恭维.而且在以往的比赛中来看,大多数队伍还是采用了C或者C++.而且C语言是大家接触的第一门编程语言,所以我们集训队都采用C和C++混编的方式写代码. 新来的同学可能C的基础知识刚刚学完,还没有接触过C++,其实在赛场上使用纯C的选手还是大有人在的,它们主要是看重了纯C在效率上的优势,所以这部分同学如果时间有限,并不需要急着去学习新的语言,只要提高了自己在算法设计上的造诣,纯C一样能发挥巨大的威力.但是我还是希望大家都能够学点C++. C++相对于C,在输入输流上的封装大大方便了我们的操作,同时降低了错的可能性,并且能够很好地实现标准流与文件流的切换,方便了调试的工作。如果有些同学比较在意这点,可以尝试C和C++的混编,毕竟仅仅学习C++的流操作还是不花什么时间的。 C++的另一个支持来源于标准模版库(STL),库中提供的对于基本数据结构的统一接口操作和基本算法的实现可以缩减我们编写代码的长度,这可以节省一些时间。但是,与此相对的,使用STL要在效率上做一些牺牲,对于输入规模很大的题目,有时候必须放弃STL,这意味着我们不能存在“有了STL就可以不去管基本算法的实现”的想法;另外,熟练和恰当地使用STL必须经过一定时间的积累,准确地了解各种操作的时间复杂度,切忌对STL中不熟悉的部分滥用,因为这其中蕴涵着许多初学者不易发现的陷阱。像STL中的很多容器, vector,queue,stack,map,set等一定要比较熟悉,STL中的sort是必需要掌握的.掌握这些STL知识后写代码的时候相对于纯C会节省不少时间. C语言学习推荐:C程序设计(谭浩强编著) C++学习推荐: C++Prime, C++大学教程.(其实基本上的C++教程都行的…) STL学习推荐: C++Prime,STL标准库.(理论联系实际,边学就用学的最快) 二、以数学为主的基础知识十分重要 虽然被定性为程序设计竞赛,但是参赛选手所遇到的问题更多的是没有解决问题的思路,而不是有了思路却死活不能实现,这就是平时积累的基础知识不够。竞赛中对于基础学科的涉及主要集中于数学,此外对于物理、电路等等也可能有一定应用,但是不多。因此,大一的同学也不必为自己还没学数据结构而感到不知从何入手提高,把数学捡起来吧!下面来谈谈在竞赛中应用的数学的主要分支。 1、离散数学——作为计算机学科的基础,离散数学是竞赛中涉及最多的数学分支,其重中之重又在于图论和组合数学,尤其是图论。 图论之所以运用最多是因为它的变化最多,而且可以轻易地结合基本数据结构和许多算法的基本思想,较多用到的知识包括连通性判断、DFS和BFS,关节点和关键路径、欧拉回路、最小生成树、最短路径、二部图匹配和网络流等等。虽然这部分的比重很大,但是往往也是竞赛中的难题所在,如果有初学者对于这部分的某些具体内容暂时感到力不从心,也不必着急,可以慢慢积累。 竞赛中设计的组合计数问题大都需要用组合数学来解决,组合数学中的知识相比于图论要简单一些,很多知识对于小学上过奥校的同学来说已经十分熟悉,但是也有一些部分需要先对代数结构中的群论有初步了解才能进行学习。组合数学在竞赛中很少以难题的形式现,但是如果积累不够,任何一道这方面的题目却都有可能成为难题。 2、数论——以素数判断和同余为模型构造来的题目往往需要较多的数论知识来解决,这部分在竞赛中的比重并不大,但只要来上一道,也足以使知识不足的人冥思苦想上一阵时间。素数判断和同余最常见的是在以密码学为背景的题目中现,在运用密码学常识确定大概的过程之后,核心算法往往要涉及数论的内容。 3、计算几何——计算几何相比于其它部分来说是比较独立的,就是说它和其它的知识点很少有过多的结合,较常用到的部分包括——线段相交的判断、多边形面积的计算、内点外点的判断、凸包等等。计算几何的题目难度不会很大,但也永远不会成为最弱的题。 4、线性代数——对线性代数的应用都是围绕矩阵展开的,一些表面上是模拟的题目往往可以借助于矩阵来找到更好的算法。 5、概率论——竞赛是以黑箱来判卷的,这就是说你几乎不能动使用概率算法的念头,但这也并不是说概率就没有用。关于这一点,只有通过一定的练习才能体会。而且近年来概率题现的次数越来越多了.

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧