作业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;
}
运行结果如下图: