ImageVerifierCode 换一换
格式:DOCX , 页数:49 ,大小:66.21KB ,
资源ID:10853431      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10853431.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C语言基础学习笔记.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C语言基础学习笔记.docx

1、C语言基础学习笔记C语言基础学习笔记(第一版修改)丁炳亮1数据类型和表达式1.1计算机数据存储方式理解与测试:什么是补码?我们得先知道模的概念。模“模”是指一个计量系统的计数围。如时钟等。 计算机也可以看成一个计量机器,它也有一个计量围,即都存在一个“模”。例如: 时钟的计量围是011,模=12。表示n位的计算机计量围是 02A(n)-1,模=2A(n)。“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只 能表示出模的余数。任何有模的计量器,均可化减法为加法运算。例如:假设当前时针指向 10点,而准确时间是 6点,调整时间可有以下两种拨法:一种是倒拨 4小时,即: 1

2、0-4=6; 另一种是顺拨 8小时:10+8=12+6=6在以 12 模的系统中, 加 8和减 4效果是一样的,因此凡 是减 4运算,都可以用加 8来代替。对“模”而言, 8和 4 互为补数。实际上以 12模的系统 中, 11 和 1, 10 和 2, 9 和3, 7 和 5, 6 和 6都有这个特性。共同的特点是两者相加等于模。二进制中整数的补码求法是:正数的补码为原码,负数的补码是符号位不变其他位全部 取反再整个数加 1。我们可以通过下面的代码看下负整数在计算机部的表示。void f(int n)unsigned int i;for(i=1,i=1)if(i&n)printf(1);els

3、eprintf(0);printf(n);main()int a=-0xff;f(a);getch();输出的结果是 000011.2变量与常量理解与测试:1)类型声明在计算机部数据是以字节为单位存储的,但是我们需要的数据类型有很多种,每种数据 类型所占字节和存储方式都不一样。类型声明的作用就是告诉计算机以哪种“格式”去读写 该数据数据。类型说明符 变量名 1,变量名 2 ,变量名 n;类型说明符有基本类型(字符型、整数型、单 / 双精度型)、高级类型(结构体型、共用 体型、枚举类型)、指针型等,其中指针类型包括指向基本类型的指针类型、指向高级类型 的指针型和指向函数的指针类型(指向函数指针声

4、明格式在后面章节)。2)符号常量的定义#define 标识符 常量;使用该种方法定义符号常量一个是可以使代码便于阅读理解,另一个是方便代码部多个 相同常量的统一修改。总结与注意在写计算式的时候要考虑变量是否会越界。一般来说计算式子时是先强制转换成式子中 最大存储空间的数据类型(不包括被赋值的变量),还要注意不同的类型数据在不同的编译 器中所占的存有可能是不一样的,例如有些编译器整型是占 2 个字节有些是占 4 个字节。同 时还要考虑到符号的优先级和结合顺序,如果按符号的优先级和结合顺序运算过程中有越界 的那么整个计算结果可能和预想的不一样了,例如 int i=100;i = 500*i/i;

5、最后 i=-155 。1.3输出输入理解与测试:1)格式化输入输出函数可以按设定的格式和设定的数据类型接收和输出多个变量。 控制格式和数据类型的是数据控制符。2)字符和字符串可以用专门的输出 输入函数。 主要有 getch(); putch();getchar(); putchar();gets(); puts();其中getch()和putch()是conio.h中声明,getch()不需要等待回车键就返回字符并 立即执行下面一语句符,getch()不在屏幕显示输入的字符。getchar();putchar();在stdio.h中声 明。getchar()读取键盘上的一个字符,立即返回并显示

6、在屏幕上,需要等待回车键才能执行下一条语句。例如下面的代码:int main(void)char ch,i;for(i=0;i10;i+)ch = getchar();putchar(ch);getch();输入: I LOVE YOU输出: I LOVE YOU总结与注意格式输入函数中的参数是变量存放的地址,所以变量前面要 ”& ”符号。如果是数组则可以直接用数组名,因为数组名就是指向该数组首地址的指针常量。1.4运算符号理解与测试:1)表达式中符号的运算顺序是有先后的,根据符号的优先级和结合性(左结合 /右结合)来判定。如果是几个符号连在一起 C 部是怎么去读的呢?有一个很简单的规则:每一

7、个符号 应该包含尽可能多的字符。也就是说,编译器读取符号的方法是,从左到右一个字符一个字 符地读入,如果该字符可能组成一个符号,那么在读入下一个字符,直到与下个字符组合成 的符号没有意义为止。例如:a-b;这个表达式等效于(a-)-b;2)复合赋值符及表达式在赋值符 “=”之前加上其他双目运算符号可以构成复合赋值符。 如: +=、-=、*=、/=、%=。构成复合赋值表达式的一般格式为变量 双目运算符 = 表达式等价于变量 = 变量 运算符 表达式可以这么去理解,等号左边的相当于变量自增、自减、自除、自取余一个数,这个数由右边的表达式计算得到。如:int a=7,b=3,c=3;a+=b+=c+

8、=5运算后是a=18,b=11,c=&3)C 中唯一一个三目运算符是条件运算符,由“?”和“:”构成。两个符号必须按下 面的格式一起使用:表达式 1 ?表达式 2:表达式 3三个表达式可以是任意的合法表达式,条件运算符的运算规则如下:如果表达式 1 的值 为真,那么整个表达式的值为表达式 2的值,否则为表达式 3的值。4) sizeof()也是一个运算符号,它可以对一个数据类型或一个变量取类型长度。 但是当一 个数组名作为一个实参传递给函数时,在函数部是不能用 sizeof 来获取该数组的长度的。因 为数组名是一个指向数组首地址的指针,使用 sizeof只能取得实参指针类型长度。5)比较少用到

9、的符号是“:”和“,”。冒号运算符在 C 中有三种用途,第一种是我 们上面讲到的与“?”构成三目运算。第二种是在 switch 中放在常量表达式后面。第三种用 法是在结构体中定义位域时用到。struct 位域结构名 位域列表 ;其中位域列表的形式为: 类型说明符 位域名:位域长度例如:struct bsint a:8;int b:2;int c:6; 逗号运算符的功能是把两个表达式连在一起组成一个新的表达式,称为逗号表达式。其 一般格式为表达式 1,表达式 2,表达式 3,. ,表达式 n; 其求值过程是自左向右求两个表达式的值,并以最后一个表达式的值作为整个逗号表达式的值。例如for(a=0

10、,b=0,c=0;b10,a20;b+,a+)+c运算后c=20,如果把中间的两个语句前 后调换 for(a=0,b=0,c=0;b10,aj?i+:j; printf(%dn,n); getch();输出结果:243)在写式子时要注意运算符号对变量的副作用,单目运算有“ +”和“ -”,双目运算有“=”。4)位运算符号与逻辑符号容易混淆的有“ & ”和“& ”、“|”和“|”、“”和“!”。 前面两个可以这么记,位运算是单个的所以符号也是单个的。5)在使用位运算符号时要主要如果是有符号数则是对他们的补码执行位运算。 对于有符号的整数型使用左移“ ”左补 1。如下代码:void f(int n

11、)unsigned int i;for(i=1,i=1)if(i&n)printf(1);elseprintf(0);printf(n);main()int a=-0xff;f(a);a=1;f(a);getch();输出的结果是:6)运算符优先级可以简单归纳如下几点:1单目运算符比任何一个真正意义上的运算符的优先级高。2逻辑运算符比关系运算符优先级高。3移位运算符表算术运算符优先级低,但高于关系运算符。2程序控制结构2.1选择结构理解与测试:使用if-else多层嵌套时else是与上面同一层的最近if相结合的,在程序设计时有过多的 分支最好要选择使用if-else,当然如果可以使用switc

12、h语句还是尽量选择switch语句或者使 用其他能使代码简洁易懂的方法。如下面的代码:main()int a=10,b=6,c=7,d=8,e=9,f=10;if(ab)printf(%dn,a);if(bc)printf(%dn,b);if(cd)printf(%dn,c);if(de)printf(%dn,d);if(ef)printf(%dn,e);elseprintf(%dn,f);getch();这种代码又长又难看懂,更要命的是经常搞不懂下面的大括号对应上面的哪个大括号。改进后的代码如下main()int a=10,b=6,c=7,d=8,e=9,f=10;while(1)if(a=

13、b)break;printf(%dn,a);if(b=c)break;printf(%dn,b);if(c=d)break;printf(%dn,c);if(d=e)break;printf(%dn,d);if(e=f)printf(%dn,e);elseprintf(%dn,f);break;getch();第二种方法比第一种方法来看上去更干净,理解上差不了多少。2)总结与注意switch语句中每一个分支结束都要有 break语句,如果没有是继续执行下面分支,可能会 得到和预料不同的效果。还要注意,case后面跟的一定是整数型或符号型常量表达式,不能 是变量,并且不用有相同值的变量表达式,不

14、然会矛盾的。2.2循环结构理解与测试:1)主要有 for、while、do-while 这三种结构循环体,其中最后一种是比较少用到的,因 为一般情况都可以用前面两种替代。2)循环体结构中括号的表达式要知道时候退出,有时候还要知道循环体运行多少次。在 循环体部也可以使用 continue 语句跳过本次循环,进入下一次循环,或者用 break 语句退出 当前层循环。总结与注意循环结构中表达式的设计很重要。在 for循环结构我们经常用到从 0到x,循环体执行 x+1 次,可以写成 for(i=0;i0;i-=3); 这个循环语句的运行结果一般不是我们想要的。把“ = ”不注意写 成“=”也是容易造成

15、死循环的结果。3数组3.1一维数组理解与测试:1)一维数组的定义如下: 类型说明符 数组名常量表达式 如果定义时就进行初始化,常量表达式可以省略。动态存储的数组没有初始化所有元素 的值都为随机。静态存储的数据没有初始化所有的元素自动赋 0。2)一维数组名是一个指针常量, 指向数组的首地址。 由于是指针常量所以不能对其赋值, 只能当指针引用。同理一个数组不能对另一个数组整体赋值。数组引用时下标是从 0 开始计 算的。3)字符型数组初始化可以直接赋值字符串。 char s= “Happy”; 或者 char s=”Happy”;。 总结与注意数组引用时下标不要越界,字符串数组初始化时,数组元素个数

16、要比字符串多一个,因为字符串结束有个“ n”符,否则越界就会发生预料不到的结果。如下:main()char a8=abcdefgh;printf(%s,a);getch();输出结果:main() int a2,i; for(i=0;i8;i+) scanf(%d,&ai);getch(); 上面这个代码当输入字符超过 2 个时可能出现无法运行的结果。总结与注意 数组名作为函数参数时传递给形参的是数组的指针,而且在子函数中无法用 sizeof 取得 数组的大小,所以有需要时可以用另一个参数传递数组的大小。数组作为形参时可以写成 int f(int a) 或者 int f(int * a) 或者

17、 int f(int a10) ,他们三者都一样的,因为对于指针来说“ ”等 效于“”,数组做形参不会传递数组大小,int a10等效于int a。数组作为实参时可以写成 f(a)或者f(&a0)或者,因为a0的地址就是数组的首地址。但是要注意 f(a10)将是把a10 作为实参传递过去,a10的值赋值给指针使用是危险的。3.2多维数组理解与测试: 多维数组和一维数组相似,只是使用了多个下标。多维数组其实可以理解为数组的元素 又是一个数组。例如,二维数组可以保存一个矩阵,三维数组可以保存多个矩阵。4函数4.1函数的定义和调用理解与测试:1 )函数定义一般格式如下函数类型 函数名(形参表)声明部

18、分;语句部分;return 表达式; 声明部分必须是放在函数的最前面,如果放在语句中则编译不能通过。2)值参数是指,将实际参数的值传递到函数的形式参数中,这也是参数默认传递方式。 函数调用中发生的数据传递是单向的,即只能把实际参数的只传递给形式参数,在函数调用 过程中,形式参数发生改变,而实际参数中的值不会发生变化 (形式参数可与实际参数同名 )。 引用参数是将实际参数的地址传递给函数的形式参数。总结与注意1)形参必须是变量,用于接收实参传递过来的值。实参可以常量、变量、表达式、函数 调用等,无论实参是何种类型的量,在函数调用时都必须有确定的值。实参与形参,数量和 类型要能一一对应。2)函数如

19、果在定义前使用,或者在其他文件中。那么必须先声明,再使用。 函数运行的时候是根据形参类型去读写形参变量的,而传递过来的实参会根据函数声明里的形参类型进行类型转换。如果声明的函数没有形参列表则传递的实参无法进行类型转换 就直接把代表实参的二进制码直接复制给形参。如果实参和形参的数据类型不对,而函数运行时又是根据自己的形参类型去读取形参变量的,所以就会发生读取出错,严重的会使程序 停止。声明返回值类型是把数据自动转换成相应的类型才返回给调用者。声明函数的返回值和 定义函数时的返回值不一样编译时会提示类型出错。在使用前没有声明或者声明的函数没有 声明返回值则编译时默认的返回值都是 int 型,若该函

20、数定义时声明的返回值不是 int 型,编 译器就也会提示类型错误。3)大多数C语言实现都是通过函数 main的返回值来告诉操作系统该函数是否执行成功。 一般是返回0表示成功,返回其他值则表示失败。如果main中没有return 0;返回的是一个int 型数值,但是不能保证值为 0。4.2局部变量和全局变量理解与测试:1)全局变量也叫外部变量,它是定义在函数外部。它不属于那个函数,而属于一个源程 序文件。局部变量是定义在函数部,可以在函数的声明中定义,也可以在一个语句块中定义。 变量的作用围都是相对于同一层次来讲的。例如函数有声明变量,在函数的语句块又有定义 相同名称的变量,则起作用的是语句块的

21、变量,虽然它们名称相同但是互不影响。如下面的 代码:int k = 10;void f(int i)int k = i;k+;printf(%dn,k);main()int k;printf(%dn,k);f(10);for(k=0;k1)分析:像这种有递推公式的就有很明确的递推关系。我们的目的是要求 n!,我们只需要两步,第一步是把n!看成n*(n-1)!。第二步求(n-1) !。由于n!和(n-1) !都是求某 一个数的阶乘,所以调用函数本身来处理(n-1)!。我们的思路知道此为止,不要在一直想下面 怎么处理,程序会按我们这思路自己往下递推的。程序设计:f(i nt n)一、 if(n=1

22、|n=0) n!=1; / 设计边界二、 n! = n*f(n-1); 利用跟被包含的下一个同概念函数计算这里千万不要感觉f()没有写完就不能用,其实递归函数方便的 就可以随便大胆的调用“自己”。代码如下:double fact(i nt n);double fact1(i nt n);main ()int n;printf(Input n:);scanf(%d,&n);printf(%d! = %.0fn,n,fact(n);printf(%d! = %.0fn,n,fact1(n); getch();double fact(int n)double f;if(n=1|n=0) /递归函数出

23、口f = 1;elsef = n*fact(n-1);return f;汉诺塔问题:分析:要把A上的n个盘借助C搬到B上,我们的只需要两步。第一步是把 n-1个盘搬 到C上,再把A上的最后一个盘搬到B。第二步是把C上的n-1个盘借助A搬到B上。由 于把 n 个盘和把 n-1 个盘的规律相同,所以可以直接调用函数本身。代码如下:void hanio(int n,char a,char b,char c);main()int n;printf(Input the number of disks:); scanf(%d,&n);printf(The steps for %d disks are:n,

24、n); hanio(n,A,B,C);getch();九连环解法:分析:我们这边设计是可以解 n连环的程序。九连环有个规律是要解或上第 n个环必须解去n-1个环。我们解n个环只需要分成两步来处理,第一步就是把解下 1个环。第二步就是把剩下 n-1 个环用解 n 个环的函数来处理。解一个环的过程是些解下 n-2 个环,再把第 n 个环解下,再安上n-2个环(剩下部分要都是未解开的环)。安 n个环的步骤过程和解n个 环的步骤过程相似。代码如下:#include Stdio.h#include Conio.hstatic int upstep = 0;static int downstep = 0;void UpRing(int n); /* 加上函数说明,否则编译将会出一点小错误 */void DownRing(int n) /* 下环的逻辑就体现在这里 */if(n2) DownRing(n-2);printf(DW:%dt,n);+downstep;if(n2) UpRing(n-2);if(n1) DownRing(n-1);void UpRing(int n) /* 上环的逻辑则体现在这里 */if(n1) UpRing(n-1);if(n2) DownRing(n-2);printf(UP:%dt,n);+upstep;if(n

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1