C语言数据结构-Day01

作业

#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字节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值