#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;
等等。。。。。。
初学者的小总结,如有错误,不吝指教。