c语言成绩管理系统

要求:
学生信息:
学号,姓名,性别,出生(年,月,日),三门课成绩和总分( 数学, 英语, C, 总分)。
数据格式:
测试数据,以文本文件方式提供,studf.txt。
程序功能
1) 建立学生信息结构数组 从文本文件studf.txt 读入数据
2) 按姓名递增冒泡排序(应用指针数组)
3) 按总分递减选择排序(应用指针数组)
4) 显示按总分排序后学生信息
5) 按学号查学生信息和平均分数(顺次查找法)
6) 按姓名查学生信息和平均分数(折半查找法)
7) 查各门课平均分数
8) 查男女学生人数和总人数
9) 显示学生信息表
2、程序总体设计
数据结构:
依据给定的学生信息和数据格式,结构数组的分量必须用结构实现; 结构类型的层次结构:
struct student
学号 字符串 char no[9]
姓名 字符串 char name[9] (汉字)
性别 字符串 char sex[3] (汉字)
出生日期 日期结构 struct date
年 int year
月 int month
日 int day
三门课成绩和总分 整型数组 int score[4]

struct date {/* 日期结构 */
int year; /* 年 */
char month; /* 月
char day; /* 日 */
};
struct student{ /* 学生信息结构 */
char no[9]; /* 学号 */
char name[9]; /* 姓名 */
char sex[3]; /* 性别 */
struct date birthday; /* 出生日期 */
int score[4]; /* 三门课成绩和总分 */
};
结构数组定义为局部标识符:
static struct student stud[N];

3、函数原型清单:
1 建立学生信息数组 readsi
void readsi(struct student stud[],int *n);
2 按姓名递增冒泡排序(应用指针数组) bsort
void bsort(struct student *pname[],int n);
3 按总分递减选择排序(应用指针数组) ssort
void ssort(struct student *ptscore[],int n);
4 按学号查学生信息和平均分数(顺序查找) ssrch_no
void ssrch_no(struct student *pstud[],int n);
5 按姓名查学生信息和平均分数(折半查找) bsrch_name
void bsrch_name(struct student *pname[],int n);
6 查各门课的平均分数 find_ave
void find_ave(struct student *pstud,int n);
7 查男女学生的人数 find_pnum
void find_pnum(struct student *pstud,int n);
8 显示学生信息表printtable
void printtable(struct student *pstud,int n);

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 35
char name;
int inth;
struct date
{
int year;
char month;
char day;
};
struct student
{
char no[9];
char name[9];
char sex[3];
struct date birthday;
int score[4];
};
int menu()
{

int code;

printf(" 菜单\n");

printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");

printf("┃ 0.退出 ┃\n");

printf("┃ 1.显示学生信息 ┃\n");

printf("┃ 2.显示按姓名排序后的学生信息 ┃\n");

printf("┃ 3.显示按总分排序后的学生信息 ┃\n");

printf("┃ 4.按学号查学生分数和平均分数 ┃\n");

printf("┃ 5.按姓名查学生分数和平均分数 ┃\n");

printf("┃ 6.查各课程平均分数 ┃\n");

printf("┃ 7.查男女学生的人数 ┃\n");

printf("┃ 8.显示学生信息表 ┃\n");

printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");

printf("选择代码(0,1,2,3,4,5,6,7,8): ");

scanf("%d",&code);

return code;

}

/* 建立学生信息数组 */

void readsi(struct student stud[],int *n)

{

FILE*fp;

int i;

if((fp=fopen("studf.txt","r"))==NULL)

{

printf("不能打开studf.txt文件!\n");

exit(1);

}

for(i=0;!feof(fp);i++)

{

(*n)++;

if(*n>N)

{

printf("最多处理35位学生信息!\n");

return;

}

fscanf(fp,"%s %s %s %d %d %d %d %d %d",stud[i].no,stud[i].name,stud[i].sex,&stud[i].birthday.year,&stud[i].birthday.month,&stud[i].birthday.day,&stud[i].score[0],&stud[i].score[1],&stud[i].score[2]);
// fscanf从一个流中执行格式化输入
stud[i].score[3]=stud[i].score[0]+stud[i].score[1]+stud[i].score[2];

}

fclose(fp);

}

/* 显示学生信息 */

void printsi(struct student *pstud,int n)

{

int i,k=0;

printf(" 学号 姓名 性别 年 月 日 数学 英语 C 总分\n");

printf("┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉\n");

printf("==================================================================\n");

for(i=0;i<n;i++)

{

printf("%-8s %-8s %-2s %4d %2d %2d %4d %4d %4d %5d\n",pstud[i].no,pstud[i].name,pstud[i].sex,pstud[i].birthday.year,pstud[i].birthday.month,pstud[i].birthday.day,

pstud[i].score[0],pstud[i].score[1],pstud[i].score[2],pstud[i].score[3]);

k++;

if(k%20==0)

scanf("%*c");

}

}

/* 按学号排序—简单比较排序法*/

void csort_no(struct student *pstud,int n)

{

struct student temp;

int i,j;

for(i=0;i<n-1;i++)

for(j=i+1;j<n;j++)

if(strcmp(pstud[i].no,pstud[j].no)>0)

{

temp=pstud[i];

pstud[i]=pstud[j];

pstud[j]=temp;

}

}

/* 显示学生信息表*/

void printtable(struct student *pstud,int n)

{

int i,k=0;struct student studA[N];

for(i=0;i<n;i++)

studA[i]=pstud[i];

csort_no(studA,n);

printf("\n\n");

printf(" 学生信息表\n");

printf(" ==================\n\n");

printf("┏━━━━┳━━━━┳━━━┳━━━━━━┳━━━┳━━━┳━━━┳━━━┓\n");

printf("┃学号 ┃姓名 ┃ 性别 ┃ 年 月 日 ┃ 数学 ┃ 英语 ┃ C ┃ 总分 ┃\n");

printf("┣━━━━╋━━━━╋━━━╋━━━━━━╋━━━╋━━━╋━━━╋━━━┫\n");

printf("┣━━━━╋━━━━╋━━━╋━━━━━━╋━━━╋━━━╋━━━╋━━━┫\n");

for(i=0;i<n;i++)

{

printf("┃%-8s┃%-8s┃ %-2s ┃ %4d %2d %2d ┃ %4d ┃ %4d ┃ %4d ┃ %4d ┃\n",studA[i].no,studA[i].name,studA[i].sex,studA[i].birthday.year,studA[i].birthday.month,studA[i].birthday.day,studA[i].score[0],studA[i].score[1],studA[i].score[2],studA[i].score[3]);

if(i==n-1)

printf("┗━━━━┻━━━━┻━━━┻━━━━━━┻━━━┻━━━┻━━━┻━━━┛\n");

else

printf("┣━━━━╋━━━━╋━━━╋━━━━━━╋━━━╋━━━╋━━━╋━━━┫\n");

k++;

if(k%20==0)

scanf("%*c");

}

}

/* 查各课程平均分数 */

void find_ave(struct student *pstud,int n)

{

static summath=0,sumenglish=0,sumC=0,score=0;int i;struct student studA[N];

for(i=0;i<n;i++)

studA[i]=pstud[i];

csort_no(studA,n);

printf(" 各课程平均分数 \n ");

printf("————————————————————————————\n");

for(i=0;i<n;i++)

{

summath=summath+pstud[i].score[0];

sumenglish=sumenglish+pstud[i].score[1];

sumC=sumC+pstud[i].score[2];

score=score+pstud[i].score[3];

}

printf("数学平均分数:%4d\n",summath/n);

printf("英语平均分数:%4d\n",sumenglish/n);

printf("c平均分数:%4d\n",sumC/n);

printf("总分平均分数:%5d\n",score/n);

}

/* 查男女学生人数 */

void find_pnum(struct student *pstud,int n)

{

int i,j=0,k=0;

for(i=0;i<n;i++)

{

if(strcmp(pstud[i].sex,"男")==0)

j++;

else

k++;

}

printf("男学生人数为%d人",j);

printf("女学生人数为%d人",k);

}

/* 按总分递减选择排序(应用指针数组)*/

void ssort(struct student *ptscore[],int n)

{

struct student *temp;

int i,j;

for(i=0;i<n-1;i++)

for(j=0;j<n-i-1;j++)

if(ptscore[j]->score[3]<ptscore[j+1]->score[3])

{

temp=ptscore[j];

ptscore[j]=ptscore[j+1];

ptscore[j+1]=temp;

}

}

/* 按学号查学生信息和平均分数(顺序查找)*/

void ssrch_no(struct student *pstud[],int n)

{

int i=0,j=0;char no[9];

printf("请输入要查找的学生学号:");

scanf("%s",&no);

printf("\n");

for(i=0;i<n;i++)

{

if(strcmp(no,pstud[i]->no)==0)

printf("已找到学号为%-8s的学生\n学号:%-8s\n姓名:%-8s\n性别:%-2s\n%4d年%2d月%2d日\n数学:%4d\n英语:%4d\nc:%4d\n总分%4d\n平均分数为:%4d\n",pstud[i]->no,pstud[i]->no,pstud[i]->name,pstud[i]->sex,pstud[i]->birthday.year,pstud[i]->birthday.month,pstud[i]->birthday.day,pstud[i]->score[0],pstud[i]->score[1],pstud[i]->score[2],pstud[i]->score[3],pstud[i]->score[3]/3);

else

j++;

}

if(j==6)

printf("未找到学号为%-8s的学生\n",no);

}

/* 按姓名查找的学生信息和平均分数(折半查找)*/

void bsrch_name(struct student *pname[],int n)

{
int bsrch(struct student *pname[],int n,char *name);
char name[9];int i;

printf("请输入要查找的学生姓名:");

scanf("%s",name);

i=bsrch(pname,n,name);

if(i!=-1)

printf("已找到该学生,学生信息:%-8s %-8s %-2s %4d %2d %2d %4d %4d %4d %5d\n",

pname[i]->no,pname[i]->name,pname[i]->sex,

pname[i]->birthday.year,pname[i]->birthday.month,

pname[i]->birthday.day,

pname[i]->score[0],pname[i]->score[1],pname[i]->score[2],

pname[i]->score[3]);

else

printf("%d没有找到该学生资料!\n",name);

for(;;)

{ i=i-1;

if(strcmp(name,pname[i]->name)==0) printf("已找到该学生,学生信息:%-8s %-8s %-2s %4d %2d %2d %4d %4d %4d %5d\n",

pname[i]->no,pname[i]->name,pname[i]->sex,

pname[i]->birthday.year,pname[i]->birthday.month,

pname[i]->birthday.day,

pname[i]->score[0],pname[i]->score[1],pname[i]->score[2],

pname[i]->score[3]);

else

break;

}

i=bsrch(pname,n,name);

for(;;)

{i=i+1;

if(strcmp(name,pname[i]->name)==0) printf("已找到该学生,学生信息:%-8s %-8s %-2s %4d %2d %2d %4d %4d %4d %5d\n",

pname[i]->no,pname[i]->name,pname[i]->sex,

pname[i]->birthday.year,pname[i]->birthday.month,

pname[i]->birthday.day,

pname[i]->score[0],pname[i]->score[1],pname[i]->score[2],

pname[i]->score[3]);

else

break;

}

}

int bsrch(struct student *pname[],int n,char *name)

{

int lower=0,upper=n-1,mid;

if(strcmp(name,pname[lower]->name)==0) return lower;

else if(strcmp(name,pname[upper]->name)==0) return upper;

else

while(lower<=upper)

{

mid=(lower+upper)/2;

if(strcmp(name,pname[mid]->name)==0)

return mid;

else if(strcmp(name,pname[mid]->name)>0)

lower=mid+1;

else

upper=mid-1;

}

return -1;

}

/* 按姓名递增冒泡排序(应用指针数组) */

void bsort(struct student *pname[],int n)

{

struct student *temp;

int i,j;

for(i=0;i<n-1;i++)

for(j=0;j<n-i-1;j++)

if(strcmp(pname[j]->name,pname[j+1]->name)>0)

{

temp=pname[j];

pname[j]=pname[j+1];

pname[j+1]=temp;

}

}

/* 按总分名次查找的学生信息和平均分数 */

void printf_ptscore(struct student *ptscore[],int n,int inth)

{

printf("请输入要查找总分名次:");

scanf("%d",&inth);

inth--;

if(inth>n)

{

printf("未找到总分名次为%5d的学生",inth);

}

else

printf("已找到总分名次为%5d的学生\n学号:%-8s\n姓名:%-8s\n性别:%-2s\n%4d年%2d月%2d日\n数学:%4d\n英语:%4d\nc:%4d\n总分%5d\n平均分数为:%4d",inth+1,ptscore[inth]->no,ptscore[inth]->name,ptscore[inth]->sex,ptscore[inth]->birthday.year,ptscore[inth]->birthday.month,ptscore[inth]->birthday.day,ptscore[inth]->score[0],ptscore[inth]->score[1],ptscore[inth]->score[2],ptscore[inth]->score[3],ptscore[inth]->score[3]/3);

}

/*显示姓名排序后的学生信息*/

void printsi_p1(struct student *parray[],int n)

{

int i,k=0;

printf(" 按姓名排序后的学生信息\n\n");

printf("学号 姓名 性别 年 月 日 数学 英语 C 总分\n");

printf("******** ------ ** ---- ** -- *** --- *** --- \n");

printf("=====================================================\n");

for(i=0;i<n;i++)

{

printf("%-8s%-8s%-2s%4d %2d %2d %4d %4d %4d %5d\n",

parray[i]->no,parray[i]->name,parray[i]->sex,

parray[i]->birthday.year,parray[i]->birthday.month,parray[i]->birthday.day,

parray[i]->score[0],parray[i]->score[1],parray[i]->score[2],parray[i]->score[3]);

k++;

if(k%20==0)

scanf("%*c");

}

}

/* 显示按总分排序后的学生信息 */

void printsi_p2(struct student *ptscore[],int n)

{

int i,k=0;

printf("\n\n");

printf(" 按总分排序后的学生信息表\n");

printf(" ==================\n\n");

printf("┏━━━━┳━━━━┳━━━┳━━━━━━┳━━━┳━━━┳━━━┳━━━┓\n");

printf("┃学号 ┃姓名 ┃ 性别 ┃ 年 月 日 ┃ 数学 ┃ 英语 ┃ C ┃ 总分 ┃\n");

printf("┣━━━━╋━━━━╋━━━╋━━━━━━╋━━━╋━━━╋━━━╋━━━┫\n");

printf("┣━━━━╋━━━━╋━━━╋━━━━━━╋━━━╋━━━╋━━━╋━━━┫\n");

for(i=0;i<n;i++)

{

printf("┃%-8s┃%-8s┃ %-2s ┃ %4d %2d %2d ┃ %4d ┃ %4d ┃ %4d ┃ %4d ┃\n",ptscore[i]->no,ptscore[i]->name,ptscore[i]->sex,ptscore[i]->birthday.year,ptscore[i]->birthday.month,ptscore[i]->birthday.day,ptscore[i]->score[0],ptscore[i]->score[1],ptscore[i]->score[2],ptscore[i]->score[3]);

if(i==n-1)

printf("┗━━━━┻━━━━┻━━━┻━━━━━━┻━━━┻━━━┻━━━┻━━━┛\n");

else

printf("┣━━━━╋━━━━╋━━━╋━━━━━━╋━━━╋━━━╋━━━╋━━━┫\n");

k++;

if(k%20==0)

scanf("%*c");

}

}
#include<stdio.h>

#include<stdlib.h>

#include<string.h>
#define N 35
void main()

{

static struct student stud[N];

struct student *pstud[N];

struct student *pname[N];

struct student *ptscore[N];

int code,inth=0;

int n=0,i;

readsi(stud,&n);

for(i=0;i<N;i++)

pstud[i]=&stud[i];

for(i=0;i<N;i++)

pname[i]=&stud[i];

for(i=0;i<N;i++)

ptscore[i]=&stud[i];

bsort(pname,n);

ssort(ptscore,n);

printf("\n 学生信息:\n");

printsi(stud,n);

printf("\n 按<Enter>,进入菜单:\n");

scanf("%*c");

while(1)

{

code=menu();

switch(code)

{

case 0: /* 退出 */

exit(1);

case 1: /* 显示学生信息 */

printsi(stud,n);

scanf("%*2c");break;

case 2: /* 显示按姓名排序后的学生信息 */

printsi_p1(pname,n);

scanf("%*2c");break;

case 3: /* 显示按总分排序后的学生信息 */

printsi_p2(ptscore,n);

scanf("%*2c");break;

case 4: /* 按学号查找学生信息和平均分数 */

ssrch_no(pstud,n);

scanf("%*2c");break;

case 5: /* 按姓名查找学生信息和平均分数 */

bsrch_name(pname,n);

scanf("%*2c");break;

case 6: /* 查各门课的平均分数 */

find_ave(stud,n);

scanf("%*2c");break;

case 7: /* 查男女人数 */

find_pnum(stud,n);

scanf("%*2c");break;

case 8: /* 显示学生信息表 */

printtable(stud,n);

scanf("%*2c");break;

}

}

}
温馨提示:答案为网友推荐,仅供参考
相似回答