6组织同类型数据ppt课件_第1页
6组织同类型数据ppt课件_第2页
6组织同类型数据ppt课件_第3页
6组织同类型数据ppt课件_第4页
6组织同类型数据ppt课件_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

1、C言语程序的数据构造根底第2篇数据构造 + 算法 = 程序C言语提供的数据耐久化技术,用来把数据存储在外部存储器上一种基于变量地址的派生数据类型一种描画一类对象属性的构外型数据类型一种用来组织同类型数据的构外型数据类型数组构造体指针文件这一篇主要引见C言语提供的4种构外型数据类型:顺序地组织同类型数据数组类型数组是一种用于组织同类型数据的构外型数据类型,其特征是类型一样、顺序存储、随机访问、空间延续。第5单元5.1 数组根底数组定义、数组初始化、数组元素援用5.1.1 扑克牌的表示与数组定义1. 用数组存储扑克牌101113,分别表示红桃A红桃K;201213,分别表示方块A方块K;30131

2、3,分别表示梅花A梅花K;401413,分别表示黑桃A黑桃K;501、502,分别表示大王、小王。这样,54张扑克牌可以用一个int类型数组card表示和存储,而每个元素以其在数组中下标subscript或索引index区分,如card0、card1、card2、card53 分别表示54张扑克牌。2. 数组的定义数组定义的普通格式是数组用一个名字存储多个同类型数据。运用数组前,必需先进展定义。存储扑克的数组card可以用如下声明定义。int card54; 数组类型 数组名 数组长度 ;这个声明语句定义了一个名字为card的数组;它有54个元素下标变量,称数组大小为54;并且每个元素都是in

3、t类型,称这是一个int类型的数组。3. 数组初始化数组card的初始化语句为int card 54= 101,102,103,104,105,106,107,108,109,110,111,112,113,201,202,203,204,205,206,207,208,209,210,211,212,213,301,302,303,304,305,306,307,308,309,310,311,312,313,401,402,403,404,405,406,407,408,409,410,411,412,413,501,502;注1:C言语允许对数组中左面的部分元素初始化。例如,可以写成in

4、t card 54= 101,102 ;注2:对于将全部元素都初始化时,在声明语句中可以省略数组长度。例如int card = 101,102,103,104,105,106,107,108,109,110,111,112,113,201,202,203,204,205,206,207,208,209,210,211,212,213,301,302,303,304,305,306,307,308,309,310,311,312,313,401,402,403,404,405,406,407,408,409,410,411,412,413,501,502 ;这样,只需前两个元素被初始化,后面元素

5、的值还是不确定的只对部分元素初始化时,不可以省略数组大小。4. 数组的特点各元素具有一样类型。这个类型称为数组基类型。元素之间具有顺序性逻辑上的顺序性和物理存储上的顺序性,并用下标表示这种顺序关系。(1)(2)一个数组的一切元素占有一片延续的内存空间。(3)数组的元素可以用下标随机访问。留意:下标从0开场(4)5.1.2 扑克牌查找:数组元素援用与数组名参数1. 数组元素的援用数组名加上括在方括号中的下标。例如card0、card1、card2、card3、的语法意义,就相当于一组变量,称为下标变量。用下标变量可以随机地访问数组中的任何一个元素,对其赋值或援用其值。代码5.1 用赋值方法给定每

6、张扑克牌的值,输出各张扑克牌的值并搜索一张牌。#include int main (void)int card54 ,i, j, k, x, flag = -1;/* 数组元素赋值 */for( i = 0; i 4; i +)/* 在反复构造中给前52个元素赋值 */for(j = 0; j 13; j +)cardi * 13 + j = 100 * (i + 1) + j + 1;card52 = 501;/* 给最后两张扑克牌赋值 */card53 = 502;/* 输出各张牌的值 */for( i = 0; i = 53; i +) printf(card%d= %d, ,i,car

7、di );/* 搜索一张扑克牌 */printf(n输入要查找的牌:);scanf(“%d,&x);for (k = 0; k 54; k +)/* 搜索为x的牌*/if(cardk = x)flag = k;break;if(flag = -1)printf(n找不到要找的牌!);elseprintf(n这张牌是第%d张牌。,k);return 0;2. 用函数实现数组操作功能与数组名参数代码5.3 扑克牌搜索函数。int searchCard(int pk54 ,int x) int k; for (k = 0; k 54; k +) /* 搜索为x的牌*/ if (pkk = x) re

8、turn k; return -1;代码5.4 函数searchCard()的测试主函数。#include int searchCard(int pk ,int x);int main (void)int x,f;int card54 = 101,102,103,104,105,106,107,108,109,110,111,112,113,201,202,203,204,205,206,207,208,209,210,211,212,213,301,302,303,304,305,306,307,308,309,310,311,312,313,401,402,403,404,405,406,

9、407,408,409,410,411,412,413,501,502 ;printf(n输入要查找的牌: );scanf(%d,&x);f = searchCard(card,x); if (f = -1)printf(n找不到要找的牌!n);else printf(n要找的是第%d张牌!n, f);return 0;在C言语中数组名有两种含义:一是用来标识数组;二是代表数组的首地址。因此,数组名作为函数参数,在函数被调用时所传送的不是数组的内容,而是数组在内存中的起始地址。 运用数组名作为函数参数,需求用一对方括号明确地指明它是一个数组,并且要指出其数组类型。除非特殊情况,普通数组的大小可

10、以不传输。由于在调用时,会用实践数组参数的大小来初始化方式数组参数的大小。3. 函数的测试要测试函数,需求为之设计一个驱动函数。在C言语中,普通用主函数作为驱动函数。驱动函数要为被测试函数预备所需求的实践参数。对于函数searchCard(),需求有一个为之提供可操作的数组。5.1.3 扑克洗牌的随机模拟1. 一次洗牌模拟算法在053之间产生一个随机数rdm,将card0与card rdm交换;在153之间产生一个随机数rdm,将card 1与card rdm交换;在253之间产生一个随机数rdm,将card 2与card rdm交换;在i53之间产生一个随机数rdm,将cardi与card

11、rdm交换;这个过程可以描画为:120irdm53已洗好部分未洗好部分下标内容tempfor( i = 0; i 54; + i)在i到53之间产生随机数rdm;将cardi与cardrdm交换;代码5.5 一次洗牌模拟函数。#include #include void shuffle(int card)int i,rdm, temp;srand(time(00);/* 用时间函数作为伪随机数序列种子*/for(i = 0; i 54;+ i)rdm = rand() % (54 - i) + i;/* 生成一个i,53之间的随机数*/temp = cardi;/* 交换两个数组元素的值*/c

12、ardi = cardrdm;cardrdm = temp;代码5.6 多次洗牌模拟函数。#include #include void shuffle(int card)int times = 1;/* 洗牌次数*/int i, j,rdm,temp;srand(time(00); /* 用时间函数作为伪随机数序列种子 */printf(n请输入洗牌次数:);scanf(%d,×);for(j = 0;j times;+ j)/* 反复n次*/for(i = 0; i 54;+ i)rdm = rand() % (54 - i) + i; /* 生成一个i,53之间的随机数*/tem

13、p = cardi;cardi = cardrdm;cardrdm = temp; 5.1.4 扑克牌整理:数组元素排序1. 冒泡排序算法每当一场扑克游戏终了后,人们总要把玩后被搞得乱序的牌进展整理,即按照一定的顺序陈列好。对于本例来说,就是把card数组中的元素进展排序。排序sorting也称分类,是指将一列数据按一定的规那么陈列。排序方法很多,例如,有交换法、选择法、希尔法、插入法等,不同的方法效率不同。本节仅引见一种在算法上具有代表性的交换排序算法冒泡排序。7539157391537915379153719351793157913579开场第1轮n-1次比较第2轮n-2次比较终了 第n-

14、1轮2. 扑克牌整序函数代码代码5.7 运用冒泡排序法的扑克整理排序函数。void cardSort(int card) /* 扑克整理方法 */int temp,i,j;for(j = 0; j 53 - 1; j +)/* 总轮数 */for(i = 0; i cardi + 1)temp = cardi;cardi = cardi + 1;cardi + 1 = temp;3. 扑克牌输出函数代码补充代码: 扑克输出函数。void printCards(int card,int cardNum) int i; for( i = 0; i cardNum; i +) printf(card

15、%d= %d, ,i,cardi); 4. 整牌函数的测试#include #include #include /* time()要求的头文件*/void shuffle(int card);/* 洗牌函数原型 */void cardSort(int card);/* 整牌函数原型 */void printCards(int card,int cardNum);/* 输出各张扑克牌 */int main (void)int card = 101,102,103,104,105,106,107,108,109,110,111,112,113,201,202,203,204,205,206,207

16、,208,209,210,211,212,213,301,302,303,304,305,306,307,308,309,310,311,312,313,401,402,403,404,405,406,407,408,409,410,411,412,413,501,502 ;printf(“n扑克牌的初始序列:n);printCards(card,54);shuffle(card);printf(“n洗牌后的扑克牌序列:n);printCards(card,54);cardSort(card);printf(“n整牌后的扑克牌序列:n);printCards(card,54);return 0

17、;5.1.5 扑克发牌:二维数组运用1. 问题描画与算法框架发牌deal就是把洗好的牌,按照商定张数逐一发送到玩家hand手中。hand1hand2hand3hand4531314121617157861011919201821120453ij代码5.8 发牌算法的C言语描画。int i = 0, j;for( j = 0; j cardNumber; + j) /* cardNumber为每人发牌数目*/ hand1j = cardi; cardi = 0;+ i; /* cardi = 0 意味牌曾经被取走*/ hand2j = cardi; cardi = 0;+ i; /* +i为下一

18、张牌下标 */ hand3j = cardi; cardi = 0;+ i; hand4j = cardi; cardi = 0;+ i;2. 用二维数组表示玩家手中的牌即一维用于表示玩家,另一维用于表示玩家手中的牌。例如,二维数组hand采用声明语句int hand 4 12 ;声明后,就表示开辟了一个4 12个int类型存储空间,4表示4个玩家,12表示每人手中有12张牌。每个下标变量分别表示某个人手中的某张牌。例如,hand25表示第3个玩家手中的第6张牌。1援用二维数组元素,要运用两个下标,并且它们都用从0开场的整型常量或整型表达式表示。2二维数组初始化:例如:int a32 = 1,

19、2,3,4,5,6;例如:int a32 = 1,2,3,4,5,6;(1)(2)例如:int a 2 = 1,2,3,4,5,6;(3)例如:int a32 = 1,3,5;可以将行第1维的长度省略,但第2维的大小不可以省略(4)还可以对部分元素初始化,但这时不可缺省第1维的大小。 3. 运用二维数组的发牌方法运用二维数组int hand后,用第1维表示玩家;用第2维表示给每位玩家的发牌数,各人手中的牌分别是:hand00、hand01、hand02、hand011;第1人手中的牌为hand10、hand11、hand12、hand111;第2人手中的牌为hand20、hand21、hand

20、22、hand211;第3人手中的牌为hand30、hand31、hand32、hand311;第4人手中的牌为对于更普通的情况,需求先确定玩家数handNumber和每人发牌数cardNumber代码5.9 运用二维数组的发牌函数。#define cardNumber 12 /* cardNumber为每人发牌数目 */#define handNumber 4 /* handNumber为玩家数目 */void deal( int card ,int handcardNumber )int i = 0, j, k;for(j = 0;j cardNumber;+ j)for(k = 0; k

21、 handNumber; + k)handkj = cardi; cardi = 0;+ i;代码5.10 不传送二维数组的发牌函数。#define cardNumber 12 /* cardNumber为每人发牌数目 */#define handNumber 4 /* handNumber为玩家数目*/void deal( int card ) int i = 0, j, k; int handhandNumbercardNumber; for(j = 0;j cardNumber;+ j) for(k = 0; k handNumber; + k) handkj = cardi; card

22、i = 0;+ i; for(k = 0;k handNumber;+ k) printf (n第%d人手中的牌为:,k + 1); for(j = 0; j cardNumber; + j) printf (%d ,handkj); 4. 发牌函数的测试运用代码5.9中的发牌函数,调用函数需求为其传输如下数据: 每人发牌数目cardNumber。 玩家数目handNumber。 存储扑克牌的数组首地址。 存储玩家手中牌的二维数组首地址。同时,调用函数还需求对扑克牌数组进展了初始化。#include #define cardNumber 12#define handNumber 4void d

23、eal(int card,int handcardNumber);void printCards(int card,int cardNum); /* 输出各张扑克牌*/int main (void) int i; int card54 = 101,102,103,104,105,106,107,108,109,110,111,112,113,201,202,203,204,205,206,207,208,209,210,211,212,213,301,302,303,304,305,306,307,308,309,310,311,312,313,401,402,403,404,405,406,

24、407,408,409,410,411,412,413,501,502 ; printf(n扑克牌的初始序列:); printCards(card,54); printf(n发牌情况:); deal(card); printf(n发牌后的底牌:); printCards(card,54); return 0; #include #define cardNumber 12#define handNumber 4void deal(int card,int handcardNumber);void printCards(int card,int cardNum); /* 输出各张扑克牌*/int

25、main (void)int handhandNumbercardNumber;int i;int card54 = 101,102,103,104,105,106,107,108,109,110,111,112,113,201,202,203,204,205,206,207,208,209,210,211,212,213,301,302,303,304,305,306,307,308,309,310,311,312,313,401,402,403,404,405,406,407,408,409,410,411,412,413,501,502 ;printf(扑克牌的初始序列:);printC

26、ards(card,54);deal(card, hand);printf(发牌情况:);for(i = 0; i handNumber; i +)printf(玩家%d手中的牌为:,i);printCards(handi, cardNumber);printf(n); printf(发牌后的底牌:); printCards(card,54);return 0;5.2 字符串C言语的字符串是基于字符数组的5.2.1 字符串与字符数组1. 字符串的概念在C言语中,把用一对双撇号括起来的零个或多个字符序列称为字符串常数。如“hello、 “Programming in C等。字符串中的字符数称为该

27、字符串的长度。如上述字符串的长度分别为5和16。2. 字符串中的特殊字符1本义字符的书写。字符串以双撇号为定界符,但双撇号并不属于字符串。要在字符串中插入撇号,应借助本义字符。例如,要处置字符串I say:Goodbye!时,可以把它写为I say:Goodbye!2格式字符串中的格式字符。格式化输入输出函数的格式参数都是一个字符串也称格式字符串,其中的格式字符如c、d、f等都要以%开头书写。一切的本义字符,在字符串中都要以反斜杠开头书写。3. 字符串的存储与字符数组在C言语中,字符串用字符数组存储,并且在字符串的末尾加一个字符串终了标志本义字符“0。如字符串“hello在内存中存储为留意字符

28、常数与字符串常数的区别,例如:A 是一个字符常数,用65存储;而“ A是一个字符串常数,用6 50存储。 表示一个空格,用32存储;而“表示一个空字符串,用 0 存储。hello04. 字符数组的定义及初始化字符数组是以字符为元素的数组,它的定义与初始化方法与一维数组一样。例如:char str1=C, h, i, n, a;char str212= C, , p, r, o, g, r, a, m, i, n, g;字符串是特殊的字符数组,以字符串终了标志0为最后一个元素。5. 字符串的定义和初始化可以有如下几种方式:char str16= C, h, i, n, a, 0; /*基于字符的

29、初始化*/char str16= “China; /* 字符串方式的初始化*/char str16= “China; /* 字符串方式的初始化*/char str1=C, h, i, n, a, 0; /* 基于字符的初始化 */char str1=“China; /* 字符串方式的初始化 */char str1=“China; /* 字符串方式的初始化 */运用字符串方式的初始化方式,C编译器将自动加上一个0标志。因此给定的字符数组的大小要比实践存储的字符串中的有效字符数多1。6.为字符串常量添加下标C+言语也允许用下标来援用字符串常量中的一个字符,例如char ch;ch=“I am a

30、student.8printf(“%c,ch);将输出字符t。这在某些情况下会比较方便。5.2.2 字符串输入输出在定义了一个字符串后,可以采用两类库函数进展输入/输出操作。运用这两类库函数,必需在程序中运用文件包含语句#include 。输入函数输出函数格式化输入输出库函数scanf()printf()非格式化输入输出库函数gets()puts()1. 运用%s格式的格式化输入函数scanf()在scanf()/printf()函数中运用%s格式,可以实现字符数组内容的一次性输入/输出。假设字符串变量名为str,那么可以运用下面的语句进展整体的键盘输入:scanf(%s,str);留意1 :

31、在scanf( )函数中,假设数据参考处运用的是数组名,那么数组名前不可以加取地址符&。由于数组名本身就是一个地址。留意2:运用%s格式的scanf()函数进展字符串的键盘输入时,遇到一个空白类字符空格、制表符,Enter等就表示一个字符串的终了,系统会就此给它加上一个字符串终了标志0。例如对于语句:scanf(%s,str);假设从键盘上键入 Computer & C那么在变量str中保管的是Computer0留意3:假设用曾经定义的长度较大字符数组存储字符串,那么数组中的空余元素将用0填充。例如char str19, str29, str39;scanf(%s %s %s , str1,s

32、tr2, str3);假设从键盘上键入 Computer & C那么这三个数组中的存储情况为:str1str2str3Computer0&00000000C000000002. 运用%s格式的格式化输出函数printf()运用下面的语句可以进展字符串的整体输出printf(%s,str);留意:输出的内容中不包括字符串终了标志0。3. 运用字符串处置函数gets()和puts()实现非格式化输入输出puts()函数用来输出一个字符串,它的作用与printf(“%s,字符串)一样。但用puts()函数一次只能输出一个字符串,不能企图用puts (str1,str2)的方式一次输出两个字符串。ge

33、ts()函数是一个用来输入一个字符串的函数。代码5.11 #include #define N 13int main (void) char strN;printf(请输入一个字符串:n);gets (str);puts (str);puts (str);return 0;(1)用gets()可以读入包括空格字符的字符串。(2)用puts()输出时,将“0字符转换成换行符,因此用puts()时一次输出一行,不用另加换行符。(3) gets()和puts()函数都是具有前往值的函数,它们执行胜利时将前往字符数组首元素的地址。请输入一个字符串:Computer & CComputer & CCom

34、puter & C代码5.12 #include #define N 13int main () char strN;printf(请输入一个字符串:n);printf(gets的前往值为:%dn,gets (str);printf(puts的前往值为:%dn,puts (str); return 0;5.2.3 字符串的其他操作1. 字符串操作库函数字符串不能直接用系统定义的操作符进展赋值、比较等操作。下表是其中运用较多的几个字符串操作库函数。函数的一般形式功能说明返回值strlen(字符串)求字符串长度有效字符个数strcpy(字符串1,字符串2)将字符串2复制到字符串1中字符串1的起始地址strcmp(字符串1,字符串2)比较两个字符串字符串1=字符串2,返回0;字符串1字符串2,返回正整数;字符串1字符串2,返回负整数strchr(字

温馨提示

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

评论

0/150

提交评论