C语言实验9_结构体
Posted jinzhi666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言实验9_结构体相关的知识,希望对你有一定的参考价值。
C语言实验9_结构体
实验09(01)结构体
题目描述
根据实验讲义实验九中的第 1 题的内容和数据完成程序设计。设计结构体,用于存储商品的
信息,包含商品编号、商品名称、商品价格以及商品折扣信息。设计函数 input,实现商品
数据的输入。设计函数 display,实现商品信息的输出。在主函数 main 中定义 keyboard 结构
体变量,用来处理商品键盘的数据。定义一个结构体数组,用于存储 3 种电器商品的信息。
输入描述
输入商品的编号、名称、价格以及折扣信息
输出描述
输出商品的编号、名称、价格、折扣以及实际价格信息
输入样例
1010 键盘 89.50 0.85
1021 冰箱 1024.00 0.95
1022 空调 2058.50 0.90
1023 电视 3001.88 0.95
输出样例
编号:1010 名称:键盘 价格:89.50 折扣:0.85 实际价格:76.08
编号:1021 名称:冰箱 价格:1024.00 折扣:0.95 实际价格:972.80
编号:1022 名称:空调 价格:2058.50 折扣:0.90 实际价格:1852.65
编号:1023 名称:电视 价格:3001.88 折扣:0.95 实际价格:2851.79
#include <stdio.h>
#include <conio.h>
typedef struct _PRODUCR
int number;
char name[20];
double price;
double discount;
PRODUCT, *PPRODUCT;
void input(PRODUCT *p);
void input(PRODUCT *p)
scanf("%d", &p->number);
scanf("%s", p->name);
scanf("%lf", &p->price);
scanf("%lf", &p->discount);
void display(PRODUCT *p)
printf("编号:%d ", p->number);
printf("名称:%s ", p->name);
printf("价格:%.2lf ", p->price);
printf("折扣:%.2lf ", p->discount);
printf("实际价格:%.2lf\\n", p->discount * p->price);
int main() //主函数
int i;
PRODUCT kyeboard; //请定义结构体类型 PRODUCT
PRODUCT ElecDevice[3];
input(&kyeboard); //请定义函数 input
for (i = 0; i < 3; i++)
input(&ElecDevice[i]);
display(&kyeboard); //请定义函数 display
for (i = 0; i < 3; i++)
display(&ElecDevice[i]);
return 0;
实验09(02)链表
题目描述
(1)利用链表结构(PLAY_LIST),为某媒体播放器建立一个播放列表(playList),该链表的每一
个节点包括:歌曲编号(number)、歌曲名称(name)、歌手姓名(artist)。
(2)建立 4 个函数,以实现对播放列表操作。函数的原型如下:
PLAY_LIST* createList(); /*创建播放列表*/
PLAY_LIST* insertItem(PLAY_LIST* pPlayList,
PLAY_LIST* pNewPlayList);
/*在播放列表中添加一首歌曲*/
PLAY_LIST* deleteItem(PLAY_LIST* pPlayList,
int iItemNumber);
/*在播放列表中删除编号为 iItemNumber 的歌曲*/
void displayList(PLAY_LIST* pPlayList); /*显示整个播放列表中的所有信息*/
(3)在主函数中定义一个链表 playList。A)利用函数 createList 创建播放列表 playList,并在
其节点上依次存储编号为 1100、1102、1103 的 3 首歌曲,并调用 displayList 函数显示此时
整个播放列表中的所有信息。B)调用insertItem函数将编号为1101的歌曲添加到playList中,
并显示整个播放列表中的所有信息。C) 调用 deleteItem 函数将编号为 1102 的歌曲从 playList
中删除,并显示整个播放列表中的所有信息。
输入描述
输入 4 首歌曲的信息
输出描述
输出链表中所有歌曲的信息
显示列表信息时,每一个成员占 10 列,并左对齐。
即:
歌曲编号(10 列)歌曲名称(10 列) 歌手姓名(10 列)
1100(10 列) 落叶归根(10 列) 王力宏(10 列)
输入样例
1100 落叶归根 王力宏
1101 风吹麦浪 李健
1103 天空 王菲
1102 往事随风 齐秦
输出样例
创建列表后:
歌曲编号 歌曲名称 歌手姓名
1100 落叶归根 王力宏
1101 风吹麦浪 李健
1103 天空 王菲
插入一条信息后:
歌曲编号 歌曲名称 歌手姓名
1100 落叶归根 王力宏
1101 风吹麦浪 李健
1102 往事随风 齐秦
1103 天空 王菲
删除一条信息后:
歌曲编号 歌曲名称 歌手姓名
1100 落叶归根 王力宏
1101 风吹麦浪 李健
1103 天空 王菲
#include <stdio.h>
#include <stdlib.h>
struct PLAY_LIST
int number;
char name[25];
char artist[25];
struct PLAY_LIST *next;
;
int n;
struct PLAY_LIST *p;
void main()
struct PLAY_LIST *head;
struct PLAY_LIST *createList();
struct PLAY_LIST *insertItem(PLAY_LIST * head, PLAY_LIST * pNewPlayList);
struct PLAY_LIST *deleteItem(PLAY_LIST * pPlayList, int iItemNumber);
void displayList(struct PLAY_LIST * head);
head = createList();
char a[3][20] = "歌曲编号", "歌曲名称", "歌手姓名";
printf("创建列表后:\\n%-10s%-10s%-10s\\n", a[0], a[1], a[2]);
displayList(head);
insertItem(head, p);
printf("插入一条信息后:\\n%-10s%-10s%-10s\\n", a[0], a[1], a[2]);
displayList(head);
deleteItem(head, p->number);
printf("删除一条信息后:\\n%-10s%-10s%-10s\\n", a[0], a[1], a[2]);
displayList(head);
struct PLAY_LIST *createList(void)
struct PLAY_LIST *head;
struct PLAY_LIST *p1, *p2;
n = 0;
p1 = p2 = (struct PLAY_LIST *)malloc(sizeof(struct PLAY_LIST));
scanf("%d %s %s", &p1->number, &p1->name, &p1->artist);
head = NULL;
while (p1->number != 0)
n++;
if (n == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct PLAY_LIST *)malloc(sizeof(struct PLAY_LIST));
if (n == 3)
break;
scanf("%d %s %s", &p1->number, &p1->name, &p1->artist);
p = (struct PLAY_LIST *)malloc(sizeof(struct PLAY_LIST));
scanf("%d %s %s", &p->number, &p->name, &p->artist);
p2->next = NULL;
free(p1);
return (head);
void displayList(struct PLAY_LIST *head)
struct PLAY_LIST *p;
p = head;
if (head != NULL)
do
printf("%-10d%-10s%-10s\\n", p->number, p->name, p->artist);
p = p->next;
while (p != NULL);
else
printf("空链表!\\n");
struct PLAY_LIST *insertItem(PLAY_LIST *head, PLAY_LIST *pNewPlayList)
struct PLAY_LIST *p0, *p1, *p2;
p1 = head;
p0 = pNewPlayList;
if (head == NULL)
head = p0;
p0->next = NULL;
else
while ((p0->number > p1->number) && (p1->next != NULL))
p2 = p1;
p1 = p1->next;
if (p0->number <= p1->number)
if (head == p1)
head = p0;
else
p2->next = p0;
p0->next = p1;
else
p1->next = p0;
p0->next = NULL;
return head;
struct PLAY_LIST *deleteItem(PLAY_LIST *head, int iItemNumber)
struct PLAY_LIST *p1, *p2;
if (head == NULL)
printf("\\n 链表为空!\\n");
return (head);
p1 = head;
while (iItemNumber != p1->number && p1->next != NULL)
p2 = p1;
p1 = p1->next;
if (iItemNumber == p1->number)
if (p1 == head)
head = p1->next;
else
p2->next = p1->next;
return head;
实验09(03)任意位置显示一个中文
题目描述
参照实验九中第 4 题。
(1)在一个显示系统中,需要在任意位置显示一个中文或者英文字符,为此请根据表 9-4
设计一种数据结构。其中当 label=0 时,content 的 16 位数据中低 8 位为英文字符,高 8 位
的数据丢弃。当 label=1 时, content 的 16 位数据为中文数据。
(2)建立 2 个函数,函数的原型如下:
PACK_DATA packData(unsigned uRow,unsigned uCol, unsigned uLabel,char * pContent); /*封装数
据,即将中英文字符按照表 9-4 方式存储*/
void unpackData(PACK_DATA data); /*将封装的数据提取出来,并安装要求显示在屏幕上。*/
(3)考虑字符(content)可能是英文也可能是中文的情况。在主函数中,2 次调用函数 packData,
将信息 1(在第 2 行第 3 列显示英文字符 X)和信息 2(在第 3 行第 4 列显示中文字符”中”)
封装好;然后 2 次调用函数 unpackData 将上一步封装好的数据提取并显示出来。
输入描述
输入显示字符的信息。第一个数据为行号,第二个数据为列号,第三个数据为中英文标志,
第 4 部分数据为显示的字符。
输出描述
正确的地方显示字符
输入样例
1 2 1 中
输出样例
(一个空格,从第 2 列开始显示)中
#include <stdio.h>
typedef struct _PACK_DATA
unsigned int uRow : 3;
int uCol : 3;
unsigned char uLabel : 2;
unsigned short uContent : 16;
PACK_DATA, *PPACK_DATA;
PACK_DATA packData(unsigned uRow, unsigned uCol, unsigned uLabel, char *pContent)
PACK_DATA pack_data;
pack_data.uRow = uRow;
pack_data.uCol = uCol;
pack_data.uLabel = uLabel;
pack_data.uContent = *(unsigned short *)pContent;
return (pack_data);
void unpackData(PACK_DATA data)
int i;
char temp[3];
for (i = 0; i < data.uRow; i++)
printf("\\n");
for (i = 0; i < data.uCol; i++)
printf(" ");
if (data.uLabel == 1)
temp[0] = data.uContent & 0xff;
temp[1] = (data.uContent >> 8) & 0xff;
temp[2] = '\\0';
printf("%s\\n", temp);
else
printf("%c\\n", (char)data.uContent);
int main()
unsigned a, b, c;
char A[10];
PACK_DATA data;
scanf("%d %d %d %s", &a, &b, &c, A);
data = packData(a, b, c, A);
unpackData(data);
return 0;
实验09(04)枚举类型
题目描述
编写程序,根据用户输入的数字(1~12),输出相应的月份名。要求:用枚举类型实现。
输入描述
输入 1~12
输出描述
输出 January~December
输入样例
1
2
13
输出样例
January
February
Error!
#include <stdio.h>
int main()
enum Mouths
Jan,
Feb,
Mar,
Apr,
May,
Jun,
Jul,
Aug,
Sep,
Oct,
Nov,
Dec
;
enum Mouths i;
scanf("%d", &i);
if (i > 12)
printf("Error!");
else
switch (i - 1)
case Jan:
printf("January\\n");
break;
case Feb:
printf("February\\n");
break;
case Mar:
printf("March\\n");
break;
case Apr:
printf("April\\n");
break;
case May:
printf("May\\n");
break;
case Jun:
printf("June\\n");
break;
case Jul:
printf("July\\n");
break;
case Aug:
printf("August\\n");
break;
case Sep:
printf("September\\n");
break;
case Oct:
printf("October\\n");
break;
case Nov:
printf("November\\n");
break;
case Dec:
printf("December\\n");
break;
default:
printf("error!\\n");
break;
return 0;
以上是关于C语言实验9_结构体的主要内容,如果未能解决你的问题,请参考以下文章