版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言难点分析整理!转贴这篇文章主要是介绍一些在复习C语言的过程中笔者个人认为比较重点的地方,较好的学握这 些車点会使对C的运用更加得心应手。此外会包括一些细节、易错的地方。涉及的主婆内容包 括:变量的作用域和存储类别、函数、数组、字符串、指针、文件、链表等。一些最基本的概念 此就不多作解释了,仅希琨能有只吉片语给同是C语言初学者的学习和上机过用提供一点点 的帮助。变量作用域和存储类别:局部变量前态变虽:(离开函数,变虽:值仍保留)门动变量寄存器变量全局变就静态变量(只能任本文件中用)非静态变鼠(允许其他文件使用)静态存储变量静态局部变量(函数)形式参数静态全局变戢(本文件)非静态全周/外部变
2、屋(其他文件引用)动态存储变量口动变星寄1?器变虽extern熨的储变最在处理多文件问题时常能用到,在一个文件中定义extern 型的变量即说明这个变最用的是其他文件的。顺便说一下,笔者在做课设时遇到 out of memory的错谋,丁足改成做多文件,再把它include进來(注总I己写 的th雯用“”不用),能起到一定的效用。static型的在读程序'弓结果的试题 中是个考点。多数时候整个程序会出现多个定义的变暈在不同的函数中,考査在 不同位置同一变最的值是多少。主要是遵循一个原则,只耍木函数内没有定义的 变葩就用全周变M:(而不是main电的),全局变最和局部变戢重名时局部变最
3、起作用,当然还耍注意静态与门动变彊的区别。函数:对于函数最基木的理解是从那个叫main的单词开始的,一开始总会觉得把语句 一并写Amain里不是挺好的么,为什么偏择出去。其实这是因为对函数还不够 熟练,否则函数的运用会给我们编程带來极大的便利。我们农知道函数的返冋值 类型,参数的类熨,以及调用换数时的形式。爭先的西数说明也能起到一个提醍的好作用。所谓形参和实参,即在调用函数时吗在括号里的就是实参,函数本身 用的就是形参,在価流程图时用平行四边形表小传参。函数的另一个应用例子就是递川了,笔者开始比较头疼的问题,反应总是比较迟 钝,按照老师的方法,把递旷I的过程耐心准确的逐级画出來,学习的效果还是
4、比 较好的,会觉得这种递归的运用是挺巧的,事实上,著名的八皐后、汉诺塔等问 题都用到了递归。例子:long fun(int n)long s;if(n=1|n=2) s=2;else s=n-fun(n-1);return s;main()printf(w%ldMtfun(4);数组:分为一维数组和多维数组,其“储方式画为表格的话就会一目了然,其实就是把 相同类熨的变最有序的放在一起。因此,在处理比较多的数据时(这也是大多数 的情况)数组的应用范嗣是非常广的。具体的实际应用不便举例,而且绝大多数是与指针相结介的,笔者个人认为学习 数组在更大程度上是为学习指针做一个铺恨 作为基础的棊础要明片儿种
5、基本操 作:即数组赋值、打印、排序(冒泡排序法和选择排序法)、査找。这些都不可 避免的用到循环,如果觉得反应不过來,可以先一点点的把循环展开,就会越來 越熟悉,以后自己编写一个功能的时候就会先找出内在规律,较好的运用了。另 外数组做参数时,一维的Q里可以是空的,二维的第一个里可以是空的但是第 二个Q中必须规定大小。旨泡法排序函数:void bubble(int aQjnt n)int IJ,k;for(i=1,i<n;i+)for(j=0;j<rH;j+)if(aQ>aO+1)k=aj;aD=afi+1;a0+1)=k;选卄法代序函数:void sortfint a,int
6、n)int i,j,k,t;for(i=0,i<n-1 ;i+)k=i;for(j=k1;j<n;j+)if(a【k<aO) k=j;if(k!=i)ai=a(kj;ak=t;折半査找函数(原数组有序):void search(int aQ.int x)int left=O,right=n-1 .mid.flag-O;while(flag=O)&&(left<=right)mid=(left*right)/2;if(x=amid)printf(M%d%dx.mid);flag =1;else if(x<amid) right=mid1;
7、else left=mid+1;相关常用的算法还有判断回文,求阶乘,Fibanacci数列,任意进制转换,杨辉 三角形计算答等。字符串:字符串其实就是一个数组(指针),在scant的输入列中是不需更在前而加“&” 符号的,因为字符数组劣本身即代表地址。值得注意的是字符串末尾的'0',如 果没有的话,字符串很有可能会不正常的打卬。另外就是字符串的定义和赋值问 题了,笔者有一次的比较综合的上机作业就是字符串打印老是乱码,上上下下找 了一圈问题,瑕后发现是因为char 5ame;而不是char name(10);前者没有说明指向哪儿,更没有确定大小,导致了乱码的错误,印象挺深
8、刻的。另外,字符吊的赋值也是需耍注意的,如果是用字符指针的话,既可以定义的时候赋初值,即char 怡二"Abcdefg"也可以在赋值语句中赋值,即char ea;a=MAbcdefgH;但如果是用字符数组的话,就只能在定义时整体赋初值,即char a二“abed”; 而不能在赋值语句屮整体赋值。常用字符串函数列表如下,耍会门己实现:字符串拷贝函数strcpy(char*,char *)后者拷贝到前者字符串追加西数strcat(char*,char *)后者追加到前者屁 返冋前者.因此前者空间要足够大字符串比较函数strcmp(charchar *)询者等于、小丁 =人于后者
9、时.返回0、止值、负值。注总,不是比较长度是比较字符ASCII码的大小,可用于按姓名字母排序等。字符串长度strlen(char )返回字符串的长度,不包括2转义字符算一字符串型整吃atoi(char *)整申"字符串空itoa(int,char int)做课设时挺有用的sprintf(char 化输赋给字符串,而不打印出来。课设时用也比入)较方便注:对字符巾是不允许做=或!二的运算的,只能用字符串比较函数指针:指针可以说是C语言中最关键的地方其实这个“指针”的名字对于这个概念的 理解是十分形彖的。首先要知道,指针变量的值(即指针变量中存放的值)是指 针(即地址)。指针变量定义形式中
10、:基本类型少指针变最名中的“"代表的是这是一个指向该基木类型的指针变量,而不是内容的意思。在以后使用的时候,ill*ptr=a时,从”才表示ptr所指向的地址甲.放的内容是a。指针比较典型乂简单的一应用例子是两数互换,看下面的程序,swap(int c,int d)int t;main()int a=2,b=3;swap(a,b);printfr%d.%d".a,b);这是不能实现m和b的数值斤换的,实际I:只是形参右:这个函数中换來换公,对实参没什么影响。现在,用指针类型的数据做为参数的话,更改如下:swap(#3333FF *p1,int *p2)int t;t=*p1
11、;*p1=*p2;#p2=t;main()int a=2,b=3;int eptr1,*ptr2;ptr1=&a;ptr2=&b;swap(prt1.ptr2);printfdd:a,b);这样在swap中就把p1,p2的内容给换了,即把a, b的值互换了。指针可以执行增、减运算,结介+运算符的法则,我们可以看到:指针和数组实际上儿乎是一样的,数组名可以看成是一个常最指针,一维数组中 ptr=&bO则K面的表示法是等价的:a3等价于(a+3)ptr3等价于 *(ptr+3)下而看一个用指针來I'l己实现atoi (字符串型亠整型)函数:int atoi(char
12、 *s)int sign=1,m=0;/*判断是否有符号*sign=Cs+*=,+l)?1 :-1;广川到三 II运算符/whiles!JO)厂对毎一个7符进行操作m=mM0*Cs-,0,);sr广指向下一个字符/return m*sign;指向多维数组的指针变最也是一个比较广泛的运用。例如数组a34, a代表的 实际是整个二维数纽的首地11卜,即第0行的首地址,也就是一个指针变量。而m +1就不是简单的在数值上加上1 了,它代表的不是a01,而是第1行的首地 址,&a10o指针变応常用的用途还有把指针作为参数传递给其他函数,即指向函数的指针。看下面的儿行代码:void lnput(S
13、T );void Output(ST *);void Bubble(ST );void Find(ST *);void Failure(ST *);广函数声明:这五个函数都是以一个指向ST型(事先定义过)结构的指针变量作为参数,无返回值。7void (*process5)(ST Input.Output.Bubble.Find.Failure;fprocess被调用时提供5种功能不同的旳数共选择(指向醺数的指针数纟|) /printf(MnChoose:n?M);scanf(H%dM,&choice);if(chcice>=0&&choice<=4)(*pr
14、ocesschoice)(a); /*调用相应的臥数实現不同功能;/总之,指针的应用是非常灵活和广泛的,不是三言两语能说完的,上面儿个小例 子只是个引子,实际编程中,会逐渐发现运用指针所能带來的便利和尚效率。文件:函数调用形式说明fopen(M路径”打开方式”)打开文件fclose(FILE *)防止之后被谋用fgetc(FILE *)从文件中读取一个字符fputc(ch,FILE *)把ch代表的字符写入这个文件里fgets(FILE *)从文件中读取一行fputs(FILE *)把一行写入文件中fprintf(FILE ,”格式字符串",输出表列)把数据写入文件fscanf(FI
15、LE T格式字符串”,输入表列)从文件中读取fwrite (地址,sizeof () , n» FILE*)把地址中n个sizeof大的数据写入文件里fread (地址,sizeof () , n, FILE*)把文件中n个sizeof大的数据读到地址里rewind (FILE *)把文件指针拨回到文件头fseek (FILE *, x, 0/1/2)移动文件指针.第二个参数是位移星,0代表从头移,1代表从当前位鱼移,2代表从文件尾移。feof(FILE *)判断是否到了文件末用注:以上用丁文本文件的操作,如果足二进制文件就在上述字母后加“b”。我们用文件最大的目的就是能让数据保心下
16、來。因此在耍用文件中数据的时候, 就是要把数据读到一个结构(一般保存数据多用结构,便r管理)中去,再对结 构进行操作即可。例如,文件aa.data中存储的是30个学生的成绩等信息,耍 遍历这些信息,对其进行成绩输出、排序、査找等匸作时,我们就把这些信息先 读入到一个结构数组中,再对这个数组进行操作。如下例:#in clude<stdio.h>#include<stdlib.h>#define N 30typedef struct student /*定义储存学工成绩信息的ftffl*/char Fame;int chinese;int maths;int phy;int
17、 total;ST;main()ST a(N); r存储N个学生伯息的数组/FILE *fp;void (-process)(ST 戶Output,Bubble,Find; /*实现相关功能的三个函数/ int choice,i=0;Show();printf(MnChoose:n?M);scanf(H%(Tv&choice);while(choice>=0&&choice<=2)fp=fopen(Maa.dar.e,rbH);for(i=0;i<N;i+)fread(&ai,sizeof(ST),1,fp); r把文件中储存的信息逐个读到MI
18、'Pfdose(fp);(*processchoice)(a); /*谕面提到的指向因数的折针,选择操作/ printf(W);Show();printf(An?H);scanf(M%d&choice);void Show()printf(Hn*w*Choices:*nO.Display the data formn1.Bubble it according to the total scoren2.Searchn3 QuitH);void Output(ST *a)广将文件中存储的信息逐个输出/int i.t=0;printf(MName Chinese Maths Phys
19、ics TotalVrT);fbr(i=0;i<N;i+)t=ai.chinese*ai.maths*ai.phy;ai.total=t;printf(M%4s%8d%8d%8d%8dnM,,ai.chinese,ai.maths>a(i.phy,ai.total);void Bubble(ST *a)厂对数组进疔排序,并输出结果/int i.pass;ST m;for(pass=0;pass<N-1 ;pass*)for(i=0;i<N-1;H+)if(ai.total<ai*1.total)m=ai;厂结构互换/ai+1=m;Output(a);
20、void Find(ST ea)int i,t=1;char m20;printf(MnEnter the name you want:*);scanfor(i=0;i<N;i+)if(!strcmp(m,) /根据姓名匹配怙况输出査找结果/printfCAnThe result is:n%s, Chinese:%d, Maths:%d, Physics:%d,Total:%dn".m.ai.chinese,ai.maths,ai.phy,ai.total);t=0:if(t)printf("nThe name is not in the list!n&
21、quot;);链表:链表是C语言中另外一个难点。牵扯到结点、动态分配空间等等。用结构作为链表的结点是非常适合的,例如:struct nodeint data;struct node 'next;英中next是指向Fl身所在结构类型的指针,这样就可以把一个个结点相连,构 成链表。链表结构的一大优势就是动态分配存储,不会像数组一样必须在定义时确定大 小,造成不必耍的浪费。用malloc和free函数即可实现开辟和释放储单元。 其中,malloc的参数多用sizeof运算符计算得到。链表的皋本操作仃:正、反向建立链表;输出链表;删除链表中结点;在链表中插入结点等等,都是要熟练学握的,初学者通
22、过画图的方式能比较形象地理解建 立、插入等实现的过程。typedef struct nodechar data;struct node Fext;NODE;广结点/正向建立链表:NODE wcreate()char ch=*a*;NODE ep?h=NULL?q=NULL;while(ch<'z*)p=(NODE *)malloc(sizeof(NODE); /锁制类型转换为折针*/p->data=ch;if(h=NULL) h=p;else q->next=p;ch*;q=p;q->next=NULL;广链表结束+ return h;逆向建立:NODE *create()char ch=*a*;NODE *p?h=NULL;while(ch<='z*)p=(NODE *)malloc(sizeof(NODE); p->
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年plc梯形图题库(含答案)
- 2026年新版税务师题库(含答案)
- 2026年专利文献检索模拟试题及答案详解
- 2026年化工安全考核试题及答案
- 2026年理化检验技术正(副)高级技师考试试题及答案
- 2026年水运工程助理试验检测师资格考试(公共基础)仿真试题及答案五
- 2026年十二月中旬一级建造师资格考试市政工程冲刺阶段考试卷(含答案)
- 2026年急救中暑题库(含答案)
- 2026年中国高效减水剂行业市场发展模式调研报告
- 2026年朔州机场招聘模拟试题及答案详解
- 急救知识科普宣传
- Ⅱ度烧伤创面治疗专家共识(2024版)
- 压力容器材料代用规范与实践
- 天府特资(四川)投资管理有限公司2026年招聘笔试参考题库及答案详解
- 5.3《9的乘法口诀》 课件 2025-2026学年二年级上册数学人教版
- 三级安全教育考试试题及答案(2025版)
- 泰国中文教师备课教案模板
- 新22J01 工程做法图集
- 学校石材工程投标书
- 下颌第一前磨牙拔除术考核评分表(2份)2024年度住院医生规范化培训评分表
- 少先队入队学少先知识做先锋少年课件
评论
0/150
提交评论