数据库DAY2-共用体,联合

文章提供两个C语言程序示例,分别用于处理学校人员信息和车辆信息。程序涉及动态内存分配、数据录入、输出、排序以及计算平均值。对于学校人员,程序能录入学生和教师的姓名、性别、职业及分数,并计算学生平均成绩和教师人数。对于车辆信息,程序可以输入车辆的品牌、颜色和价格,并按价格升序排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作业一、

多文件编译

有若干个学校人员的信息,包括学生和教师。其中学生的数据包括:姓名、性别、职业s/S、分数。教师的数据包括:姓名、性别、职业t/T、职务。要求用同一个表格来处理以上数据。

1,定义函数在堆区申请空间n

struct B *p= (struct B * )malloc(sizeof(struct B)* n );

2,定义函数实现录入学校人员信息

3,定义函数输出学校人员信息

4,定义函数计算学生平均成绩

5,定义函数计算老师的个数

6,释放存储空间

main.c

#include "head.h"

int main(int argc,const char * argv[])
{
    int n;
    printf("请输入需要录入校园人员信息的个数:");
    scanf("%d",&n);
    getchar();

    person *p=Create(n);

    In(p,n);
    Out(p,n);
    Student(p,n);
    Teacher(p,n);
    p=Free(p);


    return 0;
}

test.c

#include "head.h"

person *Create(int n)
{
    person *p=(person *)malloc(sizeof(person)*n);

    if(p==NULL)
    {
        return NULL;
    }

    return p;
}

void In(person *p,int n)
{
    for(int i=0;i<n;i++)
    {
        printf("请输第%d个人的姓名:",i+1);
        scanf("%s",(p+i)->name);
        printf("请输入第%d个人的性别:",i+1);
        scanf(" %s",(p+i)->sex);
        printf("请输入第%d个人的身份:",i+1);
        scanf(" %c",&(p+i)->career);
        if((p+i)->career=='S' || (p+i)->career=='s')
        {
            printf("请输入学生的分数:");
            scanf("%f",&(p+i)->score);
        }
        else
        {
            printf("请输入教师的职称:");
            scanf("%s",(p+i)->job);
        }

    }
}

void Out(person *p,int n)
{
    printf("name\tsex\tcareer\tjob\\score\n");

    for(int i=0;i<n;i++)
    {
        if((p+i)->career=='S' || (p+i)->career=='s') 
        printf("%s\t%s\t%c\t%.2f\n",(p+i)->name,(p+i)->sex,(p+i)->career,(p+i)->score);
        if((p+i)->career=='T' || (p+i)->career=='t')
        printf("%s\t%s\t%c\t%s\n",(p+i)->name,(p+i)->sex,(p+i)->career,(p+i)->job);

    }
}

void Student(person *p,int n)
{
    float sum=0,avg=0;
    int count=0; 
    for(int i=0;i<n;i++)
    {
        if((p+i)->career=='S' || (p+i)->career=='s')
        {
            sum+=(p+i)->score;
            count++;
        }
    }
    avg=sum/count;
    printf("学生的平均成绩是%.2f\n",avg);
}

void Teacher(person *p,int n)
{
    int count=0;
    for(int i=0;i<n;i++)
    {
        if((p+i)->career=='T' || (p+i)->career=='t')
        {
            count++;
        }
    }

    printf("老师的人数有%d人\n",count);
}

person *Free(person *p)
{
    if(p!=NULL)
    {
        free(p);
        p==NULL;
    }
    return p;
}

head.h

#ifndef __HEAD_H_
#define __HEAD_H_
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct 
{
    char name[50];
    char sex[50];  
    char career;  //Ss  Tt
    union 
    {
        char job[20];
        float score;
    }; 

}person;

person *Create(int n);
void In(person *p,int n);
void Out(person *p,int n);
void Student(person *p,int n);
person *Free(person *p);

#include "test.c"
#endif

结果:

作业二、

多文件编译

在堆区申请5个连续的存储空间,实现车辆信息的输入(品牌,颜色,价格)

1>调用函数在堆区申请空间

2>调用函数实现输入

3>调用函数对价格排序

1>if(条件) 条件是价格的比较 (p+j)->price (p+j+1)->price

2> 交换的是整个车的信息

例如: (p+j)表示整个车的地址

*(p+j)表示整个车的信息

交换的是*(p+j) 和*(p+j+1) 对应的整体信息

3> 注意中间变量t的类型,应该是结构体类型

4>调用函数输出

5>释放堆区空间

main.c

#include "head.h"

int main(int argc,const char * argv[])
{

    int n;
    printf("请输入要填写车辆的个数:");
    scanf("%d",&n);

    car *p=Create(p,n);
    In(p,n);
    Bubble(p,n);
    Put(p,n);
    p=Free(p);
    
    return 0;
}

test.c

#include "head.h"

void In(car *p,int n)
{
    
    for(int i=0;i<n;i++)
    {
        printf("请输入第%d俩车的品牌:",i+1);
        scanf("%s",(p+i)->brand);
        printf("请输入第%d俩车的颜色:",i+1);
        scanf("%s",(p+i)->colour);
         printf("请输入第%d俩车的价格:",i+1);
        scanf("%lf",&(p+i)->price);
    }
}

car *Create(car *p,int n)
{
    p=(car *)malloc(sizeof(car)*n);
    if(p==NULL)
    {
        return NULL;
    }
    else
    {
        return p;
    }
}

void Bubble(car *p,int n)
{
    for(int i=0;i<n-1;i++)
    {
        for(int j=0;j<n-1-i;j++)
        {
            if(((p+j)->price)>((p+j+1)->price))
            {
                car t;
                t=*(p+j);
                *(p+j)=*(p+j+1);
                *(p+j+1)=t;
            }
        }
    }
}

void Put(car *p,int n)
{
    printf("brand\tcolour\tprice\n");
    for(int i=0;i<5;i++)
    {
        printf("%s\t%s\t%.2lf\t",(p+i)->brand,(p+i)->colour,(p+i)->price);
        printf("\n");
    }
}

car *Free(car *p)
{
    if(p!=NULL)
    {
        free(p);
        p==NULL;
    }
    return p;
}

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct 
{
    char brand[50];
    char colour[50];
    double price;

}car;

car *Create(car *p,int n);
void In(car *p,int n);
void Put(car *p,int n);
void Bubble(car *p,int n);
car *Free(car *p);


#include "test.c"

#endif

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值