C语言学习教程

更新时间:2024-05-24 23:03:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C语言学习教程

下面,是我整理出来的若干文章,总体上按照三个大的方向进行分类, 一、基础性问题

1、C语言学习:如何由dos向windows转变 2、二级C语言实例解答 3、等级考试:C 程序设计 4、备战C语言上机考试

5、C语言程序设计技巧 6、C语言初级讲座 7、写好C程序的10条秘籍 8、强大的语言――C入门之一 9、强大的语言――C入门之二

二、实例开发 1、用C语言解决鬼谷算题 2、用C语言实现的闹钟程序 3、C 程序开发经典实例之一 4、C 程序开发经典实例之二 5、C 程序开发经典实例之三 6、C 程序开发经典实例之四 7、C 程序开发经典实例之五 8、C 程序开发经典实例之六 9、C 程序开发经典实例之七 10、C 程序开发经典实例之八

三、综合提升 1、C语言:黑客学员必修课之一 2、C语言:黑客学员必修课之二 3、C 程序设计基础之一 4、C 程序设计基础之二 5、C 程序设计基础之三 6、C 程序设计基础之四 7、C 程序设计基础之五 8、C 程序设计基础之六 9、C语言高效编程的的四大绝招(1) 10、C语言高效编程的的四大绝招(2)

C语言学习:如何由dos向windows转变

很多人学C语言很长一段时间了,还不知C究竟能干什么,以为学习c语言没什么用,纯粹是为了应付学校的考试.更有人说\学C语言?别做如此愚蠢的行为了!赶快学C++吧!\这种看法是不对的,不应该把c跟c++之间划起绝对的界限,过分看重c++而把c贬得一无是处,这是很片面的.C++功能虽然强大,但它毕竟是c的\超集\在c++里有哪一处找不到c的影子呢?没有c的支持,c++只能是无本之木。

一般情况下,c++编程方式编写的程序源代码量小,但编译后的代码量较大,运行的速度略低,不过开发时的工作量和工作难度较小;而c编程方式编写的源代码量较大,但可执行的效率高.如果一些对速度要求高,尤其是对硬件操

作较多的程序,大多数还是用c编程方式开发的(用C又比用汇编简单,易于实现).另外,学Win32 C程序设计还有助于更深入地了解Windows 的内幕和Win32 API。

任何的编程语言都是一种工具,学习语言的目是要使用它来编写出实际需要的软件来,而软件作为一个用户程序,运行时要依赖操作系统,大多数人使用什么操作系统,我们就要编写出基于哪一种平台上的程序来.这样,软件才会有更大的市场。

现在市面上出现的有关c语言方面的书大多是教授DOS下的c,上机实习也是在Turbo C 2.0(简称Tc)环境下转来转去.编程环境的单调总使人感到不爽.这也没办法,dos 下的c是最简单的,初学者当然要从最简单的入门啦.连比较有名的计算机专家谭浩强编的书也都是赞成从dos下的c学起的.再说,一个刚刚入门的人想在windows 这样的多进程,多线程的操作系统下用c编程,那似乎又不太现实.(那要了解在windows下,一个win32程序大体上是怎样执行的.要对系统有比较多的了解才行,一个初学者暂时还不具备那么多的知识)但我们的脚步又不能够只停留在dos里,应该积极地从dos向windows转变.在dos的时代,我们可以对dos下的编程迷恋,但现在都是windows横行霸道的时代了,我们就应用c语言编写windows平台上的程序,因时而变,学以致用.是时代使然!如果现在还是dos雄霸天下的话,那我就不会写这篇狗屁不通的文章来遗笑大方了,不被臭鸡蛋扔死才怪呢!

\变法\是大势所趋的了,关键是怎么变,不单单是学习c语言的人如此,就连学c++的人都这样,笔者曾经在QQ上碰到一个学了c++将近一年的小伙,居然问我,他想编一个windows窗口,该怎么下手,如果学一门语言用了一年时间,只是学了一点语法知识,却没有编过一道程序,那实在是一种悲哀.下面我谈谈从dos向windows转变的一些个人见解,(这纯属个人观点,仅供参考,如果您已是高手,完全不必要在此浪费时间):

一.拓宽视野,改变偏见 别老以为c只是dos特有的东西,一提到c语言就认为c只能在dos下编程.其实,这是被tc束缚了意识,我们在学校里平时就只在dos的tc里面用c编程,很少用到\图形模式\整天面对?quot;乌黑黑\的屏幕,也难怪有些人一看到一个用c语言描绘出来的像windows的窗口便以为是c++的手笔.其实,作为一种语言,可以在任何一种平台上编程,只是接口不同而已,只要找到适合该平台的编程工具即可,c语言当然也能在windows下大放异彩.眼界放宽点,改变偏见,必有精彩发现.

二.选择优秀的编程工具. “有好的工具,做起事来就事半功倍”.在dos下我们常用tc或bc(borland c).在windows下可以用c++builder 或者visual c++ 来编程,最好用visual c++ 毕竟是微软的东西嘛!微软一天不垮台,编程者的饭碗就不会掉的啦 ^_^ .再说,windows操作系统是微软出的,其内幕微软是最清楚不过的了,在应用程序接口上,相信vc也是做得最好的.不过用vc++6来编c程序会恨烦的,大家要有心理准备.同时可以选择多种编程工具,例如汇编,可以加强对windows的了解,是成为高手的好方法。

三.加强对windows的了解. 可以说编一个程序,就是用一种语言的语法形式将数据结构和表面的执行过程描述出来.在不同的操作系统下,其程序的执行过程是不同的.我们应该对windows的系统机制最起码有个大体的了解,才有可能编写windows的程序.dos是单进程单线程的系统,进程从头到尾的顺序执行,而windows是多进程、多线程的操作系统,是基于事件的,消息驱动的操作系统.明白这些是在windows下编程必不可少的,多学学它,你会发现windows 和 dos有很多的不同之处。 四.采取灵活多变的学习方法. 在不同的时期,学习不同的东西?

可是有些人学习像word,excel这类操作性极强的办公软件时,总是先看书,看到尾巴忘了头,到上机时却不知所措.这种学习方式是被动的,看这些软件操作的书,里面说的都是具体的操作,不亲手又怎能接受新知识? 五.多进行比较. dos和windows有许多共同和不同的地方,如果是从dos学过来的话,在学习过程中不妨多进行比较,把不同的地方记下,相同的地方可以跳过,这可以快速地了解系统的不同之处,迅速地学到东西!

学习程序设计,我主张\实践->理论->再实践\的方式,在编程的初期,不管你会不会写程序,都应先实践(这里的实,践是指编程工具操作方面的实践),学会操作编程工具.也许有些人会说:\废话!没有理论,又怎么实践?\不错,当你坐在一台电脑面前不知所措时,你就会想方设法使自己学会操作它,主动看书,看联机帮助,请教别人,忙得个\不亦乐乎\这不是变\被动\为\主动\了吗? 边学习边操作,以实践来带动理论的学习,接着达到\理论与实践同步\就可闯过第一关,学会了编程工具的基本操作,可以为以后上机实践打下铺垫.

光学会操作像vc这类的工具还不行,工具是死的,人才是活的,不会编程只能是空操作,你还会说:\废话!没有理论,怎么实践?\的,这时就要学习编程的真功夫了,也就是我说的第二阶段--学\理论\阶段,深入研究前辈们的著作,吸取前人的智慧精华为我所用,扎扎实实打好编程内功,功夫到家了就应该\再实践\将学到的东西运用于实际,编写出我们需要的软件来.学以致用嘛,呵呵~~这种方式总比\先学好语法的条条框框,再上机实践\的效果好得多啦.

关于向windows转变的个人观点就只谈这些,希望初学者早日踏上windows的光明大道!由于我也是一个菜鸟,水平有限,写得不好,还请各位多多包涵!

二级C语言实例解答 C语言牵涉的概念比较复杂,规范繁多,使用灵活,容易出错,不少初学者感到困难,下面通过几个实例的分析来说明c语言学习中容易混淆的几个问题,以期抛砖引玉,对初学者有所帮助。 问题1:下面的程序 int a=3,b=4; char str=’c’;

printf(“%d,%d”,a,b,str);

执行后, 输出结果为: (A)3,4,c (B)3 4 c (C)3,4 (D)程序出错

分析:在格式输出时一般要求格式说明符与输出项相一致,当输出项多余格式说明符时多余的输出项不输出,所以答案为C。

问题2:有下面的程序段

char a[3],b[]=“china”; a=b;

printf(“%s”,a);

则输出结果为:

(A)运行后输出china (B)运行后输出ch (C) 运行后输出chi (D)编译出错

分析:这个题容易错选a??实际答案为d,由于定义了字符数组后,数组名作为数组的首地址,是一个常量,给一个常量赋值的语句是错误的,换句话说,不能用赋值语句将一个字符常量或字符数组直接赋值给一个字符数组,以答案选D。

问题3:下列说明不正确的是:

(A)char a[10]=“china” (B)char a[10],??p=a;p=“china” (C)char ??p;p=“china”(D)char a[10],??p;p=a=“china”;

分析:此题易知A是正确的,D是错误的,对于B、C就很难选择了。有人认为p是一个字符变量,以为把”china”赋给该字符变量是不对的,实际上它是一个指针变量,只能指向一个字符变量或其他字符类型数据,不是把”china”存放到p中(指针变量只存放地址),只是把

“china”的首地址赋给指针变量 p,所以B,C也是正确的。 问题4:下面的程序执行结果是:

main()

{int x[5]={2,4,6,8,10},??p??????pp; p=x; pp=&&p;

printf(“%d”,??(p++)); printf(“%d\\n”,????pp); }

(A)4 4 (B)2 4 (C)2 2 (D)4 6

分析:在此题中p++是后加方式,先输出??p的值,p再自加,pp是二级指针,指向一级指针p,执行第一条输出语句前后,存在下列指向关系: 所以本题应选b

问题5:下列输出语句执行后结果为:

int i=3; printf(“%d”,-i++);

(A)3 (B)4 (C)-3 (D)-4

分析:此题考查运算符的优先级,负号运算符和++运算符同优先级,而结合方向为“自左至右”,即-i++相当于-??i++??,所以先取出i的值3,输出-i的值-3,然后i增值为4,而不是i先增值为4,然后输出-4,所以答案选择C。 问题6:设有以下语句,

struct st {int n; struct st ??next; };

static struct st a[3]={5,&&a[1],7,&&a[2],9,’\\0’},??p;

则以下表达式的值为6的是:

(A)p++→n (B)p→n++ (C)(??p).n++ (D)++p→n

分析:此题也是考查运算符的优先级,→优先级高于++,结合方向为自左至右,而后者结合方向为自右至左,A答案相当于??p++??→n??B答案相当于??p→n??++??所以A、B、C表达式值均为5,D答案相当于++??p→n????自加方式为前加方式,所以其值为6。

上面是我在教学过程中学生一些比较集中的问题,只要认真的体会和总结,加强上机实践,对自己C语言的学习会大有裨益。 等级考试:C 程序设计

计算机等级考试改革后,三级考试由A、B两类改为PC技术、数据库技术、网络技术、信息管理技术四类。其后三类的上机考试内容均为C语言程序设计。

三级上机不同于二级,它只有一道编程题,风险更大。但只要能达到题目的要求,一般都能拿到3分。 参加过考试的人都应该知道一本书――南开大学出版的《全国计算机等级考试?上机考试习题集》,这本书基

本上包含了所有的上机考试题目类型。这本书里一共有100道题,都很经典。但也许有人会觉得太多了,没时间看完所有的题目。下面我给大家介绍一个复习技巧。 简化问题

每道试题的程序都很长,而且涉及的知识点很多。实际上,在考试时看完全部程序并没有必要。每次只用把主要精力放在子程序的编制上,认真思考其“功能要求”。所以平时我们只用关注需要编制的子程序。 试题归类

要学会找出题目之间的规律,复习起来就会事半功倍。在一百道题目中,实际上只需要仔细分析其中的二十多道题就足够了,其他的只用看一下就行。因为大部分的题目都是类似的,总结出规律来之后,我们可以举一反三。例如下面两类题目:

例1. (占题库10%)已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中:金额=单价×数量可计算得出。函数ReadDat()的功能是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品代码从大到小进行排列,若产品代码相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT10.DAT中。 程序:void SortDat( ) {int I,J; PRO xy;

for (I=0;I<100;I++)

{if (strcmp(sell[I].dm,sell[J].dm)<0)① { xy=sell[I]; sell[I]=sell[J]; sell[J]=xy; }

else if (strcmp(sell[I].dm,sell[J].dm)==0)② if (sell[I].je { xy=sell[I];

sell[I]=sell[J]; sell[J]=xy;} } }

分析:这类程序题目的关键部分在于①、②、③三句上。它们的作用就是给出调换记录次序的条件。与其类似的题目只是在功能要求上有所不同(例如把“从大到小”改为“从小到大”,把“产品代码”换成“产品名称”等),所以我们只需要修改这三句。如果我们抽到的题目是“金额从小到大,如相同,则产品名称从大到小”,我们就将 ①改为:if (sell[I].je>sell[J].je) ②改为:else if (sell[I].je= =sell[J].je) ③改为:if (strcmp(sell[I].mc,sell[J].mc)<0)

而对于将记录次序进行调换的程序xy=sell[I]、sell[I]=sell[J]、sell[J]=xy,我们只需要套用就行。

例2. (占题库10%)函数ReadDat()的功能是实现从文件ENG.IN中读取一篇英文文章,存入大字符串数组xx中;请编制函数encryptChar(),按给定的代替关系对数组xx中的所有字符进行代替,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS1.DAT中。

代替关系:f(p)=p*11 mod 256。其中p是数组xx中某一个字符的ASCII值,f(p)是计算后的新字符的ASCII值,如果计算后f (p)的值小于等于32或大于130,则该字符不变,否则将f(p)所对应的字符进行代替。 程序:void encryptChar() { int I; char *pf; for (I=0;I { pf=xx[I]; while(*pf!=0)

{ if(*pf*11%6>130||*pf*11%6<=32)① { pf++;

continue;} *pf=*pf*11%6; pf++; } } }

分析:这一类题目较例1更为简单,其关键只有①一句,它是对条件“如果计算后f(p)的值小于等于32或大于130”的描述。上机考试中类似的题目可能只对这个条件作少许变动。例如:“如果原字符是大写字母或计算后f(p)的值小于等于32”,则只需把①改为:if ((*pf>=`A`&&&&*pf<=`Z`)||*pf*11%6<=32)

其他试题也可以按照上述方法进行总结。总而言之,对于三级上机考试,我们不仅要提高编程能力,还应该注意分析试题,寻找规律,用更少的时间和精力解决更多的问题! 备战C语言上机考试

C语言是目前最常用的软件开发语言之一,其功能强大,具有悠久的历史,从C、C++发展到现在的C#,不断地得以更新繁衍。在全国计算机等级考试中有,五个类别使用C语言作为上机考试内容,为各编程语言中应用最多的。 理论先行

[被屏蔽广告]

虽是上机考试,仍需以理论知识为基础,所以必须将C语言教材从头到尾学习一遍(应选择权威教材),对C语言的基本概况做到心中有数。

学完教材后,选取一些有代表性的编程范例,将其语句逐条理解透彻。同时还须注意一点,看的懂未必等于自己就会编写,应当自己尝试默写,从而找出知识薄弱点、思维盲点。

要养成一些良好习惯,比如,代码书写格式使用规范的锯齿形,尽量使用完整表达。如果采用简化方式,虽然不一定影响运算结果,但有的考试评分标准是按答题要点给分,所以还是不省为妙。 以下是学习C语言过程中容易出现的问题: 1.函数、变量使用前未定义。

2.混淆“=”和“= =”。

3.语句后或预定义的函数名后漏掉分号。 4.将else拼写成esle、continue拼写成contiune。 5.括号搭配错误。 6.首地址理解为1。 7. p++与++p区别不清。 8. break、continue运用不当。

9.误将单引号用于字符串常量,将双引号用于字符常量。 10. else分句中嵌套条件语句时,漏掉了“if”。 上机实践

虽然考点、培训点一般都提供模拟上机,但毕竟时间、地点受到限制,不能保证充分的练习时间,因此很多考生都希望能在自家电脑上进行操作实践,下面具体谈谈如何实现在个人电脑上进行练习的方法。 一、简易环境练习 系统要求:Windows系统 需用软件:Turbo C 2.0

TC软件虽然不是标准的Windows程序,但在Windows环境下依然可以使用。为使软件处于理想运行状态,运行tc.exe后需要做一些设置:

1.按“汉”按钮,否则会出现部分乱码。

2.点击属性按钮,在程序选项卡的“工作目录”栏中根据上一命令行填入程序所在目录,“运行”栏选择最大化,选择“退出时关闭”。

设置好后即可依照练习册输入习题,进行编译调试。编程中用到的处理数据一般需自建。为了提高效率,可从网上下载习题。这里应留意一些下载习题中的问题,比如遗漏字符、录入错误等,还有一些不易发现的情况,像双引号的字体不标准、文件扩展名前的句号成了逗号、甚至一些看似无内容的空行中包含着某些ASCII码,都会影响编程结果。

二、全真环境练习 系统要求:DOS系统

需用软件:Turbo C 2.0、UCDOS、上机模拟软件

经过基础阶段学习后,再来进行针对等级考试的练习,这就需要用到模拟软件了。市面上模拟软件很容易买到,其操作界面与正式考试完全一样,还往往汇集了丰富的题库和答案、源程序、输入数据,并可进行自我评分。有的还提供笔试题知识点查询,介绍考试技巧等。

使用模拟软件前,应先安装UCDOS(这与真实考试要求一样,须选5.0以上版本,而且最好采用正式版,否则可能影响软件使用)。通常情况下在Windows环境下是无法使用模拟软件的,经过一些专业设置后虽可实现,但仅限于Windows 9X操作系统,而且设置不当易使系统崩溃,所以笔者建议还是在纯DOS环境下使用为妥。 实战心得

笔者参加的今年上半年考试题目大意如下:要求将一篇英文文章中每个字符的ASCII值按公式f(p)=p 17%6计算,如f(p)的ASCII值小于32或为奇数,则原字符不变,否则予以替代。这道题目需要编写的程序代码没几行,我写好后调试运行,一切正常,复查几遍也看不出有哪儿不妥。正打算离开考场时,忽然觉得运算结果值得怀疑,根据题意,经过ASCII值计算后的结果不大可能仍都是常规字符,因此回过头来再逐字审查题目,反复对照编好的程序,焦点集中在了存放f(p)值的变量定义上,难道应将“char”改为“unsigned char”?一试,结果果然不同。

事后查知,char变量值的范围为-128至+127,unsigned char变量值的范围为0至255。比如字符“x”的ASCII值为120,按上述公式运算后值为248,字符应予以替代;如果存放f(p)值的变量定义为char型,值则转换为-8,字符因而不被替代,难怪刚才运算结果显出全篇常规字符了。所以说,仔细严谨的应考作风能弥补一些技术上的不足,有助于临场发挥。 友情提示

1.由于使用UCDOS,当屏幕下方显示其状态条时,Turbo C中的快捷键Alt+F9(调试编译)、Alt+F5(查看运行结果)等提示会被屏蔽掉,解决的办法为按一下右Shift键,隐藏UCDOS状态条后即可正常使用。值得一提的是,Alt+F9虽然是Turbo C菜单中的Run/Run命令的快捷键,但两者不完全相同:菜单命令包括自动编译、连接和运行程序;而快捷键方式却不包括运行程序,自然也就无运算结果,所以即使程序代码编写正确,考试成绩仍有可能为零分。

2.虽然一些模拟软件的习题也是从国家考试中心发行的《全国计算机等级考试上机考试习题集》中选取,但正式考试时如遇到练习过的题目,仍应看仔细,其中可能会有“小于”与“大于”之类的一字之别。

C语言程序设计技巧

在许多应用软件运行时都带有命令行参数,其实这些命令行参数在C语言编写的程序中也可以实现,灵活地运用命令行参数进行处理可以有效地提高程序的运行效率,收到事半功倍的效果。

C语言中有关命令行参数涉及到程序的主函数main(int argc,char *argv[]这样两个参数,其中,int argc表示命令行参数的个数(包括可执行程序名本身),char *argv[]表示每个参数的具体内容,argv[0]为命令行中可执行程序名本身,argv[1]为命令行中第二个参数的内容,依次类推。如下例输出命令行参数的个数及参数的内容:

main (int argc,char *argv[], {int I;

printf(\命令行中可执行文件名为:%s\ printf(\总共有%d个参数:\ I=0;

while(argc>=1)

{printf(″%s \++]); argc--;} }

命令行参数用的最多还是在诸如DIR A:等之类带有盘符、路径或文件名这样的命令行中,所以说灵活处理这一类参数才能有效地提高程序的运行效果。譬如DIR命令,其后可以是盘符,可以是路径,也可以是文件名,如何区分这一参数呢?请看下例(此程序模拟DIR命令,程序要求在命令行输入一个参数:盘符或路径或文件名,若无参数或参数多于一个都将取默认的参数“*.*”)。

\\*-------------------- 功能:模拟DIR命令进行处理命令行参数 --------------------*/ #include #include #include #inchlude int j,num=0;

char ss[20],path[50],path2[50]; void main (int argc,char *argv[]) {

struct ffblk f; int done;

if(argc==2) /*取命令行参数到数组中*/ strcpy(ss,argv[1]);

else

strcpy(ss,″*.*″); /*给数组赋值缺省参数*/

if (((ss[strlen(ss)-1]==′\\\\′||((ss[strlen(ss)-1]==':')) strcat(ss,″*.*″); /*若参数为路径或盘符,则加上″*.*″ */ getcwd(path1,50); /*取当前路径*/ if (chdir(ss)==0) /*判断参数是否为路径*/

strcat(ss,\若路径末没有带\,则加上\

chdir(path1); /*恢复原来路径*/ strcpy(path2,ss);

for(j=strlen(path2);j>0;j--)/*提取参数中的路径到path2 */ {if((path2[j]=='\\\\'))||(path2[j]==':')){ path2[j+1]='\\0'; goto senull;} } path2[0]='\\0'; senull:

if(strlen(path2)==0) /* 若给出的参数中没带路径,则取当前路径*/ strcpy(path2,path1);

printf(\模拟DIR**\\n 命令目录路径%s\ done=findfirst(ss,&f,55); /*查找第一个配匹的文件*/ j=1; while(!done)

{if (f.ff_attrib!=0x10) /* 若文件属性不是目录 */ printf(\%15s %20ld\ else

printf(\&11s \ num++; j++; if(j==23)

printf(\--------More (按任意键继续)----\ getch(); j=0;

printf(″\\n (目录路径%s)″,path2);}

done=findnext(&f); /*查找下一个配匹的文件*/

}

printf(″\\n 当前目录中总共有%d个文件.\\n″,num);

C语言初级讲座

我们已经看到程序中使用的各种变量都应预先加以说明,即先说明,后使用。对变量的说明可以包括三个方面:

?数据类型 ?存储类型 ?作用域

在本讲中,我们只介绍数据类型说明。其它说明在以后陆续介绍。所谓数据类型是按被说明量的性质,表示形式,占据存储空间的多少,构造特点来划分的。在C语言中,数据类型可分为:基本数据类型,构造数据类型,指针类型,空类型四大类。 1.基本数据类型

基本数据类型最主要的特点是,其值不可以再分解为其它类型。也就是说,基本数据类型是自我说明的。 2.构造数据类型构造数据类型

是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型的值可以分解成若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或又是一个构造类型。在C语言中,构造类型有以下几种:

?数组类型 ?结构类型 ?联合类型 3.指针类型

指针是一种特殊的,同时又是具有重要作用的数据类型。其值用来表示某个量在内存储器中的地址。虽然指针变量的取值类似于整型量,但这是两个类型完全不同的量,因此不能混为一谈。4.空类型在调用函数值时,通常应向调用者返回一个函数值。这个返回的函数值是具有一定的数据类型的,应在函数定义及函数说明中给以说明,例如在例题中给出的max函数定义中,函数头为: int max(int a,int b);其中“int ”类型说明符即表示该函数的返回值为整型量。又如在例题中,使用了库函数 sin,由于系统规定其函数返回值为双精度浮点型,因此在赋值语句s=sin (x);中,s 也必须是双精度浮点型,以便与sin函数的返回值一致。所以在说明部分,把s说明为双精度浮点型。但是,也有一类函数,调用后并不需要向调用者返回函数值, 这种函数可以定义为“空类型”。其类型说明符为void。在本讲中,我们先介绍基本数据类型中的整型、浮点型和字符型。其余类型在以后各讲中陆续介绍。

对于基本数据类型量,按其取值是否可改变又分为常量和变量两种。在程序执行过程中,其值不发生改变的量称为常量,取值可变的量称为变量。它们可与数据类型结合起来分类。例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量。在程序中,常量是可以不经说明而直接引用的,而变量则必须先说明后使用。 整型量

整型量包括整型常量、整型变量。整型常量就是整常数。在C语言中,使用的整常数有八进制、十六进制和十进制三种。 整型常量

1.八进制整常数八进制整常数必须以0开头,即以0作为八进制数的前缀。数码取值为0~7。八进制数通常是无符号数。

以下各数是合法的八进制数:

015(十进制为13) 0101(十进制为65) 0177777(十进制为65535) 以下各数不是合法的八进制数:

256(无前缀0) 03A2(包含了非八进制数码) -0127(出现了负号) 2.十六进制整常数

十六进制整常数的前缀为0X或0x。其数码取值为0~9,A~F或a~f。 以下各数是合法的十六进制整常数:

0X2A(十进制为42) 0XA0 (十进制为160) 0XFFFF (十进制为65535) 以下各数不是合法的十六进制整常数: 5A (无前缀0X) 0X3H (含有非十六进制数码) 3.十进制整常数

十进制整常数没有前缀。其数码为0~9。 以下各数是合法的十进制整常数: 237 -568 65535 1627

以下各数不是合法的十进制整常数: 023 (不能有前导0) 23D (含有非十进制数码)

在程序中是根据前缀来区分各种进制数的。因此在书写常数时不要把前缀弄错造成结果不正确。4.整型常数的后缀在16位字长的机器上,基本整型的长度也为16位,因此表示的数的范围也是有限定的。十进制无符号整常数的范围为0~65535,有符号数为-32768~+32767。八进制无符号数的表示范围为0~0177777。十六进制无符号数的表示范围为0X0~0XFFFF或0x0~0xFFFF。如果使用的数超过了上述范围,就必须用长整型数来表示。长整型数是用后缀“L”或“l”来表示的。例如:

十进制长整常数 158L (十进制为158) 358000L (十进制为-358000)

八进制长整常数 012L (十进制为10) 077L (十进制为63) 0200000L (十进制为65536) 十六进制长整常数 0X15L (十进制为21) 0XA5L (十进制为165) 0X10000L (十进制为65536)

长整数158L和基本整常数158 在数值上并无区别。但对158L,因为是长整型量,C编译系统将为它分配4个字节存储空间。而对158,因为是基本整型,只分配2 个字节的存储空间。因此在运算和输出格式上要予以注意,避免出错。无符号数也可用后缀表示,整型常数的无符号数的后缀为“U”或“u”。例如: 358u,0x38Au,235Lu 均为无符号数。前缀,后缀可同时使用以表示各种类型的数。如0XA5Lu表示十六进制无符号长整数A5,其十进制为165。

写好C程序的10条秘籍

神乎其技,惟C程序,功到自成,十大建议!

1、汝应频繁催动lint工具,据其语法声明修习内力,此事皆因lint之思虑决断实远在君上。 2、不可依随NULL指针,如若不然,混沌痴颠必俟君于彼岸。

3、纵有天赋大智慧,知晓其事无碍,汝亦当尽数强制挪移函数参数为原型所期之数据类型,以免一时疏忽,致使数据类型向汝讨还血债。

4、若头文件未于函数原型之中声明返回值类型,汝当亲为此事,更须谨慎再三,以防不测降临汝身。

5、汝须亲核字符串、数组操作之越界与否。古之圣人有言: 尝祈门人对答“然也”,不意门人答曰“吾了然于胸无须多虑尽请宽心他日趋庭必当重谢”――所期者短,所获者长,此于数组,实最险要处也。

6、若函数声明内提及,于异常时将返回错误代码云云,汝当谨慎校核该返回值。或有校核语句使汝之代码增大数倍,令汝之手指因敲键而痛楚莫名之事,汝亦当如此。不然,汝固以为此异常之事难得一见,上苍亦必借此惩戒汝之傲慢。

7、汝应研习库函数,不当亲笔重写之。如是,汝之代码必短小易读,汝之心境必清爽恬淡。

8、纵汝不愿,汝亦应借括号、缩进之属,使汝之代码间架清晰,可为后者借鉴。汝之大智慧施于决疑解难则可,施于敷设谜团、淆乱文体则万万不可。

9、外部标识符之前六字符当与众不同。此律法看似粗陋,和者寥寥,然其效用自能延续永远。汝若不从此言,他日,汝欲连接程序于旧作之上时,必抓耳挠腮、蓬头垢面,狼狈之相尽现矣。

10、或有族类,大言炎炎,云“普天之下,莫非VAX”。于此等异端,汝当摒弃之、断绝之、远避之。更有异人,笃信魔道,以为纵汝所用电脑频繁换代,汝之程序亦能长久适用。汝亦不可与此类恶人来往,谨记谨记。 强大的语言――C入门之一

一、C语言的特点

C 语言是美国的Dennis Ritchie在1972年设计发明的。它由早期的编程语言BCPL( Basic Combined

Programming Language) 发展演变而来。C 语言之所以发展迅速,成为最受欢迎的语言之一,主要因为它具有强大的功能。归纳起来,C 语言具有下列特点:

1.C语言是“中级语言” 它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。

2.C语言是结构式语言 所谓结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便地调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。 3.C语言功能齐全 C 语言具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。另外C 语言也具有强大的图形功能,支持多种显示器和驱动器,而且计算功能、逻辑判断功能也比较强大,可以实现决策目的。

4.C语言适用范围广 C 语言还有一个突出的优点就是适合多种操作系统,如DOS、Windows、UNIX,也适用于多种机型。

二、C语言基础介绍 随着微型计算机的日益普及,出现了许多C 语言版本。由于没有统一的标准,使得这些C 语言之间出现了一些不一致的地方。为了改变这种情况,美国国家标准研究所(ANSI)为C 语言制定了一套ANSI标准,成为现行的C语言标准。而在这里我们将主要以美国Borland 公司的产品Turbo C2.0作为介绍对象,简要介绍一下C语言的基本知识。

1.数据类型 在C语言中,每个变量在使用之前必须定义其数据类型。Turbo C有以下几种类型:整型(int)、浮点型(float)、字符型(char)、指针型(*)、无值型(void)以及结构(struct)和联合(union)。其中前五种是C语言的基本数据类型、后两种数据类型(结构和联合)则是C语言的扩展数据类型。

2.关键字和标识符、运算符 所谓关键字就是已被C语言本身使用、不能作其它用途的字。例如关键字else,就再不能用作变量名、函数名等。所谓标识符是指常量、变量、语句标号以及用户自定义函数的名称。C标识符的定义十分灵活。

C的运算符非常丰富,主要分为三大类:算术运算符、关系与逻辑运算符、按位运算符。

3.变量 C规定所有变量在使用前都必须加以说明。一条变量说明语句由数据类型和其后的一个或多个变量名组成,例如“int x”。变量可以在程序中三个地方说明:函数内部、函数的参数定义中或所有的函数外部。根据所定义位置的不同,变量可分为局部变量、形式参数和全程变量。C像其它高级语言一样也使用数组变量。所谓数组就是指具有相同数据类型的变量集,并拥有共同的名字。数组中的每个特定元素都使用下标来访问。 4.控制流程语句 C提供了丰富、灵活的控制流程语句,主要有:条件语句、循环语句和开关语句。条件语句的一般形式为if-else。C提供三种基本的循环语句:for语句、while语句和do-while语句。而在编写程序时,经常会碰到按不同情况分转的多路问题, 这时可用嵌套if-else-if语句来实现,但if-else-if语句使用不方便,并且容易出错。对这种情况,C提供了一个switch开关语句。 二、实例开发用C语言解决鬼谷算题

在鬼谷算题中有这样一个著名的题目:“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?”这属于高等数学中的数论。我国宋代学者对这类题目钻研已颇为精深,总结出了“三人同行七十稀,五树梅花廿一枝,七子团圆正半月,去百零五便得知。”这样的口诀,意思是说“以三三数之,余数乘以七十;五五数之,余数乘以二十一;七七数之,余数乘十五。三者相加,如不大于一百零五,即为答数;否则须减去一百零五或其倍数。”这道算题的答案为23。计算起来比较繁琐,但如果用我们所熟悉的C语言来编写一小段程序的话,很快就能解决。 这段程序如下: #include ″stdio.h″ main int x

for x=0 x<100 x++??

if x%3==2&&x%5==3&&x%7==2 printf ″This number is %d\\n″ x

用C语言实现的闹钟程序

#include #include #include #include #include void main() {

int gd=DETECT,gm;

int x=320,y=240,r=200,i,h,m,s,thetamin,thetasec;

struct time t;

char n[12][3]={\

initgraph(&gd,&gm,\图形驱动器路径,根据自己的系统更换。 circle(x,y,210); setcolor(4); settextstyle(4,0,5); for(i=0;i<12;i++) { if(i!=3)

outtextxy(x+(r-14)*cos(M_PI/6*i)-10,y-(r-14)*sin(M_PI/6*i)-26,n[i]); else

outtextxy(x+(r-14)*cos(M_PI/6*i)-20,y-(r-14)*sin(M_PI/6*i)-26,n[i]); }

gettime(&t);

printf(\ t.ti_sec, t.ti_hund); while(!kbhit()) {

setcolor(5); setfillstyle(1,5); circle(x,y,10); floodfill(x,y,5); gettime(&t); if(t.ti_min!=m) {

setcolor(0);

line(x,y,x+(r-60)*cos(thetamin*(M_PI/180)),y-(r-60)*sin(thetamin*(M_PI/180 )));

circle(x+(r-80)*cos(thetamin*(M_PI/180)),y-(r-80)*sin(thetamin*(M_PI/180)) ,10);

line(x,y,x+(r-110)*cos(M_PI/6*h-((m/2)*(M_PI/180))),y-(r-110)*sin(M_PI/6*h -((m/2)*(M_PI/180))));

circle(x+(r-130)*cos(M_PI/6*h-((m/2)*(M_PI/180))),y-(r-130)*sin(M_PI/6*h-( (m/2)*(M_PI/180))),10); }

if(t.ti_hour>12) t.ti_hour=t.ti_hour-12; if(t.ti_hour<4) h=abs(t.ti_hour-3); else&n bsp;

h=15-t.ti_hour; m=t.ti_min; if(t.ti_min<=15) thetamin=(15-t.ti_min)*6; else

thetamin=450-t.ti_min*6; if(t.ti_sec<=15) thetasec=(15-t.ti_sec)*6; else

thetasec=450-t.ti_sec*6; setcolor(4);

line(x,y,x+(r-110)*cos(M_PI/6*h-((m/2)*(M_PI/180))),y-(r-110)*sin(M_PI/6*h -((m/2)*(M_PI/180))));

circle(x+(r-130)*cos(M_PI/6*h-((m/2)*(M_PI/180))),y-(r-130)*sin(M_PI/6*h-( (m/2)*(M_PI/180))),10);

line(x,y,x+(r-60)*cos(thetamin*(M_PI/180)),y-(r-60)*sin(thetamin*(M_PI/180 )));

circle(x+(r-80)*cos(thetamin*(M_PI/180)),y-(r-80)*sin(thetamin*(M_PI/180)) ,10); setcolor(15);

line(x,y,x+(r-70)*cos(thetasec*(M_PI/180)),y-(r-70)*sin(thetasec*(M_PI/180 ))); delay(1000); setcolor(0);

line(x,y,x+(r-70)*cos(thetasec*(M_PI/180)),y-(r-70)*sin(thetasec*(M_PI/180 ))); } }

该程序已在Turbo C++3.0中通过编译.

C 程序开发经典实例之一

【程序1】

题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。 2.程序源代码: main() { int i,j,k; printf(\

for(i=1;i<5;i++) /*以下为三重循环*/ for(j=1;j<5;j++) for (k=1;k<5;k++) {

if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/ printf(\ } } 【程序2】

题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?

1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 2.程序源代码: main() {

long int i;

int bonus1,bonus2,bonus4,bonus6,bonus10,bonus; scanf(\

bonus1=100000*0.1;bonus2=bonus1+100000*0.75; bonus4=bonus2+200000*0.5; bonus6=bonus4+200000*0.3; bonus10=bonus6+400000*0.15; if(i<=100000) bonus=i*0.1; else if(i<=200000)

bonus=bonus1+(i-100000)*0.075; else if(i<=400000)

bonus=bonus2+(i-200000)*0.05; else if(i<=600000)

bonus=bonus4+(i-400000)*0.03; else if(i<=1000000)

bonus=bonus6+(i-600000)*0.015; else

bonus=bonus10+(i-1000000)*0.01; printf(\ } 【程序3】

题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析: 2.程序源代码: #include \ main() {

long int i,x,y,z; for (i=1;i<100000;i++)

{ x=sqrt(i+100); /*x为加上100后开方后的结果*/

y=sqrt(i+268); /*y为再加上168后开方后的结果*/

if(x*x==i+100&&y*y==i+268)/*如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/ printf(\ } } 【程序4】

题目:输入某年某月某日,判断这一天是这一年的第几天?

1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。 2.程序源代码: main() {

int day,month,year,sum,leap;

printf(\ scanf(\ switch(month)/*先计算某月以前月份的总天数*/ {

case 1:sum=0;break; case 2:sum=31;break; case 3:sum=59;break; case 4:sum=90;break; case 5:sum=120;break; case 6:sum=151;break; case 7:sum=181;break; case 8:sum=212;break; case 9:sum=243;break; case 10:sum=273;break; case 11:sum=304;break; case 12:sum=334;break; default:printf(\ }

sum=sum+day; /*再加上某天的天数*/

if(year@0==0||(year%4==0&&year0!=0))/*判断是不是闰年*/ leap=1; else leap=0;

if(leap==1&&month>2)/*如果是闰年且月份大于2,总天数应该加一天*/ sum++;

printf(\ 【程序5】

题目:输入三个整数x,y,z,请把这三个数由小到大输出。

1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。 2.程序源代码: main() {

int x,y,z,t;

scanf(\ if (x>y)

{t=x;x=y;y=t;} /*交换x,y的值*/ if(x>z)

{t=z;z=x;x=t;}/*交换x,z的值*/ if(y>z)

{t=y;y=z;z=t;}/*交换z,y的值*/ printf(\ } 【程序6】

题目:用*号输出字母C的图案。

1.程序分析:可先用'*'号在纸上写出字母C,再分行输出。 2.程序源代码:

#include \ main() {

printf(\ printf(\ printf(\ printf(\ printf(\ } 【程序7】

题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful! 1.程序分析:字符共有256个。不同字符,图形不一样。 2.程序源代码: #include \ main() {

char a=176,b=219;

printf(\ printf(\ printf(\ printf(\ printf(\ 【程序8】

题目:输出9*9口诀。

1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。 2.程序源代码: #include \ main() {

int i,j,result; printf(\ for (i=1;i<10;i++) { for(j=1;j<10;j++) {

result=i*j;

printf(\表示左对齐,占3位*/ }

printf(\每一行后换行*/ } } 【程序9】

题目:要求输出国际象棋棋盘。

1.程序分析:用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。 2.程序源代码: #include \ main() { int i,j;

for(i=0;i<8;i++) {

for(j=0;j<8;j++) if((i+j)%2==0)

printf(\ else printf(\ printf(\ } } 【程序10】

题目:打印楼梯,同时在楼梯上方打印两个笑脸。

1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。 2.程序源代码: #include \ main() { int i,j;

printf(\输出两个笑脸*/ for(i=1;i<11;i++) {

for(j=1;j<=i;j++)

printf(\ printf(\ } }

C 程序开发经典实例之二

【程序11】

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... 2.程序源代码: main() { long f1,f2; int i; f1=f2=1; for(i=1;i<=20;i++)

{ printf(\

if(i%2==0) printf(\控制输出,每行四个*/ f1=f1+f2; /*前两个月加起来赋值给第三个月*/ f2=f1+f2; /*前两个月加起来赋值给第三个月*/

} }

============================================================== 【程序12】

题目:判断101-200之间有多少个素数,并输出所有素数。

1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 2.程序源代码: #include \ main() {

int m,i,k,h=0,leap=1; printf(\

for(m=101;m<=200;m++) { k=sqrt(m+1); for(i=2;i<=k;i++) if(m%i==0) {leap=0;break;} if(leap) {printf(\ if(h==0) printf(\ } leap=1; }

printf(\ }

============================================================== 【程序13】

题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。

1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 2.程序源代码: main() { int i,j,k,n;

printf(\ for(n=100;n<1000;n++) {

i=n/100;/*分解出百位*/ j=n/10;/*分解出十位*/ k=n;/*分解出个位*/

if(i*100+j*10+k==i*i*i+j*j*j+k*k*k) {

printf(\ } } printf(\ }

【程序14】

题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 2.程序源代码:

/* zheng int is divided yinshu*/ main() { int n,i;

printf(\ scanf(\ printf(\ for(i=2;i<=n;i++) { while(n!=i) {

if(n%i==0) { printf(\ n=n/i; } else break; } }

printf(\ 【程序15】

题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

1.程序分析:(a>b)?a:b这是条件运算符的基本例子。 2.程序源代码: main() {

int score; char grade;

printf(\ scanf(\

grade=score>=90?'A':(score>=60?'B':'C');

printf(\ }

【程序16】

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 1.程序分析:利用辗除法。 2.程序源代码: main() {

int a,b,num1,num2,temp;

printf(\ scanf(\ if(num1 { temp=num1; num1=num2; num2=temp; }

a=num1;b=num2;

while(b!=0)/*利用辗除法,直到b为0为止*/ { temp=a%b; a=b; b=temp; }

printf(\

printf(\ }

【程序17】

题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 1.程序分析:利用while语句,条件为输入的字符不为'\\n'. 2.程序源代码:

#include \ main() {char c;

int letters=0,space=0,digit=0,others=0; printf(\ while((c=getchar())!='\\n') {

if(c>='a'&&c<='z'||c>='A'&&c<='Z') letters++; else if(c==' ') space++;

else if(c>='0'&&c<='9') digit++; else

others++; }

printf(\ space,digit,others); } 【程序18】

题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

1.程序分析:关键是计算出每一项的值。 2.程序源代码: main() {

int a,n,count=1; long int sn=0,tn=0;

printf(\ scanf(\ printf(\ while(count<=n)

{ tn=tn+a; sn=sn+tn; a=a*10; ++count; }

printf(\ }

【程序19】

题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。

1. 程序分析:请参照程序<--上页程序14. 2.程序源代码: main() {

static int k[10]; int i,j,n,s;

for(j=2;j<1000;j++) { n=-1; s=j; for(i=1;i { if((j%i)==0) { n++; s=s-i; k[n]=i; } }

if(s==0) {

printf(\ for(i=0;i printf(\

printf(\ } } } 【程序20】

题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? 1.程序分析:见下面注释 2.程序源代码: main() {

float sn=100.0,hn=sn/2; int n;

for(n=2;n<=10;n++) {

sn=sn+2*hn;/*第n次落地时共经过的米数*/ hn=hn/2; /*第n次反跳高度*/ }

printf(\ printf(\ }

C 程序开发经典实例之三

【程序21】

题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

1.程序分析:采取逆向思维的方法,从后往前推断。 2.程序源代码:

main() {

int day,x1,x2; day=9; x2=1; while(day>0)

{x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/ x2=x1; day--; }

printf(\ }

============================================================== 【程序22】

题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 2.程序源代码: main() {

char i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/ for(i='x';i<='z';i++) for(j='x';j<='z';j++) { if(i!=j)

for(k='x';k<='z';k++) { if(i!=k&&j!=k)

{ if(i!='x'&&k!='x'&&k!='z')

printf(\ } }

} } 【程序23】

题目:打印出如下图案(菱形) * *** ****** ******** ****** *** *

1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。 2.程序源代码: main() { int i,j,k; for(i=0;i<=3;i++) {

for(j=0;j<=2-i;j++) printf(\

for(k=0;k<=2*i;k++) printf(\ printf(\ }

for(i=0;i<=2;i++) {

for(j=0;j<=i;j++) printf(\

for(k=0;k<=4-2*i;k++) printf(\ printf(\ }

}

【程序24】

题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。 1.程序分析:请抓住分子与分母的变化规律。 2.程序源代码: main() {

int n,t,number=20; float a=2,b=1,s=0; for(n=1;n<=number;n++) { s=s+a/b;

t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/ }

printf(\ }

【程序25】

题目:求1+2!+3!+...+20!的和

1.程序分析:此程序只是把累加变成了累乘。 2.程序源代码: main() {

float n,s=0,t=1; for(n=1;n<=20;n++) { t*=n; s+=t; }

printf(\

}

【程序26】

题目:利用递归方法求5!。

1.程序分析:递归公式:fn=fn_1*4! 2.程序源代码: #include \ main() { int i; int fact(); for(i=0;i<5;i++)

printf(\ } int fact(j) int j; { int sum; if(j==0) sum=1; else

sum=j*fact(j-1); return sum; }

【程序27】

题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。 1.程序分析: 2.程序源代码: #include \ main() { int i=5;

void palin(int n); printf(\ palin(i); printf(\ }

void palin(n) int n; { char next; if(n<=1) {

next=getchar(); printf(\ putchar(next); } else {

next=getchar(); palin(n-1); putchar(next); }

} ============================================================== 【程序28】

题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。 2.程序源代码: age(n) int n; {

int c; if(n==1) c=10; else c=age(n-1)+2; return(c); } main()

{ printf(\ }

============================================================== 【程序29】

题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 1. 程序分析:学会分解出每一位数,如下解释:(这里是一种简单的算法,师专数002班赵鑫提供) 2.程序源代码: main( ) {

long a,b,c,d,e,x; scanf(\

a=x/10000;/*分解出万位*/ b=x000/1000;/*分解出千位*/ c=x00/100;/*分解出百位*/ d=x0/10;/*分解出十位*/ e=x;/*分解出个位*/

if (a!=0) printf(\ else if (b!=0) printf(\ else if (c!=0) printf(\ else if (d!=0) printf(\ else if (e!=0) printf(\ }

【程序30】

题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。 1.程序分析:同29例

2.程序源代码: main( ) {

long ge,shi,qian,wan,x; scanf(\ wan=x/10000; qian=x000/1000; shi=x0/10; ge=x;

if (ge==wan&&shi==qian)/*个位等于万位并且十位等于千位*/ printf(\ else

printf(\ }

本文来源:https://www.bwwdw.com/article/7cb7.html

Top