文档库 最新最全的文档下载
当前位置:文档库 › c语言学习经典例题

c语言学习经典例题

c语言学习经典例题.txt30生命的美丽,永远展现在她的进取之中;就像大树的美丽,是展现在它负势向上高耸入云的蓬勃生机中;像雄鹰的美丽,是展现在它搏风击雨如苍天之魂的翱翔中;像江河的美丽,是展现在它波涛汹涌一泻千里的奔流中。C语言学习教程
多数情况下,现在的编程高手都是从学习C 语言入门的,在学校里,计算机相关专业中最基础的课程也包括C 语言,因此,掌握好这门课程对每一位立志成为优秀程序员的初学者来说是大有裨益的!另外,对想通过参加全国计算机等级考试获得证书的同学来说,学好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%256>130||*pf*11%256<=32)①
{ pf++;
continue;}
*pf=*pf*11%256;
pf++;
}
}
}
分析:这一类题目较例1更为简单,其关键只有①一句,它是对条件“如果计算后f(p)的值小于等于32或大于130”的描述。上机考试中类似的题目可能只对这个条件作少许变动。例如:“如果原字符是大写字母或计算后f(p)的值小于等于32”,则只需把①改为:if ((*pf>=`A`&&&&*pf<=`Z`)||*pf*11%256<=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%256计算,如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("\n命令行中可执行文件名为:%s",argv[0]);
 printf("\n总共有%d个参数:",argc);
 I=0;
 while(argc>=1)
 {printf(″%s ",argv[I++]);
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("\n**模拟DIR**\n 命令目录路径%s",path2);
 done=findfirst(ss,&f,55); /*查找第一个配匹的文件*/
 j=1;
 while(!done)
 {if (f.ff_attrib!=0x10) /* 若文件属性不是目录 */
printf("\n %15s %20ld",f.ff_name,f.ff_fsize);
else
printf("\n &11s ",f.ff_name);
num++;
j++;
if(j==23)
printf("\n --------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开关语句。
5.指针(point)

学习C语言,指针是较难理解的一个概念。我们知道变量在计算机内占有一块存贮区域(也就是有一个“地址”),变量的值就存放在这块区域之中,在计算机内部,通过访问或修改这块区域的内容来访问或修改相应的变量。C语言中,对于变量的访问形式之一,就是先求出变量的地址,然后再通过地址对它进行访问,这就是指针及指针变量。指针变量的一般定义为“类型标识符 *标识符”,其中标识符是指针变量的名字,标识符前加

了“*”号, 表示该变量是指针变量,而最前面的“类型标识符”表示该指针变量所指向的变量的类型。一个指针变量只能指向同一种类型的变量,也就是说,我们不能定义一个指针变量,既能指向一整型变量又能指向双精度变量。

三、C程序设计初步

C语言是一种中级语言,用户用C语言编写的程序称为源程序,源程序文件的后缀一般必须为“.c”。计算机硬件不能直接执行源程序,必须将源程序翻译成二进制目标程序。翻译工作是由编译程序完成的,翻译的过程称为编译,编译的结果称为目标程序,目标程序文件后缀一般为“.OBJ”。程序翻译成目标程序后,便可进行连接。“连接”的目的是使程序变成在计算机上可以执行的最终形式。在这一阶段,系统程序库中的程序要与目标程序连接,连接的结果称为执行程序,执行程序文件名字一般以“.EXE”结尾。 正如所有利用计算机语言所编写的的第一个程序一样,下面,我们也试着建立一个名为“HELLO.C”的源程序,这个程序将在屏幕上面打印出“你好,《电脑报》软件世界!”这个短语。

通过键盘输入程序:

include

main()

{

printf(″你好,《电脑报》软件世界!\n″);

}

这个最简单的程序,也包括了C语言的一些基本的内容,它有一个主函数main(),使用到了标准的输出函数printf(),同时为了能够让程序运行时包含这个标准函数,我们首先要在程序的最开始写上include ,“stdio.h”是C语言提供的标准输入输出函数库头文件,我们可以直接引用里面的一些函数,来完成我们所要实现的功能。

现在,让我们来编译、连接并运行一下这个最简单的程序,我们将看到,在屏幕上打印出了“你好,《电脑报》软件世界!”

四、参考资料

首先是一些C语言相关的书籍:

《C语言》谭浩强,《C语言编程宝典》王大刚,《数据结构与算法――面向对象的C++设计模式》Bruno R. Preiss,《C/C++语言与研究开发实践》伍晓宇、辛勇,《Borland C++ Builder 3.0/4.0类参考详解》张济、袁野、王秀娟,《Borland C++Builder 3.0/4.0高级类参考详解》王秀娟、孙悦、黎华,《C++语言命令详解(第二版)》Brian Overland,《C++程序设计实验指导》钱能。

用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]={"3","2","1","12","11","10","9","8","7","6","5","4"};
initgraph(&gd,&gm,"g:\\tc\\bgi");//图形驱动器路径,根据自己的系统更换。
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("The current time is: %2d:%02d:%02d.%02d\n",t.ti_hour, t.ti_min,
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("\n");
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("%d,%d,%d\n",i,j,k);
 }
}
【程序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("%ld",&i);
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("bonus=%d",bonus);
}
【程序3】
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析:
2.程序源代码:


#include "math.h"
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("\n%ld\n",i);
 }
}

【程序4】
题目:输入某年某月某日,判断这一天是这一年的第几天?
1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
2.程序源代码:


main()
{
int day,month,year,sum,leap;
printf("\nplease input year,month,day\n");
scanf("%d,%d,%d",&year,&month,&day);
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("data error");break;
}
sum=sum+day; /*再加上某天的天数*/
 if(year%400==0||(year%4==0&&year%100!=0))/*判断是不是闰年*/
leap=1;
 else
leap=0;
if(leap==1&&month>2)/*如果是闰年且月份大于2,总天数应该加一天*/
sum++;
printf("It is the %dth day.",sum);}
【程序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("%d%d%d",&x,&y,&z);
 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("small to big: %d %d %d\n",x,y,z);
}
【程序6】
题目:用*号输出字母C的图案。
1.程序分析:可先用'*'号在纸上写出字母C,再分行输出。
2.程序源代码:


#include "stdio.h"
main()
{
printf("Hello C-world!\n");
printf(" ****\n");
printf(" *\n");
printf(" * \n");
printf(" ****\n");
}

【程序7】
题目:输出特殊图案,请在c

环境中运行,看一看,Very Beautiful!
1.程序分析:字符共有256个。不同字符,图形不一样。
2.程序源代码:


#include "stdio.h"
main()
{
char a=176,b=219;
printf("%c%c%c%c%c\n",b,a,a,a,b);
printf("%c%c%c%c%c\n",a,b,a,b,a);
printf("%c%c%c%c%c\n",a,a,b,a,a);
printf("%c%c%c%c%c\n",a,b,a,b,a);
printf("%c%c%c%c%c\n",b,a,a,a,b);}
【程序8】
题目:输出9*9口诀。
1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
2.程序源代码:


#include "stdio.h"
main()
{
 int i,j,result;
 printf("\n");
 for (i=1;i<10;i++)
{ for(j=1;j<10;j++)
{
result=i*j;
printf("%d*%d=%-3d",i,j,result);/*-3d表示左对齐,占3位*/
}
 printf("\n");/*每一行后换行*/
}
}
【程序9】
题目:要求输出国际象棋棋盘。
1.程序分析:用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。
2.程序源代码:


#include "stdio.h"
main()
{
int i,j;
for(i=0;i<8;i++)
 {
for(j=0;j<8;j++)
 if((i+j)%2==0)
printf("%c%c",219,219);
 else
printf(" ");
 printf("\n");
 }
}
【程序10】
题目:打印楼梯,同时在楼梯上方打印两个笑脸。
1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。
2.程序源代码:


#include "stdio.h"
main()
{
int i,j;
printf("\1\1\n");/*输出两个笑脸*/
for(i=1;i<11;i++)
 {
 for(j=1;j<=i;j++)
printf("%c%c",219,219);
 printf("\n");
 }
}
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("%12ld %12ld",f1,f2);
 if(i%2==0) printf("\n");/*控制输出,每行四个*/
 f1=f1+f2; /*前两个月加起来赋值给第三个月*/
 f2=f1+f2; /*前两个月加起来赋值给第

三个月*/
 }
}
==============================================================
【程序12】
题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
2.程序源代码:
#include "math.h"
main()
{
 int m,i,k,h=0,leap=1;
 printf("\n");
 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("%-4d",m);h++;
if(h%10==0)
printf("\n");
}
 leap=1;
}
 printf("\nThe total is %d",h);
}
==============================================================
【程序13】
题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
2.程序源代码:
main()
{
int i,j,k,n;
printf("'water flower'number is:");
 for(n=100;n<1000;n++)
 {
i=n/100;/*分解出百位*/
j=n/10%10;/*分解出十位*/
k=n%10;/*分解出个位*/
if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)
 {
 printf("%-5d",n);
 }
 }
printf("\n");
}

==============================================================


【程序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("\nplease input a number:\n");
scanf("%d",&n);
printf("%d=",n);
for(i=2;i<=n;i++)
 {
while(n!=i)
{
 if(n%i==0)
 { printf("%d*",i);
n=n/i;
 }
 else
break;
}

}
printf("%d",n);}
==============================================================
【程序15】
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
1.程序分析:(a>b)?a:b这是条件运算符的基本例子。
2.程序源代码:


main()
{
 int score;
 char grade;
 printf("please input a score\n");
 scanf("%d",&score);
 grade=score>=90?'A':(score>=60?'B':'C');
 printf("%d belongs to %c",score,grade);
}
==============================================================
【程序16】
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。
2.程序源代码:


main()
{
 int a,b,num1,num2,temp;
 printf("please input two numbers:\n");
 scanf("%d,%d",&num1,&num2);
 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("gongyueshu:%d\n",a);
printf("gongbeishu:%d\n",num1*num2/a);
}

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

2.程序源代码:


#include "stdio.h"
main()
{char c;
 int letters=0,space=0,digit=0,others=0;
 printf("please input some characters\n");
 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("all in all:char=%d space=%d digit=%d others=%d\n",letters,
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("please input a and n\n");

相关文档