作业
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
//构建结构体
struct Stu
{
char name[20]; //姓名
char gender[20]; //性别
char num[20];//学号
double score;//成绩
};
#define MAX 50
//定义菜单函数
void menu_1()
{
printf("*******1>学生信息录入**********\n");
printf("*******2>查询学生信息**********\n");
printf("*******3>最高分最低分学生信息********\n");
printf("*******4>班级总成绩与平均成绩**********\n");
printf("*******5>按成绩排序**********\n");
printf("*******6>查找学生**********\n");
printf("*******0>退出系统**********\n");
printf("请输入功能所对应数字>>\n");
}
//定义录入函数
void input(struct Stu *stu,int *size_ptr)
{
printf("请输入学生数量:");
scanf("%d",size_ptr); //输入班级人数
for(int i=0;i<*size_ptr;i++)
{
printf("请输入第%d个学生的姓名:",i+1);
scanf("%s",stu[i].name);
printf("请输入第%d个学生的性别:",i+1);
scanf("%s",stu[i].gender);
printf("请输入第%d个学生的学号:",i+1);
scanf("%s",stu[i].num);
printf("请输入第%d个学生的成绩:",i+1);
scanf("%lf",&stu[i].score);
printf("\n");
}
printf("录入成功!!!\n");
}
//定义信息输出函数
void output(struct Stu *stu,int size)
{
printf("××××××××××学生信息××××××××××\n");
printf("姓名\t性别\t学号\t成绩\n");
for(int i=0;i<size;i++)
{
printf("%s\t%s\t%s\t%.2lf\n",stu[i].name,stu[i].gender,\
stu[i].num,stu[i].score);
}
}
//定义输出成绩最好与最差学生函数
void output_1(struct Stu *stu,int size)
{
struct Stu max;//定义成绩最高学生信息
struct Stu min;//定义最低
max=stu[0];
for(int i=0;i<size;i++)
{
if(max.score<stu[i].score)
{
max=stu[i];
}
}
printf("成绩最好的学生信息如下,%s\t%s\t%s\t%.2lf\n",max.name,\
max.gender,max.num,max.score);
min.score=stu[0].score;
for(int i=0;i<size;i++)
{
if(min.score>stu[i].score)
{
min=stu[i];
}
}
printf("成绩最地的学生信息如下,%s\t%s\t%s\t%.2lf\n",min.name, \
min.gender,min.num,min.score);
}
//总成绩和平均成绩
void sum_ave(struct Stu *stu,int size)
{
int sum=0;
double ave;
for(int i=0;i<size;i++)
{
sum+=stu[i].score;
}
ave=(double)sum/size;
printf("学生们的总成绩是%d,平均分是%.2lf\n",sum,ave);
}
//排序函数
void sort_1(struct Stu *stu,int size)
{
int flag=0;
printf("1为升序,0为降序,请输入数字:");
scanf("%d",&flag);
getchar();
if(flag==0)
{
for(int i=1;i<size;i++)
{
for(int j=0;j<size-i;j++)
{
if(stu[j].score<stu[j+1].score)
{
struct Stu temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
printf("降序后的结果为:\n");
printf("姓名\t性别\t学号\t成绩\n");
for(int i=0;i<size;i++)
{
printf("%s\t%s\t%s\t%.2lf\n",stu[i].name,stu[i].\
gender,stu[i].num,stu[i].score);
}
}
else if(flag==1)
{
for(int i=1;i<size;i++)
{
for(int j=0;j<size-i;j++)
{
if(stu[j].score>stu[j+1].score)
{
struct Stu temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
printf("升序后的结果为:\n");
printf("姓名\t性别\t学号\t成绩\n");
for(int i=0;i<size;i++)
{
printf("%s\t%s\t%s\t%.2lf\n",stu[i].name,stu[i].\
gender,stu[i].num,stu[i].score);
}
}
}
void find(struct Stu *stu,int size)
{
char find_name[20]={0};
char *res=NULL;
printf("请输入要查找的学生姓名\n");
scanf("%s",find_name);
for(int i=0;i<size;i++)
{
res=strstr(stu[i].name,find_name);
}
if(res)
printf("该学生存在于班级中\n");
else{printf("该学生不在班级中\n");}
}
/***********************主函数*********************/
int main(int argc, const char *argv[])
{
int menu=0;
int size=0;
struct Stu stu[MAX];
memset(stu, 0, sizeof(stu));
while(1)
{
menu_1();
scanf("%d",&menu);
getchar();
switch(menu)
{
case 1: {input(stu,&size);}
break;
case 2:{output(stu,size);}
break;
case 3: {output_1(stu,size);}
break;
case 4: {sum_ave(stu,size);}
break;
case 5: {sort_1(stu,size);}
break;
case 6: {find(stu,size);}
break;
case 0: exit(1);
default:printf("输入错误,请重新输入有效数字\n");
}
}
return 0;
}
笔记
一、结构体
1.1
引入目的:处理对象时,往往有许多信息是由多个不同类型的数据组合在一起描述的,而且不同的数据是互相联系形成一个有机的整体;此时需要一种新的构造类型数据——结构体。
结构体本质上是数据类型,属于构造数据类型
定义:由相同数据类型或不同数据类型构成的数据的集合,叫做结构体
结构体种可以包含若干个不同数据类型和不同意义的数据项(也可以相同)
1.2 定义格式与初始化
struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
数据类型 成员名3;
:
数据类型 成员名n;
};
注意事项:
1、struct是定义结构体类型的关键字,不能省略;
2、结构体名称:标识符,需要符合命名规则,一般建议首字母大写(可以不接收建议;
3、成员属性使用花括号包裹;
4、成员类型可以是基本数据类型,也可以是构造数据类型、指针类型;
5、定义结束后,必须加上分号结尾;
例子:struct STU
{
char name[20]; //姓名
int age; //年龄
double score; //成绩
};
1.3 使用结构体类型定义变量
1、定义格式 struct 结构体名称 变量名;
2、注意:定义变量时,strcut也不能省略
3、也可以在进程类型定义时,顺便定义一个结构体变量:
struct Stu
{
char name[20]; //姓名
int age; //年龄
double score; //成绩
} s1;
此时的s1就是一个结构体变量
#include<myhead.h>
//定义一个英雄类型
struct Hero
{
char name[30]; // 英雄名称
int blood; //英雄血量
char skill[4][20]; //技能
int kill; //击杀人头数
int die; //死亡数量
int assiant; //辅助数量
} h2; //定义类型时,顺便定义一个变量
//定义类型顺便定义变量
struct
{
char name[20]; //学生姓名
int age; //年龄
double score; //成绩
}s1; //该结构体称为无名结构体
int main(int argc, const char *argv[])
{
//使用自定义类型,定义一个英雄变量
struct Hero h1, h3;
return 0;
}
结构体的初始化 四种方式:
#include<myhead.h>
//定义一个英雄类型
struct Hero
{
char name[30]; // 英雄名称
int blood; //英雄血量
char skill[4][20]; //技能
int kill; //击杀人头数
int die; //死亡数量
int assiant; //辅助数量
} h2 = {"德玛西亚之力", 800, {"q", "w", "e", "r"}, 0, 2, 10}; //定义类型时,顺便定义一个变量
//定义类型顺便定义变量
struct
{
char name[20]; //学生姓名
int age; //年龄
double score; //成绩
}s1 = {"李华", 18, 65}; //该结构体称为无名结构体
int main(int argc, const char *argv[])
{
//使用自定义类型,定义一个英雄变量
struct Stu h1 = {"张三", 20, 99};
struct Stu s2 = {.age=32, .score=100}; //只给部分成员初始化
return 0;
}
1.4结构体访问成员
1> 普通结构体变量访问成员是,使用成员运算符 ‘.’ 来进行,读作 "的"
例如:s1.name s1.score
2> 结构体指针变量访问成员,使用成员运算符 '->'来进行,读作 '的'
例如:struct Stu *ptr = &s1; ptr->name ptr->score
3> 在进行成员访问时,访问的最终的类型,就是最后一个成员所表示的结果类型
例如:s1.name 是字符数组类型, ptr->score 是double类型
4> 当一个结构体类型中的某个成员变量也是一个结构体变量时,如果要进行最深一级的访问,需要使用成员运算符一级一级进行访问
1.5 结构体输入输出
通过成员运算符,找到结构体变量的普通成员后,本质上就是一个普通变量的输入输出
1.6 结构体数组
1> 结构体数组本质上也是一个数组,只是每个元素是结构体变量
2> 定义格式:strcut 结构体名 数组名[常量];
1.7 结构体的大小
1> 结构体变量所占内存空间的大小,是各个成员所占内存空间之和
2> 要遵循字节对齐原则,有两个
1、结构体中的每个成员,在分配内存时,要以数据类型对齐一次
2、所有成员分配内存结束后,整体需要对齐一次:
32位系统以 min(最大字节的成员,4) 对齐
64位系统以 min(最大字节的成员,8)对齐
3> 在C语言中一个空的结构体类型,占0字节