带解析的学生成绩管理系统(C语言版本帮别人改的)

整个程序的主要存储数据都在这个顺序表里面
stu结构体为存储单个学生信息然后通过slist创建结构体数组加上len属性表示学生信息的个数

typedef struct
{
char name[20];//姓名
int num;//编号
int age;//年龄
int yw;//语文
int sx;//数学
int yy;//英语
int sum;//总成绩
int sex;//性别:1为男 2为女
}stu;
typedef struct
{
stu a[MAX];
int len;
}slist;

主函数用于菜单的打印以及功能选择

void main()
{
int n;
slist s;
slist *p=&s;
s.len=0;
for(;;)
{
puts(“\t\t====================”);
puts(“\t\t1. 录入学生信息”);
puts(“\t\t2. 输出学生信息”);
puts(“\t\t3. 插入学生信息”);
puts(“\t\t4. 删除学生信息”);
puts(“\t\t5. 修改学生信息”);
puts(“\t\t6. 写入文本信息”);
puts(“\t\t7. 读取文本信息”);
puts(“\t\t8. 总成绩排序输出(加平均分)”);
puts(“\t\t0. 退出”);
puts(“\t\t====================”);
printf(“请输入功能编号:”);
scanf(“%d”,&n);
switch(n)
{
case 1:
{
printf(“输入学生数量:”);
scanf(“%d”,&n);
input(p,n);
}break;
case 2:
{
shuchu(p);
}break;
case 3:
{
printf(“输入要插入的位置:”);
scanf(“%d”,&n);
charu(p,n);
}break;
case 4:
{
printf(“输入要删除的位置:”);
scanf(“%d”,&n);
shanchu(p,n);
}break;
case 5:
{
printf(“输入要修改的位置:”);
scanf(“%d”,&n);
xiugai(p,n);
}break;
case 6:
{
makeText(p);
}break;
case 7:
{
readText(p);
}break;
case 8:
{
int t;
printf(“请选择正序还是逆序输出(1 or 0):”);
scanf(“%d”, &t);
infoSort(p,t);
}break;

case 0:
{
exit(0);
}break;
default:printf(“错误编号,请重新输入\n”);break;
}
}
}

添加学生信息函数,传入参数为结构体数组地址,需要添加的学生个数n 然后通过循环n次的方式以此给结构体赋值

void input(slist *p,int n)
{
int i;
for(i=0;i<n;i++)
{
printf(“输入学生编号:”);
scanf(“%d”,&p->a[i].num);
printf(“输入学生姓名:”);
scanf(“%s”,&p->a[i].name);
printf(“输入学生年龄:”);
scanf(“%d”,&p->a[i].age);
printf(“输入学生语文:”);
scanf(“%d”,&p->a[i].yw);
printf(“输入学生数学:”);
scanf(“%d”,&p->a[i].sx);
printf(“输入学生英语:”);
scanf(“%d”,&p->a[i].yy);
printf(“输入学生性别:(1:男 2:女)”);
scanf(“%d”, &p->a[i].sex);
p->len++;
}
}

打印学生信息子函数,通过结构体数组遍历的方式输出所有的学生信息

void shuchu(slist *p)
{
int i;
p->a[0].sum=0;
puts(“编号\t姓名\t年龄\t语文\t数学\t英语\t总成绩\t性别”);
for(i=0;i<p->len;i++)
{
p->a[i].sum = p->a[i].yw + p->a[i].sx + p->a[i].yy;
printf(“%d\t%s\t%d\t%d\t%d\t%d\t%d\t”,p->a[i].num,p->a[i].name,p->a[i].age,p->a[i].yw,p->a[i].sx,p->a[i].yy,p->a[i].sum);
if (p->a[i].sex == 1)
{
printf(“男\n”);
}
else
{
printf(“女\n”);
}
}
}

插入学生信息子函数 传入数值为学生结构体数组以及插入的位置
首先从插入的位置的学生信息全部后移一位,然后在插入的的位置的学生结构体数组添加插入的学生信息

void charu(slist *p,int n)
{
int i;
stu e;
if(n<1||n>p->len+1)
{
puts(“插入位置不合理”);
}
else
{
for(i=p->len-1;i>=n-1;i–)
{
p->a[i+1]=p->a[i];
}
printf(“插入学生编号:”);
scanf(“%d”,&e.num);
printf(“插入学生姓名:”);
scanf(“%s”,&e.name);
printf(“插入学生年龄:”);
scanf(“%d”,&e.age);
printf(“插入学生语文:”);
scanf(“%d”,&e.yw);
printf(“插入学生数学:”);
scanf(“%d”,&e.sx);
printf(“插入学生英语:”);
scanf(“%d”,&e.yy);
printf(“插入学生性别:(1:男 2:女)”);
scanf(“%d”, &e.sex);
p->a[n-1]=e;
p->len++;
shuchu(p);
}
}

删除学生信息函数 原理和上面差不多通过删除位置后面一位的学生数据抵消前面一位的学生信息,然后后面的数据全部前移一位

void shanchu(slist *p,int n)
{
/** n表示删除的下表 *p表示学生数组 **/
int i;
stu e;
if(n < 1 || n > p->len)
{
puts(“删除位置不合理”);
}
else
{
for(i=n-1; i < p->len-1; i++)
{
p->a[i]=p->a[i+1];
}
p->len–;
shuchu(p);
}
}

修改学生信息函数 通过查找学生位置找到结构体数组中该学生的数组数据,然后全部重新赋值即可

void xiugai(slist *p,int n)
{
int i;
stu e;
if(n<1||n>p->len+1)
{
puts(“修改位置不合理”);
}
else
{
printf(“修改学生编号:”);
scanf(“%d”,&e.num);
printf(“修改学生姓名:”);
scanf(“%s”,&e.name);
printf(“修改学生年龄:”);
scanf(“%d”,&e.age);
printf(“修改学生语文:”);
scanf(“%d”,&e.yw);
printf(“修改学生数学:”);
scanf(“%d”,&e.sx);
printf(“修改学生英语:”);
scanf(“%d”,&e.yy);
printf(“修改学生性别:(1:男 2:女)”);
scanf(“%d”, &e.sex);
p->a[n-1]=e;
shuchu(p);
}
}

写入文件的方式为遍历结构体数组然后每个数据都会换行写入“test.txt”的文件家内 为什么换行写入呢(为了后面的读文件更方便操作)

void makeText(slist* p)
{
//获取文件指针
int i;
FILE* pFile = fopen(“test.txt”, “w”);

//向文件写数据
/*fprintf(pFile, “编号\t姓名\t年龄\t语文\t数学\t英语\t总成绩\n”);*/

for (i = 0; i < p->len; i++)
{
p->a[i].sum = p->a[i].yw + p->a[i].sx + p->a[i].yy;
fprintf(pFile,”%d\n%s\n%d\n%d\n%d\n%d\n%d\n%d\n”, \
p->a[i].num, p->a[i].name, p->a[i].age, p->a[i].yw, p->a[i].sx, p->a[i].yy, p->a[i].sum,p->a[i].sex);
}
fclose(pFile); //关闭文件
}

读文件函数,通过打开text.txt文本一行一行的读取数值然后转换为int类型送给结构体数组,跟添加学生的方式基本一致,不同的是从文本获取的信息需要分信息的个数来进行循环赋值

void readText(slist* p)
{
int i = 0,j = 0,t = 0;
FILE* pFile = fopen(“test.txt”, “r”);

char buf[1024] = “”;

char str[100][20] = {” “};

while (fgets(buf, 1024, pFile) != NULL)
{
//printf(“%s”, buf);
if (buf != “”)
{
strcpy(str[i++], buf);
}
t = i;
}
p->len = 0;
for (i = 0; i < t; i+=8)
{
p->a[p->len].num = atoi(str[i]);
strcpy(p->a[p->len].name, str[i+1]);
for (j = 0;j < strlen(p->a[p->len].name);j++)
{
if (p->a[p->len].name[j] == ‘\n’)
p->a[p->len].name[j] = ‘ ‘;
}
p->a[p->len].age = atoi (str[i+2]);
p->a[p->len].yw = atoi(str[i+3]);
p->a[p->len].sx = atoi(str[i+4]);
p->a[p->len].yy = atoi(str[i+5]);
p->a[p->len].sum = atoi(str[i+6]);
p->a[p->len].sex = atoi(str[i + 7]);
p->len++;
}
fclose(pFile); //关闭文件
}

通过选择排序的方法来排序学生的总成绩,函数有一个正序和倒叙的参数判断,是正序还是倒叙输出

void infoSort(slist *p,int flag)
{
/*根据总成绩排序输出*/
/*如果flag为true正序输出否则为倒叙输出*/
int i = 0,j = 0,item = 0;
stu it;
//正序 1-2-3-4
if (flag)
{
for (i = 0; i < p->len; i++)
{
item = i;
for (j = i + 1; j < p->len ; j++)
{
if (p->a[i].sum > p->a[j].sum)
item = j;
}
if (item != i)
{
it = p->a[i];
p->a[i] = p->a[item];
p->a[item] = it;
}
}
}
//逆序 4-3-2-1
else
{
for (i = p->len; i >=0 ; i–)
{
item = i;
for (j = i -1; j >=0 ; j–)
{
if (p->a[i].sum > p->a[j].sum)
item = j;
}
if (item != i)
{
it = p->a[i];
p->a[i] = p->a[item];
p->a[item] = it;
}
}
}
shuchu(p);
}

猜你喜欢

转载自blog.csdn.net/qq_43581670/article/details/107604677