C语言经典案例——第八章 结构体和共用体(上)

本篇提供了关于C语言程序设计中结构体和共用体部分的经典案例,可供C语言的初学者们进行一个学习和编译练习。

/*Case 1
学生信息存取
输入一名学生的学号、姓名、年龄和身高等信息,然后再把所有输入的信息一一输出到屏幕上*/

typedef struct Student {
    int num;
    char name[20];
    int age;
    float height;
}STU;
int main() {
    STU stu;
    scanf("%d%s%d%f", &stu.num, &stu.name, &stu.age, &stu.height);
    printf("%d %s %d %.2f\n", stu.num, stu.name, stu.age, stu.height);
    return 0;
}

/*Case 2
结构体指针
用两种方法把小明的基本信息输出*/

typedef struct Student {
    int num;
    char name[20];
    int age;
    float height;
}STU;
int main() {
    STU ming;
    STU* m;       //定义一个结构体指针
    m = &ming;
    scanf("%d%s%d%f", &m->num, &m->name, &m->age, &m->height);
    printf("First:");
    printf("%d %s %d %.lf\n", ming.num, ming.name, ming.age, ming.height);
    printf("Second:");
    printf("%d %s %d %.lf\n", m->num, m->name, m->age, m->height);
    return 0;
}

/*Case 3
求学生平均成绩
通过编程依次输入学生的学号、姓名和三门课程的成绩,计算出平均成绩并依次把每名学生的学号、姓名和平均成绩打印*/

struct student {
    char num[6];
    char name[10];
    int score[3];
    float average;
}stu[5];
int main() {
    int i, k;
    int j;
    float sum;
    for ( i = 0; i < 3; i++)
    {
        printf("请依次输入学生的信息:\n");
        printf("请输入学号:\n");
        scanf("%s", stu[i].num);
        printf("请输入姓名:\n");
        scanf("%s", stu[i].name);
        sum = 0;
        for ( j = 0; j < 3; j++)
        {
            printf("分数%d:\n",j+1);
            scanf("%d", &stu[i].score[j]);     
            sum += stu[i].score[j];            
        }
        stu[i].average = sum / 3;
        printf("-----------------------------\n");
    }
    for ( k = 0; k < 3; k++)              //输出三个学生的信息以及平均成绩
    {
        printf("学号:%s\n",stu[k].num);
        printf("姓名:%s\n",stu[k].name);
        printf("平均成绩:%.lf\n",stu[k].average);
    }
    return 0;
}

/*Case 4
师生信息统计表
设计一个师生信息统计表,将老师与学生的信息统计在一个表格中,如果是学生就记录其姓名、性别、角色、所在教室,如果是老师就记录其姓名、性别、角色、所在办公室。*/

struct 
{
    int num;
    char name[20];
    char gender;
    char role;
    union 
    {
        int classname;
        char office[10];
    }dept;
}person[3];
int main() {
    int i;
    for ( i = 0; i < 3; i++)
    {
        printf("请输入第%d个人的信息:\n",i+1);
        printf("姓名:");
        scanf("%s", person[i].name);
        getchar();
        printf("性别:");
        scanf("%c", &person[i].gender);
        getchar();
        printf("角色:");
        scanf("%c", &person[i].role);
        if (person[i].role=='s')
        {
            printf("班级:");
            scanf("%d", &person[i].dept.classname);
        }
        else
        {
            printf("办公室:");
            scanf("%s", &person[i].dept.office);
        }
    }
    printf("    姓名  性别  角色  部门\n");
        for ( i = 0; i < 3; i++)
        {
            if (person[i].role=='s')
            {
                printf("%6s%6c%6c%10d\n", person[i].name, person[i].gender, person[i].role, person[i].dept.classname);
            }
            else
            {
                printf("%6s%6c%6c%10s\n", person[i].name, person[i].gender, person[i].role, person[i].dept.office);
            }
        }
    return 0;
}

/*Case 5
打鱼还是晒网
某人从2000年1月1日开始“三天打鱼两天晒网”,任意输入某一天,判断这一天是打鱼还是晒网*/

typedef struct date {
    int year;
    int month;
    int day;
}DATE;
int days(DATE today) {
    static int day_tab[2][13] = { { 0,31,28,31,30,31,30,31,31,30,31,30,31 },
    { 0,31,29,31,30,31,30,31,31,30,31,30,31 } };   //每月的天数
    int i, leap;
    leap = today.year % 4 == 0 && today.year % 100 != 0 || today.year % 400 == 0;  
    //判断year是闰年还是平年,leap=0为平年,leap=1为闰年
    for ( i = 1; i < today.month; i++)      //计算本年中自1月1日起的天数
    {
        today.day += day_tab[leap][i];
    }
    return today.day;
}
int main() {
    DATE today, term;
    int yearday, year, day;
    printf("请输入年/月/日:\n");
    scanf("%d/%d/%d", &today.year, &today.month, &today.day);
    term.month = 12;        //设置月份初始值
    term.day = 31;          //设置某日的初始值
    for (yearday= 0,year=2000; year < today.year; year++)
    {
        term.year = year;
        yearday += days(term);    //计算从2000年至指定年的前一年一共有多少天
    }
    yearday += days(today);       //加上指定年中到指定日期的天数
    day = yearday % 5;            //求余数
    if (day>0&&day<4)
    {
        printf("打鱼!");
    }
    else
    {
        printf("晒网!");
    }
    return 0;
}

 /*Case 6
初识链表*/

#include <malloc.h>
struct node
{
    int data;
    struct node* next;      //结构体指针
};
typedef struct node NODE;   //取别名NODE
NODE* create(int n)         //自定义一个创建链表的函数
{
    int i, a;
    NODE* head = NULL;
    NODE* p1 = NULL;
    NODE* p2 = NULL;
    printf("请输入全部数据:");
    for ( i = n; i >0; --i)
    {
        p1 = (NODE*)malloc(sizeof(NODE));   //分配空间
        scanf("%d", &a);
        p1->data = a;                       //给数据域赋值
        if (NULL==head)                     //指定头结点
        {
            head = p1;
            p2 = p1;
        }
        else
        {
            p2->next = p1;                  //指定后继结点
            p2 = p1;
        }
    }
    p2->next = NULL;
    return head;                            //返回头节点
}
int main() {
    int n;
    NODE* p;
    printf("请输入链表结点个数:");
    scanf("%d", &n);
    p = create(n);
    printf("结果:\n");
    while (p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
    return 0;
}

 本篇的所有代码是在VS编译环境下操作的,如有错误,望大家指正!!!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

追逐太阳的星星

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

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

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

打赏作者

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

抵扣说明:

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

余额充值