DAY11 数据结构——结构体的练习(HQYJ)

作业1

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

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

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

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

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

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

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

6,释放存储空间

main.c

#include "main.h"

int main(int argc, char const *argv[])
{
    int n;
    printf("请输入学校人员个数:");
    scanf("%d",&n);
    person *s = Create(n);
    SchoolInput(s,n);
    printf("\n<----------------学校人员信息---------------->\n\n");
    SchoolOutput(s,n);
    printf("\n<----------------学生平均成绩---------------->\n\n");
    printf("本校学生平均成绩为%.2f",CaculateAverage(s,n));
    printf("\n\n<----------------教师人员个数---------------->\n\n");
    printf("本校老师人数为%ld\n",TeacherCount(s,n));
    printf("\n<----------------校园统计结束---------------->\n\n");
    s = free_space(s);
    return 0;
}

main.h

#ifndef __MAIN_H
#define __MAIN_H

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

typedef struct Person
{
    char name[20];  //姓名
    char sex;   //性别
    char job;   //职业
    union
    {
        float score;    //学生分数
        char work[10];  //老师职务
    };
}person;


person *Create(int n);
void SchoolInput(person *s,int n);
void SchoolOutput(person *s,int n);
float CaculateAverage(person *s,int n);
size_t TeacherCount(person *s,int n);
person *free_space(person *s);


#endif //  __MAIN_H

school.c

#include "main.h"


/**
 * @brief 为结构体申请堆区空间
 * 
 * @param n     申请的结构体个数 
 * @return person*  申请成功返回堆区首地址,失败返回NULL
 */
person *Create(int n)
{
    person *p = (person *)malloc(sizeof(person)*n);
    if(p == NULL)
        return NULL;
    return p;
}

/**
 * @brief 录入学校人员信息
 * 
 * @param s     结构体s
 * @param n     学校人员个数
 */
void SchoolInput(person *s,int n)
{
    for (size_t i = 0; i < n; i++)
    {
        printf("请输入姓名:");
        scanf("%s",(s+i)->name);
        printf("请输入性别:");
        scanf(" %c",&(s+i)->sex);
        printf("请输入职业:");
        scanf(" %c",&(s+i)->job);
        if ((s+i)->job == 's' || (s+i)->job == 'S')
        {
            printf("请输入学生分数:");
            scanf("%f",&(s+i)->score);
        }
        else if ((s+i)->job == 't' || (s+i)->job == 'T')
        {
            printf("请输入教师职务:");
            scanf("%s",(s+i)->work);    
        }
        printf("\n");   
    }
}

/**
 * @brief 输出学校人员信息
 * 
 * @param s     结构体s
 * @param n     学校人员个数
 */
void SchoolOutput(person *s,int n)
{
    for (size_t i = 0; i < n; i++)
    {
        if ((s+i)->job == 's' || (s+i)->job == 'S')
        {
            printf("姓名\t性别\t职业\t学生分数\n");
            printf("%s\t%c\t%c\t%.1f\n",(s+i)->name,(s+i)->sex,(s+i)->job,(s+i)->score);
        }
        else if ((s+i)->job == 't' || (s+i)->job == 'T')
        {
            printf("姓名\t性别\t职业\t教师职务\n");
            printf("%s\t%c\t%c\t%s\n",(s+i)->name,(s+i)->sex,(s+i)->job,(s+i)->work);    
        }   
    }
}

/**
 * @brief 计算学生平均成绩
 * 
 * @param s     结构体s
 * @param n     学校人员个数
 * @return float    学生平均成绩
 */
float CaculateAverage(person *s,int n)
{
    float avr_grade;    //平均成绩
    int Student_Count = 0;  //学生个数
    float Sum_Grade = 0;  //学生总成绩
    for (size_t i = 0; i < n; i++)
    {
        if ((s+i)->job == 's' || (s+i)->job == 'S')
        {
            Sum_Grade += (s+i)->score;
            Student_Count++;
        }
    }
    avr_grade = Sum_Grade/Student_Count;

    return avr_grade;
}

/**
 * @brief 计算老师人数
 * 
 * @param s     结构体s
 * @param n     学校人员个数
 * @return size_t   老师个数
 */
size_t TeacherCount(person *s,int n)
{
    size_t Teacher_Count = 0;  //老师个数
    for (size_t i = 0; i < n; i++)
    {
        if ((s+i)->job == 't' || (s+i)->job == 'T')
        {
            Teacher_Count++;
        }
    }

    return Teacher_Count;
}

/**
 * @brief 释放堆区空间
 * 
 * @param s 结构体s
 * @return person*  返回NULL
 */
person *free_space(person *s)
{
    if(s == NULL)
        return NULL;
    free(s);
    s = NULL;
    return s;
}

运行结果如下图:

 

作业2

在堆区申请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 "main.h"

int main(int argc, char const *argv[])
{
    car *s = Create(5);
    CarInput(s,5);
    printf("\n<----------------车辆基本信息---------------->\n\n");
    CarOutput(s,5);
    printf("\n<----------------车辆价格排序---------------->\n\n");
    BubbleSort(s,5);
    CarOutput(s,5);
    printf("\n<----------------车辆统计结束---------------->\n\n");
    s = free_space(s);
    return 0;
}

main.h

#ifndef __MAIN_H
#define __MAIN_H

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

typedef struct Car
{
    char brand[20]; //车辆品牌
    char color[20]; //车辆颜色
    int price;      //车辆价格
}car;

car *Create(int n);
void CarInput(car *s,int n);
void CarOutput(car *s,int n);
void BubbleSort(car *s,int n);
car *free_space(car *s);

#endif // !__MAIN_H

car.c

/**
 * @file car.c
 * @author XHJ
 * @brief 
 * @version 0.1
 * @date 2023-03-28
 * 
 * @copyright Copyright (c) 2023
 * 
 */

#include "main.h"

/**
 * @brief 为结构体申请堆区空间
 * 
 * @param n     申请的结构体个数 
 * @return person*  申请成功返回堆区首地址,失败返回NULL
 */
car *Create(int n)
{
    car *p = (car *)malloc(sizeof(car)*n);
    if(p == NULL)
        return NULL;
    return p;
}

/**
 * @brief 车辆信息输入函数
 * 
 * @param s     堆区首地址
 * @param n     车辆个数
 */
void CarInput(car *s,int n)
{
    for (size_t i = 0; i < n; i++)
    {
        printf("请输入车辆品牌:");
        scanf("%s",(s+i)->brand);
        printf("请输入车辆颜色:");
        scanf(" %s",(s+i)->color);
        printf("请输入车辆价格:");
        scanf(" %d",&(s+i)->price);
        printf("\n"); 
    } 
}

/**
 * @brief 输出学校人员信息
 * 
 * @param s     结构体s
 * @param n     车辆个数
 */
void CarOutput(car *s,int n)
{
    for (size_t i = 0; i < n; i++)
    { 
        printf("品牌\t颜色\t价格\n");
        printf("%s\t%s\t%d\n",(s+i)->brand,(s+i)->color,(s+i)->price);     
        printf("\n");
    }
}

/**
 * @brief 冒泡排序(对价格)
 * 
 * @param s     结构体s
 * @param n     车辆个数
 */
void BubbleSort(car *s,int n)
{
    for (size_t i = 1; i < n; i++)
    {
        //记录本轮排序是否发生交换  未发生交换:0   发生交换:1
        int flag = 0;
        for (size_t j = 0; j < n-i; j++)
        {
            if ((s+j)->price > (s+j+1)->price)
            {
                car temp = *(s+j);
                *(s+j) = *(s+j+1);
                *(s+j+1) = temp;
                flag = 1;   //发生交换,flag置为1
            }   
        }
        if(flag == 0)
            break;
    }
}

/**
 * @brief 释放堆区空间
 * 
 * @param s 结构体s
 * @return person*  返回NULL
 */
car *free_space(car *s)
{
    if(s == NULL)
        return NULL;
    free(s);
    s = NULL;
    return s;
}

运行结果如下图:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值