笔记
杂项
一.结构体
1.1引入目的
1)系统中提供的数据类型不够使用,自己定义数据类型以供程序使用
2)结构体本质上时数据类型,属于构造数据类型
3)定义:由相同数据类型或不同数据类型构成的数据的集合,叫做结构体
1.2定义以及初始化
定义格式:
struct 结构体名称
{
成员类型1 成员变量1
成员类型2 成员变量2
........
成员类型n 成员变量n
};
注意事项:
1)struct是定义结构体类型的关键字,不能省略
2)结构体名称:标识符,符合命名规则,一般建议首字母大写
3)成员属性使用一对花括号包裹起来
4)成员类型可以是基本数据类型,也可以是构造数据类型、指针类型
5)定义结束后,必须加上分号结尾
1.3使用结构体类型定义变量
定义格式: struct 结构体名称 名称名;
注意事项:定义变量时,struct也不能省略;
也可以在进程类型定义时,顺便定义一个结构体变量;
struct Stu
{
char name[20];
int age;
double score;
}s1;
//此时s1就是一个结构体变量
1.4初始化结构体变量
1)定义类型时,顺便定义一个变量
2)在主函数中使用定义的结构体类型定义变量
3)只给部分成员初始化
1.5结构体访问成员
1)普通结构体变量访问成员时,使用成员运算符‘ .'来进行,读作“的”
2)结构体指针变量访问成员,使用成员运算符‘->’来进行,读作“的”
3)在进行成员访问时,访问的最终类型,就是最后一个成员所表示的结果类型
4)当一个结构体类型中的某一个成员变量也是一个结构体变量时,如果要进行最深一级的访问,需要使用成员运算符一级一级进行访问
1.6结构体变量的输入输出
通过成员运算符,找到结构体变量的普通成员后,本质上就是一个普通变量的输入输出
1.7结构体数组
1)结构体数组本质上也是一个数组,只是每个元素是结构体变量
2)定义格式:struct 结构体名 数组名[常量]
1.8结构体大小
1)结构体变量所占内存空间的大小,是各个成员所占内存空间之和
2)要遵循字节对齐原则,有两个
1.结构体中的每个成员,在分配内存时,要以数据类型对齐一次
2.所有成员分配内存结束后,整体需要对其一次
32位系统以min(最大字节的成员,4)对齐
64位系统以min(最大字节的成员,8)对齐
3)在C语言中一个空的结构体类型,占0字节
作业
#include<stdio.h>
#include<string.h>
#include"student_system.h"
int main(int argc, char const *argv[])
{
int sum=0;//记录录入学生总个数
int flag_cz=4;//用于记录操作界面的选项
int flag_tc=0;//用于判断是否退出
int flag_sort=0;//记录排序时要进行的选项
while(1)
{
printf_interface();//操作界面显示函数
scanf("%d",&flag_cz);
switch(flag_cz)
{
case 1:
sum=stu_input(stu,sum);//录入函数,最后返回已录入的学生人数
break;
case 2:
stu_printf(stu,sum);//打印函数,将学生信息打印出来
break;
case 3:
stu_score_MaxAndMin(stu,sum);
break;
case 4:
stu_score_SumAndAve(stu,sum);
break;
case 5:
printf_sort_interface();//排序操作界面显示函数
scanf("%d",&flag_sort);//选择排序方式
getchar();
stu_sort(stu,sum,flag_sort);//排序函数有四种排序方式
break;
case 6:
stu_name_find(stu,sum);
break;
case 7:
return 0;
default:
printf("错误操作!\n");
break;
}
}
return 0;
}
#include<stdio.h>
#include<string.h>
#include"student_system.h"
void printf_interface()//操作界面打印函数
{
putchar(10);//用于分割两个操作之间的显示
putchar(10);//使用时个人感觉看着舒服
printf("**********学生管理系统*********\n");//打印界面
printf("************1.录入************\n");
printf("************2.查看************\n");
printf("**********3.成绩最高与最低者**\n");
printf("**********4.总成绩和平均成绩**\n");
printf("************5.排序************\n");
printf("************6.查找************\n");
printf("************7.退出************\n");
printf("******************************\n");
putchar(10);
putchar(10);
printf("请选择操作:\n");
}
int stu_input(struct Student stu[],int sum)//学生信息录入函数
{
int num=0;
printf("请输入你要录入的学生位数:\n");
scanf("%d",&num);
getchar();
if(num>0)//判断要录入的学生人数是否大于0,大于0则正常输入,小于零则输入失败
{
for (int i = 0; i < num; i++)
{
printf("请输入第%d位入学生学号:\n",i+1);
scanf("%ld",&stu[i].num);
getchar();
printf("请输入第%d位学生姓名:\n",i+1);
scanf("%s",stu[i].name);
getchar();
printf("请输入第%d位入学生姓别:\n",i+1);
scanf("%s",stu[i].sex);
getchar();
printf("请输入第%d位学生成绩:\n",i+1);
scanf("%lf",&stu[i].score);
getchar();
}
sum+=num;//将录入的人数加到总人数中
printf("输入成功!\n");
}
else
printf("输入失败!");
putchar(10);
putchar(10);
return sum;
}
void stu_printf(struct Student stu[],int sum)
{
putchar(10);
putchar(10);
if(sum==0)//判断学生数组是否为空
printf("数据为空!\n");//如果没有录入过信息则打印
else
{
printf("<----------------------------------------------->\n");
printf("学号\t\t姓名\t\t性别\t\t成绩\n");
for (int i = 0; i < sum; i++)
{
printf("%ld\t\t%s\t\t%s\t\t%.2f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].score);
}
printf("<----------------------------------------------->\n");
}
putchar(10);
putchar(10);
}
void printf_sort_interface()//排序操作界面函数
{
putchar(10);
putchar(10);
printf("************************************\n");
printf("************1.按序号排列************\n");
printf("************2.按名字排列************\n");
printf("************3.按成绩排列************\n");
printf("************4.退出******************\n");
printf("************************************\n");
putchar(10);
putchar(10);
printf("请选择你需要的操作\n");
}
void stu_sort(struct Student stu[],int sum,int flag_1)//排序函数
{
int flag_2=0;
putchar(10);
putchar(10);
if(sum>0)
{
switch(flag_1)//定义四种排序方式
{
case 1:
printf("<----------------->\n");
printf("\t1升序\n");
printf("\t2降序\n");
printf("\t3退出\n");
printf("<----------------->\n");
scanf("%d",&flag_2);
getchar();
switch(flag_2)
{
case 1:
for (int i = 1; i < sum; i++)
{
for (int j= 0; j < sum-i; j++)
{
if(stu[j].num>stu[j+1].num)
{
struct Student temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
printf("排序成功!\n");
break;
case 2:
for (int i = 1; i < sum; i++)
{
for (int j= 0; j < sum-i; j++)
{
if(stu[j].num<stu[j+1].num)
{
struct Student temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
printf("排序成功!\n");
break;
case 3:
break;
default:
printf("输入错误\n");
break;
}
printf("排序结果为:\n");
printf("<----------------------------------------------->\n");
printf("学号\t\t姓名\t\t性别\t\t成绩\n");
for (int i = 0; i < sum; i++)
{
printf("%ld\t\t%s\t\t%s\t\t%.2f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].score);
}
printf("<----------------------------------------------->\n");
break;
case 2:
printf("<----------------->\n");
printf("\t1升序\n");
printf("\t2降序\n");
printf("\t3退出\n");
printf("<----------------->\n");
scanf("%d",&flag_2);
getchar();
switch(flag_2)
{
case 1:
for (int i = 1; i < sum; i++)
{
for (int j= 0; j < sum-i; j++)
{
if(strcmp(stu[j].name,stu[j+1].name)>0)
{
struct Student temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
printf("排序成功!\n");
break;
case 2:
for (int i = 1; i < sum; i++)
{
for (int j= 0; j < sum-i; j++)
{
if(strcmp(stu[j].name,stu[j+1].name)<0)
{
struct Student temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
printf("排序成功!\n");
break;
case 3:
break;
default:
printf("输入错误\n");
break;
}
printf("排序结果为:\n");
printf("<----------------------------------------------->\n");
printf("学号\t\t姓名\t\t性别\t\t成绩\n");
for (int i = 0; i < sum; i++)
{
printf("%ld\t\t%s\t\t%s\t\t%.2f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].score);
}
printf("<----------------------------------------------->\n");
break;
case 3:
printf("<----------------->\n");
printf("\t1升序\n");
printf("\t2降序\n");
printf("\t3退出\n");
printf("<----------------->\n");
scanf("%d",&flag_2);
getchar();
switch(flag_2)
{
case 1:
for (int i = 1; i < sum; i++)
{
for (int j= 0; j < sum-i; j++)
{
if(stu[j].score>stu[j+1].score)
{
struct Student temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
printf("排序成功!\n");
break;
case 2:
for (int i = 1; i < sum; i++)
{
for (int j= 0; j < sum-i; j++)
{
if(stu[j].score<stu[j+1].score)
{
struct Student temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
printf("排序成功!\n");
break;
case 3:
break;
default:
printf("输入错误\n");
break;
}
printf("排序结果为:\n");
printf("<----------------------------------------------->\n");
printf("学号\t\t姓名\t\t性别\t\t成绩\n");
for (int i = 0; i < sum; i++)
{
printf("%ld\t\t%s\t\t%s\t\t%.2f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].score);
}
break;printf("学号\t\t姓名\t\t性别\t\t成绩\n");
case 4://退出操作
break;
default:
printf("输入错误\n");//未输入指定字符打印
break;
}
}
else
{
printf("数据为空!");
}
putchar(10);
putchar(10);
}
void stu_score_MaxAndMin(struct Student stu[],int sum)
{
int max=stu[0].score;
int min=stu[0].score;
int MAX=0;
int MIN=0;
for(int i=0;i<sum;i++)
{
if(stu[i].score>max)
{
max=stu[i].score;
MAX=i;
}
if(stu[i].score<min)
{
min=stu[i].score;
MIN=i;
}
}
printf("成绩最高者为:\n");
printf("学号\t\t姓名\t\t性别\t\t成绩\n");
printf("%ld\t\t%s\t\t%s\t\t%.2f\n",stu[MAX].num,stu[MAX].name,stu[MAX].sex,stu[MAX].score);
putchar(10);
printf("成绩最低者为:\n");
printf("学号\t\t姓名\t\t性别\t\t成绩\n");
printf("%ld\t\t%s\t\t%s\t\t%.2f\n",stu[MIN].num,stu[MIN].name,stu[MIN].sex,stu[MIN].score);
putchar(10);
}
void stu_score_SumAndAve(struct Student stu[],int sum)
{
int Sum=0;
double Avg=0;
for(int i=0;i<sum;i++)
{
Sum+=stu[i].score;
}
Avg=Sum/(double)sum;
printf("班级总分为%d,平均分为%lf\n",Sum,Avg);
}
void stu_name_find(struct Student stu[],int sum)
{
char name[30]="";
printf("请输入你要查找的学生姓名:\n");
scanf("%s",name);
int flag=0;
for (int i = 0; i < sum; i++)
{
if(strcmp(stu[i].name,name)==0)
{
printf("学号\t\t姓名\t\t性别\t\t成绩\n");
printf("%ld\t\t%s\t\t%s\t\t%.2f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].score);
flag=1;
}
}
if(flag=0)
printf("未找到!\n");
}
#ifndef _STUDENT_SYSTEM_H_
#define _STUDENT_SYSTEM_H_
#define M 100
struct Student
{
long int num;
char name[30];
char sex[4];
double score;
}stu[M];//定义一个数组存储学生成绩
void printf_interface();
int stu_input(struct Student stu[],int sum);
void stu_printf(struct Student stu[],int sum);
void stu_sort(struct Student stu[],int sum,int flag_1);
void printf_sort_interface();
void stu_score_SumAndAve(struct Student stu[],int sum);
void stu_score_MaxAndMin(struct Student stu[],int sum);
void stu_name_find(struct Student stu[],int sum);
#endif // !_STUDENT_SYSTEM_H_