作业1
有若干个学校人员的信息,包括学生和教师。其中学生的数据包括:姓名、性别、职业s/S、分数。教师的数据包括:姓名、性别、职业t/T、职务。要求用同一个表格来处理以上数据。
1,定义函数在堆区申请空间n
struct B p= (struct B * )malloc(sizeof(struct B) n );
2,定义函数实现录入学校人员信息
for(int i=0;i<n;i++)
{
printf(“请输入姓名:”);
scanf(“%s”,(p+i)->name);
printf(“请输入性别:”);
scanf(" %c",&(p+i)->sex);
printf(“请输入职业:”);
scanf(" %c",&(p+i)->job);
if( (p+i)->job==‘s’ || (p+i)->job==‘S’)
{
printf(“请输入分数:”);
scanf(“%f”,&(p+i)->score);
}
else
{
printf(“请输入职务:”);
scanf(“%s”,(p+i)->position);
}
}
3,定义函数输出学校人员信息
4,定义函数计算学生平均成绩
5,定义函数计算老师的个数
6,释放存储空间
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//结构体和共用体嵌套
//用来存储学生和教师信息
typedef struct Information
{
char name[20];
char sex;
char job;
union {
float score;
char position[20];
};
}information;
information * my_malloc(int n);
void get_input(information * p, int n);
void put_output(information * p, int n);
float score_average(information * p, int n);
int cnt_teacher(information * p, int n);
void * my_free(information * p);
#endif
fun.c
#include"head.h"
//为结构体分配堆空间
information * my_malloc(int n)
{
information * p = (information *)malloc(n*sizeof(information));
if(p == NULL)
return p;
return p;
}
// 其中学生的数据包括:姓名、性别、职业s/S、分数。
// 教师的数据包括:姓名、性别、职业t/T、职务。
void get_input(information * p, int n)
{
int i = 0;
for(i = 0; i<n; i++)
{
printf("请输入第%d个人员的姓名:", i+1);
scanf( " %s", &((p+i)->name) );
printf("请输入第%d个人员的性别:", i+1);
scanf(" %c", &((p+i)->sex));
printf("请输入第%d个人员的职业:", i+1);
scanf(" %c", &((p+i)->job) );
//检查输入是否合法
while((p+i)->job != 't' && (p+i)->job != 'T' && (p+i)->job != 's' && (p+i)->job != 'S')
{
printf("第%d个人员的职业输入错误,请输入s/S/t/T:");
scanf(" %c", &((p+i)->job));
}
if((p+i)->job == 's'||(p+i)->job == 'S')
{
printf("请输入第%d个人员的分数:", i+1);
scanf(" %f", &((p+i)->score));
}
else if((p+i)->job == 't'||(p+i)->job == 'T')
{
printf("请输入第%d个人员的职务:", i+1);
scanf(" %s", &((p+i)->position));
}
}
}
void put_output(information * p, int n)
{
int i = 0;
printf("编号\t姓名\t性别\t职业\t分数/职务\n");
for(i = 0; i<n; i++)
{
printf("%d\t%s\t%c\t%c\t", i+1, (p+i)->name, (p+i)->sex, (p+i)->job );
if((p+i)->job == 's'||(p+i)->job == 'S')
{
printf("%.2f\n", (p+i)->score );
}
else if((p+i)->job == 't'||(p+i)->job == 'T')
{
printf("%s\n", (p+i)->position );
}
else
{
printf("职业信息错误!\n" );
}
}
}
//求所有学生平均值
float score_average(information * p, int n)
{
int i = 0, cnt = 0;
float score_sum = 0;
for(i = 0; i<n; i++)
{
if((p+i)->job == 's'||(p+i)->job == 'S')
{
score_sum += (p+i)->score;
cnt++;
}
}
return score_sum/cnt;
}
int cnt_teacher(information * p, int n)
{
int i = 0, cnt = 0;
for(i = 0; i<n; i++)
{
if((p+i)->job == 't'||(p+i)->job == 'T')
{
cnt++;
}
}
return cnt;
}
void * my_free(information * p)
{
if(p == NULL)
return NULL;
free(p);
p = NULL;
return NULL;
}
main.c
#include"head.h"
int main(int argc, char const *argv[])
{
int n;
information * p;
p = my_malloc(n);
printf("请输入要录入的人员数量:");
scanf(" %d", &n);
get_input(p, n); //打印提示,并接收用户输入
put_output(p, n); //输出所有人员信息
printf("所有学生平均成绩为:%.2f\n", score_average(p, n) );
printf("所有老师人数为:%d\n", cnt_teacher(p, n) );
free(p);
p = NULL;
if(p == NULL)
printf("空间释放完成。\n");
return 0;
}
作业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>释放堆区空间
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//结构体和共用体嵌套
//用来存储学生和教师信息
typedef struct CarInfo
{
char brand[20];
char color[10];
int price;
}carinfo;
carinfo * my_malloc(int n);
void get_input(carinfo * p, int n);
void car_sort_bubble(carinfo * p, int n);
void put_output(carinfo * p, int n);
void * my_free(carinfo * p);
#endif
fun.c
#include"head.h"
//为结构体分配堆空间
carinfo * my_malloc(int n)
{
carinfo * p = (carinfo *)malloc(n*sizeof(carinfo));
if(p == NULL)
return p;
return p;
}
void get_input(carinfo * p, int n)
{
int i = 0;
for(i = 0; i<n; i++)
{
printf("请输入第%d个车辆的品牌:", i+1);
scanf( " %s", &((p+i)->brand) );
printf("请输入第%d个车辆的颜色:", i+1);
scanf(" %s", &((p+i)->color));
printf("请输入第%d个车辆的价格:", i+1);
scanf(" %d", &((p+i)->price) );
}
}
void car_sort_bubble(carinfo * p, int n)
{
carinfo temp_carinfo;
int i, j;
for(i = 0;i<n-1;i++)
{
int cnt = 0;
for(j = 0; j<n-1-i; j++)
{
if((p+j)->price>(p+j+1)->price)
{
temp_carinfo = *(p+j);
*(p+j) = *(p+j+1);
*(p+j+1) = temp_carinfo;
cnt++;
}
}
if (cnt == 0)
break;
}
}
void put_output(carinfo * p, int n)
{
int i = 0;
printf("编号\t品牌\t颜色\t价格\n");
for(i = 0; i<n; i++)
{
printf("%d\t%s\t%s\t%d\n", i+1, (p+i)->brand, (p+i)->color, (p+i)->price );
}
}
void * my_free(carinfo * p)
{
if(p == NULL)
return NULL;
free(p);
p = NULL;
return NULL;
}
main.c
#include"head.h"
//为结构体分配堆空间
carinfo * my_malloc(int n)
{
carinfo * p = (carinfo *)malloc(n*sizeof(carinfo));
if(p == NULL)
return p;
return p;
}
void get_input(carinfo * p, int n)
{
int i = 0;
for(i = 0; i<n; i++)
{
printf("请输入第%d个车辆的品牌:", i+1);
scanf( " %s", &((p+i)->brand) );
printf("请输入第%d个车辆的颜色:", i+1);
scanf(" %s", &((p+i)->color));
printf("请输入第%d个车辆的价格:", i+1);
scanf(" %d", &((p+i)->price) );
}
}
void car_sort_bubble(carinfo * p, int n)
{
carinfo temp_carinfo;
int i, j;
for(i = 0;i<n-1;i++)
{
int cnt = 0;
for(j = i; j<n-1-i; j++)
{
if((p+j)->price>(p+j+1)->price)
{
temp_carinfo = *(p+j);
*(p+j) = *(p+j+1);
*(p+j+1) = temp_carinfo;
cnt++;
}
}
if (cnt == 0)
break;
}
}
void put_output(carinfo * p, int n)
{
int i = 0;
printf("编号\t品牌\t颜色\t价格\n");
for(i = 0; i<n; i++)
{
printf("%d\t%s\t%s\t%d", i+1, (p+i)->brand, (p+i)->color, (p+i)->price );
}
}
void * my_free(carinfo * p)
{
if(p == NULL)
return NULL;
free(p);
p = NULL;
return NULL;
}
int main(int argc, char const *argv[])
{
int n = 5;
carinfo * p;
p = my_malloc(n);
get_input(p, n); //打印提示,并接收用户输入
put_output(p, n); //输出所有车辆信息
car_sort_bubble(p, n); //排序
put_output(p, n); //输出所有车辆信息
free(p);
p = NULL;
if(p == NULL)
printf("空间释放完成。\n");
return 0;
}