作业一:
有若干个学校人员的信息,包括学生和教师。其中学生的数据包括:姓名、性别、职业s/S、分数。教师的数据包括:姓名、性别、职业t/T、职务。要求用同一个表格来处理以上数据。
- 定义函数在堆区申请空间n
- 定义函数实现录入学校人员信息
- 定义函数输出学校人员信息
-
定义函数计算学生平均成绩
-
定义函数计算老师的个数
-
释放存储空间
头文件:
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct school
{
char name[20];
char sex;
char work;
union
{
float score;
char job[20];
};
}sch,*p_sch;
//在堆区申请结构体空间
p_sch create(int n);
//录入学校人员信息
void input(p_sch p,int n);
//输出学校人员信息
void output(p_sch p,int n);
//计算学生平均成绩
float avg(p_sch p,int n);
//统计老师个数
int num_T(p_sch p,int n);
//释放空间
p_sch free_speac(p_sch p);
#endif
主函数:
#include "head.h"
int main(int argc, const char *argv[])
{
int n=5;
//为结构体申请空间
p_sch p=create(n);
//录入学校人员信息
input(p,n);
//输出学校人员信息
output(p,n);
//计算学生平均成绩
printf("学生平均成绩为:%.2f\n",avg(p,n));
//统计老师个数
int num= num_T(p,n);
printf("教师共%d个\n",num);
//释放空间
free_speac(p);
return 0;
}
自定义函数:
#include "head.h"
//在堆区申请结构体空间
p_sch create(int n)
{
p_sch p=(p_sch)malloc(sizeof(sch)*n);
if(p==NULL)
return NULL;
return p;
}
//录入学校人员信息
void input(p_sch p,int n)
{
for(int i=0;i<n;i++)
{
printf("请输入姓名:");
scanf("%s",(p+i)->name);
printf("请输入性别(W/M):");
scanf(" %c",&(p+i)->sex);
printf("请输入职业(S/T):");
scanf(" %c",&(p+i)->work);
if((p+i)->work=='S')
{
printf("请输入成绩:");
scanf("%f",&(p+i)->score);
}
else
{
printf("请输入职务:");
scanf("%s",(p+i)->job);
}
printf("\n");
}
}
//输出学校人员信息
void output(p_sch p,int n)
{
for(int i=0;i<n;i++)
{
if((p+i)->work=='S')
{
printf("%s\t%c\t%c\t%.2f\n",(p+i)->name,(p+i)->sex,(p+i)->work,(p+i)->score);
}
else
{
printf("%s\t%c\t%c\t%s\n",(p+i)->name,(p+i)->sex,(p+i)->work,(p+i)->job);
}
}
}
//计算学生平均成绩
float avg(p_sch p,int n)
{
float sum=0;
int num=0;
for(int i=0;i<n;i++)
{
if((p+i)->work=='S')
{
num++;
sum+=(p+i)->score;
}
}
return sum/num;
}
//统计老师个数
int num_T(p_sch p,int n)
{
int sum=0;
for (int i=0;i<n;i++)
{
if((p+i)->work=='T')
sum+=1;
}
return sum;
}
//释放空间
p_sch free_speac(p_sch p)
{
if (p==NULL)
return NULL;
free(p);
p=NULL;
return p;
}
输出结果:
作业二:
在堆区申请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>释放堆区空间
头文件:
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Car
{
char name[20];
char color[10];
int piace;
}car,*p_car;
//在堆区申请结构体空间
p_car create();
//输入车辆信息
void input(p_car p);
//按价格排序
void sort(p_car p);
//输出车辆信息
void output(p_car p);
//释放空间
p_car free_speac(p_car p);
#endif
主函数:
#include "head.h"
int main(int argc, const char *argv[])
{
//在堆区申请结构体空间
p_car p=create();
//输入车辆信息
input(p);
//按价格排序
sort(p);
//输出车辆信息
output(p);
//释放空间
p=free_speac(p);
return 0;
}
自定义函数:
#include "head.h"
//在堆区申请结构体空间
p_car create()
{
p_car p=(p_car)malloc(sizeof(car)*5);
if(p==NULL)
return NULL;
return p;
}
//输入车辆信息
void input(p_car p)
{
for (int i=0;i<5;i++)
{
printf("请输入车辆品牌:");
scanf("%s",(p+i)->name);
printf("请输入车辆颜色:");
scanf("%s",(p+i)->color);
printf("请输入车辆价格:");
scanf("%d",&(p+i)->piace);
printf("\n");
}
}
//按价格排序
void sort(p_car p)
{
int i,j;
car t;
for(i=1;i<5;i++)
for(j=0;j<5-i;j++)
if((p+j)->piace>(p+j+1)->piace)
{
t=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=t;
}
}
//输出车辆信息
void output(p_car p)
{
for(int i=0;i<5;i++)
printf("%s\t%s\t%d\n",(p+i)->name,(p+i)->color,(p+i)->piace);
}
//释放空间
p_car free_speac(p_car p)
{
if (p==NULL)
return NULL;
free(p);
p=NULL;
return p;
}
输出结果: