结构体编程练习

结构体编程练习
结构体编程练习

实验十二:结构体编程练习

一:实验目的:

1、理解结构体和共用体的作用功能;

2、掌握结构体类型变量的定义方法;

3、掌握结构体变量的使用方法;

4、掌握结构体数组,并能较熟练应用;

5、理解指向结构体类型数据的指针

二:实验内容及要求:

1、用结构体实现在屏幕上模拟显示一个数字式时钟;

思考题:

①用结构体指针作为函数参数与用结构体变量作为函数参数有什么不

同?本题可以用结构体变量作为函数参数编程实现吗?

②请读者自己分析下面两段程序代码,并解释它们是如何实现时钟值

更新操作的。

2、洗牌和发牌模拟(选作)

参考教材P329~332,编程实现洗牌和发牌模拟。

三:程序源代码:

题目1:

#include

struct clock

{

int hour;

int minute;

int second;

};typedef struct clock CLOCK;

void Update(CLOCK*t);

void Display(CLOCK*t);

void Delay(void);

main()

{

CLOCK t;

long i;

t.hour = t.minute = t.second = 0;

for (i=0; i<100000; i++)

{

Update(&t);

Display(&t);

Delay();

}

}

void Update(CLOCK*t)

{

t->second++;

if(t->second==60)

{

t->minute++;

t->second=0;

}

if(t->minute==60)

{

t->hour++;

t->minute=0;

}

if(t->hour==24)

{

t->hour=0;

}

}

void Display(CLOCK*t)

{

printf("%2d:%2d:%2d\r",t->hour,t->minute,t->second); }

void Delay(void)

{

long m;

for(m=0;m<50000000;m++)

{

;

}

}

题目2:

#include

#include

#include

#include

struct cards

{

char suit[10];

char face[10];

};typedef struct cards CARD;

void Deal(CARD *wCard);

void Shuffle(CARD *wCard);

void FillCard(CARD wCard[],char *wFace[],char *wSuit[]);

main()

{

char *suit[]={"Spades","Hearts","Clubs","Diamonds"};

char

*face[]={"A","2","3","4","5","6","7","8","9","10","jACK","Queen","King"};

int i;

CARD card[52];

srand(time(NULL));

FillCard(card,face,suit);

Shuffle(card);

Deal(card);

}

void FillCard(CARD wCard[],char *wFace[],char *wSuit[])

{

int i;

for(i=0;i<52;i++)

{

strcpy(wCard[i].suit,wSuit[i/13]);

strcpy(wCard[i].face,wFace[i%13]);

}

}

void Shuffle(CARD *wCard)

{

int i,j;

CARD temp;

for(i=0;i<52;i++)

{

j=rand()%52;

temp=wCard[i];

wCard[i]=wCard[j];

wCard[j]=temp;

}

}

void Deal(CARD *wCard)

{

int i;

for(i=0;i<52;i++)

printf("%10s%10s\n",wCard[i].suit,wCard[i].face);

}

四:运行结果、分析与讨论:

题目1:

0: 0:19

思考题:

①用结构体指针作为函数参数,这种方式比用结构体变量作函数参数效率高,

因为无需传递各个成员的值,只需传递一个地址,且函数中的结构体成员并不占据新的内存单元,而与主调函数中的成员共享存储单元。这种方式还可通过修改形参所指成员影响实参所对应的成员值。而用结构体变量做函数参数效率较低,优势小。用结构体变量作为函数参数编程并不能实现实验目的。

变量离开用户自定义的函数时,内存释放,且无法返回具体的值,故不可实现实验目的。

②这两个程序都有相似之处。将m定义为静态长整型变量,在第一个程序中:

t->hour = m / 3600; 通过取余来实现对小时的计时,

t->minute = (m – 3600 * t->hour) / 60;

t->second = m % 60; 通过取整来实现对秒的计时,

而第二个程序中:

t->minute = (m / 60) % 60;

t->hour = (m / 3600) % 24;

这个与第一个有所不同,但实际的效果是一样的。

题目2:

Diamonds jACK

Hearts 10

Spades 9

Hearts 3

Hearts 5 Clubs 10 Clubs 9 Spades 5 Hearts 9 Hearts King

Spades 6

Spades 4 Diamonds 4 Clubs jACK

Spades 8

Clubs 4

Clubs Queen

Spades 3 Diamonds 8

Clubs 5

Clubs King

Clubs 3

Hearts A

Hearts 4

Spades King

Hearts 6

Hearts 7

Hearts 2

Hearts jACK

Spades Queen

Spades A

Diamonds 5

Hearts Queen

Diamonds 3

Spades 10

Spades jACK

Clubs 7

Spades 7

Diamonds 9

Clubs 8

五:实验心得与体会:

这次实验主要掌握结构体数组,并能较熟练应用结构体。在程序设计过程中,我们会发现结构体的不少优势。特别是用结构体指针作函数参数时,更能体现出它的优势。特别要注意的是,关键字struct 结构体名是当作一个整体来看待,用以表示新的数据类型名,而且在表声明结束后,“;”是绝对不能省略的。使用结构体指针作函数参数只需传递一个地址,且函数中的结构体成员并不占据新的内存单元,而与主调函数中的成员共享存储单元。这大大提高程序运行效率,同时又节约了内存。

相关主题
相关文档
最新文档