C语言实训 管理系统

学生信息管理系统 链表和数组

老师给分贼水 多数人抄祖传下来代码
话不多说 上代码

**数组存储形式 **
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#define M 8
using namespace std;

//*******************************************************
struct Student{
	char num[20];
	char name[20];
	char major[20];
	char clas[20];
	int score[3];
};

int N;
typedef struct Student STU;

//*******************************************************
void Input(STU *p,int &i);
void Output(STU *p);
void Save(STU *p);
int Fetch(STU *p);
void Max(STU[],int m);
double average_person(STU *p);
void Sort_select(STU *P);
void Sort_buble(STU *p);
void Sort_insert(STU *p);
void Search(STU *p);
void Ask();
void PrintMenu();

//*******************************************************
int main(){
	int choice;
	int m,n,i,j;
	STU stu[N];
	char filename[10];
	STU *p;
	p=stu;
    while(1){
	PrintMenu();
	scanf("%d",&choice);
	switch(choice){
		case 1:{
		    printf("请输入即将录入信息的学生数\n");
            scanf("%d",&N);
            for(int i=0;i<N;i++){
				Input(stu+i,i);
			}
			break;
        }
		case 3:{
			getchar();
			Save(stu);
			printf("文件保存成功!\n");
			Ask();
			break;
		}
		case 2:{
			printf("请输入想查看第几个学生的信息:\n");
			scanf("%d",&n);
			if(i>=0&&n<N){
				Output(stu+n-1);
			}
			else{
				printf("输入错误,查无此人\n");
			}
			Ask();
			break;
		}
		case 4:{
			if(Fetch(stu)==0){
				printf("提取失败\n");
				}
			Ask();
			break;
		}
		case 5:{
			printf("请输入想查哪门科目的最高分\n");
			scanf("%d",&m);
			Max(stu,m);
			Ask();
			break;
		}
		case 6:{
                printf("对某个专业的学生,按平均成绩由低到高选择排序为:\n");
				Sort_select(stu);
				Ask();
				break;
			}
        case 7:{
		    printf("对某个班级的学生,按平均成绩由高到低起泡排名为:\n");
			Sort_buble(stu);
			Ask();
			break;
		}
		case 8:{
		    printf("对某个班级的学生,按某门课程成绩由低到高进行直接插入排序:\n");
			Sort_insert(stu);
			Ask();
			break;
		}
		case 9:{
		    printf("输入班级及某个分数,查找同学");
			getchar();
			Search(stu);
			Ask();
			break;
		}
		default:{
			printf("请正确输入0~9之间的数字!\n");
            break;
				}
		}//while
    }return 0;
}
//main
//***********************************************************

//输入函数:学号、姓名、专业、班级、三科成绩、总成绩
void Input(STU *p,int &i){
        int j;
        printf("请输入第%d个学生的全部信息\n",i+1);
		printf("请输入学生学号,回车结束\n");
		scanf("%s",&p->num);
		getchar();
		printf("请输入学生姓名,回车结束\n");
		gets(p->name);
		printf("请输入学生专业,回车结束\n");
		gets(p->major);
		printf("请输入学生班级,回车结束\n");
		scanf("%s",&p->clas);
		getchar();
		for(j=0;j<3;j++){
            printf("请输入第%d门成绩,回车结束\n",j);
            scanf("%d",&p->score[j]);

        }
        getchar();
	}

//输出函数
void Output(STU *p){
        printf("\n学号   名字     专业   班级     高数    日语    C语言");
		printf("\n%s\t%s\t%s\t%s\t%d\t%d\t%d\t",p->num,p->name,p->major,p->clas,p->score[0],p->score[1],p->score[2]);
}

//保存函数、将数据存入文件
void Save(STU *p)
{
	FILE *fp;
	char filename[20];
	int i;
	printf("请输入要保存的文件名称:\n");
	gets(filename);
	if((fp=fopen("C:\\Users\\余悸\\Desktop\\student_list.txt","w+"))==NULL)
	{
		printf("新建文件失败,请重试:\n");
		return;
	}
	for(i=0;i<N;i++)
	{
		//if(fwrite(p++,sizeof(STU),1,fp)!=1)
		fprintf(fp,"学号   名字     专业   班级     高数    日语    C语言\n");
		fprintf(fp,"%s\t%s\t%s\t%s\t%d\t%d\t%d\t",(p+i)->num,(p+i)->name,(p+i)->major,(p+i)->clas,(p+i)->score[0],(p+i)->score[1],(p+i)->score[2]);
			//printf("文件写入失败,请重试!\n");
	}
	fclose(fp);
}

//阅读函数、读取文件中学生的信息
int Fetch(STU *p)
{
	FILE *fp;
	int i=0;
	if ((fp = fopen("C:\\Users\\余悸\\Desktop\\student_list.txt","rb")) == NULL)
	{
	    //printf("1");
		fclose(fp);
		return 0;
	}
	//fseek(fp,(long)(sizeof(STU)),0);
	//rand()%N;
	fseek(fp, sizeof(Student) * 1, SEEK_SET);
	Student* student = new Student();
    fread(student,sizeof(STU),1,fp);
    printf("已读取到第%d个学生的信息\n",i+1);
    printf("学号   名字     专业   班级     高数    日语    C语言\n");
    printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\t",(p+i)->num,(p+i)->name,(p+i)->major,(p+i)->clas,(p+i)->score[0],(p+i)->score[1],(p+i)->score[2]);
	fclose(fp);
	return 1;
}

//选择排序函数、对某个专业的学生,按总平均成绩由低到高进行选择排序
void Sort_select(STU *p){
	int i,j,k;
	double t,aver[N];
	STU a;
	char b[10];
	getchar();//吸收回车字符
	printf("请输入你要查看成绩的专业:\n");
	gets(b);
	for(i=0;i<N;i++)
	{
		aver[i]=average_person(p+i);
	}
	for(i=0;i<N-1;i++)
	{
		k=i;
		for(j=i+1;j<N;j++)
			if(aver[k]>aver[j])
				k=j;
		        t=aver[i];
		        aver[i]=aver[k];//交换平均值
	        	aver[k]=t;
				a=*(p+i);
				*(p+i)=*(p+k);
				*(p+k)=a;//交换指针的引用
				}
	for(i=0;i<N;i++){
		if(!strcmp((p+i)->major,b)){
			printf("专业: %s\t班级: %s\t姓名: %s\t平均成绩: %5.3f\n",(p+i)->major,(p+i)->clas,(p+i)->name,aver[i]);}
	}
}

//冒泡排序函数、对某个班级的学生,按总平均成绩由高到低进行起泡排序
void Sort_buble(STU *p)
{
	int i,j;
	double t, aver[N];
	char b[20];
	STU a;
	printf("选择一个班级:\n");
	scanf("%s",b);
	for(i = 0;i < N;i++)
	{
		aver[i] = average_person(p+i);
	}
	for(i = 0;i < N;i++){
        for(j = 0;j < N-1-i;j++){
            if(aver[j]<aver[j+1])
            {
			t = aver[j];
			aver[j] = aver[j+1];
			aver[j+1] = t;
			a = *(p+j);
			*(p+j) = *(p+j+1);
			*(p+j+1) = a;
            }
        }
	}
	printf("%s班平均分从高到低为\n",b);
    for(i = 0;i < N;i++){
        if(!strcmp((p+i)->clas,b)){
            printf("姓名:%s\t平均分=%5.3f\n",(p+i)->name,aver[i]);
        }
    }

}
//插入排序函数、对某个班级的学生,按某门课程成绩由低到高进行直接插入排序
void Sort_insert(STU *p)
{
	int i, j, id, temp;
	int grade[N];
	char b[20];
	int k = 0;
	STU *m;
	m = p;
	printf("请输入你想查看成绩的班级:\n");
	scanf("%s",&b);
	printf("请输入你想查看成绩的课程:\n");
	scanf("%d", &id);
	if(id<0||id>2){
        printf("请输入正确的科目!\n");
        return;
	}
	getchar();
	for (i = 0;i < N;i++,p++){
		if(!strcmp((p+i)->clas,b)){
			grade[k] = p->score[id];
			k++;
		}
	}
	for (i = 1;i < k;i++)
		if(grade[i]<grade[i-1])
		{
			temp = grade[i];
			j = i-1;

			do{
				grade[j+1] = grade[j];
				j--;
				}
				while (j >= 0&&temp < grade[j]);
			grade[j+1] = temp;
		}
        printf("对该班级的学生,按课程成绩由低到高进行插入排序为:\n");
		for(i = 0;i < k; i++){
			p = m;
			for (j = 0; j < N;j++,p++){
				if((!strcmp(p->clas,b))&&(p->score[id]==grade[i])){
					printf("专业: %s\t班级: %s\t姓名: %s\t该门课程的分数为: %5.3f\n",(p)->major,(p)->clas,(p)->name,p->score[id]);
					printf("\n");
				}
			}
    }
}

//搜索函数、实现班级和成绩的综合查找
void Search(STU *m){
	STU *p;
	int j,sum_scores;
	int limit_score;
	int op;
	char a[20];
	j=0;
	printf("请输入学生班级:\n");
	scanf("%s",&a);
	getchar();
	printf("请输入查找选项1.低于某分数 2.高于某分数\n");
	scanf("%d",&op);
	if(op==2){
        printf("请问您想要查询总分再多少以上学生?\n");
        scanf("%d",&limit_score);
        printf("您查询的学生信息为:\n");
        for(p=m;p<m+N;p++){
            sum_scores=(p->score[0])+(p->score[1])+(p->score[2]);
            if(!strcmp((p->clas),a)){
                if(sum_scores>=limit_score){
				Output(p);
				printf("\n");
				j++;
			}
			else{
                printf("该班无超过%d的学生!\n",limit_score);
			}
		}
		if(j==0){
			printf("您查找的班级不存在!");
            }
		}
	}
	else if(op==1){
        printf("请问您想要查询总分在多少以下学生?\n");
        scanf("%d",&limit_score);
        printf("您查询的学生信息为:\n");
        for(p=m;p<m+N;p++){
            sum_scores=(p->score[0])+(p->score[1])+(p->score[2]);
            if(!strcmp((p->clas),a)){
                if(sum_scores<=limit_score){
				Output(p);
				printf("\n");
				j++;
			}
			else{
                printf("该班无低于%d的学生!\n",limit_score);
			}
		}
		if(j==0){
			printf("您查找的班级不存在!");
            }
		}
	}
		else{
            printf("请输入正确的数字功能!\n");
		}
}//Search

//求所有学生某门课程的最高分和分数最高的学生的姓名
void Max(STU *stu,int grade_m)
{
    STU *p;
    p=stu;
    if(grade_m<0||grade_m>2){
        printf("请输入正确的科目!\n");
        return;
        }
    int max1=0;
    for(int i=0;i<N;i++){
        if((p+i)->score[grade_m]>max1){
            max1=(p)->score[grade_m];
        }
    }
    for(int i=0;i<N;i++){
        if(max1==(p+i)->score[grade_m]){
            printf("第%d科的最高分的人是 %s\n",grade_m,(p+i)->name);
            printf("他的第%d科的分数是 %d",grade_m,(p+i)->score[grade_m]);
            printf("\n");
        }
    }
    return ;
}

//询问函数
void Ask()
{
	int c;
	printf("\n您所需要的功能已经实现,是否继续进行?若退出请输入0\n");
	scanf("%d",&c);
	if(c==0)
		exit(0);
}

//计算平均分函数
double average_person(STU *p)
{
	return (((p->score[0])+(p->score[1])+(p->score[2]))/3.0);
}

void PrintMenu(){
    printf( "***********************功能菜单***************************************\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( "9.实现班级和成绩的综合查找\n" ) ;
    printf( "0.结束程序\n" ) ;
    printf( "***********************************************************************\n") ;
    printf("\n");
    printf("请输入选择的功能\n");
}

链表存储形式
在这里插入图片描述

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>

using namespace std;

int n ;

struct Student{
    char num[20];
	char name[20];
	char major[20];
	char clas[20];
	float score[3];
	Student *next;
	//Student *pre;
};

typedef Student Node;

void CreateList(int n);//创建链表 输入学生的信息
void OutPut(Node *p);//输出所有或一个学生的信息
void Save(Node *h);  //保存所有学生信息到文件
int  Fetch(Node *h);//随机读取某个学生的信息
void Search_num( Node *h, char *stu_id ) ; // 查找指定学号的学生,返回该学生的指针
void InsertList( Node *h, char *id); // 添加一个学生信息到链表中,保持有序性
void Delete_num( Node *h, char *stu_id ) ; // 删除指定学号的学生
void Search_Major_SubjectScore(Node *h, char* stu_profes , int score_id , int stu_score ) ; // 查找某个专业某门课程小于某个分数的学生
void Delete_Major_Subject(     Node *h, char* stu_profes , int score_id , int stu_score ) ; // 删除某个专业某门课程小于某个分数的学生
void PrintMenu();//打印菜单

void CreateList(Node *h,int n){
    for(int i=0;i<n;i++){
        Student *s = new(Student);
        printf("请输入第%d个学生的全部信息\n",i+1);
        printf("请输入该生的学号 姓名 专业 班级\n");
        scanf( "%s%s%s%s", &s->num, s->name, s->major, s->clas ) ;
        printf("请输入该学生的高数 日语 C语言的成绩\n");
        scanf( "%f%f%f", &s->score[0], &s->score[1], &s->score[2] ) ;
        s->next = h->next; // s接到第一个节点前面
        h->next = s ;       // s变成第一个
    }
}

void OutPut(Node *p){
        printf("学号   名字     专业   班级     高数    日语    C语言");
		printf("\n%s\t%s\t%s\t%s\t%.2f\t%.2f\t%.2f\n",p->num,p->name,p->major,p->clas,p->score[0],p->score[1],p->score[2]);
}

void Save(Node *h){
    FILE *fp;
	char filename[20];
	int i;
	printf("请输入要保存的文件名称:\n");
	gets(filename);
	if((fp=fopen("C:\\Users\\余悸\\Desktop\\student_list.txt","w+"))==NULL)
	{
		printf("新建文件失败,请重试:\n");
		return;
	}
	 Node *p=h;
     p=p->next;
     while(p!=NULL){
        fprintf(fp,"学号   名字     专业   班级     高数    日语    C语言\n");
        fprintf(fp,"%s\t%s\t%s\t%s\t%.2f\t%.2f\t%.2f\t",p->num,p->name,p->major,p->clas,p->score[0],p->score[1],p->score[2]);
        p = p->next;
    }

	fclose(fp);
}

int Fetch(Node *p){
    FILE *fp;
	int i=0;
	if ((fp = fopen("C:\\Users\\余悸\\Desktop\\student_list.txt","rb")) == NULL)
	{
		fclose(fp);
		return 0;
	}
	i = rand()%n;
	fseek(fp, sizeof(Student) * i, SEEK_SET);
	Student* student = new (Student);
    fread(student,sizeof(Node),1,fp);
    printf("已读取到第%d个学生的信息\n",i+1);
    printf("学号   名字     专业   班级     高数    日语    C语言\n");
    printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\t",student->num,student->name,student->major,student->clas,student->score[0],student->score[1],student->score[2]);
	fclose(fp);
	return 1;
}

void Search_num( Node *h,char *stu_id ) {
    Node *p = h;
    p=p->next;;
    while(p!=NULL){
        if(!(strcmp(p->num,stu_id))){
            printf("该学生的信息为\n");
            OutPut(p);
            return ;
        }
        p=p->next;
    }
    printf("查无此人 可能退学了\n");
    return ;
}

void InsertList(Node *h,char *id){
    Node *p=h,*pre=h;
    p=p->next;
    Student *s = new(Student);
    strcpy(s->num,id);
    printf("请输入新插入学生的全部信息\n");
    printf("请输入该生的姓名 专业 班级\n");
    scanf( "%s%s%s", s->name, s->major, s->clas ) ;
    printf("请输入该学生的高数 日语 C语言的成绩\n");
    scanf( "%f%f%f", &s->score[0], &s->score[1], &s->score[2] ) ;
    while(p!=NULL){
        if(strcmp(p->num,id)>0){
            s->next = pre->next;
            pre->next = s;
            s->next = p;
            return ;
        }
        else{
            pre=p;
            p=p->next;
        }
    }
    s->next = h->next;
    h->next = s;
    return ;
}

void Delete_num( Node *h,char *stu_id ){
    Node *p = h,*pre = h;
    p=p->next;
    while(p!=NULL){
        if(!(strcmp(p->num,stu_id))){
            pre->next = p->next;
            delete(p);
            printf("已成功删除该学生的信息\n");
            return;
        }
        pre = p;
        p = p->next;
    }
    printf("没有此学号的学生,可能已经被删除了!\n");
    return;
}

void Search_Major_SubjectScore(Node *h,char *major,int clas_i,int score_d){
    Node *p = h;
    p = p->next;
     while(p!=NULL){
        if(!(strcmp(p->major,major))){
                if(p->score[clas_i]<score_d){
                    printf("%s专业第%d门课程小于%d分的学生的信息为\n",major,clas_i,score_d);
                    OutPut(p);
                    return ;
                }
        }
        p=p->next;
    }
    printf("查无此人 可能退学了\n");
    return ;
}

void Delete_Major_Subject(Node *h, char* stu_profes , int score_id , int stu_score ){
    Node *p = h,*pre = h;
    p=p->next;
    while(p!=NULL){
        if(!(strcmp(p->num,stu_profes))){
                if(p->score[score_id]<stu_score){
                    pre->next = p->next;
                    delete(p);
                    printf("已成功删除该学生的信息\n");
                    return;
                }
        }
        pre = p;
        p = p->next;
    }
    printf("没有此学号的学生,可能已经被删除了!\n");
    return;
}

void PrintMenu(){
    printf( "***********************功能菜单***************************************\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( "9.删除某个专业某门课程小于某个分数的学生\n" );
    printf( "0.结束程序\n");
    printf( "***********************************************************************\n") ;
    printf("\n");
}

int main(){
    int op;
    Node *h;
    h = new (Student);// 初始化链表h
    h->next = NULL ;
    while( 1 ) {
        PrintMenu() ;
        printf( "请输入选择功能:" ) ;
        scanf( "%d", &op ) ;
        if (op == 1) {
            printf( "请输入学生个数:" ) ;
            scanf( "%d", &n );
            CreateList( h,n );
        }
        else if (op == 2) {
            int op2;
            printf("请选择输出功能:\n");
            printf("1.输出全部学生的信息。\n");
            printf("2.输出某个学生的信息。\n");
            scanf("%d",&op2);
            if(op2 == 1){
                Node *p=h;
                p=p->next;
                while(p!=NULL){
                    OutPut(p);
                    p = p->next;
                }

            }
            else if( op2 == 2){
                int n;
                Node *p=h;
                printf("请输入查看学生的顺序\n");
                scanf("%d",&n);
                p=p->next;
                for(int i=0;i<n;i++){
                    p = p->next;
                }
                OutPut(p);
            }
            else{
                printf("请输入正确的数字!\n");
            }
        }
        else if (op == 3) {
            Save(h);
            printf( "成功保存到文件“student_list.txt”中\n" ) ;
        }
        else if(op==4){
            if(Fetch(h)==0){
				printf("提取失败\n");
				}
        }
        else if(op==5){
            printf("请输入查找学生的学号\n");
            char str[20];
            scanf("%s",str);
            Search_num(h,str);

        }
        else if(op==6){
            printf("请输入插入学生的学号");
            char id[100];
            scanf("%s",&id);
            InsertList(h,id);
        }
        else if(op==7){
            printf("请输入要删除学生的学号\n");
            char str[20];
            scanf("%s",str);
            Delete_num(h,str);
        }
        else if(op==8){
            printf("请输入要查找学生的专业 课程 小于的分数\n");
            char str[20];
            int class_i,score_d;
            scanf("%s",str);
            scanf("%d %d",&class_i,&score_d);
            Search_Major_SubjectScore(h,str,class_i,score_d);

        }
        else if(op==9){
            printf("请输入要删除学生的的专业 课程 小于的分数\n");
            char str[20];
            int class_i,score_d;
            scanf("%s",str);
            scanf("%d %d",&class_i,&score_d);
            Delete_Major_Subject(h,str,class_i,score_d);
        }
        else if( op == 0){
            break;
        }
        else{
            printf("请输入正确的数字!\n");
        }
    }
    return 0;
}

完成这两个实验,你可能对C语言代码有了一丝丝的兴趣,能力可能有了很大的提升,但是你绝对会厌倦这种ctrl+c、ctrl+v的工作生活,不对,多数程序员的工作就是这样。

看到这里的海大学子们,希望早点摆脱卷的绩点生活,编码能力越来越好,中国未来的IT行业是你们的!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值