学生成绩管理系统(数据结构C语言版源代码)

更新时间:2023-08-25 21:44:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

只要你有能力去做的事就一定要去做,不要给自己留下任何遗憾,人生最重要的不是所站的位置,而是所朝的方向。

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

struct students{

char Num[10]; /*字符型学生学号*/

char Name[20]; /*字符型学生姓名*/

char Sex[3]; /*字符型学生性别*/

double English; /*双精度实型英语成绩*/

double Java; /*双精度实型Java成绩*/

double Sjjg; /*双精度实数据结构*/

double Szdl; /*双精度实型数字电路*/

double Jsj; /*计算机组成原理*/

struct students *next; /*用与构建连表指向下一结点*/

};

FILE *fp; /*定义全局变量fp*/

void Revisemenu();/*修改菜单*/

void Sortmenu();/*排序菜单*/

void menu();/*主菜单*/

void secret();/*安全验证*/

struct students * Input();/*新建学生信息*/

void fprint(struct students *head);/*将信息导入文件可追加*/

void fprint_(struct students *head);/*将信息导入文件并覆盖*/

void Browse(struct students *head);/*浏览全部学生信息*/

struct students * create(struct students *head

int *n);/*从tushu_list中读取数据构建链表*/

void FindofNum(struct students *head);/*按学号查询学生信息*/

void FindofNname(struct students *head);/*按姓名查询学生信息*/

void SortEnglish(struct students * head);/*按英语成绩排序*/

void SortJava(struct students * head);/*按Java成绩排序*/

void SortSjjg(struct students * head);/*按数据结构成绩排序*/

void SortSzdl(struct students * head);/*按数字逻辑电路成绩排序*/

void SortJsj(struct students * head);/*按计算机组成原理成绩排序*/

struct students * Delete(struct students * head

char m[15]);/*按学号删除学生成绩信息*/

struct students * Revise();/*修改学生信息(按编号修改)*/

/*主菜单*/

void menu()

{

printf("\n\n");

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

printf(" 学生成绩管理系统 \n");

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

printf(" 1-添加新同学 2-浏览学生信息 \n");

printf(" 3-按学号查询 4-按姓名查询 \n");

printf(" 5-按成绩排序 6-修改学生信息 \n");

printf(" 7-删除学生信息 0-退出系统 \n");

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

printf("___________________________________________________\n");

}

/*排序菜单*/

void Sortmenu()

{

printf("\n\n");

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

printf(" 按成绩排序 \n");

printf(" 1-大学英语 2-JAVA编程 \n");

printf(" 3-数据结构 4-数字逻辑电路 \n");

printf(" 5-计算机组成原理 0-返回上级菜单 \n");

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

}

/*修改菜单*/

void Revisemenu()

{

printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");

printf(" 1--修改学生姓名 2--修改学生学号 \n");

printf(" 3--修改学生性别 4--修改英语成绩 \n");

printf(" 5--修改JAVA成绩 6--修改数据结构 \n"); printf(" 7--修改数字电路 8--修改计算计 \n");

printf(" 0--返回上级菜单 \n");

printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");

}

/*安全验证*/

void secret()

{

char a[20];

printf("**欢迎来到学生信息管理系统

进入系统前请先进行密码验证---");

printf(" ");

do{

gets(a); /*输入密码*/

system("cls"); /*调用库函数清屏*/

printf("对不起!您输入的密码有误

请重新输入---");

}while(strcmp(a

"0605")!=0); /*单一密码"0605"*/

system("cls");

}

/*新建学生信息*/

struct students * Input()

{

struct students *p1

*p2

*head; /*建立辅助结点及头结点*/

char Name;

int n=0

x;

printf("\n请按对应项输入学生信息以#结束:\n");

printf("姓名 学号 性别 英语 Java 数据结构 数字电路

\n");

p1=(struct students *)malloc(sizeof(struct students));

head=p2=p1;

do{ /*使用do while语句输入学生信息*/

scanf("%s"

&p1->Name);

if(strcmp(p1->Name

"#")==0)break; /*判断结束符*/

else

scanf("%s%s%lf%lf%lf%lf%lf"

p1->Num

p1->Sex

&p1->English

&p1->Java

&p1->Sjjg

&p1->Szdl

&p1->Jsj);

Name='#';

p1=(struct students *)malloc(sizeof(struct students));

p2->next=p1;

p2=p1;

n++;

}while(1);

p1->next=NULL; 计算机组成原理

printf("学生信息输入结束!\n");

getchar();

printf("是否保存学生信息?(1.是/2.否):");

scanf("%d"

&x);

if(x==1)

fprint(head); /*调用函数保存至文件*/

else

printf("\n文件没有被保存!\n");

return head; /*返回头指针*/

}

/*将信息导入文件可追加*/

void fprint(struct students *head)

{

struct students *p1;

if((fp=fopen("students_list.txt"

"a"))==NULL)

{

printf("File open error!\n");

exit(0);

}

for(p1=head;p1->next!=NULL;p1=p1->next) /*遍历*/

fprintf(fp

"%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p1->Name

p1->Num

p1->Sex

p1->English

p1->Java

p1->Sjjg

p1->Szdl

p1->Jsj);/*将学生信息写入文件*/

fclose(fp); /*关闭文件*/

printf("\n学生信息已成功保存到文件 students_list.txt 中!\n");

getchar();

}

/*将信息导入文件并覆盖*/

void fprint_(struct students *head)

{

struct students *p1;

if((fp=fopen("students_list.txt"

"w"))==NULL)

{

printf("File open error!\n");

exit(0);

}

for(p1=head;p1!=NULL;p1=p1->next) /*遍历*/

fprintf(fp

"%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p1->Name

p1->Num

p1->Sex

p1->English

p1->Java

p1->Sjjg

p1->Szdl

p1->Jsj);/*将学生信息写入文件*/

fclose(fp); /*关闭文件*/;

getchar();

}

/*浏览全部学生信息*/

void Browse(struct students *head)

{

char Num[10]; /*字符型学生学号*/

char Name[20]; /*字符型学生姓名*/

char Sex[3]; /*字符型学生性别*/

double English; /*双精度实型英语成绩*/

double Java; /*双精度实型Java成绩*/

double Sjjg; /*双精度实数据结构*/

double Szdl; /*双精度实型数字电路*/

double Jsj; /*计算机组成原理*/

if((fp=fopen("students_list.txt"

"a+"))==NULL)

{

printf("File open error!\n");

exit(0);

}

printf("-------------------------------------------------------------\n"); printf("姓名 学号 性别 英语 Java 数据结构 数字电路 计算机\n"); while(!feof(fp))/*读取并输出*/{

fscanf(fp

"%s%s%s%lf%lf%lf%lf%lf"

Name

Num

Sex

&English

&Java

&Sjjg

&Szdl

&Jsj);

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

Name

Num

Sex

English

Java

Sjjg

Szdl

Jsj);

};

if(fclose(fp))

{

printf("Can not close the file!\n");

exit(0);

}

}

/*从tushu_list中读取数据构建链表*/

struct students * create(struct students * head

int *n)

{

FILE *fp;

struct students*p

*p1

*p2;

if((fp=fopen("students_list.txt"

"a+"))==NULL)

{

printf("File open error!\n");

exit(0);

}

while(!feof(fp))

{

(*n)++;

p=(struct students *)malloc(sizeof(struct students));

fscanf(fp

"%s%s%s%lf%lf%lf%lf%lf"

p->Name

p->Num

p->Sex

&p->English

&p->Java

&p->Sjjg

&p->Szdl

&p->Jsj);

if(head==NULL)

{

head=p;

p1=p;

}

else

{

p1->next=p;

p2=p1;

p1=p;

}

}

p2->next=NULL;

free(p);

(*n)--;

fclose(fp);

return head;

}

/*按姓名查询学生信息*/

void FindofName(struct students *head)

{

int i=0

n=0;

char b[20];

struct students *p;

head=create(head

&n);

p=head;

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

scanf("%s"

b);

while(p!=NULL){

if(strcmp(p->Name

printf("姓名 学号 性别 英语 Java 数据结构 数字电路 计算机\n");

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Sjjg

p->Szdl

p->Jsj);

i++;

}

p=p->next;

}

if(i==0)

printf("\n对不起!没有找到名为"%s"的学生信息!\n"

b);

}

/*按学号查询学生信息*/

void FindofNum(struct students *head)

{

int i=0

n;

char b[20];

struct students *p;

head=create(head

&n);

p=head;

printf("\n请输入要查询的学生学号:");

scanf("%s"

b);

while(p!=NULL){

if(strcmp(p->Num

b)==0){

printf("姓名 学号 性别 英语 Java 数据结构 数字电路 计算机\n");

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->English

p->Java

p->Sjjg

p->Szdl

p->Jsj);

i++;

}

p=p->next;

}

if(i==0)

printf("\n对不起!没有找到学号为"%s"学生信息!\n"

b);

}

/*按英语成绩排序*/

void SortEnglish(struct students * head)

{

struct students *p

*tail; /*定义中间变量*/

int n;

double English;

p=(struct students *)malloc(sizeof(struct students));

head=create(head

&n);

printf("姓名 学号 性别 英语 Java 数据结构 数字电路 计算机\n"); while(head->next!=NULL) /*利用选择法排序*/

{

tail=NULL;

p=head;

English=p->English; /*将链表中第一个成绩赋给English*/

while(p!=NULL)

{

if((p->English)>English)/*比较*/

English=p->English;

tail=p;

p=p->next;

}

tail=NULL;

p=head;

while(p->next!=NULL)

{

if(p->English==English){

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Sjjg

p->Szdl

p->Jsj);

if(p==head)

head=head->next;

else

tail->next=p->next;

}

tail=p;

p=p->next;

}

if(p->English==English){ /*分数相同时无需比较*/ printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Sjjg

p->Szdl

p->Jsj);

tail->next=NULL;

}

}

p=head; /*将链表赋给结构体指针*/

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Sjjg

p->Szdl

p->Jsj);/*浏览排序后的信息*/

printf("按英语成绩排序后输出如上(注:此过程不保存至文件):\n");

return;

/*按JAVA成绩排序*/

void SortJava(struct students * head)

{

struct students *p

*tail; /*定义中间变量*/

int n;

double Java;

p=(struct students *)malloc(sizeof(struct students));

head=create(head

&n);

printf("姓名 学号 性别 英语 Java 数据结构 数字电路 计算机\n"); while(head->next!=NULL) /*利用选择法排序*/

{

tail=NULL;

p=head;

Java=p->Java; /*将链表中第一个成绩赋给Java*/

while(p!=NULL)

{

if((p->Java)>Java)/*比较*/

Java=p->Java;

tail=p;

p=p->next;

}

tail=NULL;

p=head;

while(p->next!=NULL)

{

if(p->Java==Java){

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Sjjg

p->Szdl

p->Jsj);

if(p==head)

head=head->next;

else

tail->next=p->next;

}

tail=p;

p=p->next;

}

if(p->Java==Java){ /*成绩相同时无需比较*/

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Sjjg

p->Szdl

p->Jsj);

tail->next=NULL;

}

}

p=head; /*将链表赋给结构体指针*/

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Sjjg

p->Szdl

p->Jsj);/*浏览排序后的信息*/

printf("按Java成绩排序后输出如上(注:此过程不保存至文件):\n"); return;

}

/*按数据结构排序*/

void SortSjjg(struct students * head)

{

struct students *p

*tail; /*定义中间变量*/

int n;

double Sjjg;

p=(struct students *)malloc(sizeof(struct students));

head=create(head

&n);

printf("姓名 学号 性别 英语 Java 数据结构 数字电路 计算机\n");

while(head->next!=NULL) /*利用选择法排序*/

{

tail=NULL;

p=head;

Sjjg=p->Sjjg; /*将链表中第一个成绩赋给Sjjg*/

while(p!=NULL)

{

if((p->Sjjg)>Sjjg)/*比较*/

Sjjg=p->Sjjg;

tail=p;

p=p->next;

}

tail=NULL;

p=head;

while(p->next!=NULL)

{

if(p->Sjjg==Sjjg){

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Sjjg

p->Szdl

p->Jsj);

if(p==head)

head=head->next;

else

tail->next=p->next;

}

tail=p;

p=p->next;

}

if(p->Sjjg==Sjjg){ /*成绩相同时无需比较*/

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Sjjg

p->Szdl

p->Jsj);

tail->next=NULL;

}

}

p=head; /*将链表赋给结构体指针*/

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Sjjg

p->Szdl

p->Jsj);/*浏览排序后的信息*/

printf("按数据结构成绩排序后输出如上(注:此过程不保存至文件):\n"); return;

}

/*按数字电路排序*/

void SortSzdl(struct students * head)

{

struct students *p

*tail; /*定义中间变量*/

int n;

double Szdl;

p=(struct students *)malloc(sizeof(struct students));

head=create(head

&n);

printf("姓名 学号 性别 英语 Java 数据结构 数字电路 计算机\n"); while(head->next!=NULL) /*利用选择法排序*/

{

tail=NULL;

p=head;

Szdl=p->Szdl; /*将链表中第一个成绩赋给Szdl*/

while(p!=NULL)

{

if((p->Szdl)>Szdl)/*比较*/

Szdl=p->Szdl;

tail=p;

p=p->next;

}

tail=NULL;

p=head;

while(p->next!=NULL)

{

if(p->Szdl==Szdl){

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Sjjg

p->Szdl

p->Jsj);

if(p==head)

head=head->next;

else

tail->next=p->next;

}

tail=p;

p=p->next;

}

if(p->Szdl==Szdl){ /*成绩相同时无需比较*/

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Sjjg

p->Szdl

p->Jsj);

tail->next=NULL;

}

}

p=head; /*将链表赋给结构体指针*/

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Szdl

p->Jsj);/*浏览排序后的信息*/

printf("按数字电路成绩排序后输出如上(注:此过程不保存至文件):\n"); return;

}

/*按计算机组成原理排序*/

void SortJsj(struct students * head)

{

struct students *p

*tail; /*定义中间变量*/

int n;

double Jsj;

p=(struct students *)malloc(sizeof(struct students));

head=create(head

&n);

printf("姓名 学号 性别 英语 Java 数据结构 数字电路 计算机\n"); while(head->next!=NULL) /*利用选择法排序*/

{

tail=NULL;

p=head;

Jsj=p->Jsj; /*将链表中第一个成绩赋给Jsj*/

while(p!=NULL)

{

if((p->Jsj)>Jsj)/*比较*/

Jsj=p->Jsj;

tail=p;

p=p->next;

}

tail=NULL;

p=head;

while(p->next!=NULL)

{

if(p->Jsj==Jsj){

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Sjjg

p->Szdl

if(p==head)

head=head->next;

else

tail->next=p->next;

}

tail=p;

p=p->next;

}

if(p->Jsj==Jsj){ /*成绩相同时无需比较*/

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Sjjg

p->Szdl

p->Jsj);

tail->next=NULL;

}

}

p=head; /*将链表赋给结构体指针*/

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Sjjg

p->Szdl

p->Jsj);/*浏览排序后的信息*/

printf("按计算机组成原理成绩排序后输出如上(注:此过程不保存至文件):\n"); return;

}

/*按学号删除学生成绩信息*/

struct students * Delete(struct students * head

char m[15])

{

struct students *ptr1

*ptr2;

printf("\n所有学生信息如下:\n");

Browse(head);

printf("\n请输入想要删除的学生学号:");

scanf("%s"

m);

head=create(head

&n);

if(head==NULL){

printf("无学生信息!\n");

return head;

}

if((strcmp(head->Num

m)==0)&&head!=NULL)

{

ptr2=head;

head=head->next;

free(ptr2);

}

if(strcmp(head->Num

m)!=0){

ptr1=head;

ptr2=head->next;

while(ptr2!=NULL){

if(strcmp(ptr2->Num

m)==0){

ptr1->next=ptr2->next;

free(ptr2);

}

else

ptr1=ptr2;

ptr2=ptr1->next;

}

}

fprint_(head);

printf("\n学号为' %s '学生信息已被删除

并保存至文件!\n"

m);

return head;

}

/*修改学生信息(按编号修改)*/

struct students * Revise()

{

t;

char num[10];

char Num[10]; /*字符型学生学号*/

char Name[20]; /*字符型学生姓名*/

char Sex[3]; /*字符型学生性别*/

double English; /*双精度实型英语成绩*/

double Java; /*双精度实型Java成绩*/

double Sjjg; /*双精度实数据结构*/

double Szdl; /*双精度实型数字电路*/

double Jsj; /*计算机组成原理*/

struct students *head=NULL;

struct students *p;

printf("\n所有学生信息如下:\n");

Browse(head);

head=create(head

&n);

printf("\n输入需要修改的学生的学号:");

scanf("%s"

num);

p=head;

while(head!=NULL)

{

if(strcmp(p->Num

num)==0)

{

system("cls");

Revisemenu();

printf("编号为%s的学生信息如下:\n"

num);

printf("姓名 学号 性别 英语 Java 数据结构 数字电路 计算机\n");

printf("%s\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n"

p->Name

p->Num

p->Sex

p->English

p->Java

p->Sjjg

p->Szdl

p->Jsj);

while(1){

本文来源:https://www.bwwdw.com/article/dxei.html

Top