结构体与指针(使用malloc)

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

//定义一个结构体,存放学生信息。然后存储于malloc的空间内

#define M 20
#define N 3
#define SIZE 3

typedef struct student//定义一个结构体变量,存放学生信息
{
	char name[M];//姓名
	int age;//年龄
	float scores[N];//成绩
}stu;//对结构体变量进行重命名

int menu()//菜单
{
	int c = 0;
	printf("......请选择要进行的操作:....\n");
	printf("1.........................输入\n");
	printf("2.........................输出\n");
	printf("3.........求年龄最大人的首地址\n");
	printf("4.............根据年龄进行排序\n");
	printf("5.............根据姓名进行排序\n");
	printf("6.....根据三门成绩总和进行排序\n");
	printf("-1........................退出\n");
	scanf("%d",&c);
	return c;
}

int SWAP(stu *p,stu *pp)//交换元素
{
	stu temp = {0};
	temp = *p;
	*p = *pp;
	*pp = temp;
}

float SUM(float temp[], int n)//求三门成绩的总和
{
	float sum = 0;
	int i = 0;
	for(i = 0; i < n; i++)
	{
		sum = sum + temp[i];
	}
	return sum;
}

int INPUT(stu *p,int n)//输入函数
{
	int i;
	for(i= 1; i <= n; i++)
	{
		printf("请输入第%d个学生的信息:姓名,年龄,三门成绩\n",i);
		scanf("%s%d%f%f%f",p->name,&(p->age),p->scores,p->scores +1,p->scores +2);
		p++;
	}
}

int OUTPUT(stu *p,int n)//输出函数
{
	int i;
	for(i = 1; i <= n; i++)
	{
		printf("第%d个学生的信息为:\n",i);
		printf("姓名:%s\n年龄:%d\n三门成绩:%.1f %.1f %.1f\n",p->name,p->age,p->scores[0],p->scores[1],p->scores[2]);
		p++;
	}
}

stu *AGE_MAX(stu *p, int n)//求年龄最大的人的首地址
{
	stu *pmax = NULL;
	pmax = p;
	int i;
	for(i = 1; i < n; i++)
	{
		p++;
		if((pmax->age) < (p->age))
		{
			pmax = p;
		}
	}
	return pmax;
}

int PX_AGE(stu *p, int n)//根据年龄进行排序
{
	int i,j;
	for(i = 1; i < n; i++)
	{
		for(j = 0; j < n - i; j++)
		{
			if(((p + j)-> age) > ((p + j + 1) -> age))
			{
				SWAP((p + j), (p + j +1));
			}
		}
	}
}

int PX_NAME(stu *p, int n)//根据姓名进行排序
{
	int i,j;
	for(i = 1; i < n; i++)
	{
		for(j = 0; j < n - i; j++)
		{
			if((strcmp(((p + j) -> name),(p + j + 1) -> name)) > 0)
			{
				SWAP((p + j), (p + j +1));
			}
		}
	}
}

int PX_SUM_SCORES(stu *p, int n)//根据三门成绩总和进行排序
{
	int i,j;
	for(i = 1; i < n; i++)
	{
		for(j = 0; j < n - i; j++)
		{
			if(SUM(((p + j) -> scores),N) > SUM(((p + j + 1) -> scores),N))
			{
				SWAP((p + j), (p + j +1));
			}
		}
	}
}

int main(int argc, const char *argv[])//主函数
{
	stu *p = NULL;//定义一个结构体指针变量
	stu *pmax = NULL;//定义一个结构体指针用于功能3的返回值
	p = (stu *)malloc(sizeof(stu) * SIZE);//malloc空间
	if(NULL == p)
	{
		perror("malloc_error!\n");//mallco的提示
		return -1;
	}
	memset(p,0,sizeof(stu) * SIZE);//对于malloc的空间进行初始化
	while(1)
	{
		int c = 0;
		c = menu();
		if(-1 == c)
		{
			break;
		}
		switch(c)
		{
			case 1:INPUT(p,SIZE);break;//输入函数
			case 2:OUTPUT(p,SIZE);break;//输出函数
			case 3://求年龄最大人的首地址
				   pmax = AGE_MAX(p,SIZE);
				   printf("年龄最大人的首地址为:%p\n",pmax);
				   break;
			case 4://根据年龄进行排序
				   PX_AGE(p,SIZE);
				   break;
			case 5://根据姓名进行排序
				   PX_NAME(p,SIZE);
				   break;
			case 6://根据三门成绩总和进行排序
				   PX_SUM_SCORES(p,SIZE);
		}
	}
	free(p);
	p = NULL;
	return 0;
}

以上程序是关于近期C语言学习情况的一个综合练习,包括但不限于:

(1)结构体

                struct   student  

                {

                        内容;

                        。。

                };

(2)指针

                int *p = NULL;

                stu *p = NULL;

(3)循环语句

                for(语句1; 语句2; 语句3)

                 {

                        循环体;

                 }

                 先执行语句1,再执行语句2,再执行循环体,最后再执行语句3

(4)选择语句

                if()

                switch()

(5)宏定义

                #define  宏名  宏体

(6)数组

                数据类型 数组名 [元素个数]

                int arr[N];

(7)malloc

                (void*)malloc(需要开辟的空间大小)

开辟成功,函数返回值为万能指针,使用时需要进行强制转换;

失败返回-1;

等等。。。。。。

初学者的小总结,如有错误,不吝指教。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值