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;
}
  • 4
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bmNkotc2AECynaY6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值