C语言笔记.doc_第1页
C语言笔记.doc_第2页
C语言笔记.doc_第3页
C语言笔记.doc_第4页
C语言笔记.doc_第5页
免费预览已结束,剩余19页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章 C语言概述1.1 C语言的发展与特点机器语言用“0”、“1”编程,难编改,但可直接执行汇编语言直接描述计算机硬件操作的语言;代码效率高,但移植性差高级语言难以对计算机硬件进行直接操作;结构化设计,易于编写、理解和维护C语言兼有汇编语言和高级语言的特点:可对计算机硬件进行直接操作结构化设计,易于编写、理解和维护,可移植性强语言简洁,32个关键字,9条控制语句,45种运算符,书写自由1.2 C语言程序的结构和语法规则C语言程序的基本结构C语言程序的组成:一个主函数main()和0若干个其他函数一个C语言程序总是从主函数开始执行,并在主函数结束,不论主函数位置如何C语言编译系统区分大小写被主函数调用的其他函数包括:库函数、自定义函数形式参数表C语言的函数的一般结构函数首部 函数类型函数名(函数形参表) “ ”内容可有可无 例:int max(int x,int y)函数体 数据定义和声明语句可执行语句C语言函数的语法规则数据定义和声明语句位于可执行语句之前数据定义和声明语句不需要时可默认一行内可写若干语句,每个语句以“;”结束注释格式 /*注释内容*/ /注释内容1.3 C程序开发过程编译过程源程序 编译 目标程序 连接 可执行程序 (*.obj) (*.exe) 库函数逻辑错误须自己发现开发过程启动C+ 编辑源程序 编译 连接 运行 结束 错 错 错语法错误(逻辑错误,须自己发现)第二章 数据类型及其运算2.1 标识符用来标识变量、常量、函数、类型、语句等程序对象名称标识符 标识符由字母和下划线开头,可以包含字母、数字和下划线,并区分大小写(名字) 标识符应能反映一定的程序对象意义关键字不能作为标识符 32关键字(P14)+8单词(P13)合法标识符: sum, _total, Main等非法标识符: Mr.John, #33, $500, 3D64, main等2.2 C语言的数据类型(书P15)整型 signed int有符号数 短整型 signed short int整型数据 (int) 长整型 signed long int数制转换 整型 unsigned int无符号数 短整型 unsigned short int长整形 unsigned long int基本数据类型 单精度型 float实型数据 (float) 双精度型 double长双精度型 long double字符型 char字符型数据 (char) 无符号字符型 unsighed charASC码 有符号字符型 signed char枚举型long(用于int、double)数据类型修饰符 short(用于int)(用于扩充数据类型) signed(用于int、char)unsigned(用于int、char)位宽字节数有效数字单精度float3247双精度double64815162.3 常量常量:程序运行过程中其值不能被改变的量十进制 例:123、456、0、-1整型常量 八进制:以“o”开头 例:o123=(83)10、-o11=(-9)10十六进制:以“ox”或“oX”开头 例:ox123=(291)10、-oX12=(-18)10注:后缀L长整型 U无符号整型小数形式 例:0.123、 .123、-123.0、0.0实型常量(又称浮点数) 指数形式 NeA (N不可省,可省,A必须为整数)常量 例:正确2e3 (2103) 错误e3,-2e3.5注:后缀F单精度实型 L双精度实型字符型常量:单引号括起来的单个字符 例:a、D、$转义字符(书P18表2-2):以一个“”开头的字符序列字符串常量:用双引号括起来的字符序列 例:”Hello, world!n”在内存中存储时,字节数=字符数+1字符串变量:没有专门的形式,要用数组或指针来表示符号常量:用标识符代表一个常量例:#define PI 3.14159 #define PRICE 30 #define HELLO “Hello, world!n”2.4 变量变量:程序运行过程中其值可以改变的量 变量需先定义,后使用变量的定义 例:int x,y,z; (数例2.2)变量的初始化 例:int x=3,y=5,z=7;2.5 运算符与表达式 单目(只有一个操作数) 例:!、+、-等运算符分类 双目(两个操作数) 例:+、-、/、%、0?x:-x)逗号运算符e1,e2,e3,.,en结果取最后一个表达式的值 例:设int a=2;float b=5.2;则2*a,2*b的结果是10.4用于按顺序计算各表达式的值 例:执行x=(i=3,i*2)后,x的值为6第三章 顺序结构程序设计3.1 程序的三种基本控制结构 顺序结构三种结构 选择结构 循环结构 只有一个入口四个特点 只有一个出口 结构内的每个部分都有机会被执行到 结构内不存在“死循环”流程图:处理框起止框判断框连接符输入输出框AB顺序结构:PABPA选择结构:noyes noyesPAPA循环结构: no yes no yes3.2 顺序执行语句表达式语句 例:i+;a-1;x=10;函数调用语句 例:printf(“%d”,a);空语句 例:;复合语句 例:printf(“Hello, world!n”);if(xy) z=x;else z=y;z=x+y;t=z/100;printf(“%f”,t);注:C语言的第5种语句为“控制语句”,是非顺序执行语句3.3 格式化输出函数 printf()注:C语言没有输入输出语句,这类操作通过调用库函数来实现形式:printf(“格式字符串”, 输出表项);功能:按照一定的格式向终端输出任意个任意类型的数据表项:常量、变量或表达式,逗号隔开 例:printf(“a=%d,b=%dn”,a,b);”m.n” m为宽度n为精度宽度:指定输出数据所占的宽度宽度精度修饰 f:指定输出小数的位数修饰符 精度 e:指定输出的小数点后的有效数字位格式指示符 数%修饰符格式字符 d:指定至少输出的数字的个数格式 左对齐修饰:“-”,数据右边补空格补够宽度字符串 右对齐修饰:“+”,数据左边补空格补够宽度包括: 格式字符:书P41表3.1格式指示符:从“%”开始,到“格式字符”结束转义字符普通字符:原样输出“宽度”与“精度”矛盾时,以精度为准需输出的数据宽度大于m时,以数据为准说明 若“宽度”m前加前导符“0(零)”,则数据左边用“0”补够宽度默认对齐方式为“右对齐”不写宽度并不意味着宽度为“1”(输出格式)3.4 格式化输入函数scanf()预留地址格式:scanf(“格式字符串”,输入项地址表);功能:输入多种类型的数据地址表:若干输入项地址构成,逗号隔开 例:scanf(“%d%d%d”,&a,&b,&c); 宽度修饰:指定输入数据所占列数 抑制修饰:“*”,对应的输入数据不赋给相应变量 修饰符 例:scanf(“%2d%*2d&3d”,&n1,&n2); 格式指示符: 输入“123456789”,“12”赋给n1, %修饰符格式字符 “34”舍弃,“567”赋给n2格式字符串包括 长度修饰 格式字符:书P44表3.3 空白字符:空格键、跳格键、回车键 非空白字符:普通字符 若相邻两个格式指示符间无分隔符时,相应两个输入数据间要用空格、回车、跳格 分开(例2.2) scanf()函数无精度修饰scanf()要点 在“格式字符串”中出现的普通字符(包括转义字符),必须原样输出 遇空格、回车或Tab 以下情况认为输入结束 遇宽度结束 遇非法输入 用“%c”输入单个字符时,空格和转义字符都是有效字符3.5 单个字符输入/输出函数字符输出函数putchar()形式:putchar(ch);或putchar(A);参数:ch表示字符变量,A表示字符常量功能:向终端输出单个字符头文件:#include 例:putchar(n);字符输入函数getchar()形式:getchar();功能:从终端输入单位字符参数:无返回值:输入的字符头文件:#include 例:c=getchar();putchar(c);putchar(getchar();第四章 选择结构程序设计4.1 关系运算及其表达式关系运算即比较运算结果类型:逻辑值(布尔值,Boolean) 真(TRUE)1 假(FALSE)0关系运算符6种:、=、=、!=优先级 算术运算符 、= =、!= 赋值运算符关系运算:假设X是一种关系运算符,则aXb成立 =1;aXb不成立 =0例:已知a=1,b=0,c=1,则ab成立所以d=ab d=1所以f=abc f=0结合性:自左向右 例:543=? 答:04.2 逻辑运算及其表达式 & 逻辑与 逻辑值之间的运算 | 逻辑或 ! 逻辑非 目数:&、|为双目,!为单目 操作数:逻辑值(广义) 结果类型:逻辑值 优先级 ! 算术运算符逻辑运算 关系运算符 & | 赋值运算符 结合性:自左向右以“1”代表“真”,“0”代表“假” ab!a!ba&ba|b非0非00011非0001010非01001001100逻辑运算的操作数可以是任意类型数据,只要符合“0”和“非0”的分类即可 例: 0 操作数为“0” 53&0 -1 操作数为“非0” 53 a=1 53&1 例:a=4 a=0 b=0 b=1 a=4,b=5 a&b=1 , a|b=1 4&0|2=1 53&2|8b) t=a; a=b; b=t; printf(“%5.2f,%5.2f”,a,b);if-else : if(e) s1;Ye N else s2; 例:if(x0) y=x;s1 s2 else y=-x; (求绝对值)if语句的嵌套 嵌套:if语句当中可以包含其他if语句 规律:else总是和它上面最近的if配对,除非用“”隔开 例:if(e1)if(e1)if(e2) s1;else s2;if(e2) s1;else s2;if-else if-else多分支if(e1) s1;e1else if(e2) s2;Ye2Ye3else if(en) sn;Yelse sn+1en例:有一个函数,输入x,求出yY-1(x0)解:if(x0) y=1; else if(x0) y=-1; else y=0;4.4 switch语句(多分支选择语句)switch(e) e=e1s1case e1:s1;e=e2s2case e2:s2;.default:e=ensnsn+1;sn+1switch(e)e=e1s1case e1:s1;e=e2s2break;case e2:s2;break;e=ensn.default: sn+1sn+1;switch后面的e为表达式,case后面的ex为常量表达式,二者一般都是整型或字符型,不可以是实型若e和某一个case后的ex相等,则执行其后的语句,若均不相等,则执行default后面的语句(前提:没加break)每一个case的ex不能相同各个case的出现次序不影响结果执行完一个case语句以后,转移到下一个case继续执行,除非用break中断(跳出switch结构)switch 多个case可以共用一组语句例:switch(n)当n=1或n=2时,都执行x=5;break;case 1:case 2:x=5;break;default语句可以省略本章难点:if(x+y!=0) printf(x+y!=0n); if(x+y) printf(x+y!=0n);if(x=0) printf(x=0n); if(!x) printf(x=0n);第五章 循环结构程序设计循环语句 while do-while for循环结构要点 控制语句 continue break常见问题 死循环 多层循环 边界问题常见算法 穷举法 迭代法 递推法5.1 5.2 while and do-whileesseNwhile先做判断e,再执行循环体s,s可能一次也不执行do-while先执行一次循环体s,再判断e,因此s至少执行一次例:求n=1100nwhile:do-while:n=0;n=0;sum=0;sum=0;while(n=100)dosum+=n;sum+=n;n+;n+; while(n=100); 当循环体由多个语句组成时,必须用花括号括起来以形成复合语句注 为避免“死循环”,每执行一次循环体,表达式e的值部应该有所变化 例:n=0; sum=0; while(1) sum+=n; n+; 5.3 for语句for(e1;e2;e3) s;e1e1:循环变量赋初值e2:循环条件 e2e3:循环变量增值s:循环体 se31.求解e1,循环变量赋初值步骤 2.求解e2,若为真,则执行s,然后转向e3,否则结束整个循环3.求解e3,循环变量增值4.转向e2e1可省,即for(;e2;e3),循环变量赋初值应在之前完成e2可省,即for(e1;e3),循环体内部应有循环结束点,否则陷入死循环(一般采用break语句)e3可省,即for(e1;e2;),循环变量增值放在循环体内部,否则会陷入死循环e1、e2、e3均可省,即for(;),相当于while(1),无条件循环,可综合上述情况处理e1可以是任意变量赋初值e1、e3均可用逗号表达式e2一般是关系或逻辑表达式,可以是任意表达式标准形式:for(n=0,sum=0;n=100;n+) sum+=n;省略e1:n=0,sum=0; for(;n100) break;sum+=n; 省略e3:for(n=0,sum=0;n100) break; sum+=n+; for and while的比较e1e2 esse35.4 break和continue语句用于循环语句中,提前结束本次循环体,即跳过本次循环中continue以后的语句,直接continue 执行循环变量增值e3和循环条件判断e2一般和if配合使用Quiz:以下两个程序的循环次数是多少?答:都是101for(n=100;n=200;n+) for(n=100;n=200;n+) if(n%3=0) printf(%d,n); if(n%3!=0) continue; printf(%d,n);break 用于循环语句中,提前结束整个循环(本层)或者用于switch语句中,结束整个switchQuiz:以下程序的输出是什么?答:100 101for(n=100;n=200;n+)if(n%3=0) break;printf(%d,n);5.5 循环的嵌套(即多重循环)for(sum=0,i=1;i=20;i+)for(pro=1,j=1;j=3)例4:书P104 (11)第六章 数组数组是由若干同类元素组成的对象数组元素的数据类型相同数组的概念 数组元素的个数固定数组元素按顺序存储数组的每一个元素都可以看作一个独立的变量,用数组名和下标来表示6.1 一维数组 数组类型 数组名 数组长度int as;数组名是标识符定义 数组长度可以是常量、常量表达式或符号常量,不可以是变量或变量表达式(即不能定义可变数组)#define N 5 int n,an;int aN; scanf(%d,&n); int a5;数组在内存中连续存放 a a0存储 每个元素所占内存大小和数组类型相同 a1 5数组名指向第一个元素(类似于指针),数组名在程序中单独出现代表数组首地址 a4数组名下标,称之为元素下标运算符:引用 下标范围:0N-1,N为数组长度下标可以是常量/变量/表达式超出下标范围的数组元素称之为越界,会引起不可预料之后果!注意:下标在定义时必须为常量,而引用时可以为变量在定义数组的同时初始化:int a5=0,1,2,3,4;只给部分元素初始化,其它元素默认0(静态)int a5=0,1,2;int a5=0,1,4;初始化 在给全部元素初始化时,可以省略数组长度int a=0,1,2,3,4;除了初始化,不能对整个数组同时赋值,只能逐个赋值a=0,1,2,3,4; no!for(i=0;i5;i+) ai=i; yes!举例方法一:顺序查找从首元素开始,顺序查找到数组的末尾,如果存在该元素,则结束。(书P109/6.3)一维查找 方法二:二分查找如果数组是按序排列的,则用二分查找法(书P110/6.4)*return 退出主函数方法一:冒泡排序在无序区从后往前两两比较,将小者换至前(书P111)初始:6 3 9 8 1 5 4 10 3 72 6 3 9 8 2 5 4 10 71 2 6 3 9 8 4 5 7 101 2 3 6 4 9 8 5 7 101 2 3 4 6 5 9 8 7 101 2 3 4 5 6 7 9 8 101 2 3 4 5 6 7 8 9 10方法二:直接插入排序在无序区取一个数插在有序区适当位置(书P113)初始:6 3 9 8 1 5 4 10 3 73 6 9 8 1 5 4 10 2 73 6 9 8 1 5 4 10 2 73 6 8 9 1 5 4 10 2 71 3 6 8 9 5 4 10 2 7一维排序 1 3 5 6 8 9 4 10 2 71 3 4 5 6 8 9 10 2 71 3 4 5 6 8 9 10 2 71 2 3 4 5 6 8 9 10 71 2 3 4 5 6 7 8 9 10方法三:直接选择排序在无序区中找出最小数与无序区第一个数互换(书P115 6.7)初始:6 3 9 8 1 5 4 10 3 71 3 9 8 6 5 4 10 2 71 2 9 8 6 5 4 10 3 71 2 3 8 6 5 4 10 9 71 2 3 4 6 5 8 10 9 71 2 3 4 5 6 8 10 9 71 2 3 4 5 6 8 10 9 71 2 3 4 5 6 7 10 9 81 2 3 4 5 6 7 8 9 101 2 3 4 5 6 7 8 9 106.2 二维数组定义:floating a23;a0a1a00a01a02a10a11a12可以看作若干个一维数组,如上图存储:第一维的下标变化最慢,最右边的下标变化最快a00a01a02a10a11a12aa0a1引用 数组名下标1下标2注意小标值的有效性(常量、变量)分行赋值:int a23=1,2,3,4,5,6;按存储顺序赋值:int a23=1,2,3,4,5,6;部分赋值,其它元素为0:int a23=1,4;初始化 可省去第一维,其它维不可省:int a3=1,3,;矩阵转置(书P117 6.8)a00a01a02a10a11a12a00a10a01a11a02a12b00b10b01b11b02b12定义:char s5;s0=a; s1=b; s2=c; s3=d; s4=e;初始化方法 数组长度 备注char s5=a,b,c,d,e; 5 字符序列初始化 char s5=a,b,c,d; 5 字符序列、字符串(0)char s5=abcd; 5 字符序列、字符串(0)字符数组 char s=abcd; 5 字符序列、字符串(0)字符数组即可放字符序列,又可放字符串放字符串时有效字符个数必须小于数组长度字符数组每个元素存放一个字符,若末尾字符不是0,则只能表示字符序列;是0,则既可表示字符序列,又可表示字符串char str7=goodbye 错!不能用赋值语句将字符串赋给字符数组:str=abcd 错!字符串输入和输出(字符数组输入和输出)char s10;scanf(%s,s);字符串方式scanf() 该方法不能读入空格、TAB,注意用scanf()输入字符串时不加&,输入 遇空格、TAB、回车即认为输入结束scanf(%c,si);配合循环语句单个字符方式getchar() char s10;for (i=0;i10;i+) si=getchar();printf(%s,s);字符串方式printf() 输出表项中只能是字符数组名,不能是字符元素名输出 printf(%c,si);配合循环语句单个字符方式putchar()字符串处理函数(包含在string.h头文件中)gets(str):从终端输入一个字符串给str可以输入空格和TAB等,而scanf()不能puts(str):将字符串str输出到终端上也可输出0和转义字符strcat(str1,str2):将字符串str2接到字符串str1后面作为函数结果,str2不变str1后面的0被取消,str2后面的0保留strcpy(str1,str2):将字符串str2覆盖到字符串str1中作为函数结果,str2不变使str1=str2,返回str1此函数可用于为字符数组赋值:strcpy(str,abcd)strcmp(str1,str2):比较字符串str1和字符串str2相等,函数结果为0;大于,为+1;小于,为-1不能用str1=str2进行字符串比较strlen(str):函数结果为字符串str的长度(不包括0)字符串数组:每个元素都是一个字符串,即是一个二维数组定义:char s210;字符串数组 s0表示第一个字符串元素的首地址,是常量s1表示第二个字符串元素的首地址,是常量s0=ABCD 错! 不能给常量赋值s00=ABCD 错! 不能给字符赋字符串char name28=mary,smith;scanf(%s,name0); strcpy(name0,smith);给字符串数组赋值 name00=m; name01=a; name02=r; name03=y;第七章 函数7.1 函数的定义与调用 由C语言开发系统提供的函数,不同系统的库函数各不相同库函数 调用库函数必须在文 #include输入输出(可直接调用,无需定义) 件头部写上包含相应 #include数字处理函数 头文件的预处理命令 #include字符处理 自定义函数(必须定义,且若先定义后调用不必声明,若先调用后定义必须声明) 主函数:主函数main是程序的入口和出口 main a b c d e f g 存储类型 数据类型 函数名 形式参数定义表 (省) int max (int x,int y) int z; z=xy?x:y;函数体函数定义 r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论