作业1
题目
有若干个学校人员的信息,包括学生和教师。其中学生的数据包括:姓名、性别、职业s/S、分数。教师的数据包括:姓名、性别、职业t/T、职务。要求用同一个表格来处理以上数据。
- 定义函数在堆区申请空间n
- 定义函数实现录入学校人员信息
- 定义函数输出学校人员信息
- 定义函数计算学生平均成绩
- 定义函数计算老师的个数
- 释放存储空间
结果
代码
main.c
#include <stdio.h>
#include <stdlib.h>
#include "func.h"
int main(int argc, char const *argv[])
{
// 申请空间
int n = 5;
Person *p_psn = create(n);
// 录入人员信息
input(p_psn,n);
// 输出学校人员信息
output(p_psn,n);
// 计算学生平均成绩
printf("学生平均成绩 = %.2f\n",get_avg(p_psn,n));
// 计算老师的个数
printf("老师个数 = %d\n",get_tCnt(p_psn,n));
// 释放空间
free(p_psn);
p_psn = NULL;
return 0;
}
func.h
#if !defined(_FUNC_H_)
#define _FUNC_H_
typedef struct{
char name[20];
char sex;
char job;
union{
float score;
char work[20];
};
}Person;
Person *create(int n);
void input(Person *p,int n);
void output(Person *p,int n);
float get_avg(Person *p,int n);
int get_tCnt(Person *p,int n);
#endif // _FUNC_H_
func.c
#include <stdio.h>
#include <stdlib.h>
#include "func.h"
/*
* 在堆区申请空间
* @param n 人数
* @return persons首地址
*/
Person *create(int n){
Person *p = (Person *)malloc(sizeof(Person) * n);
if (p == NULL){
return NULL;
}
return p;
}
/*
* 输入人员信息
* @param p person数组
* @param n person数组长度
*/
void input(Person *p,int n){
for (int i = 0; i < n; i++){
printf("请输入人员%d信息:\n",i+1);
printf("姓名:");
scanf("%s",(p+i)->name);
printf("性别:");
scanf("%*c%c",&(p+i)->sex);
printf("职业:");
scanf("%*c%c",&(p+i)->job); //清除垃圾字符
if((p+i)->job == 's' || (p+i)->job == 'S'){
printf("分数:");
scanf("%f",&(p+i)->score);
}else if((p+i)->job == 't'|| (p+i)->job == 'T'){
printf("职务:");
scanf("%s",(p+i)->work);
}
}
}
/*
* 输出人员信息
* @param p person数组
* @param n person数组长度
*/
void output(Person *p,int n){
printf("*****************\n输出人员信息:\n");
for (int i = 0; i < n; i++){
printf("人员%d: ",i+1);
printf("姓名:%s\t",(p+i)->name);
printf("性别:%c\t",(p+i)->sex);
printf("职业:%c\t",(p+i)->job);
if((p+i)->job == 's' || (p+i)->job == 'S'){
printf("成绩:%f\n",(p+i)->score);
}else if((p+i)->job == 't'|| (p+i)->job == 'T'){
printf("工作:%s\n",(p+i)->work);
}
}
}
/*
* 输出学生平均分
* @param p person数组
* @param n person数组长度
* @return 学生平均分
*/
float get_avg(Person *p,int n){
float sum = 0;
int count = 0;
for (int i = 0; i < n; i++){
if((p+i)->job == 's' || (p+i)->job == 'S'){
sum += (p+i)->score;
count++;
}
}
return sum / count;
}
/*
* 输出人员信息
* @param p person数组
* @param n person数组长度
* @return 老师个数
*/
int get_tCnt(Person *p,int n){
int count = 0;
for (int i = 0; i < n; i++){
if((p+i)->job == 't'|| (p+i)->job == 'T'){
count++;
}
}
return count;
}
作业2
题目
在堆区申请5个连续的存储空间,实现车辆信息的输入(品牌,颜色,价格)
1. 调用函数在堆区申请空间
2. 调用函数实现输入
3. 调用函数对价格排序
思路:和正常的冒泡是一样的
注意点:
- if(条件) 条件是价格的比较
(p+j)->price (p+j+1)->price
- 交换的是整个车的信息
例如:
(p+j)
表示整个车的地址
*(p+j)
表示整个车的信息
交换的是*(p+j)
和*(p+j+1)
对应的整体信息 - 注意中间变量t的类型,应该是结构体类型
- 调用函数输出
- 释放堆区空间
结果
代码
main.c
#include <stdio.h>
#include <stdlib.h>
#include "func.h"
int main(int argc, char const *argv[])
{
int n = 5;
Car *p_car = create(n);
input(p_car,n);
bubble_sort(p_car,n);
output(p_car,n);
// 释放空间
free(p_car);
p_car = NULL;
return 0;
}
func.h
#if !defined(_FUNC_H_)
#define _FUNC_H_
typedef struct{
char brand[20];
char color[20];
int price;
}Car;
Car *create(int n);
void input(Car *p,int n);
void bubble_sort(Car *p,int n);
void output(Car *p,int n);
#endif // _FUNC_H_
func.c
#include <stdio.h>
#include <stdlib.h>
#include "func.h"
/*
* 在堆区申请空间
* @param n 车辆数
* @return 堆区首地址
*/
Car *create(int n){
Car *p = (Car *)malloc(sizeof(Car) * n);
if (p == NULL){
return NULL;
}
return p;
}
/*
* 车辆信息输入
* @param p 指针首地址
* @param n 长度
*/
void input(Car *p,int n){
printf("车辆信息输入:\n");
for (int i = 0; i < n; i++){
printf("品牌:");
scanf("%s",(p+i)->brand);
printf("颜色:");
scanf("%s",(p+i)->color);
printf("价格:");
scanf("%d",&(p+i)->price);
}
}
/*
* 冒泡升序
* @param p 指针首地址
* @param n 长度
*/
void bubble_sort(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 = *(p+j);
*(p+j)= *(p+j+1);
*(p+j+1) = t;
}
}
}
}
/*
* 车辆信息输出
* @param p 指针首地址
* @param n 长度
*/
void output(Car *p,int n){
printf("车辆信息输出:\n");
for (int i = 0; i < n; i++){
printf("车辆%d:\t",i+1);
printf("品牌:%s\t",(p+i)->brand);
printf("颜色:%s\t",(p+i)->color);
printf("价格:%d\n",(p+i)->price);
}
}