Bootstrap

C语言-学生成绩管理系统

C语言-学生成绩管理系统

全部代码如下:

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<conio.h> 

#define MAXSIZE 100

void display();         // 主界面展示函数

void isert();           // 插入学生信息函数

void show();            // 学生信息显示示函数

void find();            // 主查询函数
void findById();        // 通过学号查询学生
void findByName();      // 通过姓名查询学生

void modify();          // 主修改函数(包括通过学号修改与删除函数)
void modifyById();      // 通过Id修改学生信息
void deleteById();      // 通过Id删除学生信息

void sort();            // 主排序函数
void sortByAvg();       // 平均分排序函数
void sortByScore1();    // 成绩1排序函数
void sortByScore2();    // 成绩2排序函数
void sortByScore3();    // 成绩3排序函数

void save();            // 文件保存函数
void load();            // 文件加载函数

void shutdown();        // 退出函数

// 学生信息结构体
struct student{
  	int id;                         //学号
  	char name[20];                  //姓名
  	char sex[4];                    //性别
  	double score1;                  //成绩1
  	double score2;                  //成绩2
  	double score3;                  //成绩3
  	double ave;                     //平均分         
};

// 定义队列的结构体
typedef struct Squeue {
	struct student data[MAXSIZE];
	int front;
	int rear;
}Squeue;

// 初始化队列
void InitQueue(Squeue* qu)
{
	qu->front = qu->rear = 0;
    for (int i = 0; i < MAXSIZE; i++) {
        qu->data[i].id = 0;
        strcpy(qu->data[i].name, "NULL");
        strcpy(qu->data[i].sex, "NULL");   // 解决表达式必须是可修改的左值(字符串不能直接赋值)
        qu->data[i].score1 = 0.0;
        qu->data[i].score2 = 0.0;
        qu->data[i].score3 = 0.0;
        qu->data[i].ave = 0.0;
    }
}

// 判断队列是否为空
int isQueueEmpty(Squeue* qu)
{
	if (qu->front == qu->rear)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

// 元素入队操作
int EnQueue(Squeue* qu, struct student s)
{
	//若队满则无法入队
	if ((qu->rear + 1) % MAXSIZE == qu->front)
	{
		return 0;
	}
	qu->data[qu->rear].id = s.id;
    strcpy(qu->data[qu->rear].name,  s.name);
    strcpy(qu->data[qu->rear].sex, s.sex);
    qu->data[qu->rear].score1 = s.score1;
    qu->data[qu->rear].score2 = s.score2;
    qu->data[qu->rear].score3 = s.score3;
    s.ave = (s.score1 + s.score2 + s.score3) / 3;
    qu->data[qu->rear].ave = s.ave;
    qu->rear = (qu->rear + 1) % MAXSIZE;
    return 1;
}

// 元素出队操作
int Dequeue(Squeue* qu)
{
	//若队空则无法出队
	if (qu->front == qu->rear)
	{
		return 0;
	}
	qu->front = (qu->front + 1) % MAXSIZE;
	return 1;
}

// 系统主函数入口
int main(){

    int flag = 1;
    int choice;

    Squeue *Q;
    Q = (Squeue*)calloc(20,sizeof(Squeue));
    InitQueue(Q);

    load(Q);    //完成数据的预读取

    while (flag) {

        display();

        printf("\t请在0-9之间做出选择:");

        fflush(stdin);          //清除输入设备的缓冲
        scanf("%d", &choice);

        switch (choice)
        {
            case 1:
                 system("cls");
                 insert(Q);
                 break;

            case 2:
                 system("cls");
                 show(Q);
                 break;

            case 3:
                 system("cls");
                 sort(Q);
                 break;

            case 4:
                 system("cls");
                 modify(Q);
                 break;

            case 5:
                 system("cls");
                 find(Q);
                 break;     

            case 6:
                save(Q);
                shutdown();

            default:
                 system("cls");
                 continue;              
        }

    }
    return 0;
}

// 主页面展示函数
void display() {
    printf("\t************学 生 管 理 系 统**********\n");
    printf("\t1.录入学生信息\n");
	printf("\t2.显示学生信息\n");
	printf("\t3.学生成绩排序\n");
	printf("\t4.编辑学生信息\n");
	printf("\t5.查询学生成绩\n");
	printf("\t6.退出\n");
    printf("\t************学 生 管 理 系 统**********\n");
}

// 插入学生信息函数
void insert(Squeue *Q) {
    int i = 0;
    char ch;
    do
    {
         struct student s;
         printf("\n");
         printf("\t正在录入第%d个学生的信息", i + 1);

         printf("\n");
         printf("\t输入学生学号:");
         scanf("%d", &s.id);
         fflush(stdin);

         printf("\n");
         printf("\t输入学生姓名:");
         fflush(stdin);
         gets(s.name);

         printf("\n");
         printf("\t输入学生性别:");
         fflush(stdin);
         gets(s.sex);

         printf("\n");
         printf("\t输入学生成绩1:");
         scanf("%lf", &s.score1);
         fflush(stdin);

         printf("\n");
         printf("\t输入学生成绩2:");
         fflush(stdin);
         scanf("%lf", &s.score2);

         printf("\n");
         printf("\t输入学生成绩3:");
         fflush(stdin);
         scanf("%lf", &s.score3);

         printf("\n");

         EnQueue(Q,s);
         i++;

         printf("\t是否继续输入?(Y/N)");
         fflush(stdin);
         ch = getch();
         system("cls");

   }while(ch != 'n' && ch != 'N');
   system("cls");
}

// 学生信息显示示函数
void show(Squeue *Q) {
    int i;
  	char choice;
  	do{
        printf("\n");
        printf("\t班级学生信息列表\n");

      	printf("\t学号\t姓名\t性别\t成绩1\t成绩2\t成绩3\t平均值\n");
      	for(i = Q->front; i < Q->rear; i++){
            if(Q->data[i].id == 0) {  // 解决删除时候最后元素异常显示问题
                continue;
            }  
            printf("\t%d\t%s\t%s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", Q->data[i].id, Q->data[i].name, Q->data[i].sex, Q->data[i].score1, Q->data[i].score2, Q->data[i].score3, Q->data[i].ave);
        }

      	printf("\t\t\t按任意键返回主菜单\a");
      	fflush(stdin);

      	choice = getch();

   	}while(!choice);
 	system("cls");
}

// 文件保存函数
void save(Squeue *Q) {
    FILE *fp;
    int i;

    if((fp = fopen("D://Student.txt", "w")) == NULL)
    {
        printf("\n保存失败!");
        shutdown();
    }
    
    for(i = Q->front; i < Q->rear; i++)
     {
        if(Q->data[i].id == 0) {  // 解决删除时候最后元素异常显示问题
            continue;
        }  
        fprintf(fp, "%d %s %s %lf %lf %lf %lf\t", Q->data[i].id, Q->data[i].name, Q->data[i].sex, Q->data[i].score1, Q->data[i].score2, Q->data[i].score3, Q->data[i].ave);
        //fwrite(&Q->data[i], sizeof(struct student), 1, fp);
     }

     fclose(fp);
     printf("学生信息已自动保存!\n");
}

// 文件加载函数
void load(Squeue *Q) {
    FILE *fp;
  	int i;
  	
  	if((fp = fopen("D://Student.txt", "r")) == NULL)        // 需要提前准备好文件
    {
       printf("找不到文件!\n");
       shutdown();
    }

    fseek(fp, 0, SEEK_SET);

    for(i = Q->front; i < MAXSIZE && !feof(fp); i++)
    {
        fscanf(fp, "%d %s %s %lf %lf %lf %lf\t", &Q->data[i].id, Q->data[i].name, Q->data[i].sex, &Q->data[i].score1, &Q->data[i].score2, &Q->data[i].score3, &Q->data[i].ave);
        //fread(&Q->data[i], sizeof(struct student), 1, fp);
        Q->rear++;          // 解决文件读取异常情况,指针未后移
    }

 	fclose(fp);
}

// 主查询函数
void find(Squeue *Q){
    int choice;
    int flag = 1;  // 设置标志位,结束循环
    do{
        printf("\n");
        printf("\t学生查询系统\n");  
        printf("\t1.按照学生学号查询\n");
        printf("\t2.按照学生姓名查询\n");
        printf("\t3.返回主菜单\n");
        printf("\t请输入要选择的功能:");
        fflush(stdin);
        scanf("%d", &choice);
        switch(choice)
            {
            case 1:
                system("cls");
                findById(Q);
                break;
            case 2:
                system("cls");
                findByName(Q);
                break;
            case 3:
                system("cls");
                flag = 0;
                break;
            default:
                system("cls");
                find(Q);
                break;
            }
        }while(flag);
        system("cls");
}

// 通过学号查询学生
void findById(Squeue *Q){
    int i;
    int choice;
    char as;
    do{
        printf("\n");
        printf("\t输入要查询的学生学号:\a");
        fflush(stdin);
        scanf("%d", &choice);

        for(i = Q->front; i < Q->rear; i++) {
            if(choice == Q->data[i].id)
            {
                printf("\t学号\t姓名\t性别\t成绩1\t成绩2\t成绩3\t平均值\n");
                printf("\t%d\t%s\t%s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", Q->data[i].id, Q->data[i].name, Q->data[i].sex, Q->data[i].score1, Q->data[i].score2, Q->data[i].score3, Q->data[i].ave);
            }
        }

        printf("\t按任意键返回主菜单");
        fflush(stdin);
        as = getch();
     }while(!as);
    system("cls");
}

// 通过姓名查询学生
void findByName(Squeue *Q){
    int i;
    char str[20],as;
    do{
        printf("\n");
        printf("\t输入要查询的学生姓名:");
        fflush(stdin);
        gets(str);

        for(i = Q->front; i < Q->rear; i++) {
            if(!strcmp(Q->data[i].name,str))
            {
                printf("\t学号\t姓名\t性别\t成绩1\t成绩2\t成绩3\t平均值\n");
                printf("\t%d\t%s\t%s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", Q->data[i].id, Q->data[i].name, Q->data[i].sex, Q->data[i].score1, Q->data[i].score2, Q->data[i].score3, Q->data[i].ave);
            }
        }

        printf("\t按任意键返回主菜单");
        fflush(stdin);
        as=getch();
     }while(!as);
    system("cls");
}

// 主修改函数(包括通过学号修改与删除函数)
void modify(Squeue *Q){
    int choice;
    int flag = 1;  // 设置标志位,结束循环
    do{
        printf("\n");
        printf("\t学生修改系统\n");  
        printf("\t1.按照学号修改学生\n");
        printf("\t2.按照学号删除学生\n");
        printf("\t3.返回主菜单\n");
        printf("\t请输入要选择的功能:");
        fflush(stdin);
        scanf("%d", &choice);
        switch(choice)
            {
            case 1:
                system("cls");
                modifyById(Q);
                break;
            case 2:
                system("cls");
                deleteById(Q);
                break;
            case 3:
                system("cls");
                flag = 0;
                break;
            default:
                system("cls");
                modify(Q);
                break;
            }
        }while(flag);
        system("cls");
}

// 通过Id修改学生信息
void modifyById(Squeue *Q){
    int i;
    int SearchId;

    printf("\t输入要修改的学生学号:");
  	fflush(stdin);
  	scanf("%d", &SearchId);

    for(i = Q->front; i < Q->rear; i++)
  	{
     	if(Q->data[i].id == SearchId){
            printf("\n");
            system("cls");
        	struct student stu;
        	printf("\t输入修改后学生信息\n");

        	Q->data[i].id = SearchId;

            printf("\t输入学生姓名:");
            fflush(stdin);
            gets(stu.name);
            strcpy(Q->data[i].name, stu.name);
            printf("\n");

        	printf("\t输入学生性别:");
        	fflush(stdin);
        	gets(stu.sex);
        	strcpy(Q->data[i].sex, stu.sex);
            printf("\n");

        	printf("\t输入学生成绩1:");
        	fflush(stdin);
        	scanf("%lf", &stu.score1);
        	Q->data[i].score1 = stu.score1;
            printf("\n");

        	printf("\t输入学生成绩2:");
        	fflush(stdin);
        	scanf("%lf", &stu.score2);
        	Q->data[i].score2 = stu.score2;
            printf("\n");

        	printf("\t输入学生成绩3:");
        	fflush(stdin);
        	scanf("%lf", &stu.score3);
        	Q->data[i].score3 = stu.score3;
            printf("\n");

			system("cls");
            printf("\t修改成功,系统自动跳转!\n");
            show(Q);
            break;
       	}
  	}
  	printf("\t删除失败!查无此人,系统自动跳转!");
    modify(Q);
}

// 通过Id删除学生信息
void deleteById(Squeue *Q){
    int num;
    printf("\t输入要删除学生的学号:");
    fflush(stdin);
    scanf("%u",&num);
    for(int i = Q->front; i < Q->rear; i++){
        if(Q->data[i].id == num){
            for (int j = i; j < Q->rear; j++)
            {
                Q->data[j] = Q->data[j + 1];
            }
            printf("\t删除成功!自动跳转查询全部学生页面!");
            show(Q);
            break;
        }
    }
    printf("\t删除失败!查无此人,系统自动跳转!");
    modify(Q);
}

// 主排序函数
void sort(Squeue *Q) {
    int choice;
    int flag = 1;  // 设置标志位,结束循环
    do{
        printf("\n");
        printf("\t学生排序系统\n");  
        printf("\t1.按照平均分排序\n");
        printf("\t2.按照成绩1排序\n");
        printf("\t3.按照成绩2排序\n");
        printf("\t4.按照成绩3排序\n");
        printf("\t5.返回主菜单\n");
        printf("\t请输入要选择的功能:");
        fflush(stdin);
        scanf("%d", &choice);
        switch(choice)
            {
            case 1:
                system("cls");
                sortByAvg(Q);
                break;
            case 2:
                system("cls");
                sortByScore1(Q);
                break;
            case 3:
                system("cls");
                sortByScore2(Q);
                break;
            case 4:
                system("cls");
                sortByScore3(Q);
                break;        
            case 5:
                system("cls");
                flag = 0;
                break;
            default:
                system("cls");
                sort(Q);
                break;
            }
        }while(flag);
        system("cls");
}

// 平均分排序函数
void sortByAvg(Squeue *Q) {
    struct student temp;   // 临时变量学生
    int i, j;
    for(i = Q->front; i < (Q->rear - 1); i++){
        for(j = Q->front; j < (Q->rear - i - 1); j++){
            if(Q->data[j].ave < Q->data[j + 1].ave){
                temp = Q->data[j];
                Q->data[j] = Q->data[j + 1];
                Q->data[j + 1] = temp;
            }
        }
    }
    show(Q);
}

// 成绩1排序函数
void sortByScore1(Squeue *Q) {
    struct student temp;   // 临时变量学生
    int i, j;
    for(i = Q->front; i < (Q->rear - 1); i++){
        for(j = Q->front; j < (Q->rear - i - 1); j++){
            if(Q->data[j].score1 < Q->data[j + 1].score1){
                temp = Q->data[j];
                Q->data[j] = Q->data[j + 1];
                Q->data[j + 1] = temp;
            }
        }
    }
    show(Q);
}

// 成绩2排序函数
void sortByScore2(Squeue *Q) {
    struct student temp;   // 临时变量学生
    int i, j;
    for(i = Q->front; i < (Q->rear - 1); i++){
        for(j = Q->front; j < (Q->rear - i - 1); j++){
            if(Q->data[j].score2 < Q->data[j + 1].score2){
                temp = Q->data[j];
                Q->data[j] = Q->data[j + 1];
                Q->data[j + 1] = temp;
            }
        }
    }
    show(Q);
}

// 成绩3排序函数
void sortByScore3(Squeue *Q) {
    struct student temp;   // 临时变量学生
    int i, j;
    for(i = Q->front; i < (Q->rear - 1); i++){
        for(j = Q->front; j < (Q->rear - i - 1); j++){
            if(Q->data[j].score3 < Q->data[j + 1].score3){
                temp = Q->data[j];
                Q->data[j] = Q->data[j + 1];
                Q->data[j + 1] = temp;
            }
        }
    }
    show(Q);
}

// 退出函数
void shutdown() {
    exit(0);
}
;