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_结构体的主要内容,如果未能解决你的问题,请参考以下文章

c语言中如何将按结构体中的某个元素大小,将结构体排序输出

结构体与公用体

结构体与公用体

结构体与共用体

C语言结构体程序设计问题

实验报告(构造数据类型实验)