c语言学生信息管理系统

这是一个使用C语言实现的学生信息管理系统,采用动态链表存储结构,具备增删改查功能,并实现了冒泡排序和快速排序。系统包含文件操作、统计分析等功能,支持按学号和姓名模糊查找。代码中还包括了延迟打印和界面动态效果。
摘要由CSDN通过智能技术生成

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言课程设计——学生信息管理系统_带数据文件版 系统的功能要求 学校现状分析 1、某学校有本科生和研究生两类学生。 A. 本科生信息:学号、姓名、性别、专业、班级、高数成绩、英语成绩、C语言、总成绩、班级排名、校级排名。其中:学号、姓名、性别、专业、班级、高数成绩、英语成绩、C语言成绩为输入项,总成绩是计算项,班级排名是总成绩在班内的名次,校级排名是总成绩在校内的名次。 B. 研究生信息:学号、姓名、性别、专业、班级、课程综合成绩、论文成绩、总成绩、班级排名、校级排名。其中:学号、姓名、性别、专业、班级、课程综合成绩、论文成绩为输入项,总成绩是计算项,班级排名是总成绩在班内的名次,校级排名是总成绩在校内的名次。 2、学生总成绩计算方法。 A.本科生:总成绩=高数成绩+英语成绩+C语言成绩; B.研究生:总成绩=课程综合成绩+论文成绩; 请使用结构化的程序设计方法,开发一个学生成绩管理系统对学生成绩进行有效管理。 1.2 主要任务 系统的功能要求 1. 添加功能:分本科生和研究生两类人员,实现下列添加功能。 A.本科生:能够添加学生信息,如果高数成绩、英语成绩、C语言成绩都输入,则系统自动计算总成绩。 B.研究生:能够添加学生信息,如果课程综合成绩、论文成绩都输入,则系统自动计算总成绩。 2. 修改功能:分本科生和研究生两类人员,实现下列修改功能。 A.本科生:根据学号来修改任意学生的除学号外的信息。如果高数成绩、英语成绩、c语言成绩都存在,则系统自动计算总成绩。 B.研究生:根据学号来修改任意学生的除学号外的信息。如果课程综合成绩、论文成绩都存在,则系统自动计算总成绩 3. 删除功能:分本科生和研究生两类人员,能够根据学号删除一个学生。 4. 查询功能:分本科生和研究生两类人员,实现下列查询功能。 1) 分页显示全部学生的信息。分页功能:每页显示10条学生的信息,有上一页、下一页、首页和最后一页的功能。 2) 能够按班级显示本班全部学生信息。 3) 能够根据学号或者姓名查询学生信息。 4) 能够在某个班级中查询某门课成绩不及格学生信息。 5. 排序功能:分本科生和研究生两类人员,实现下列排序功能。 1) 所有学生信息按总成绩从高到低排序并显示。 2) 某个班学生信息按总成绩从高到低排序并显示。 6. 统计功能:分本科生和研究生两类人员,实现下列统计与显示功能。 1) 统计某班级某课程的平均成绩、最高成绩、最低成绩。如果学生该门课没有成绩,统计平均成绩时忽略该生。 2) 统计某班级某课程超过课程平均成绩的学生名单及人数。 3) 统计某班级某课程不及格学生名单及人数。 4) 统计某班级某课程不同等级的学生人数。等级标准:优—大于等于90;良—大于等于80且小于90;中:大于等于70且小于80;及格:大于等于60且小于70;不及格:小于60。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值