C语言结构体和共用体实验报告.docx
《C语言结构体和共用体实验报告.docx》由会员分享,可在线阅读,更多相关《C语言结构体和共用体实验报告.docx(26页珍藏版)》请在冰豆网上搜索。
C语言结构体和共用体实验报告
实验九参考程序
实验9-1
/****************************************************************
*实验9.1
*
*
(1)为某商店的商品设计合适的结构体(PRODUCT)。
每一种商品包含编号(number)、
*名称(name)、价格(price)、折扣(discount)4项信息,根据表9-1,为这些信息选择合适的数据类型。
*
(2)建立2个函数,以实现对商品的操作。
input函数实现商品的输入;
*display函数显示商品信息。
要求这2个函数都以商品的结构体(PRODUCT)指针为参数。
*(3)在主函数中为商品键盘定义一个结构体变量(keyboard),利用input函数实现键盘信息的输入;
*定义一个结构体数组(elec_device[3]),利用input函数实现冰箱、空调、电视信息的输入;
*最后利用display函数显示4种商品的信息。
*
*表9-1
*
*编号名称价格折扣
*1010键盘89.500.85
*1021冰箱1024.000.95
*1022空调2058.500.90
*1023电视3001.880.95
*
****************************************************************/
#include
typedefstruct_PRODUCT
{
intiNumber;
charstrName[32];
floatfPrice;
floatfDiscount;
}PRODUCT,*PPRODUCT;
voidinput(PRODUCT*pProduct);
voiddisplay(PPRODUCTpProduct);
voidmain()
{
inti;
PRODUCTkyeboard;
PRODUCTelec_device[3];
input(&kyeboard);
for(i=0;i<3;i++)
{
input(&elec_device[i]);
}
display(&kyeboard);
for(i=0;i<3;i++)
{
display(&elec_device[i]);
}
}
/****************************************************************
*
*函数名称:
input()
*
*参数:
PRODUCT*pProduct-PRODUCT结构体指针,用来存放输入数据
*
*
*返回值:
无
*
*说明:
*该函数用来完成PRODUCT结构体数据的输入。
*
*
*
**************************************************************/
voidinput(PRODUCT*pProduct)
{
printf("\n请输入商品的编号:
\n");
scanf("%d",&pProduct->iNumber);
printf("请输入商品的名称:
\n");
scanf("%s",pProduct->strName);
printf("请输入商品的价格:
\n");
scanf("%f",&pProduct->fPrice);
printf("请输入商品的折扣:
\n");
scanf("%f",&pProduct->fDiscount);
}
/**************************************************************
*
*函数名称:
display()
*
*参数:
PRODUCTpProduct-PRODUCT结构体数据
*
*
*返回值:
无
*
*说明:
*该函数用来完成PRODUCT结构体数据的显示。
*
****************************************************************/
voiddisplay(PPRODUCTpProduct)
{
printf("\n商品的编号:
%d\n",pProduct->iNumber);
printf("商品的名称:
%s\n",pProduct->strName);
printf("商品的价格:
%.2f\n",pProduct->fPrice);
printf("商品的折扣:
%.2f\n",pProduct->fDiscount);
}
实验9-2
/****************************************************************
*实验9.2
*
*
(1)利用链表结构(PLAY_LIST),为某媒体播放器建立一个播放列表(playList),
*该链表的每一个节点包括:
歌曲编号(number)、歌曲名称(name)、歌手姓名(artist)、歌曲长度(time),见表9-2。
*
(2)建立4个函数,以实现对播放列表操作。
函数的原型如下:
*创建播放列表PLAY_LIST*createList();
*在播放列表中添加一首歌曲PLAY_LIST*insertItem(PLAY_LIST*pPlayList,PLAY_LIST*pNewPlayList);
*在播放列表中删除编号为iItemNumber的歌曲PLAY_LIST*deleteItem(PLAY_LIST*pPlayList,intiItemNumber);
*显示整个播放列表中的所有信息voiddisplayIList(PLAY_LIST*pPlayList);
*(3)在主函数中定义一个链表playList。
*A)利用函数createList创建播放列表playList,并在其节点上依次存储编号为1100、1102、1103的3首歌曲,
*并调用displayList函数显示此时整个播放列表中的所有信息。
*B)调用insertItem函数将编号为1101的歌曲添加到playList中,并显示整个播放列表中的所有信息。
*C)调用deleteItem函数将编号为1102的歌曲从playList中删除,并显示整个播放列表中的所有信息。
*
*
*表9-2
*
*歌曲编号歌曲名称歌手姓名歌曲长度
*1100落叶归根王力宏05:
16
*1101风吹麦浪李健04:
07
*1102往事随风齐秦04:
38
*1103天空王菲03:
42
*
****************************************************************/
#include
typedefstruct_PLAY_LIST
{
intiNumber;
charstrName[64];
charstrArtist[32];
struct_TIME
{
intiMinutes;
intiSeconds;
}sTime;
struct_PLAY_LIST*pNext;
}PLAY_LIST,*PPLAY_LIST;
PLAY_LIST*createList();
PLAY_LIST*insertItem(PLAY_LIST*pPlayList,PLAY_LIST*pNewPlayList);
PLAY_LIST*deleteItem(PLAY_LIST*pPlayList,intiItemNumber);
voiddisplayList(PLAY_LIST*pPlayList);
intinputItem(PLAY_LIST*pPlayList);
voidmain()
{
PLAY_LIST*pPlayList=NULL;
PLAY_LIST*pNewPlayList=NULL;
pPlayList=createList();
printf("播放列表:
\n");
displayList(pPlayList);
printf("\n播放列表插入曲目:
\n");
pNewPlayList=createList();
pPlayList=insertItem(pPlayList,pNewPlayList);
printf("插入新的曲目之后的播放列表:
\n");
displayList(pPlayList);
printf("\n播放列表删除曲目:
\n");
pPlayList=deleteItem(pPlayList,1102);
printf("删除编号为1102的曲目之后的播放列表:
\n");
displayList(pPlayList);
}
/****************************************************************
*
*函数名称:
createList()
*
*参数:
无
*
*
*返回值:
PLAY_LIST*-返回创建好的播放列表链表
*
*说明:
*该函数用来创建播放列表链表。
*
*
*
***************************************************************/
PLAY_LIST*createList()
{
intiResult=0;
PLAY_LIST*pListHead,*pTemp,*pNewList;
pTemp=pNewList=(PLAY_LIST*)malloc(sizeof(PLAY_LIST));
pNewList->pNext=NULL;
pListHead=NULL;
printf("创建新播放列表\n");
iResult=inputItem(pNewList);
if(iResult)
{
pListHead=pNewList;
}
while(iResult)
{
pNewList=(PLAY_LIST*)malloc(sizeof(PLAY_LIST));
pNewList->pNext=NULL;
iResult=inputItem(pNewList);
if(iResult)
{
pTemp->pNext=pNewList;
pTemp=pNewList;
}
}
returnpListHead;
}
/***************************************************************
*
*函数名称:
insertItem()
*
*参数:
PLAY_LIST*pPlayList-操作的播放列表链表
*PLAY_LIST*pNewPlayList-插入的新项目
*
*
*
*返回值:
PLAY_LIST*-返回操作后的播放列表链表
*
*说明:
*该函数用来完成播放列表链表的新项目插入。
*
*
*
****************************************************************/
PLAY_LIST*insertItem(PLAY_LIST*pPlayList,PLAY_LIST*pNewPlayList)
{
PLAY_LIST*pTemp;
if(NULL==pPlayList||NULL==pNewPlayList)
{
if(pPlayList)
returnpPlayList;
if(pNewPlayList)
returnpNewPlayList;
returnNULL;
}
pTemp=pPlayList;
if(pTemp->iNumber>pNewPlayList->iNumber)
{
pNewPlayList->pNext=pTemp;
returnpNewPlayList;
}
while
(1)
{
if(pTemp->pNext==NULL)
{
pTemp->pNext=pNewPlayList;
break;
}
if(pTemp->pNext->iNumber>pNewPlayList->iNumber)
{
pNewPlayList->pNext=pTemp->pNext;
pTemp->pNext=pNewPlayList;
break;
}
pTemp=pTemp->pNext;
}
returnpPlayList;
}
/****************************************************************
*
*函数名称:
deleteItem()
*
*参数:
PLAY_LIST*pPlayList-操作的播放列表链表
*intiItemNumber-删除项目的编号
*
*
*
*返回值:
PLAY_LIST*-返回操作后的播放列表链表
*
*说明:
*该函数用来完成播放列表链表的项目删除。
*
*
****************************************************************/
PLAY_LIST*deleteItem(PLAY_LIST*pPlayList,intiItemNumber)
{
PLAY_LIST*pTemp;
if(NULL==pPlayList)
{
returnNULL;
}
pTemp=pPlayList;
if(pTemp->iNumber==iItemNumber)
{
returnpTemp->pNext;
}
while
(1)
{
if(pTemp->pNext==NULL)
{
break;
}
if(pTemp->pNext->iNumber==iItemNumber)
{
pTemp->pNext=pTemp->pNext->pNext;
break;
}
pTemp=pTemp->pNext;
}
returnpPlayList;
}
/****************************************************************
*
*函数名称:
displayList()
*
*参数:
PLAY_LIST*pPlayList-显示的播放列表链表
*
*
*
*
*返回值:
无
*
*说明:
*该函数用来完成播放列表链表的内容显示。
*
*
*
****************************************************************/
voiddisplayList(PLAY_LIST*pPlayList)
{
PLAY_LIST*pTemp;
printf("\n歌曲编号\t歌曲名称\t歌手姓名\t歌曲时间长度(mm:
ss)\n");
if(NULL==pPlayList)
{
return;
}
pTemp=pPlayList;
while(pTemp)
{
printf("%-8d\t%-8s\t%-8s\t%02d:
%02d\n",
pTemp->iNumber,
pTemp->strName,
pTemp->strArtist,
pTemp->sTime.iMinutes,
pTemp->sTime.iSeconds);
pTemp=pTemp->pNext;
}
}
/****************************************************************
*
*函数名称:
inputItem()
*
*参数:
PLAY_LIST*pPlayList-操作的播放列表链表
*
*
*返回值:
int-正常返回1,不正常返回0
*
*说明:
*该函数用来完成播放列表链表的内容输入。
*
*
*
****************************************************************/
intinputItem(PLAY_LIST*pPlayList)
{
printf("请输入歌曲编号,编号小于0结束输入:
\n");
scanf("%d",&pPlayList->iNumber);
if(pPlayList->iNumber<0)
return0;
printf("请输入歌曲名称:
\n");
scanf("%s",pPlayList->strName);
printf("请输入歌手姓名:
\n");
scanf("%s",pPlayList->strArtist);
printf("请输入歌曲时间长度(mm:
ss):
\n");
scanf("%d:
%d",&pPlayList->sTime.iMinutes,&pPlayList->sTime.iSeconds);
return1;
}
实验9-3
#include
uniondata
{
intiData[2];
floatfData;
charstrData[4];
unsignedintuData;
}myUnion;
voidmain()
{
intiTemp;
charstrTemp;
floatfTemp;
unsignedintuTemp;
/*第一部分*/
printf("第一部分\n");
myUnion.iData[0]=-1;
myUnion.iData[1]=1;
iTemp=myUnion.iData[0];
printf("iTemp=%d\n",iTemp);/*iTemp的值是多少*/
uTemp=myUnion.uData;
printf("uTemp=%u\n",uTemp);/*uTemp的值是多少*/
strTemp=myUnion.strData[0];
printf("strTemp=%d(ASCII:
%C)\n",strTemp,strTemp);/*strTemp的值是多少*/
fTemp=myUnion.fData;
printf("fTemp=%f\n\n",fTemp);/*fTemp的值是多少*/
/*第二部分*/
printf("第二部分\n");
myUnion.strData[0]='A';
myUnion.strData[1]='B';
iTemp=myUnion.iData[0];
printf("iTemp=%d\n",iTemp);/*iTemp的值是多少*/
uTemp=myUnion.uData;
printf("uTemp=%u\n",uTemp);/*uTemp的值是多少*/
strTemp=myUnion.strData[0];
printf("strTemp=%d(ASCII:
%C)\n",strTemp,strTemp);/*strTemp的值是多少*/
fTemp=myUnion.fData;
printf("fTemp=%f\n\n",fTemp);/*fTemp的值是多少*/
/*第三部分*/
printf("第三部分\n");
myUnion.fData=0.1f;
iTemp=myUnion.iData[0];
printf("iTemp=%d\n",iTemp);/*iTemp的值是多少*/
uTemp=myUnion.uData;
printf("uTemp=%u\n",uTemp);/*uTemp的值是多少*/
strTemp=myUnion.strData[0];
printf("strTemp=%d(ASCII:
%C)\n",strTemp,strTemp);/*strTemp的值是多少*/
fTemp=myUnion.fData;
printf("fTemp=%f\n\n",fTemp);/*fTemp的值是多少*/
}
实验9-4
/****************************************************************
*实验9.4
*
*
(1)在一个显示系统中,需要在任意位置显示一个中文或者英文字符,为此请根据表9-4设计一种数据结构。
*其中当label=0时,content的16位数据中低8位为英文字符,高8位的数据丢弃。
*当label=1时,content的16位数据为中文数据。
*
(2)建立2个函数,函数的原型如下:
*封装数据,即将中英文字符按照表9-4方式存储
*PACK_DATApackData(unsigneduRow,unsigneduCol,unsigneduLabel,char*pContent);
*将封装的数据提取出来,并安装要求显示在屏幕上
*voidunpackData(PACK_DATAdata);
*(3)只考虑字符(content)为英文的情况。
在主函数中,调用函数packData,将信息(在第2行第3列显示英文字符X)封装好;
*然后调用函数unpackData将上一步封装好的数据提取并显示出来。
*(4)考虑字符(content)可能是英文也可能是中文的情况。
*在主函数中,2次调用函数packData,将信息1(在第2行第3列显示英文字符X)和信息2(在第3行第4列显示中文字符“中”)封装好;
*然后2次调用函数unpackData将上一步封装好的数据提取并显示出来。
*
*表9-4
*行号(row):
3bit列号(col):
3bit中英文标识(label):
2bit字符(content):
16bit
*
****************************************************************/
#include
/*声明结构体并定义结构体类型*/
typedefstruct_PACK_DATA
{
unsigneduRow:
3;
unsigneduCol:
3;
unsigneduLabel:
2;
uns