文档介绍:第3章数据结构
1
第3章数据结构
数组
指针
字符串
对象与指针
枚举
共用体
关于声明符的进一步讨论
2
数组
一维数组
二维数组
对象数组
3
一维数组的定义
一维数组(向量)是一种整体定义、个别使用的数据结构。作为一个整体,数组有如下特征:
· 名字:用以对数组各元素的整体标识,这个名字称为数组名;
· 类型:数组各元素的类型;
· 大小:可容纳的数组元素个数(注意,不是字节数);
· 存储:占有一个连续的内存空间。
与简单变量一样,上述特征要用声明语句定义,格式如下:
类型数组名[大小];
4
一维数组的初始化
数组的声明语句是定义性声明,在声明的同时可以对数组各元素初始化,初始化表达式按元素顺序依次写在一对花括号内
C + + 语言还允许使用下列初始化的省略方式
1)初始化时也可以不指定数组的大小,编译器会根据初始值的个数自动决定数组大小
2)允许省略为0的元素值
3)当最后的几个元素初值为0时,可以只写出前面的数列,但数组体积不可省略
5
数组元素
作为数组的个体,数组中的每个元素都有如下特征:
它们的类型是相同的
每个元素用数组名加上括在方括号中的下标表示。下标表示该元素在数组中的顺序,下标以0为起始计数
6
模拟洗扑克牌
基本思路是:将54张扑克牌统一编号为:0,1,2,……,52,53,然后随机地从中一一抽取一张牌,并依次放起,形成新的序列。具体要解决两个问题:如何存储54张扑克牌以及在此基础上如何一一抽取
随机抽牌算法
在0到53之间产生一个随机数r,将pk[0]与pk[r]交换
7
类结构
#include <>
#include <>
int pk[qqchyan1][] = { 501,502, 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};
class Pack
{ public:
void makePackOnce();
};
void Pack::makePackOnce()
{
int temp,r;
for(int i = 0; i < 53; i ++) // 洗一次牌
{
r= int(float(53 - i) * rand() / RAND_MAX) + i; temp = pk[i];
pk[i] = pk[r];
pk[r] = temp;
cout << pk[i] << ","; // 打印洗好的牌
}
cout << pk[i] << endl; // 打印洗好的最后一张牌
}
8
多次洗牌程序
void Pack::makePackAny()
{
int temp,r,times;
cout << "\nTimes for take the pack is:";
cin >> times; // 输入拟洗牌次数
cout << endl;
for(int j =1; j <= times; j ++) // 洗times次牌
{
cout << "Time: " << j <<endl;
for(int i = 0; i < 53; i ++) //一次洗牌
{r= int(float(53 - i) * rand() / RAND_MAX) + i;
temp = pk[i];
k[i] = pk[r];
pk[r] = temp;
cout << pk[i] << ",";
}
cout << pk[i] << endl;
}
}
9
动态地改变随机数序列起点
void Pack::makePackAny()
{
int temp,r,times;
cout << "\nTimes for take the pack is:";
cin >> times; // 输入拟洗牌次数
cout << endl;
srand(time(NULL)); // 用时间函数设置随机数序列的起点
for(int j =1; j <= times; j ++) // times次洗牌
{
for(int i = 0; i < 53; i ++) // 其中的一次洗牌
{
r= int(float(53 - i) * rand()