一 、有若干个学校人员的信息,包括学生和教师。其中学生的数据包括:姓名、性别、职业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
{
char name[20];
char sex;
char job;
union
{
float score;
char work[20];
};
}per;
per *create(int n);
void input(per *p,int n);
void output(per *p, int n);
float average(per *p,int n);
int count_teacher(per *p,int n);
#endif
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
int n;
printf("输入总人数:");
scanf("%d",&n);
per *p = create(n);
input(p,n);
output(p,n);
printf("平均成绩为:%.2f\n",average(p,n));
printf("教师的人数为:%d\n",count_teacher(p,n));
free(p);
p=NULL;
return 0;
}
test.c
#include "head.h"
//申请内存空间
per *create(int n)
{
per *p = (per *)malloc(sizeof(per)*n);
if (p == NULL)
return NULL;
return p;
}
//输入
void input(per *p,int n)
{
for(int i=0;i<n;i++)
{
printf("输入第%d名成员信息\n",i+1);
printf("请输入性名: ");
scanf("%s",(p+i)->name);
printf("请输入性别: ");
scanf(" %c",&(p+i)->sex);
printf("请输入职业: ");
scanf(" %s",&(p+i)->job);
if((p+i)->job=='s'||(p+i)->job=='S')
{
printf("请输入分数: ");
scanf("%f",&(p+i)->score);
}
else
{
printf("请输入职务: ");
scanf("%s",(p+i)->work);
}
}
}
//输出
void output(per *p, int n)
{
printf("姓名\t性别\t职业\t成绩(职位)\n");
for(int i=0;i<n;i++)
{
printf("%s\t",(p+i)->name);
printf("%c\t",(p+i)->sex);
printf("%s\t",&(p+i)->job);
if((p+i)->job=='s'||(p+i)->job=='S')
printf("%.2f\n",(p+i)->score);
else
printf("%s\n",(p+i)->work);
}
}
//计算平均值
float average(per *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 = sum + (p+i)->score;
count++;
}
}
return sum / count;
}
//计算教师人数
int count_teacher(per *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;
}
二、在堆区申请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>
typedef struct
{
char name[20];
char color[20];
float price;
}car;
car *create(int n);
void input(car *p,int n);
void bubble_price(car *p,int n);
void output(car *p,int n);
#endif
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
car *p=create(5);
//输入
input(p,5);
//价格排序
bubble_price(p,5);
output(p,5);
//释放空间
free(p);
p=NULL;
return 0;
}
test.c
#include "head.h"
//申请内存空间
car *create(int n)
{
car *p=(car *)malloc(sizeof(car)*n);
if(p==NULL)
return NULL;
return p;
}
//输入
void input(car *p,int n)
{
for(int i=0;i<n;i++)
{
printf("输入第%d辆车的信息\n",i+1);
printf("输入车辆品牌:");
scanf("%s",p[i].name);
printf("输入车辆颜色:");
scanf("%s",p[i].color);
printf("输入车辆价格:");
scanf("%f",&p[i].price);
}
}
//按照价格排序
void bubble_price(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 temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
}
}
void output(car *p,int n)
{
printf("品牌\t颜色\t价格\n");
for(int i=0;i<n;i++)
{
printf(" %s\t",p[i].name);
printf(" %s\t",p[i].color);
printf(" %.2f\t\n",p[i].price);
}
}