结构体编程练习
实验十二:结构体编程练习
一:实验目的:
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 结构体名是当作一个整体来看待,用以表示新的数据类型名,而且在表声明结束后,“;”是绝对不能省略的。使用结构体指针作函数参数只需传递一个地址,且函数中的结构体成员并不占据新的内存单元,而与主调函数中的成员共享存储单元。这大大提高程序运行效率,同时又节约了内存。