数据结构day02---结构体共用体练习

有若干个学校人员的信息,包括学生和教师。其中学生的数据包括:姓名、性别、职业s/S、分数。教师的数据包括:姓名、性别、职业t/T、职务。要求用同一个表格来处理以上数据。

1,定义函数在堆区申请空间n

struct B *p= (struct B * )malloc(sizeof(struct B)* n );

2,定义函数实现录入学校人员信息

for(int i=0;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,释放存储空间

头文件

#ifndef __HEAD_H__
#define __HEAD_H__

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
typedef struct person
{
    char name[20];
    char sex;
    char job;
    union
    {
        float score;
        char position[20];
    };
}per;
per *create(int n);
void input(per *p,int n);
void output(per *p,int n);
float Age(per *p,int n);
int sumTeacher(per *p,int n);

per *free_space(per *p);
#endif
 

自定义文件

 

#include"head.h"

per *create(int n)
{
    per *p =(per *)malloc(sizeof(per)*n);
    if(p == NULL)
        return NULL;
    return p;
}
/*
 * function:    输入
 * @param [ in] 结构体指针 ,人数
 * @param [out] 
 * @return      无返回值
 */

void input(per *p,int n)
{
    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);
        }
    }
}

/*
 * function:    输出
 * @param [ in] 结构体指针,人数
 * @param [out] 
 * @return      无返回值
 */

void output(per *p,int n)
{
    for(int i = 0; i < n; i++)
    {
        if((p+i)->job == 's' || (p+i)->job == 'S')
        {
            printf("姓名:%s  性别:%c  职业:%c  分数:%.2f\n ",(p+i)->name,(p+i)->sex,(p+i)->job,(p+i)->score);
        }
        else
        {
            printf("姓名:%s  性别:%c  职业:%c  职务:%s\n ",(p+i)->name,(p+i)->sex,(p+i)->job,(p+i)->position);
        }
    }
}

float Age(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 += (p+i)->score;
            count++;
        }
    }
    return sum/count;

}

int sumTeacher(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;
}

per *free_space(per *p)
{
    if(p == NULL)
        return NULL;
    free(p);
    p = NULL;
    return p;
}
 

主函数文件

 

#include"head.h"
/*typedef struct person
{
    char name[20];
    char sex;
    char job;
    union
    {
        float score;
        char position[20];
    };
}per;*/

int main (int argc, const char *argv[])
{
    int n;
    printf("请输入您要录入几个人员\n");
    scanf("%d",&n);
    per *p = create(n);
    //录入
    input(p,n);
    //输出
    printf("输出\n");
    output(p,n);
    printf("学生的平均值为%.2f\n",Age(p,n));
    printf("老师的个数为%d\n",sumTeacher(p,n));
    p = free_space(p);

    return 0;
}    

day2作业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>释放堆区空间

头文件

 

#ifndef __HEAD_H__
#define __HEAD_H__

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct Car
{
    char brand[20];
    char color[10];
    float price;
}car;

car *create(int n);
void input(car *p,int n);
void sort(car *p,int n);
void output(car *p,int n);
car *free_space(car *p);

#endif
 

自定义函数

 

#include"head.h"

/*
 * function:    申请5个连续的存储空间
 * @param [ in] 
 * @param [out] 
 * @return      成功返回首地址
 */

car *create(int n)
{
    car *p = (car *)malloc(sizeof(car)*n);
    if(p == NULL)
        return NULL;
    return p;
}

/*
 * function:    输入
 * @param [ in] 指针 个数
 * @param [out] 
 * @return      
 */
void input(car *p,int n)
{
    for(int i = 0; i< n; i++)
    {
        printf("请输入品牌:");
        gets((p+i)->brand);
        printf("请输入颜色:");
        gets((p+i)->color);
        printf("请输入单价:");
        scanf("%f",&(p+i)->price);
        getchar();
    }
}
/*
 * function:    对价格进行排序
 * @param [ in] 结构体指针,个数
 * @param [out] 
 * @return      
 */

void sort(car *p,int n)
{
    car temp;
    for(int i = 1; i < n; i++)
    {
        for(int j = 0; j < n-i; j++)
        {
            if((p+j)->price > (p+j+1)->price)
            {
                temp = *(p+j);
                *(p+j) = *(p+j+1);
                *(p+j+1) = temp;
            }
        }
    }
}

void output(car *p,int n)
{
    for(int i = 0; i < n; i++)
    {
        printf("品牌:%s  颜色:%s  单价:%.2f\n",(p+i)->brand,(p+i)->color,(p+i)->price);
    }
}

car *free_space(car *p)
{
    if(p == NULL)
        return NULL;
    free(p);
    p = NULL;
    return p;
}
 

主函数文件

 

#include"head.h"

int main (int argc, const char *argv[])
{
    car *p = create(5);
    input(p,5);
    //排序
    sort(p,5);
    //输出
    output(p,5);
    p = free_space(p);
    
    return 0;
}    

输出结果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值