收藏 分享(赏)

C笔记(完美版)适合初学者.doc

上传人:公务员考试助手 文档编号:21758900 上传时间:2024-04-22 格式:DOC 页数:60 大小:224.50KB
下载 相关 举报
C笔记(完美版)适合初学者.doc_第1页
第1页 / 共60页
C笔记(完美版)适合初学者.doc_第2页
第2页 / 共60页
C笔记(完美版)适合初学者.doc_第3页
第3页 / 共60页
C笔记(完美版)适合初学者.doc_第4页
第4页 / 共60页
C笔记(完美版)适合初学者.doc_第5页
第5页 / 共60页
亲,该文档总共60页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、C+笔记(day02) 2007-3-231、%ldd 可行文件的名字; -可查看连接库2、C+严格区分大小写,变量命名只能使用字母,数字,或下划线,第一个字母必须使用字母或下划线3、float单精度,double双精度 sizeof(int)-返回int在内存中占的大小 size(bool)=1 size(char)=1 size(short)=2 size(int)=4 size(long)=4 size(float)=4 size(double)=8 无符号的数据一旦溢出,将成为0。 有符号的int最大值2147483647,益处变为最小值,负数4、不同数据间赋值:有兼容性的,占空间小的

2、数据类型,可以给占空间大的数据类型赋值 不兼容的,可能会造成数据丢失。int -float可以转换;float-int 小数部分丢失5、运算符 要求数据类型要相同 i+ 先用后加 +i 先加后用 布尔运算符号:结果真或假 逻辑运算符:做bool运算!(1)“与”运算&,两条件要同时成立(2)“或”运算|,只要有一个条件是真,就成立6、按位与“&” 有0则与的结果为0 按位或“|” 有1则或的结果为1 按位异或“” 两位不同则为1,相同为07、左移 “ 右移1相当于除以28、三目运算符 条件?真:假 9、返回变量 - 表达式可以再次赋值,赋值语句返回变量本身 eg:(a=10)=20 返回变量的

3、值 - 不可再次赋值 eg:(a+5)=10 左值:变量、赋值表达式,+i的返回值是左值 右值:不能放在“=”左边的是右值,i+的返回值是右值 常量要在声明时就赋值,并且不能修改10、流程控制 while(条件)循环体 条件成立,则进入循环,知道条件为假时,退出循环 (1)声明循环变量 (2)while()确定循环条件 (3)循环变量要有所变化,避免形成死循环 for(变量初始化;条件;变量的变化)循环体代码 开始时判断循环条件是否成立,循环结束后,到第三个条件,使用变量改变 do循环体while(条件); 先执行一次,再判断条件,选择是否继续执行循环 break; 跳出循环,执行循环之外的下

4、一条语句 continue; 从次处开始,结束本次循环,进行下一次循环11、课堂练习-求1到100之间的所有素数C+笔记 (day03) 2007-03-26 1、cin 输入流一旦破坏,就不能恢复2、函数:一段相关代码组成的集合,以便完成一个特定的目的。 (1)可以通过名字来使用,曾强了代码的可重用性。 (2)提高可维护性。3、函数定义=声明+函数体: 函数名(.) return . 函数返回值:只有在调用函数的同时才能保存返回值 函数定义时,小括号里的参数称为形参,在函数被调用的时候才有意义。 函数调用时,小括号里的被传入的参数称为实参。4、函数在调用之前只有声明就可以,因为在编译阶段,参

5、照声明可以完成语法上的检测。 函数声明 函数名(.); 声明与定义的分离,实现并行开发!5、全局变量,局部变量 局部变量:函数内部声明的变量,只能在它声明的函数内部使用。如果没有对其初始化就使用,则其值为垃圾数字。 全局变量:能被所有的函数共同使用,要声明在所有函数(包括main函数)之外。尽量少使用,影响太大。如果没有对其初始化就使用,系统默认为其初始化为0。6、数据区:只存放全局数据,数据区的数据是稳定的,程序启动时,即创建,程序结束时,才消失 堆区 代码区 栈区:存储局部变量。插入数据从栈顶插入,先进后出结构。 如果函数不调用的话,局部变量是不存在的 在main函数与其他函数之间有个标记

6、,一旦函数返回,栈顶下落到标记处 栈中的数据是变化频繁的 函数调用时创建,函数返回即消失 7、 值传递 函数调用并不是传递实参本身,而是创建一个临时变量传到函数中 (1)为形参创建一个临时变量,临时变量的值是拷贝实参的值 (2)对形参的使用,实际上是对临时变量的使用,不会改变实参的大小 8、默认参数 (1)area(float a , float b =10); 当只传递一个参数时,形参b的位置默认为10 (2)有默认值的形参靠右摆放 9、内联函数 声明时加“inline”,运行效率高,不支持结构控制语句,必须先定义,不支持函数原形。 10、递归函数 在函数内部自己调用自己。 必须有明确的返回

7、条件-递归的出口11、函数重载 (1)函数名相同。 (2)参数表不同(参数个数不同,参数类型不同,参数顺序不同)。 (3)与参数名和返回类型不关 调用时会根据参数表匹配自动调用相应的函数 编译之后,函数的名字都会发生改变,后面会加上形参缩写作为后缀,没有任何函数的名字是一样的 不会做自动类型提升 对重载的函数最好不使用参数默认值12、const 在函数内部不允许修改此形参13、需求分析、设计、代码实现 多文件示例: = chang.h = char change( char ); = chang_impl.cc = char change( char c ) if( c = 97 & c =

8、65 & c = 90 ) return c + 32 ; else return c ; = main.cc = #include #include change.h using namespace std; int main() char c = 0 ; while( 1 ) cout; cinc ; if( c = 0 ) break; cout change( c ) 程序结束 数据区 Data 局部变量 函数内部 函数开始调用-函数返回 栈 Stack 静态局部 函数中 第一次调用函数时(只被初始化一次)-程序结束 数据区 -只需要一份数据,并且不希望别的函数访问他 静态全局 本源文

9、件中 程序开始-程序结束 数据区作业:实现银行业务 = a.cc = long id; int password; double balance; long(id) create(balance , password); /创建账户 void save( sum ); int(staus 0,-1) withdraw(sum , password); float query(); = generatorId(); /得到唯一的ID号 int showMenu(); /现实主菜单 saveMenu(); /收集开户信息,然后调用创建账户 createMenu(); withdrawMenu();

10、 queryMenu(); = *今日重点:(1)形参和实参的区别 (2)递归 (3)函数重载练习: 观察费波拉切数列1,1,2,3,5,8,13,21,34. . . . . .第一项和第二项都是1,后面的每一项是前面相邻两项的和。 使用递归方法计算第n项的费波拉切数列结果。C+笔记 2007-03-271、程序由函数组成,函数只完成自己特定的功能即可 把函数声明写在头文件里(想使用函数时,可直接导入头文件,调用函数),把函数实现写在.cc文件中 把多个.cc文件编译成可执行文件 -分别编译成.o文件,再连接到一起 2、值传递 函数中的参数传递是值传递,形参只是实参的一份拷贝数据,在函数中改

11、变形参的值,对实参无影响 3、作业分析:显示层(与用户的交互) 操作数据(完成业务逻辑) biz层 数据(id , password , balance ) Bank实现代码 = biz.cc=/operation /* p : Password of account . * b : balance of account . * return : id of account . */long create( int p , double b );void save( double sum ) ;/* * return : 0 success , otherwise -1 returned .

12、*/int withdraw( int p , double sum ) ; double query( int p ) ;long generateId();= biz.cc=static long id ;static int passwd ;static double balance ;#include using namespace std;long generateId()static int id = 1 ;return id+ ;long create( int p , double b )id = generateId();passwd = p ;balance = b ;re

13、turn id ;void save( double sum )balance += sum ;int withdraw( int p , double sum )if( p != passwd )coutinvalid password . endl;return -1 ;if( balance (sum + 10) )coutno enough money . endl;return -1 ;balance -= sum ;return 0 ;double query( int p )if( p != passwd )coutinvalid password endl;return -1

14、;elsereturn balance ;= menu.h=int showMenu();void createMenu();void saveMenu();void withdrawMenu();void queryMenu();= menu.cc=#include biz.h#include using namespace std;int showMenu()cout 1 endl;cout 2 endl;cout 3 endl;cout 4 endl;cout 0 endl;cout;int c ;cinc ;if( !cin )return -1 ;elsereturn c ;void

15、 createMenu()int passwd ;double balance ;cout;cinpasswd ;cout;cinbalance ;long id = create( passwd , balance );cout=endl;coutcreate account ok , id = id endl;cout=endl;void saveMenu()double sum ;cout;cinsum ;save( sum ) ;cout=endl;coutsave money ok endl;cout=endl;void withdrawMenu()int passwd ; doub

16、le sum ;cout;cinpasswd ;cout;cinsum ;int ret = withdraw( passwd , sum ) ;if( ret = 0 )cout=endl;coutwithdraw successful . endl;cout=endl;void queryMenu()int passwd ;cout;cinpasswd ;double ret = query( passwd ) ;if( ret != -1 ) cout=endl; coutBLANCE : $ ret endl; cout=endl;else cout=endl; coutinvalid

17、 password endl; cout=endl;= main.cc=#include #include menu.husing namespace std;int main()int c = 0 ;doc = showMenu();if( c = -1 ) break ; switch( c ) case 1 : createMenu();break; case 2 : saveMenu();break; case 3 : withdrawMenu();break; case 4 : queryMenu();break; case 0 :cout=endl;coutGood Bye end

18、l;cout=endl;break; default : cout=endl;coutinvalid option, try again.;coutendl;cout=endl;break;while( c != 0 );return 0 ;= 4、数组 (1)声明数组 数组名元素个数 int intArray100; -intArray 是个集合,有100个元素,每个元素都是int类型的 (2)初始化数组 (3)使用 通过数组的下标来访问数组中的元素,下标从0开始 intArray0=100; -intArray数组中的第一个元素赋值为100 数组声明时,元素个数必须是常量表达式 数组声明带

19、有初始化,则可直接为数组赋值 在数组声明时,必须指明数组长度,若在声明时候初始化,数组长度可省 int a12=100,200; 长度2 int a2 = 5,6,7; 长度3 对于数组中的元素个数,比声明时的多,则会报错,这样的越界访问,对整个程序来说会有很严重的后果! 比声明少,系统会把余下的没有定义数据的元素初始化为0 不初始化的数组,其中的元素数据为随机数 下标工作的原理: 表示编号,还表示当前元素相对于数组起始位置的偏移量 计算机通过偏移量找到元素在内存中的位置5、数组的排序 选择排序:找出最小的放在第一个位置 数组元素有n个,需要找n-1次,需要比较n-i次(i为开始元素的位置)6

20、、多维数组 二维数组;一个数组中的每个元素是个数组 声明: int iA510; -“5”代表数组有5行,“10”代表数组有10列 声明时,第一维可以省略! 确定一个元素需要2个下标7、结构 用户自己定义的一组数据类型 声明结构时,编译器不会分配空间,在声明一个结构的变量的时候才会为其分配空间 结构中的成员是多个简单类型组成的 用 “结构名.成员名”来操作其中的成员变量 strcpy(p.name,huxz);为char数组赋值 结构类型的变量间也可以相互赋值 结构的大小就是所有成员的大小之和(每个成员的大小必须是int类型的整倍数,当不够时,会自动补齐) Unix上还要求,结构的大小是结构的

21、最大的成员的整倍数 size(of) 计算结构大小 作业:把银行系统用结构改写,要求可以开多个账户(定义一个account类型的数组保存) struct account long id; int password; double balance; create(int password,double balance); void save(int id , double sum); int withdraw(int id,int password,double sun); double query(int id,int password); C+笔记 2007年3月28日1、变量的存储 (1)

22、内存是一块空间,把其中的每个字节做了编号,为了以后计算机能通过编号找到数据 (2)编址方式:绝对编址(在整个程序中使用),相对编址(字节相对于逻辑0偏移量,在进程中使用)2、取变量地址 (1)& &i 表示取内存中i的地址 地址的编址用十六进制表示 (2)逻辑0在代码区 全局变量在数据区,地址的编址是大于0的 局部变量在栈区,地址的编址是小于0的3、数组、结构的地址 (1)数组中的数据在内存中是连续存储的。 数组中每个元素的地址相差的值应为数组元素类型的大小。 (2)结构的地址: 结构的空间是连续的。 结构的起始地址与第一个成员变量的地址是一样的。4、存储地址 指针:存储变量的地址 指针的类型

23、由将要保存的地址的变量类型决定 int*只能保存int变量的地址 指针赋值一定要是同类型的指针才能相互赋值! 5、指针的运算 (1)指针和指针之间的运算 “+”,“*”,“/” 指针与指针间是不能做这些运算,没有意义! “-” 可以做减法运算,以“sizeof(指针类型)”作为计算单位的! 注意:要同类型的指针才能做此运算,不同的话,会对运算单位产生歧义。 (2)指针和数字之间的运算(加、减都可以) int i = 100; int * p = &i; 打印 p+1 - 相当于在地址上加4,因为存储的变量是int类型的 p+2 - 相当于在地址上加86、通过指针访问所指向的变量 *p 代表指针

24、p所指向的变量 *p i 指针在声明的时候,即初始化 int * p = NULL; 表示没有明确指向,不能 *p ,会出现 “段错误”的异常 -空指针 段错误原因 (1)空指针 (2)数组越界 (3)递归的条件不正确7、课堂练习 用指针打印出数组中个元素的值 #include using namespace std; int main() int ai6=34,4,12,67,34,2; int *p = &ai0; for(int i = 0 ; i 6 ; i+) cout a i = *(p+i) endl; return 0; int *p = ai ; 数组的本质就是用指针实现的,

25、数组的名字就代表数组的首地址(起始地址) 数组的名字是指向数组首地址(a0)的指针 ai 数组名,就是指向数组首地址的指针,可以用下标取元素,也可以把数组名当指针来访问元素 *(ai+n) p 指针名,也是指向首地址的指针,也可以通过下标(像数组名一样)访问数组元素 pn *(p+n)8、结构指针 struct person int id; int age; int main() person per = 1,20; person* p = &per; cout per.id =per.idendl; /通过结构名取成员变量 cout per.age= per.age endl; cout =

26、endl; cout (*P).id= (*P).id endl; /通过指针访问结构的成员变量 cout (*P).age= (*P).age endl; / (*p).id p-id 只有结构指针可以这样使用 cout =endl; cout id= id endl; cout age= age endl; return 0; 9、指针的地址 指针变量在内存中占4个字节(与类型无关,因为保存地址的指针只保存地址) 保存int型指针(int* p = &i)的地址用int*保存(int* pp = &p) #include using namespace std; int main() in

27、t i = 0 ; int * p = &i ; int * pp = & p ; cout&i = &i endl; coutp = p endl; cout&p = &p endl; coutpp = pp endl; cout&pp = &pp endl; couti = i endl; cout*p = *p endl; cout*pp = *pp endl; cout*pp = *pp p - i 指向关系 pp=&p p=&i *pp=p *p=i *pp=*p=iC+笔记 2007年3月29日1、数组指针声明的时候不用初始化,声明以后就指向数组的首地址了,以后不允许改变,所以,数

28、组指针可以认为是一个常量,一旦赋值就不能改变2、char数组 (1)打印char数组的名字即打印数组的内容 (2)对于字符数组,0是结束标志 字符 0 = 数组0 可以认为字符0的ASCII码就是0 要保存5个字符,就要把字符数组长度声明为6 (3)strcpy()和memset() 给一个字符串数组赋值 strcpy(),自动为字符串补 0 在使用strcpy之前,要调用memset(str,0,sizeof(str));初始化一片内存 str - 初始化内存的起始位置 0 - 初始化的值 (初始化为0,清除垃圾数字) sizeof(str) - 初始化空间的大小 (4)strlen(str) 计算实际存储的字符个数,不包括0 (5)strcmp(str1,str2) 比较2个字符串是否相等 实际比较的两个字符串的ASCII码的大小,返回0则内容一样 (6)字符串的拆分 strtok(a,b); a、被拆分的字符串名字,当此处是NULL时,表示要拆分的不是新串 b、分隔符号 此函数调用一次,拆分一次 当此函数返回NULL时,则表明拆分完毕 Hello World叫字符串常量,存储在data数据区里,类型就是char* 其值是一个地址,指向数据区里的一块空间 数据区里的空间保存的内容就是Hello World char line50; strcpy(l

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高中资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:文库网官方知乎号:文库网

经营许可证编号: 粤ICP备2021046453号世界地图

文库网官网©版权所有2025营业执照举报