数据结构.docx
- 文档编号:10568809
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:30
- 大小:236.67KB
数据结构.docx
《数据结构.docx》由会员分享,可在线阅读,更多相关《数据结构.docx(30页珍藏版)》请在冰豆网上搜索。
数据结构
讲完第一次课后补:
补两次课。
虽然大家上学期才学习过《高级语言程序设计》,八月底又经过了3天的强化训练,但根据我的经验,在学习《数据结构》之前,针对初学语言者常犯的错误进行点拨还是有必要的,所以我们抽出两次课的时间来回顾一下c++的若干知识点,希望大家能进一步打好基础,进而更好的理解《数据结构》的精髓。
1.变量的命名规则、
①第一个符号只能是字母或下划线
②第二个及其以后的符号可以是字母、数字、下划线
常犯的错误:
①和系统关键字相同。
如ifstreamif(“s.txt”)
↑if是关键字,不能做变量名。
②大小写不区分。
在c++语言中,大小写敏感
大写小写代表不同的对象
如定义:
intsum=0
引用:
Sum+=100↑
将会提示英文:
Sum没有定义
③变量名中出现空格。
当变量名较长时,尤其是使用多个单词代表一个变量时,容易出这个错误
如intArraySum=0
解决办法,用下划线连起来Array_Sum.
2.数据类型
就像人要区分男女一样,数据也要区分类型。
一是变量的数据类型确定,那么随之而确定的将是该变量的属性,取值范围,操作。
如intm;定义了一个整型变量m。
那么就意味着
·m是一个有符号整数;
·m占有|←8位→|←8位→|
(4)个字节的空间,从而确定m的取值范围-232~232-1
·m所能进行的运算:
算术运算+、-、/、*、%等。
数据类型方向易犯的错误:
对于参与运算的数值的大小考虑不周,导致定义点多类型不能容纳运算的结果,从而出现错误。
Int
-2147483648~2,147,483,647
如intsecond;
求100年有多少秒
Second=100*365*24*60*60肯定超出范围
=3,153,600,000
3.如何定义变量.
①数据类型变量名;如inta;
②数据类型变量名=初值;如inta=3;
③数据类型变量名[=初值],变量名[=初值],...;
如inta,b=2,c,d=3;
易犯的错误
①数据类型和变量名之间忘写空格。
属手误打字快
如inta;intb;
②两条语句之间用‘,’隔开
如inta,intb;
↑应为;
4.数组:
数组用来存储成批数据。
如对一批数据排序,求平均值时。
①一维数组的定义
·数据类型数组名[常量];
↑
不能为变量
如inta[10];有a[0],a[1],a[2],...a[9]共10个元素
又如constn=10;
连续区域。
故能随机按下标访问
...
8
12
...
20
a→
a[0]→
a[1]→
a[9]→
Inta[n];有a[0],a[1],...a[n-1]共n个元素
②一维数组的引用
按下标引用。
Inta[10];
a[0]=8;
a[1]=12;
a[9]=20;
20
temp→
Inttemp;
Temp=a[0]+a[1];
③一维数组初始化
即在定义时赋值↗初始化量
如inta[5]={1,2,3,4,5};
又如inta[]={1,2,3};
↓
则最终数组a大小仅为3,有3个数值,
即若干指定数组大小,则由初始化量种元素个数决定。
又如inta[10]={0};
0123
则a中10个数据全部为0.
a[0][0]
a[0][1]
a[0][3]
a[1][0]
a[1][1]
a[1][3]
a[2][0]
a→
a[2][3]
0
1
2
④二维数组的定义
inta[3][4];
在内存中如何存放
a[0][0]
a[0][1]
a[0][2]
...
a[2][2]
a[2][3]
...
行优先存放
⑤二维数组的引用
同一维数组,找下标引用
⑥二维数组初始化
如inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
还有其他初始化方法,不提倡使用,因共可读性不好
以下介绍程序的三种结构
5.顺序结构
顺序结构种的语句执行顺序是从前到后逐字语句执行。
顺序结构中的语句有下面几种
①输入语句
即如何从屏幕上,文件中获得数据并将其放在变量中。
我们在此处仅介绍从屏幕上获取键盘上输入的数据。
从屏幕上获取一整数并将其存入变量temp中。
如inttemp;
cin>>temp;
↑↖提取运算符
输入该对象
其他若干类型也按此种方式输入
从屏幕上输入一个字符串并存入str中。
Charstr[20];
cin>>str;
②赋值语句
即赋值表达式,由赋值运算符组成的表达式{=;+=;-=;*=;/=;%=}常用还有5种不常用的{<<=;>>=;&=;^=;|=}
↑按位异或
如inta,b,c;
从屏幕上输入两个整数,
分别输入a,b中,
之后将a,b的和赋值给c
cin>>a>>b;
c=a+b;
注意:
在屏幕上输入时,可以每输入一个整数后回车,如4↖↙
5↖↙;也可连续输入两个整数之后回车,两整数间用空格隔开,如45↖↙
③输出语句
即如何从屏幕上、文件中写数据
此处我们仅介绍向屏幕上写数据
Inttemp;
cin>>temp;
cout< 此处又可以是表达式,可以使基本类型,也可以是字符串 Inta=1,b=2,c=3; cout< cout< 12 3 结果是 6.选择结构 形式: if(条件1) { 语句块1 } elseif(条件2) { 语句块2 } elseif ... elseif(条件n-1) { 语句块n-1 } else { 语句块n } 当条件只有两个时,简代为 if(条件1) { 语句块1 } else { 语句块2 } 当只需要判断一个条件时 if(条件1) { } 容易犯的错误 ①if(条件1);多写一个分号。 此处不是语句结束。 ②当条件是判断两个对象a,b 是否相等时,少写一个‘=’而成赋值句 正确的是if(a==b) { } 错误的是if(a=b) { } ③当分子较多时,条件1,条件2,条件3... 容易出现互相包含的问题,则导致程序出错。 因此当条件较多时,应加倍小心 练习: ①从屏幕输入a,b,c的值,计算方程ax2+bx+c=0的根。 (a,b,c类型为double。 )显示在屏幕上。 若有实根,输出形式为x1=__,x2=__. 若有复根,输出形式为x1=+d1i+d2,x2=-d1i+d2. ②输入a,b,c的值,判断a,b,c能否构成三角形。 若能,输出其面积(a,b,c为double) d=(a+b+c)/2,s=√(d(d-a)(d-b)(d-c)) 输入x的值,计算函数的值 y=e-x(x<0),y=1(x=0),y=-ex(x>0)exp(x): ex 7.循环结构 当遇到需要重复的做同样的工作时,就需要使用循环结构。 如①从屏幕上输入100个数并存入数值中。 ②求1到100的和。 循环结构主要有下面几种: ①while循环 当条件1满足时,重复顺序执行语句块1. 形式while(条件1) { 语句块1 } 例如从屏幕上输入100个数并存入数组中。 inta[100]; inti=0; while(i<100) { cin>>a[i]; i++; } 也可以 While(i) { if(i==100)break; cin>>a[i]; i++; } 注意: 使用循环式,一定要保证在某个时候能够终止循环。 ②for循环 形式: 定义循环变量; for(循环语句赋初值;循环条件;循环变量增值) 如上面的例子: inta[100]; inti; for(i=0;i<100;i++) cin>>a[i]; 还可以 for(定义循环变量并赋初值;循环条件;循环变量增值) 注意: ·循环变量可以使其他类型,如double ·循环变量增值外每次必须增1(可任意增)如i=i+2等 ③break和循环的配合使用,跳出最近的循环 如inti=0; 结果是 012345 inta[10]={0}; 1 2 3 4 5 while(i) {if(i==5)break; a[i]=i+1; i++; } ④continue和循环的使用: 跳过本次循环,执行下次循环 inti; inta[10]={0}; for(i=0;i<10;i++) 当把10换成100时,会崩溃掉, 因为访问到了a[11]单元 { if(i%2==0)continue; if(i==10)break; a[i]=i+1; } 结果是: 比较下面两端程序;看a中结果是多少 Inti=0; Inta[10]={0}; While(i) { if(i%2==0)continue; if(i==10)break; a[i]=i+1; i++; } 结果是: 0 2 0 4 0 6 0 8 0 10 死循环 执行流程图: 8.如何编写稍微复杂点的程序。 ①分析题意,弄清楚题目的要求 ②根据题目要求,思考解决问题的方法(算法), 用自然语言描述出来 ③根据第②步的描述进行细化,区分出哪些描述属于输入部分,哪些描述属于输出部分,哪些描述应采用选择结构,哪些应采用循环结构 ④根据第③步的分析,画出程序流程图。 (熟练后,该步可省略) ⑤将流程图用c++语言描述出来。 9.简单程序举例 ①从屏幕上输入一个整数并存入变量n中,计算n! =1*2*3*4*...*n, 并输出到屏幕上。 问题分析: 该问题共分三部分输入n;计算n! ;输出n! 问题的重心在于如何计算n! 该问题是一个累乘问题,可用循环实现。 longp=1; inti; for(i=1;i<=n;i++) p=p*i; 则问题可顺序求解 intn; cin>>n; inti; longp=1; for(i=1;i<=n;i++) p=p*i; cout< ②利用公式π/4=1-1/3+1/5-1/7+.....计算π的值,直到最后一项的绝对值小于10-4(计算在内)为止,要求统计共累加了多少项。 第一种方法: 问题分析: 该问题是一个累加求和的问题,但其难点在于不知道累加了多少项和加减是交替出现的。 第一步: 我们先找出累加的规律性,即先找出通项公式 π/4=1*(1/(2*1-1))-1*(1/(2*2-1))+1*(1/(2*3-1))-..... 则通项公式为(-1)n+1*1/(2n-1) 第二步: 寻找累加结束的条件 1/(2n-1)<10-4 1/(2(n-1)-1)>=10-4 n=1; while(i) { doubletemp=1.0/(2*n-1); if(temp<1e-4)break; n++; } 第三步: 求π/4 i=1; sum=0; while(i) { if(i>n)break; if(i%2==1) temp=1.0/(2*i-1); else temp=-1.0/(2*i-1); temp=(-1)i+1*1.0/(2*i-1); sum+=temp; i++; } 第二种方法: π/4=1-1/3+1/5-1/7+... =1/1+(-1)/3+1/5+(-1)/7+... 后一项分子是前一项分子的(-1)倍 后一项分母是前一项分母多2 假定项数n已找到 doublesum,item,fenzi,fenmu; 和每一项分子分母 inti;第一位 第 一 位 item=1; fenzi=1; fenmu=1; sum=sum+item; i=1; while(i) { if(i>=n)break; 否则计算下一项 fenzi=-fenzi; fenmu=fenmu+2; item=fenzi/fenmu; sum=sum+item; i++; } 第三种方法: 在累加的过程中控制次数。 doublesum,item,fenzi,fenmu; intn; fenzi=1,fenmu=1,item=1,sum=1; n=1; while(i) {n计算下一项 if(i>=n)break; 否则计算下一项 fenzi=-fenzi; fenmu=fenmu+2; item=fenzi/fenmu; sum=sum+item; n++; if(abs(item)<1e-4)break; }调试一下(自己试试) ③百钱百鸡问题 公鸡每只5元,母鸡每只3元,小鸡每3只1元。 用100元买100只鸡,问公鸡、母鸡、小鸡各能买多少只? (假设每种鸡至少1只) 问题分析: 列方程 公鸡母鸡小鸡 x+y+z=100 5x+3y+z/3=100 如何解方程? 采取穷举的方法→多重循环 先看一下,x,y,z的大致取值范围 1<=x<=100 1<=y<=100 3<=z<=100z是3的倍数 intx,y,z; for(x=1;x<=100;x++) for(y=1;y<=100;y++) for(z=3;z<=100;z++) if(x+y+z==100&&5*x+3*y+z/3==100) cout< 10.函数 函数的优点 代码复用,能够重复使用代码; 简化程序,使程序结构更清晰更好读; 更符合人们的自上而下,逐步求解的解题思路。 函数的定义形式 返回值类型函数名(参数列表) { 函数体 } 参数列表形式为: 类型变量1,类型变量2.........类型变量n 如整数求和函数 intAdd(inta,intb) { inttemp=a+b; return; } 这都比较简单,咱们重点说一下参数传递 1 传值 Voidsloap(inta,intb) { inttemp; iemp=a,a=b,b=temp; } Voidmain() { Intm=3,n=2; cout< swap(m,n); cout< } mn的值不会变,这种分式是传值 Main M不 是a 同 一 空 间b N 2 传引用 Voidswap(int&a,int&b) { Inttemp; Temp=a,a=b,b=temp; } 此时mn的值改变 Main 相当于a是m别名,b是n别名 操作a,b就是操作m,n M a N b 3 数组名做参数 理解成按引用传递(其实是按地址传递) 练习: 随机生成10个数并存入数组中。 然后将其数组倒置。 要求: 设计一个函数用于随机生成数组 设计一个函数用于打印数组中的数值 设计一个函数用于导致数组中的数值 #include srand(time(o)) rand()O~max voidgenerate(inta[],intn)//n是数组大小 { srand(time(o)); for(i=0,; { a[i]=rcmd()%101= }} Voidprint(inta[];intn) { For(inti=0;i Couct< Couct< } 下面介绍倒置: 有n对数据交换n/2 即a[0]a[n-1] A[1]a[n-2] A[i]a[n-(i+1)] A[n/2]a[n-(n/2+1)] Voidkeverse(inta[i],intn) { Intinclex=n/2; For(inti=0;i<=inclex;i++) { Inttemp; Temp=a[i]; A[a-i+1]=temp; } } 11.指针 变量、指针、指针变量 变量: 在程序运行过程中值可以变化的量。 如: inta;//a就是一个整形变量。 指针: 指针是一种数据,是变量的地址。 指针变量: 也是一种变量,故有存储空间,其内容是指针,即指针变量中有储是地址。 注意: 一旦计算机类型或者说编译程序一定,则该计算机的内存地址的占位数是一定的。 如: 16位机,其地址占16位;32位机,其地址占32位。 在该编译系统下,所以无论何种类型的指针变量,所指向的内存单元都是一样大的。 但由于类型不一样,则不同类型的指针变量将作? ? 是不同的。 (sizeof指针变量) 指针的定义方式 类型名1*指针变量名1 这样就定义了一个指针类型为“类型名为1”的指针变量 “指针变量名1”。 如int*a;//a是整型指针变量 指针和数组的配合使用 inta[5]={1,2,3,4,5,}; int*p;p=a;//p和a指向同一位置,使用指针变量p就如同使用a一样。 cout< cout<<*(p+1)< 注意: 我们知道一个地址变量时16进制数,指的是内存中一个字节开始位置,即内存是以字节为单位编址的,而整型int,在c++中长32位,占4个字节,故上面p+1其实是实际地址+4,并作是1. 但这都是编译理解考虑的,我们+1就是了。 动态分配内存空间 定义一个变量,就意味着为该变量分配了内存空间。 如;inta;则
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构