2021-07-10

学生信息管理系统c语言实现

文章目录


关于

这篇博客是关于学生信息管理,由于时间太匆忙,只完成了少部分功能,基础的增删改查功能,并未进行细致的拓展。


注:代码框架来源于闫海玉老师的分享,但是闫海玉老师的B占视频讲解是基于数组实现,我用的是动态链表实现

特点:
1.使用睡眠函数,界面是动态打印。
2.实现了链表的快速排序。

代码如下:

#include <string.h>
#include <windows.h>
using namespace std;

char sname[100][100];
int m[100][100];

struct student
{
     int sno;  // 学号
     char name[20]; //姓名
     char sex[3];  // 性别
     char clas[10]; // 班级
     int chinese; // 语文成绩
     int maths; // 数学成绩
     int english; // 英语成绩
     int total; // 总分
}Student;

// 链表
typedef struct node
{
	struct student stu;
	struct node *next;
 } Lnode;
// 最大数
int maxSum = 0;
// 文件指针
   FILE *fp;
    Lnode *Head;

/*****函数声明*********/
//延迟打印
void pr(char *p1)
{
    Sleep(200);
    while(1)
    {
        if(*p1!=0)
            printf("%c",*p1++);
        else break;
        Sleep(35);
    }
}


//冒泡排序
int SortLinkBubble(Lnode *pHead);
//快速排序
Lnode* partition(Lnode* begin,Lnode* end);
void quicksort(Lnode* begin, Lnode* end);
//  增加
void  addStudent();
//  删除
void deleteStudent();
//  查找
void queryStudent();
void queryBySno();
void queryByName();
//  更新
void updateStudnt();
//  打印:
void printAll();
// 统计分析
void analysis();
/
//文件操作
/
//  读文件
int readData();
//  写文件
int writeData();
//  自动生成学号
int createSno();
//  显示当前学生信息
void printCurrent(Lnode *p);
//  欢迎界面
void welcome();
//  菜单
void mainMenu();
Lnode *bycno();

/*****主函数***********/
int main()
{
    Head=(Lnode *)malloc(sizeof(Lnode));
    Head->next=NULL;
    maxSum = readData();
   SortLinkBubble(Head);
    welcome();
    mainMenu();
    return 0;
}


/*****菜单选择*********/
void mainMenu()
{
    // 循环显示主业务
    // 提供选择项
    // 输入选择项后调用
    int select = 0;
    while(1)
    {
        printf("\t\t\t|          菜单                |\n");
        printf("\t\t\t|------------------------------|\n");
        pr("\t\t\t|       1. 增加学生信息        |\n");
        pr("\t\t\t|       2. 删除学生信息        |\n");
        pr("\t\t\t|       3. 修改学生信息        |\n");
        pr("\t\t\t|       4. 查找学生信息        |\n");
        pr("\t\t\t|       5. 打印学生信息        |\n");
        pr("\t\t\t|       6. 统计成绩信息        |\n");
        pr("\t\t\t|       0. 退出系统            |\n");
        printf("\t\t\t|------------------------------|\n");
        pr("\t\t\t\t请输入选择业务\n\t\t\t");
        scanf("%d",&select);
        switch(select)
        {
            case 1:
                system("cls");
                addStudent();
                break;
            case 2:
                system("cls");
                deleteStudent();
                break;
            case 3:
                system("cls");
                updateStudnt();
                break;
            case 4:
                system("cls");
                queryStudent();
                break;
            case 5:
                system("cls");
                printAll();
                break;
            case 6:
                system("cls");
                analysis();
                break;
            case 0:
                exit(0);
            default:
                printf("\t\t\t输入错误,请重新选择\n");
        }
    }

}

void  addStudent()
{
    char x;

    Lnode *p;
    printf("\t\t\t----------  增加学生信息  ----------\n");
    while(1){
        p=(Lnode*)malloc(sizeof(Lnode));
        p->stu.sno= createSno();
        maxSum++;
        fflush(stdin);// 清空缓存
        printf("\t\t\t请依次输入以下信息:姓名 性别 班级 语文成绩 数学成绩 英语成绩\n\t\t");
        scanf("%s %s %s %d %d %d",
                p->stu.name,
                p->stu.sex,
                p->stu.clas,
                &p->stu.chinese,
                &p->stu.maths,
                &p->stu.english);
        p->stu.total=p->stu.chinese+p->stu.english+p->stu.maths;
        p->next=Head->next;
        Head->next=p;
        SortLinkBubble(Head);
        printf("\t\t\t是否继续添加学生信息?(Y)or(N)\n\t\t");
         fflush(stdin);// 清空缓存
        scanf("%c",&x);
        if(x=='N')break;
    }
         if(writeData() == 1)
         {
            printf("\t\t\t添加成功\n\n\n");return ;
         }
         else
         {
            printf("添加失败\n");
         }

}
/********************************

*********************************/
void deleteStudent()
{
    printAll();
    int sno;
    int flag = -1;
    printf("\t\t\t----------  删除学生信息  ----------\n");
    printf("\t\t\t请输入想要删除学生的学号:\n\t ");
    scanf("%d",&sno);
    Lnode *pre,*p;
    pre=Head;
    p=pre->next;
    while(p->next)
    {
        if(p->stu.sno==sno)
        {
            pre->next=p->next;
            free(p);
            p=pre;
            maxSum--;
            flag=1;
        }
        pre=p;
        p=pre->next;
    }
    if(flag == 1)
    {
         if(writeData() == 1)
         {
           printf("\t\t\t删除成功!\n\n");
           printAll();
         }

    }
    else
         {
            printf("\t\t\t删除失败\n");
         }
}

void queryBySno()
{
    int sno;
    printf("\t\t\t请输入想要查找学生的学号:\n\t\t ");
    scanf("%d",&sno);
    Lnode *pre,*p;
    pre=Head;
    p=pre->next;
    while(p->next)
    {
        if(p->stu.sno==sno)
        {
            printf("\t\t\t已查找到该学生的信息:\n");
            printCurrent(p);return;
        }
        pre=p;
        p=pre->next;
    }
    printf("\t\t\t该学号学生不存在,未找到!\n");

}
/********************************

*********************************/
void queryByName()
{
    char name[20];
    int flag=0;
    printf("\t\t\t请输入想要查找的学生的任意名字字符\n\t\t\t");
    fflush(stdin);
    gets(name);
    Lnode *pre,*p;
    pre=Head;
    p=pre->next;
    while(p->next)
    {
        if(strstr(p->stu.name,name) != NULL)
        {
            if(flag!=1)printf("\t\t\t已查找到该学生的信息:\n");
            printCurrent(p);
            flag=1;
        }
        pre=p;
        p=pre->next;
    }
    if(flag == 0)
    {
        printf("\t\t\t未找到该姓学生\n");
    }

}
/********************************
函数功能:查找
        方式:学号查找和名字字符模糊查找
*********************************/
void queryStudent()
{
    char x;
    int select = 0;
    while(1){
    printf("\t\t\t----------  请输入查找方式  ----------\n");
    printf(" \t\t\t 1 学号查找    2 姓名字符模糊查找  \n\t\t\t");
    scanf("%d",&select);
    if(select == 1)
    {
        queryBySno();
    }
    else
    {
        queryByName();
    }
    printf("\t\t\t是否想继续分析:Y(是)N(否)\n\t\t\t");
    fflush(stdin);
    scanf("%c",&x);
    if(x=='N'){system("cls");return;}
    }
}
/********************************
函数功能:
修改学生信息
*********************************/
void updateStudnt()
{
    printAll();
    int sno;
    printf("\t\t\t----------  修改的学生的信息  ----------\n");
    printf("\t\t\t请输入想要修改信息的学生的学号: ");
    scanf("%d",&sno);
    Lnode *pre,*p;
    pre=Head;
    p=pre->next;
    while(p->next)
    {
        if(p->stu.sno==sno)
        {
            printf("\t\t\t已查找到该学生的信息:\n");
            printCurrent(p);
            printf("\t\t\t请依次输入以下信息:姓名 性别 班级 语文成绩 数学成绩 英语成绩\n\t\t");
        scanf("%s %s %s %d %d %d",
                p->stu.name,
                p->stu.sex,
                p->stu.clas,
                &p->stu.chinese,
                &p->stu.maths,
                &p->stu.english);
        p->stu.total=p->stu.chinese+p->stu.english+p->stu.maths;
        writeData();
        printf("\t\t\t修改成功!\n");
        printCurrent(p);
        return;

        }
        pre=p;
        p=pre->next;
    }
        printf("\t\t\t未找到该学号学生信息,修改失败\n");
        return;

}

/********************************
输出学生信息
*********************************/
void printAll()
{
    printf("\t\t\t\t----------  学生基本信息  ----------\n");
    printf("\t|-------------------------------------------------------------------------|\n");
    printf("\t|%-10s|%-8s|%-8s|%-8s|%-8s|%-8s|%-8s|%-8s|\n"," 学号","  姓名","性别","班级","语文成绩","数学成绩","英语成绩","  总分");
    printf("\t|----------+--------+--------+--------+--------+--------+--------+--------|\n");
    Lnode *p=Head->next;
    while(p->next)
    {
        printf("\t%10d %8s %8s %8s %8d %8d %8d %8d\n",
                p->stu.sno,
                p->stu.name,
                p->stu.sex,
                p->stu.clas,
                p->stu.chinese,
                p->stu.maths,
                p->stu.english,
                p->stu.total);
        p=p->next;
    }
     printf("\n\t\t\t\t----------  打印完成  ----------\n\n");
}

int SortLinkBubble(Lnode *pHead)

{   //从小到大

    int n,i,j;

    Lnode *p,*pNext;
    n=maxSum;

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

    {

          p=pHead->next;

          pNext=p->next;

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

           {     if(p->stu.sno>pNext->stu.sno)

                    swap(p->stu,pNext->stu);

                 p=p->next;

                pNext=p->next;

          }

    }

    return 0;

}

  Lnode* partition(Lnode* begin,Lnode* end) {
	if (!begin) return nullptr;
	Lnode* slow = begin, *fast = begin->next;
	const int pivot = begin->stu.total;
	while (fast != end) {
		if (fast->stu.total > pivot) {
			slow = slow->next;
			swap(slow->stu, fast->stu);
		}
		fast = fast->next;
	}
	swap(begin->stu, slow->stu);
	return slow;
}

void quicksort(Lnode* begin, Lnode* end) {
	if (begin != end) {
		Lnode* mid = partition(begin, end);
		quicksort(begin, mid);
		quicksort(mid->next, end);
	}
}

void getMaxScore(Lnode *head,int sum)
{
    Lnode *p,*q,*r,*m;
    int maxc=0,maxmath=0,maxen=0;
    p=head->next;
    q=r=m=p;
    while(p->next)
    {
        maxc+=p->stu.chinese;maxmath+=p->stu.maths;maxen+=p->stu.english;
        if(p->stu.chinese>q->stu.chinese)
            q=p;
        if(p->stu.maths>r->stu.maths)
            r=p;
        if(p->stu.english>m->stu.english)
            m=p;
        p=p->next;
    }
    printf("\t\t\t语文单科成绩最高的同学是:\n");
    printCurrent(q);
    printf("\t\t\t数学单科成绩最高的同学是:\n");
    printCurrent(r);
    printf("\t\t\t英语单科成绩最高的同学是:\n");
    printCurrent(m);
    printf("\t\t\t语文总分 %d  平均分是 %d \n",maxc,maxc/sum);
    printf("\t\t\t数学总分 %d  平均分是 %d \n",maxmath,maxmath/sum);
    printf("\t\t\t英语总分 %d  平均分是 %d \n",maxen,maxen/sum);
}

Lnode *bycno()
{
    char x[10];int i=0;
    fflush(stdin);
    gets(x);
    printf("\t\t\t----%s班级的学生成绩分析:-----------\n",x);
    Lnode *h;
    h=(Lnode*)malloc(sizeof(Lnode));
    h->next=NULL;
    Lnode *pre,*p,*q,*r=h;
    pre=Head;
    p=pre->next;
    while(p)
    {
        if(strstr(p->stu.clas,x) != NULL)
        {
            q=(Lnode*)malloc(sizeof(Lnode));
            q->stu=p->stu;
            r->next=q;
            r=q;
            i++;
        }
        pre=p;
        p=pre->next;
    }
    q=(Lnode*)malloc(sizeof(Lnode));
    r->next=q;
    r=q;
    r->next=NULL;
    getMaxScore(h,i);
    return h;
}

void analysis()
{
    int i=0;
    char x;
    printf("\t----------  统计分析全年级的同学成绩  ----------\n");
    while(1){
    printf("--------------请输入想分析的模块:1 全年级成绩 or 2 班级成绩 3年级总分排名-----------\n\t\t\t");
    int select;
    scanf("%d",&select);
    if(select==1)
    {
    printf("\t\t\t----全年级的学生成绩分析:-----------\n");
    getMaxScore(Head,maxSum);
    }
    else if(select==2)
    {
    printf("\t\t\t请输入待分析的班级代号:1 2 3(任选一个)\n\t\t\t");
    bycno();
    }
    else if(select==3)
        {quicksort(Head->next,NULL);
        printAll();
        }
    printf("\t\t\t是否想继续分析:Y(是)N(否)\n\t\t\t");
    fflush(stdin);
    scanf("%c",&x);
    if(x=='N'){system("cls");return;}
    }
}

/***************************************************
函数功能 :读取文件
返回:数据的总个数,首次运行会创建文件并返回-1

***************************************************/
int readData()
{
    // 定义个数
    int i = 0;
    // 1打开文件
    if((fp = fopen("C:/Users/lx/Desktop/c课设/test.txt","r")) == NULL)
    {
        //读取文件失败就创建新文件
        fp = fopen("C:/Users/lx/Desktop/c课设/test.txt","w");
        return -1;
    }
    // 2读文件
    Lnode *p,*r;
    r=Head;
    while(!feof(fp))
    {
        i++;
        p=(Lnode*)malloc(sizeof(Lnode));
        fscanf(fp,"%d %s %s %s %d %d %d %d",
                &p->stu.sno,
                p->stu.name,
                p->stu.sex,
                p->stu.clas,
                &p->stu.chinese,
                &p->stu.maths,
                &p->stu.english,
                &p->stu.total);
                r->next=p;
                r=p;

    }
    r->next=NULL;
    fclose(fp);
    return i-1;
}
/***************************************************
写文件:成功返回1,失败返回0
***************************************************/
int writeData()
{
    if((fp = fopen("C:/Users/lx/Desktop/c课设/test.txt","w")) == NULL)
    {
        printf("打开文件失败");
        return 0;
    }
   Lnode *p;
   p=Head->next;
   while(p->next){
        fprintf(fp,"%d %s %s %s %d %d %d %d\n",
                p->stu.sno,
                p->stu.name,
                p->stu.sex,
                p->stu.clas,
                p->stu.chinese,
                p->stu.maths,
                p->stu.english,
                p->stu.total);
        p=p->next;
    }

    fclose(fp);
    return 1;
}
/***************************************************
函数功能:自动生成学号.从1001开始生成,
***************************************************/
int createSno()
{
    if(maxSum == 0)
    {
        return 10001;
    }
    else
    {
        return 1003 + maxSum;
    }

}
/***************************************************
输出函数
***************************************************/
void printCurrent(Lnode *p)
{
    printf("\t|-------------------------------------------------------------------------|\n");
    printf("\t|%-10s|%-8s|%-8s|%-8s|%-8s|%-8s|%-8s|%-8s|\n"," 学号","  姓名","性别","班级","语文成绩","数学成绩","英语成绩","  总分");
    printf("\t|----------+--------+--------+--------+--------+--------+--------+--------|\n");
   printf("\t%10d %8s %8s %8s %8d %8d %8d %8d\n",
                p->stu.sno,
                p->stu.name,
                p->stu.sex,
                p->stu.clas,
                p->stu.chinese,
                p->stu.maths,
                p->stu.english,
                p->stu.total);
   printf("\t|-------------------------------------------------------------------------|\n");
}

void welcome()
{
    printf("\t\t\t|------------------------------|\n");
    pr("\t\t\t|---欢迎使用学生成绩管理系统---|\n");
    printf("\t\t\t|------------------------------|\n");
    printf("\t\t\t\n");
}

总结

c语言的课程设计大作业,本来是两个星期的时间,但是由于学校的特色月考和期末考,以及各种课设交叉穿梭,还有自己在摸鱼的缘故,导致最后是一天半匆匆忙忙写完改完代码,写完报告。若以后有时间再继续修改完善吧!

上一篇:带结点与不带结点用头插法和尾插法创建单链表


下一篇:单链表(c++)