c语言指针函数笔记 C语言指针笔记
(OC 初级笔记)OC 常用数学函数(C语言)
1.算数函数
创新互联服务项目包括尼泸西网站建设、尼泸西网站制作、尼泸西网页制作以及尼泸西网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,尼泸西网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到尼泸西省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
1.1产生随机数
rand()
1.2取绝对值
fabs()
1.3取复数的绝对值
cabs(struct complex i)
1.4浮点数的绝对值
fabs()/fabsf()/fabsl()
1.5取余
fmod(double, double)
1.6向上取整
ceil()/ceilf()/ceill()
1.7向下取整
floor()/floorf()/floorl()
1.8求最大值
fmax()/fmaxf()/fmaxl()
1.9求最小值
fmin()/fminf()/fminl()
1.10四舍五入
round()/roundf()/roundl()
2.指数与对数
2.1求 n 的 m 次方的值
pow(n, m)/powf(n, m)/powl(n, m)
2.2求 e 的 x 次方
exp(x)/expf(x)/expl(x)
2.3以 e 为底的对数值
log()/logf()/logl()
2.4以10为底的对数
log10()/log10f()/log10l()
2.5开平方(根号)
sqrt()
3.三角函数
3.1正弦值
sin()/sinf()/sinl()
3.2余弦值
cons()/cosf()/cosl()
3.3正切值
tan()/tanf()/tanl()
3.4双曲线正弦值
sinh()/sinhf()/sinhl()
3.5双曲线余弦值
cosh()/coshf()/coshl()
3.4双曲线正切值
tanh()/tanhf()/tanhl()
4.反三角函数
4.1反正弦值
asin()/asinf()/asinl()
4.2反余弦值
acos()/acosf()/acosl()
4.3反正切值
atan()/atanf()/atanl()
4.4反双曲线正弦值
asinh()/asinhf()/asinhl()
4.5反双曲线余弦值
acosh()/acoshf()/acoshl()
4.6反双曲线正切值
atanh()/atanhf()/atanhl()
C语言中交换两个数为什么一定要用指针和调用函数?
我刚入门的时候也是这样想的,哈哈。
但是随着你学的深入,你会知道指针才是c语言的灵魂。
用函数交换变量,如果不用指针的话,是无法进行的,因为函数只能改变形参,而对于主函数的实参,是没有交换作用的(这里得好好想想,初学可能会糊涂的点就在这)
指针的作用很多的,下面是我上课做的一些笔记,你可以看看。
有什么问题再追问我哦~
指针的重要性
表示一些复杂的数据结构
快速的传递数据,减少内存的耗用
使函数返回一个以上的值
能直接访问硬件
能够方便地处理字符串
是理解面向对象语言中引用的基础
总结:指针是c语言的灵魂
一道简单C语言指针问题编程题!麻烦高手帮我改的简单容易理解,英文单词别很多还难!麻烦了
因为某种原因,本人共考过2次笔试,3次上机。其中笔试在70左右,3次上机均为满分,
看着大批的同学在为三级发愁不知道如何准备和应考。我想我应该把经验和学习的方法写下
来,这些方法保证你能过三级。但是不保证你能获得高分并学到知识,所以请各位计算机系
与爱好电脑的高手或自认为是高手的同志们就此打住。OK!
以网络技术为例(其他三门的方法相似),我把方法总结为:细看书,做笔记,多复习。
第一阶段:看网络技术教材,详细地做笔记(20天).
第一边看书你要看得特别仔细,把所有你认为重要的地方全抄到笔记本上,包括重要的
表格和插图。第一次看不懂的地方可以跳过去等过两天再回头看一遍。每天看新的知识之前
都将前两天看的再复习一遍,强化记忆。
我把全书的重要程度划分了一下:第一,七,八章 了解(看看做做笔记就行了);
第二,四章 理解(看懂主要的知识点);第三,五,六章 掌握(看懂所有的知识点);
其中又以以下章节为重点:2.2 进程 2.3 存储管理 2.4 文件管理 2.5 设备管理
(我当时这一节的题都挂了) 3.5 双绞线 VS 同轴电缆 3.6 OSI VS TCP/IP 4.3 以太网
4.5 组网技术 4.8 网络互连 5.3 IP协议 6.4 加密技术 其中有些内容必须理解并掌握,
要是不理解,背也要背下来。如:OSI协议和TCP/IP协议的各层的名字,各种传输介质和各种
以太网的参数等。
另外所有教材上没有的内容不用看,因为考试出的题没有一道是书本之外的。
=== 要点一:坚持就是胜利,每天坚持看2个小时,至少能看15页。
=== 要点二:该抄就抄,好记性不如坏笔头。
=== 要点三:注意课后作业题,那可能就是原题。
这一阶段完成后,应该能够理解大部分的知识点。还要能够很快的在书中找到某个知识
点的位置。
第二阶段:复习重点章节(5天)
这一次复习的重点在那些需要理解和掌握的内容上,如果你看懂了,合上书想一遍,看
不懂就多看两遍,有些重点一定要记住。而且要把笔记本大声地读上两遍,达到更加熟练。
=== 要点一:看懂不一定会记住,一定要在脑海中形成印象,合上书能写下来。
=== 要点二:名词术语要注意。
=== 要点三:缩略语。凡是在书上出现过两遍的,一定要记下中英文解释。
例如:CDMA/CD,MFLOPS等。
第三阶段:复习不重要的章节和作题(5天)
有人也许要问,既然不重要还复习它干什么。错!出题人不能用重点凑成一百分要适当的
加点其他内容。于是只有在这些不重要的章节里面出了,这些题大概占20分左右。得分的方法
是将所有不太重要的章节再看一遍,越是你认为不可能出的,越要把它抄下来,记一记。而且
要特别注意数字,如ATM的传输速率,单模光纤所使用的光的波长等。(上次最呕吐的的一道
题是,信号从发送站经过卫星到接收站的传输延迟的典型值是多少?我按照同步地球卫星到地
球的距离,光的传输速度,算到百毫秒的量级,但是算不出具体的值,于是猜了一个250ms。
答案居然是540ms。晕倒~!)
还有就是模拟题的问题,我认为现在市面上的模拟题都太差了,考的全没有,不考的全有
了,说实话还不如我出的呢。所以题不用多做,只要把书看好就行,最后几天可以做几套,熟
悉一下题型,掌握一下时间就够了,多做全是浪费。
以上方法我一个同学上次照着我说的做了,结果笔试考分比我还高。所以不管你聪明不聪
明,只要你照我说的做了,一定能通过。
一句话:要是不过你拿我是问。
上机部分现在只有一到c语言编程题,非常简单。但我认为最重要的是能够编译程序和调试
程序,也就是说,一道题你能在纸上写下来还不够,一定要能够在机器上运行出结果才行,因为
编译系统及机器的不同,有的对的程序也可能产生大量的错误。只要你能把错误找出来就差不多
能过了。
因此我把方法总结为:多思考,多上机,捉虫子。(以谭浩强的《c语言设计》第二版为例)
第一阶段:看书,做笔记。(15天)
有人说那本书那么厚,15天能看完吗?错!谁说让你们看完了,你要是只是想过三级。只用
看前140页就足够了。也就是,第一章,了解,第二,三章理解,第五,六,七章掌握,第八,
第十章随便看一下就行了。因为c上机只要求你填一个函数,所以函数那一章不用看太仔细,只
要知道函数是干什么用的,它们之间是如何调用的就行了。至于指针,所有的考题全都能用数组
做出来,用指针只不过是简单一点,容易出错一点而已,我是强烈建议不用指针。第九章和第十
一章以后一概不用看。
=== 要点一:勤记,把所有重要的东西都记在笔记本上。如转义字符的定义等。
=== 要点二:每天上机调试两个程序(可以是例题或作业题)
=== 要点三:坚持,再坚持。
第二阶段:做课后作业题并上机调试。(10天)
现在书你已看完,练习题也可能做出了一些。现在就是要把前几章特别是五六七三章的课后
题一定要自己思考一下,做出来后再上机调试,是在做不出来,就看看答案,看懂后,再在机器
上调试一下也行。
重要例题:例 4.10 4.12 5.4 5.5 5.6 5.7 5.8 6.6 6.8 6.10 7.2 7.2 7.8 7.9
重要习题:4.5 4.9 5.5 5.7 5.8 6.1~6.10 7.1~7.14
=== 要点一:做题时使用N-S流程图。
=== 要点二:每道题不管多么简单,一定要调试直到正确为止。如习题2.4(2)我有几个同
学都是能编出来,但是怎么都运行不正确。
=== 要点三:每天上机作五道题以上,最好在TC2.0环境下。
第三阶段:继续调试重要程序,看一本书(5天)
继续调试程序直到熟练,然后看一本书,书名我先不说,可能许多同学都知道。但我不赞成
看这本书,而且我劝你到最后几天再看,挑出一部分典型的题看一下,自己做做,看是否正确,
熟悉一下题型,不要完全依赖那本书。那样可能因为一点小错误你找不出来就挂了。我们班的女
生们第一次因为这个原因挂的可不是少数。
还是那句话:要是你上机不过找我是问。
········回顾过去的大学生活,计算机等级考试最令人难忘。笔者斗胆在这里卖弄一下过去两年(准确的说是一年半)里通过全国计算机等级考试二到四级的经历,以自己的感受泡制一份全国计算机等级考试全攻略,希望对后来的朋友们尤其是刚刚迈入大学校门的师弟师妹们有所帮助。
考证路上,有两点需要特别注意。一是一次只能报考一个等级(包括笔试和上机)的考试。一个级别中有不同类别,考生只能选择其中一类。另外,考试单科合格者,成绩只保留到下一个考试周期。所以不想找麻烦的话就要认真准备,争取一次OK,否则会对信心造成打击。
一级考试
对于一级考试,其实没什么好说的,大部分人不必报考这一级别,既浪费金钱又浪费生命。因而笔者强烈建议不要考这一级别。如果你不得不参加这一级别考试的话,笔者在表示同情之余建议你在熟悉常用软件之余研究一下WPS,在以后的全国计算机等级考试(一级)中 ,WPS将成为一门单独的考试科目。
二级考试
二级考试是大部分人都必须参加的。二级考试的内容包括基础知识和程序设计两大部分。 基础知识主要包括电脑基本知识,DOS基本知识和基本操作,WINDOWS的基本概念与操作。关于这部分知识有点水准的辅导书就会有详细的介绍,只要把书好好看看就没什么问题。DOS中的文件、目录、路径的概念及使用是必考部分,要留意。(相关阅读:如何应付新大纲二级考试的公共基础知识)
二级考试的重中之重是程序部分。要对语言的基础知识熟练掌握,尤其要留意基础概念和基本方法(选择法、冒泡法等),要能看懂书上给的程序。一般来说,如果能独立做出大部分课后题就一切OK了。对语言的工夫应该下在平时,多想,多练,多上机。自己考虑作一些小程序会有很大帮助的(别人崇敬的目光就会让你觉得很有价值)。二级DOS类考试的上机考试包括三个部分的内容,即DOS操作题,程序修改题和程序编制题。如果你的C语言有一定水准的话,较难的部分就是程序修改题了,毕竟了解陌生人的思路是一件比较难的事。因此平时要多读一些程序,自己编程时注意要尽量符合规范,否则很容易吃亏。当然多上机练习是取得好成绩的不二法门。关于辅导书大连理工出版社和南开出版社的都相当不错。
三级考试
三级是一个比较麻烦的等级。它共有四个类别,可以大致分两种。 三级PC上机是考汇编程序,其他三个类别考C程序。如果不是对自己特别有信心的话一般不要报考PC技术。毕竟学习汇编语言也是不小的负担 ,而且对报考四级没什么帮助(四级不考汇编!)。对于其他三种主要看自己的兴趣了。相对来说数据库要难一点(对数学系的除外)。三级的四个类别各有侧重,比较麻烦的是对于四级来说都太片面了,所以帮助不大。因此基础比较好的,直考四级也是可以考虑的。(相关阅读:通过计算机等级考试三级网络的经验)
笔试部分是三级的难点,所要记忆的内容比二级增加很多。要注意对基本理论和基础概念的掌握,有利于知识网络的形成,减少记忆负担。
由于三级刚刚改革不久,各个出版社出版的辅导书都很难贴近考试。这种情况下多看书就成了最好的选择。从近两次考试的情况看,出题也很接近课本(尤其是网络技术,有部分教材原话)。三级上机考试难度比二级提高并不大,较复杂的部分如文件读写,函数调用等通常题目已给出,因而所考的依然是比较基本和典型的算法。
四级考试
四级是最后一级,也是知识最复杂的一级。报考四级是需要一点信心和勇气的,你报考四级后身边几乎不可避免的出现一片质疑声(当我报四级时老师竟然告诉我本校从来没人通过),这时候一定要相信自己。(相关阅读:帮你全面了解全国计算级等级考试-四级)
四级通过的人数的确是非常少(相对三级),但要看到四级报考人数也是最少的。四级知识量是巨大的(看看那厚厚的教材就知道了),难点主要是离散数学和计算机英语。对于离散数学,如果有机会旁听一下计算机专业的核心课程《离散数学》会很有帮助的。要记住一定要作一定数量的习题!仅仅通过识记是无法提高水平的。
计算机英语没有想象中的困难,常用的单词只有几百个,只要把近5、6年的试题中英语题过一遍就差不多了。手头最好有一本专业词典,大部分单词在文曲星上查不到 。相对来说英语题比较简单,只要单词认识就OK了。
笔试中比较新鲜的是论述题。建议买一本历年试题及参考答案(每年国家考试中心都出版),仔细研究一下,掌握答题方法。比较幸运的是论述题通常有四道,可以选择自己最有把握的。由于四级考试已经举行多年,各出版社出的辅导书都比较扣题。笔者强烈推荐大连理工出版社出版的《全国计算机等级考试题典(四级)》。这本书贴近考试,解答详尽,对顺利过级会有很大帮助!一定要做历年试题(5年以内),确实是有一定复现率的!
四级上机考试和三级差不多,只有一道编程题,注意别紧张,一定要存盘,否则会变为0分。当时跟我一个考场的同学就有人因为慌乱忘记存盘,造成下午的考试没有通过。(相关阅读:全国计算机四级考试经验谈)
结束语:最后,不管面对任何考试都需要对自己要信心,相信即使只有一个人通过,那个人也一定是自己!这时你就成功一半了。预祝每一位考生能够在9月的考试中取得理想的成绩!
计算机考试备忘录
首先是报考时间问题。虽说大学有四年,但是如果你要考研究生的话(大部分人都会考的),从大三下学期就该开始准备了,所以留给等级考试的时间其实只有两年半而已(四次机会)。因此,如果你是大一的新生,应该考虑报考明年四月的考试。因为全国计算机等级考试是面对非专业人士的,所以难度并不太高(当然也不很容易,否则听我唠叨什么)。如果你的学校没有一级必考之类的变态规定话,就应该坚决跳过一级从二级开考(时间宝贵,不应该为没意义的事浪费半年时光)。平心而论,二级知识非常基础,只要认真准备(你有整整一个寒假的时间准备)过关是很容易的(即使你的计算机基础很差)。
虽然三级证书一样可以拿到学位证,并且越级考试也是被许可的,但笔者不提倡直接报考三级(即使你的计算机基础很好)。直接过三级虽然是一件很酷的事,但这要担相当的风险,一旦失误(这是很可能的事,毕竟三级是有一定难度的),你就不得不与刚通过二级的同学一起考试。除非你的神经有下水管道那么粗,不然会有很大压力,而且对信心的打击不容忽视。如果你对自己的计算机水平很有自信的话,二级证书到手后跳过三级直考四级倒是可以考虑的,那样风险和效率比较均衡。
另一个比较重要的问题是计算机语言的选择问题。笔者强烈推荐学习C语言。C语言不但本身逻辑清楚,实用性强而且扩展性很强,方便以后学习C++,C#等语言。如果你有狮子一样的雄心,更应该选择C语言,要注意到四级和高级程序员考试都要求C语言!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@计算机三级考试马上就要到了,然而很多朋友对计算机上机考试却仍旧十分茫然,
参加这次考试的人有很大一部分是上次机试没有通过的朋友,甚至还有一些考了两次机试都没有通过的……
这其中不乏一些C语言学的很不错的高手,大部分人到现在都不明白为什么自己亲手编的程序却是0分……
究竟是什么原因呢?不就是那100道题目吗?翻来覆去的看也没有发现自己的程序有什么错误啊,看资料,用模拟盘模拟也是满分啊,可为什么正式考试就是0分呢?
于是很多人甚至把通过上机考试当成一件*运气的事了,甚至有的朋友对上机考试感到十分恐惧
然而这其中真正的原因……
大家不妨和我一起看一下考试中心命题组的正确答案~
顺便提醒一下大家在考试的时候要注意的问题,希望对大家有所帮助。
第一条:审题要仔细!正式考试的时候会遇到很多面熟的题目,这些题目有的似乎和
平常资料中看到的一样,然而,千万不要见到面熟的题目而沾沾自喜,因为有很多的
“陷阱”会使你审题的时候就出错~!
我们看一道所有人都做过的的 “数字题目” 。
考试中心命题组第23题:
已知在文件in.dat中存有N个实数,(N200),函数readdat()是读取这N个实数并存入数组xx中。
请编制函数CalValue(),其功能要求:
1、求出这N个实数的整数部分平均值aver;
2、分别求出这N个实数中其整数部分值小于平均值ever的数的整数部分值之和sumint与小数部分之和sumdec
最后调用函数WriteDat()把所求的结果输出到文件OUT8.dat中。
这一题看起来很眼熟,然而你仔细看~!
1、aver是整数部分的平均值~!不是普通的哦!
2、整数部分值小于平均值ever的数的整数部分值之和sumint与小数部分之和sumdec!!
呼~,原来这么复杂~!稍不留心就错了~,结果就想当然的……0分
考试中心命题组第4题
函数ReadDat()实现从文件ENG.IN中读取一篇英文文章存入到字符
串数组xx中;请编制函数ComWord()分别计算出10个不区分大小写
的英文单词的首字母(b,c,f,s,n,r,u,e,o,p)的频数并依次存入
整型数组yy[0]至yy[9]中,最后调用函数WriteDat( )把结果yy
输出到文件PS1.OUT中。
这题也很眼熟,然而你仔细看~!
英文单词的首字母,呵呵,不是平常的字母的个数,是作为单词的首字母的个数啊,晕~
上面两道题目并没有在其他资料上见过,考试的时候也不一定会出,
这里仅仅是给大家提个醒儿,正式考试一定要仔细审题,严格按照题目的要求去做,
不要受以前做过的题目的影响。
第二条:一定要考虑除零、溢出、类型转换、精度等细节问题~!!
虽然我们在平时学C语言的时候老师都提醒过,可是真正到了编程序的时候,
却没有几个人会考虑。这些细节问题似乎并不直接影响题目的输出结果,
然而,因为溢出和类型转换错误而造成考试得不到满分的可是大有人在啊!
我们看下面一道最害人的题目~!!,很多朋友考了这道题目都没有过。
下面来看看你为什么是0分~!
考试中心命题组64题:
请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,
仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS8.DAT中。
替代关系:f(p)=p*11 mod 256 (p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),
如果原字符小于等于32或大于130,则该字符不变,否则将f(p)所对应的字符进行替代。
这道题目所有的人都做过,但几乎就没有人做对,包括南开无忧在内~!
原因就在于这一句!
无忧:int f; f=(xx[i][k]*11)%256;
南开:char *pf; *pf=*pf*11%256;
表面看来,好象两个都对,
请你在TC下运行一下下面的代码,看一下结果你就知道了是怎么回事了……:
main()
{
char nk='E',*nkp,wuyou='E';
int wy;
nkp=nk;
*nkp=*nkp*11%256;
wy=wuyou*11%256;
printf("%c %c %c %c\n",nk,*nkp,wuyou,wy);
printf("%d %d %d %d\n",nk,*nkp,wuyou,wy);
}
看到结果了么?是不是很吃惊啊?
≈ ≈ E ≈
-9 -9 69 247
大家看到了,南开的结果是负数,连原来的变量nk都变成了负数,这显然错了。
无忧的聪明一点,知道int比char大,定义了个int,对了。
南开错误原因就是在TC2.0中char型变量只有一个字节,根本容纳不下'E'*11,
所以产生了溢出,上次考这道题目没过的同学是不是有所启发呢?
这里给出考试中心命题组的答案:
void encryptChar(){
int i,k,ch;
for(i=0;imaxline;i++)
for(k=0;kstrlen(xx[i]);k++){
ch=xx[i][k];
ch=(ch*11)%256;
if(!(ch=32||ch=130))xx[i][k]=ch;
}
}
似乎一个例子不能说明什么,那就把上面的数字题目的答案给大家看看:
考试中心命题组23题答案:
int i;
long val;
float dec;
for(i=0;iN;i++){
val=(long)xx[i];
aver+=xx[i]-val;
}
aver/=(double)N;
for(i=0;iN;i++){
val=(long)xx[i];
dec=xx[i]-val;
if(decaver){
sumint+=val;
sumdec+=(xx[i]-val);
}
}
看到了吧,首先,val的定义,不是我们习惯的int,而是能容纳更大数的 long ,
这样在求和的时候就不会溢出,无忧和南开的答案没有吧~
再看,算aver平均值的细节,不是我们平常习惯的aver/=N,更不是无忧的1.0* sum/N,
而是aver/=(double)N,所以大家在考试的时候要时刻注意你的变量类型,特别是在一些求平均值的题目中,千万要注意,用sum/n的时候,sum的类型一定不要用整形。
第三条:不要使用快捷键!!很多人在使用TC的时候习惯于用F9,CTRL+F9或者其他的热键,
首先F9只是编译了,并没有运行程序,考试一定要运行一下你的程序才会有输出文件,
否则一定是0分。
热键在考试的时候是很危险的,因为UCDOS的热键和TC的冲突,CTRL+F9变成了全角半角转换,
如果不小心按了,会导致你的程序有中文字符,编译的时候出错,而且很难查找排除错误~!
所以建议大家在考试的时候使用ALT+红色字母 来调出菜单进行编译调试等步骤,建议步骤为:
写完代码后用ALT+F,S存盘,然后ALT+C,M编译,然后ALT+R,R运行,这样就万无一失了。
第四条:不要加载任何输入法
上机考试用的DOS环境内存十分有限,如果你加载了任何一个输入法,都有可能造成编译程序的时候出现out of memory 内存不足的情况,到那时就麻烦了。
程序只要写的对就可以,不要画蛇添足的加注释,没有人看的~!
第五条:不要提前交卷!考场一般使用NOVELL网络,有的时候存在网络状况不好而连接失败等问题,
这时,如果你已经提前交卷的话就不太好了。另外也可以防止别人有意无意的改动你的程序。
第六条:考试时候的一些技巧。
1、进入TC以后如果想查看题干要求,不用退出TC,直接用F12就可以显示出来。
2、用F12显示题目之后可以通过CTRL+BACKSPACE把题目定在屏幕上。
3、编译运行之后,可以通过type out.dat或edit out.dat或tc out.dat查看输出文件。
(千万不要改动!不然影响考试结果。如果不小心改动,再重新编译运行一次你的程序就可以了)
4、如果考试的时候不小心改动了代码的主函数或其他部分,可以进入考生目录下的warn隐藏目录,
把里边的备份文件复制到考生目录。步骤:
在考生目录下输入cd warn
输入copy *.c ..输入cd ..
就可以了
5、如果调试的时候不小心死循环了,可以通过CTRL+C或CTRL+BREAK来终止,如果连按多次都没反应,
不要慌,立即找监考老师说明情况,可以重新启动机器继续答原题,你的程序还在,时间也是继续刚才的。
所以这也提醒大家,运行程序之前一定要先存盘。
c语言的一个指针题,,,很重要!!!求大神帮帮忙 抄笔记的时候不认真,,,程序运行不出来,
根据你的题目, 我重新给你写了完整的程序,你可以参考下。
源代码如下(在vc++ 6.0下编译通过):
#include stdio.h
#include stdlib.h
#include string.h
#define __DEBUG_PRINT
#define MAX_STR_LEN 30
void count(char *str)
{
int number_count = 0;
int non_number_char_count = 0;
while (*str != '\0')
{
if (*str = '0' *str = '9')
{
number_count++;
}
else
{
if ( (*str 'z' || *str 'a')
(*str 'Z' || *str 'A') )
{
non_number_char_count++;
}
}
str++;
}
printf("The count of number is: %d\n", number_count);
printf("The count of non number and non charactor is: %d\n", non_number_char_count);
return;
}
int main(void)
{
int i = 1;
int str_num = 0;
char **pStr = NULL;
int tmp = 0;
printf("Pls input the string number(=100): ");
scanf("%d", str_num);
pStr = (char **)malloc(str_num * sizeof(char));
printf("pls input each string.\n");
tmp = str_num;
while (tmp--)
{
*pStr = (char *)malloc(MAX_STR_LEN * sizeof(char));
printf("string%d: \n", i++);
scanf("%s", *pStr);
pStr += MAX_STR_LEN;
}
pStr -= MAX_STR_LEN * str_num;
#ifdef __DEBUG_PRINT
i = 1;
tmp = str_num;
printf("The following are your input: \n");
while (tmp--)
{
printf("string%d: %s\n", i++, *pStr);
pStr += MAX_STR_LEN;
}
pStr -= MAX_STR_LEN * str_num;
#endif
printf("The following is the result: \n");
i = 1;
tmp = str_num;
while (tmp--)
{
printf("string%d: \n", i++);
count(*pStr);
free(*pStr);
pStr += MAX_STR_LEN;
}
free(pStr);
return 0;
}
C语言笔记(五)----struct,enum,typedef等
成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。
对每个成员也必须做类型声明。
其形式为:
类型声明符 成员名;
例如:
注意, 最后括号外面的;分号是不可少的 。
结构定义之后,才可以进行变量声明。
凡声明为结构 stu 的变量都由上述4个成员组成。
由此可见,结构是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。
声明结构变量 有以下三种方法。
使用上面定义的stu为例:
如:
也可以用宏定义使一个符号常量来表示一个结构类型。例如:
例如:
这种形式的声明的一般形式为:
例如:
这种声明的一般形式为:
第三种方法与第二种方法的区别在于第三种方法中省去了结构名,而直接给出结构变量。
在程序中使用结构变量时,往往不把她作为一个整体来使用。
在ANSI C中除了允许有相同类型的结构变量相互赋值以外,一般对结构变量的使用,包括 赋值、输入、输出、运算 等都是通过结构变量的成员来实现的。
表示结构变量成员的一般形式为:
结构变量名.成员名
例如: boy1.num boy2.sex
如果成员本身又是一个结构,则必须逐级找到最低级的成员才能使用。如: boy1.birthday.month
结构变量的赋值就是给各成员赋值。
数组的元素也可以是结构类型的。
因此可以构成结构型数组。
初始化赋值:
当然也可以在定义 stu结构 时同时声明 pstu。
赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。
如果 boy 是被声明为 stu类型 的结构变量。
则:
有了结构指针变量,就能更方便地访问结构变量的各个成员。
其访问的一般形式为:
(*结构指针变量).成员名
或
结构指针变量-成员名
例如: (*pstu).num 或 pstu-num
例如:
介绍数组的时候,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变。
C语言中不允许动态数组类型。
例如:
但是又有此需求,为了解决这个问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。
常用的内存管理函数有3个:
例子:分配一块区域,输入一个学生数据
上面的例子采用了动态分配的办法为一个结构分配内存空间。
每一次分配一块空间可用来存放一个学生的数据,我们可称之为一个节点。
有多少个学生就应该申请分配多少块内存空间,也就是说要建立多少个节点。
当然用结构数组也可以完成上述工作,但如果预先不能准确把握学生人数,也就无法确定数组大小。
而且当学生留级、退学之后也不能把该元素占用的空间从数组中释放出来。
用动态存储的方法可以很好地解决这些问题。
有一个学生就分配一个节点,无须预先确定学生的准确人数,某学生退学,可删去该节点,并释放该节点占用的存储空间,从而节约了宝贵的内存资源。
另一方面,用数组的方法必须占用一块连续的内存区域。
而使用动态分配时,每个节点之间可以是不连续的(节点内是连续的)。
节点之间的关系可以用指针实现。
即在节点结构中定义一个成员项来存放下一节点的首地址,这个用于存放地址的成员,常把他称为指针域。
可在第一个节点的指针域内 存入第二个节点的首地址,在第二个节点的指针域内 又存入第三个节点的首地址,如此串联下去直到最后一个节点。
最后一个节点因无后续节点连接,其指针域可赋值 0
这种连接方式,在数据结构中称为“链表”。
链表的基本操作主要有以下几种:
例子:建立一个三个节点的链表,存放学生数据。为简单起见,我们假定学生数据结构中只有学号和年龄两项。可编写一个建立链表的函数create。程序如下:
create函数 用于建立一个有 n个节点 的链表,他是一个指针函数,他返回的指针指向 stu结构。
在create函数内定义了三个 stu结构 的指针变量。
head为头指针,pf为指向两相邻节点的前一节点的指针变量。
pb为后一节点的指针变量。
枚举是一种 基本数据类型 ,而不是一种 构造类型 ,因为他不能再分解为任何基本类型。
enum 枚举名{ 枚举值表 };
例如: enum weekday { sun,mou,tue,wed,thu,fri,sat };
enum weeakday a,b,c;
或者为:
enum weekday { sun,mou,tue,wed,thu,fri,sat }a,b,c;
或者为:
enum { sun,mou,tue,wed,thu,fri,sat }a,b,c;
例子:
说明:
只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如:
a=sun;b=mon; 是正确的
a=0;b=1; 是错误的。
如果一定要把数值赋予枚举变量,则必须使用强制类型转换。
如: a=(enum weekday)2;
还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。
例子:
typedef定义的一般形式为:
typedef 原类型名 新类型名
其中原类型名中含有定义部分,新类型名一般用大写表示,一般用大写表示,以便于区别。
有时也可用 宏定义 来代替 typedef 功能,但是 宏定义 是由 预处理 完成的,而 typedef 则是 在编译时 完成的,后者更为灵活方便。
使用 typedef 定义数组、指针、结构等类型将带来很大的方便,不仅使书写简单而且使意义更加明确,因而增强了可读性。
例如:
又如:
文章标题:c语言指针函数笔记 C语言指针笔记
URL标题:http://pwwzsj.com/article/doopijc.html