/*
@copyright from LZY.
@time:23.11.2016.
@name:学生信息管理系统
@界面:DOS.
@版本:2.0
*/
#include<stdio.h>
#include<stdlib.h>
#include<process.h>
#include<string.h>
#include<conio.h>
#define N 10
typedef struct student
{
char name[8];
unsigned No;
float math,Chinese,English;
float ave;
struct student *next;/*保存下一个stu的地址*/
}NODE,*linklist;
void zhu();
void scan(int a[],int n)
{
int i;
printf("\n请输入%d个人成绩\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
}
/*****************************************************************************/
void sort(int a[],int n, char style)
{
int i,j,t;
if(style=='a')
{
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
{if(a[j]>a[j+1])
{t=a[j];a[j]=a[j+1];a[j+1]=t;}
}
printf("按照升序排列的结果:\n");
for(i=0;i<n;i++)
printf("%d\t",a[i]);
printf("\n");
}
if(style=='d')
{
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
{
if(a[j+1]>a[j])
{ t=a[j];a[j]=a[j+1];a[j+1]=t;}
}
printf("按照降序排列的结果:\n");
for(i=0;i<n;i++)
printf("%d\t",a[i]);
printf("\n");
}
}
/*****************************************************************************/
void scan_1(int a[],int n)
{
int i;
printf("定义一个数组stu[10]存放10个学生的成绩,从键盘输入数据\n ");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
}
/*****************************************************************************/
void sort_stu (int a[],int n)
{
int i,j,t;
printf("\n将成绩数组按照从高到低进行排序\n");
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if(a[j+1]>a[j])
{t=a[j+1];a[j+1]=a[j];a[j]=t;}
}
/*****************************************************************************/
void print_stu(int a[],int n)
{
int i;
printf("\n将数组stu[10]的内容输出到屏幕上\n");
for(i=0;i<n;i++)
printf("%d\t",a[i]);
printf("\n");
}
/*****************************************************************************/
void scan_str(char str[])
{
int i=0;
printf("输入字符串‘student score’ ,复制该字符串并输出\n");
fflush(stdin);
gets( str);
printf("输出该字符串\n");
printf("%s",str);
printf("\n");
}
/*****************************************************************************/
void scan_con(struct student *p,int n)
{
int i;
printf("格式:姓名,学号,成绩(数学,语文,英语)\n\n");
for(i=0;i<n;i++,p++)
{
printf("请输入第%d个学生数据\n",i+1);
scanf("%s%d%f%f%f",(*p).name,&(*p).No,&(*p).math,&(*p).Chinese,&(*p).English);
}
}
/*****************************************************************************/
int Max1(struct student *p)
{
int i,a;
float max1=p->math;
for(i=0;i<10;i++){
if((p+i)->math>max1){ max1=(p+i)->math; a=i; }}
return a;
}
int Max2(struct student *p){
int i,b;
float max2=p->Chinese;
for(i=0;i<10;i++){
if((p+i)->Chinese>max2) {max2=(p+i)->Chinese; b=i;}}
return b;
}
int Max3(struct student *p){
int i,c;
float max3=p->English;
for(i=0;i<10;i++){
if((p+i)->English>max3) {max3=(p+i)->English; c=i;}}
return c;
}
/*****************************************************************************/
void print_con(struct student *p)
{
int m=0,c=0,e=0;
m=Max1(p);
c=Max2(p);
e=Max3(p);
printf("\n\n输出单门课成绩最高的学生的学号、姓名、以及该门课程的成绩\n");
printf("max math:");
printf("%s\t%d\t%.2f\n",(p+m)->name,(p+m)->No,(p+m)->math);
printf("max Chinese:");
printf("%s\t%d\t%.2f\n",(p+c)->name,(p+c)->No,(p+c)->Chinese);
printf("max English:");
printf("%s\t%d\t%.2f\n",(p+e)->name,(p+e)->No,(p+e)->English);
}
/******************************************************************************/
void print_aver(struct student *p,int n)
{
int i,e=0;
float max;
for(i=0;i<n;i++){
p[i].ave=(p+i)->math+(p+i)->Chinese+(p+i)->English;
}
for(i=0;i<n;i++){
p[i].ave=(1.0/3.0)*p[i].ave;
}
max=p[0].ave;
for(i=0;i<n;i++){
if(p[i].ave>max) {max=p[i].ave; e=i;}
}
printf("\n输出三门课程的平均分数最高的学生的学号、姓名及其平均分\n");
printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",(p+e)->No,(p+e)->name,(p+e)->math,(p+e)->Chinese,(p+e)->English,(p+e)->ave);
}
/*****************************************************************************/
void sort_aver(struct student *p,int n)
{
int i,j;
struct student t;
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
{
if(p[j+1].ave>p[j].ave){
t=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=t;
}
}
printf("\n将10个学生按照平均分数从高到低进行排序\n");
printf("number\t\tname\tmath\tChinese\tEnglish\tave\n") ;
for(i=0;i<n;i++)
printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",(p+i)->No,(p+i)->name,(p+i)->math,(p+i)->Chinese,(p+i)->English,(p+i)->ave);
}
/*****************************************************************************/
void scan_con_1(FILE *fp,struct student *p,int n)
{
int i;
for(i=0;i<n;i++,p++)
{
fprintf(stdout,"请输入第%d个学生数据(姓名,学号,成绩(数学,语文,英语))\n",i+1);
fscanf(stdin,"%s%d%f%f%f",(*p).name,&(*p).No,&(*p).math,&(*p).Chinese,&(*p).English);
}
}
/*****************************************************************************/
void print_con_1(FILE *fp,struct student *p)
{
int m=0,c=0,e=0;
m=Max1(p);
c=Max2(p);
e=Max3(p);
fprintf(stdout,"\n\n输出单门课成绩最高的学生的学号、姓名、以及该门课程的成绩\n");
fprintf(stdout,"max math:");
fprintf(stdout,"%s\t%d\t%.2f\n",(p+m)->name,(p+m)->No,(p+m)->math);
fprintf(stdout,"max Chinese:");
fprintf(stdout,"%s\t%d\t%.2f\n",(p+c)->name,(p+c)->No,(p+c)->Chinese);
fprintf(stdout,"max English:");
fprintf(stdout,"%s\t%d\t%.2f\n",(p+e)->name,(p+e)->No,(p+e)->English);
}
/*****************************************************************************/
void print_aver1(FILE *fp,struct student *p,int n)
{
int i,e=0;
for(i=0;i<n;i++){
p[i].ave=(p+i)->math+(p+i)->Chinese+(p+i)->English;
}
for(i=0;i<n;i++){
p[i].ave=(1.0/3.0)*p[i].ave;
}
for(i=0;i<n;i++){
if(p[i].ave>p[0].ave) e=i;}
fprintf(stdout,"\n输出三门课程的平均分数最高的学生的学号、姓名及其平均分\n");
fprintf(stdout,"%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",(p+e)->No,(p+e)->name,(p+e)->math,(p+e)->Chinese,(p+e)->English,(p+e)->ave);
}
/*****************************************************************************/
void print_aver_con(FILE *fp,struct student *p,int n)
{
int i,j,e=0;
float t=0;
for(i=0;i<n;i++){
p[i].ave=(p+i)->math+(p+i)->Chinese+(p+i)->English;
}
for(i=0;i<n;i++){
p[i].ave=(1.0/3.0)*p[i].ave;
}
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
{
if(p[j+1].ave>p[j].ave){
t=p[j].ave;p[j].ave=p[j+1].ave;p[j+1].ave=t;
}
}
fprintf(stdout,"\n将10个学生按照平均分数从高到低进行排序\n");
fprintf(stdout,"number\t\tname\tmath\tChinese\tEnglish\tave\n") ;
for(i=0;i<n;i++)
fprintf(stdout,"%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",(p+i)->No,(p+i)->name,(p+i)->math,(p+i)->Chinese,(p+i)->English,(p+i)->ave);
}
/*****************************************************************************/
void print_aver_con2(FILE *fp,struct student *p )
{
int i;
fprintf(stdout,"\n从studsort.dat 文件中读取第2,4,6,8,10个学生的数据。\n");
for(i=2;i<=10;i=i+2)
{
fprintf(stdout,"%d\t%s\t%.2f\t%.2f\t%.2f",(p+i-1)->No,(p+i-1)->name,(p+i-1)->math,(p+i-1)->Chinese,(p+i-1)->English);
fprintf(stdout,"\n");
}
}
/******************************************************************************/
/*struct stu *h;===>NoDE *h or linklist h;等价;定义一个单链表*/
linklist create(int n)
{
linklist h,f,p;
int i;
h=(linklist) malloc(sizeof(NODE));/*申请空间*/
f=p=h;
printf("请输入姓名,学号以及三门课成绩\n");
scanf("%s%d%f%f%f",(*p).name,&(*p).No,&(*p).math,&(*p).Chinese,&(*p).English);
for(i=1;i<n;i++)
{ f=p;
p=(linklist) malloc(sizeof(NODE));/*申请空间*/
scanf("%s%d%f%f%f",(*p).name,&(*p).No,&(*p).math,&(*p).Chinese,&(*p).English);
f->next=p;
}
p->next=NULL;
return(h);
}
/*****************************************************************************/
void pt(linklist h)
{
linklist p=h;
printf("\n输出的结果是:\n");
while(p!=NULL)
{
printf("%s\t%d\t%.2f\t%.2f\t%.2f\n",p->name,p->No,p->math,p->Chinese,p->English);
p=p->next;
}
}
/*****************************************************************************/
linklist del_xh(linklist h,int num)
{
linklist current_node=h;
linklist previous=0;
while(current_node!=0&&(current_node->No!=num))
{
previous=current_node;
current_node=current_node->next;
}
if(current_node!=0&&previous==0)
{
h=current_node->next;
delete current_node;
printf("学号:%d成功删除 \n",num);
}
else if(current_node!=0&&previous!=0)
{
previous->next=current_node->next;
delete current_node;
printf("学号:%d成功删除 \n",num);
}
else
printf("对不起,链表中没有这个人员的信息 \n");
return (h);
}
/*****************************************************************************/
linklist del_xm(linklist h,char str[])
{
linklist current_node=h;
linklist previous=0;
while(current_node!=0&&strcmp(current_node->name,str)!=0)
{
previous=current_node;
current_node=current_node->next;
}
if(current_node!=0&&previous==0)
{
h=current_node->next;
delete current_node;
printf("姓名:%s成功删除 \n",str);
}
else if(current_node!=0&&previous!=0)
{
previous->next=current_node->next;
delete current_node;
printf("姓名:%s成功删除 \n",str);
}
else
printf("对不起,链表中没有这个人员的信息 \n");
return (h);
}
/*************************链表的插入*****************************************/
linklist insert(linklist head,linklist stud)
{
linklist p1,p2,p3;
p1=head;
p2=stud;
while( (p2->No>p1->No)&&(p1->next!=NULL))
{
p3=p1;
p1=p1->next;}
if(p2->No<=p1->No)
{
if(head==p1) head=p2;
else p3->next=p2;
p2->next=p1; }
else
{ p1->next=p2;p2->next=NULL;}
return(head);
}
/*****************************************************************************/
void case1(){
char style;
int stu[N]={0};
/* n个学生成绩从高到低排名 */
printf("please input a(升序) or d(降序)\t");
scanf(" %c",&style);
scan( stu,N);
sort(stu,N, style);
printf("按任意键返回主菜单:\n");
getch();
system("cls");
zhu();
}
/*****************************************************************************/
void case2(){
char stu_score[20]={0};
int stu[N];
/* 定义一个数组stu[10]存放10个学生的成绩,从键盘输入数据 */
scan_1(stu,N);
/* 将数组stu[10]的内容输出到屏幕上 */
print_stu(stu,N);
/* 将成绩数组按照从高到低进行排序 */
sort_stu(stu,N);
/* 将数组stu[10]的内容输出到屏幕上(排序后) */
print_stu(stu,N);
/* 输入字符串"student score ",复制该字符串并输出 */
scan_str(stu_score);
printf("\n");
printf("按任意键返回主菜单:\n");
getch();
system("cls");
zhu();
}
/*****************************************************************************/
void case3(){
struct student s[N];
float a[N]={0};
/* 从键盘输入10个学生的以上内容 */
scan_con(s,N) ;
/* 输出单门课成绩最高的学生的学号、姓名、以及该门课程的成绩 */
print_con(s);
/* 输出三门课程的平均分数最高的学生的学号、姓名及其平均分 */
print_aver(s,N);
/* 将10个学生按照平均分数从高到低进行排序 */
sort_aver(s,N);
printf("\n");
printf("按任意键返回主菜单:\n");
getch();
system("cls");
zhu();
}
/*****************************************************************************/
void case4(){
struct student s[N];
FILE *fp;
/* 从键盘输入10个学生的以上内容,存入文件stud.dat,关闭文件 */
if((fp=fopen("stud.dat","w"))==NULL){
printf("FILE OPEN ERROR!\n");
exit(0);
}
scan_con_1(fp,s,N);
/* 打开stud.dat文件,将数据读出,查看是否正确写入,关闭文件。 */
print_con_1(fp,s);
fclose(fp);
/*打开文件stud.dat文件,读出数据,将10个学生按照平均分数从高到低进行排序,
分别将结果输出到屏幕上和另一文件studsort.dat中。 */
if((fp=fopen("stud.dat","r"))==NULL){
printf("FILE OPEN ERROR!\n");
exit(0);
}
print_aver_con(fp,s,N);
fclose(fp);
print_aver_con2(fp,s);
printf("\n");
printf("按任意键返回主菜单:\n");
getch();
system("cls");
zhu();
}
/*****************************************************************************/
void case5(){
int s,m,j,i=0;
char k[8];
linklist l,h,p;
NODE stu;
printf("请输入学生人数\n");
scanf("%d",&m);
l=create(m);
pt(l);
printf("请根据学号或姓名修改数据:\n1.学号\t2.姓名\n");
printf("你的选择:\t");
scanf("%d",&j);
if(j>=1&&j<=2){
switch(j){
case 1:{
printf("\n请输入要删除的学号\t");
scanf("%d",&s);
printf("\n");
h=del_xh(l,s);
pt(h);
printf("\n");
}break;
case 2:{
printf("\n请输入要删除的姓名\t");
scanf("%s",k);
printf("\n");
h=del_xm(l,k);
pt(h);
printf("\n");}break;
}
}
p=h;
while(p!=NULL)
{
i++;
p=p->next;
}
if(i<m){
printf("请输入新的数据:\t\n");
printf("格式:姓名,学号,成绩\n");
scanf("%s%d%f%f%f",&stu.name,&stu.No,&stu.math,&stu.Chinese,&stu.English);
h=insert(h,&stu);
pt(h);
}
printf("按任意键返回主菜单:\n");
getch();
system("cls");
zhu();
}
/*****************************************************************************/
void case6()
{
printf("\n\n\n\t****************************************************************\n");
printf("\t\tcopyright from liangZY\n");
printf("\t\t学号:15115011040 班级:计科一班\n");
printf("\t****************************************************************\n");
printf("按任意键返回主菜单:\n");
getch();
system("cls");
zhu();
}
/*****************************************************************************/
int main()
{
int j;
printf("\n\n\n\t=======================================================\n");
printf("\t=======================================================\n");
printf("\t**************欢迎进入学生管理系统*********************\n");
printf("\t=======================================================\n");
printf("\t=======================================================\n\n\n");
char f[]="888888";
printf("请输入密码并以回车键结束:");
scanf("%s",f);
if(strcmp(f,"15115011040")==0)
{
system("cls");
zhu();//密码正确时进入系统
}
else
j=1;
printf("密码错误!请重新选择按键!\n");
printf("请输入第2次\t");
scanf("%s",f);
while(strcmp(f,"149074303")!=0&&j<=4) {
printf("密码错误!请重新选择按键!\n");
printf("请输入第%d次\t",j+2); scanf("%s",f); j++;
}
if(j>4) {printf("输错次数大于6次\n"); getch(); exit(0);}
system("cls");
zhu();//密码正确时进入系统
return 0;
}
/*****************************************************************************/
void zhu(){
int i;
while(1){
printf("\t****************************************************************\n");
printf("\t\t1: 根据条件进行学生成绩排名\n\t\t2:用指针优化学生成绩排名\n\t\t3:学生成绩单制作\n\t\t");
printf("4:学生成绩文件管理\n\t\t5:修改学生信息(链表)\n\t\t6: 查看版本信息\n\t\t7: 离开\n");
printf("\t****************************************************************\n\n");
printf("\t\t请选择:\t");
scanf("%d",&i);
switch(i)
{
case 1: system("cls");case1();break;
case 2: system("cls");case2();break;
case 3: system("cls");case3();break;
case 4: system("cls");case4();break;
case 5: system("cls");case5();break;
case 6: system("cls");case6();break;
case 7: exit(0);break;
default:
{system("cls");
printf("\n输入错误,请重新输入\n");
printf("按任意键返回主菜单:\n");
getch();
system("cls");
zhu();
}
}
}
}
/*****************************************************************************/
学生信息管理系统2.0
最新推荐文章于 2024-03-30 10:48:44 发布