Advertisement

C语言程序设计-学生选课系统

阅读量:

本课程设计基于C语言开发了一套学生选课管理系统。随着信息技术的发展和知识经济对科技创新的依赖程度提升,教育信息化成为重要趋势。本系统针对传统选课方式效率低下等问题,在信息时代背景下提出了解决方案:通过链表数据结构构建课程管理系统,并提供包括数据录入、课程浏览、查询等功能在内的完整功能模块。
系统采用菜单化操作方式供用户选择功能选项:如课程信息录入与管理、学生选课状态查询等,并通过冒泡排序实现按编号或开课学期对课程进行排序处理。同时系统还实现了对已选人数及学分等属性的信息展示功能。
通过本次设计实践,掌握了模块化开发方法和结构化程序设计思想,并加深了对C语言编程的理解与应用能力;体会到解决问题时理清流程并逐步细化的重要性;认识到复杂问题需分阶段逐步完善的编程理念。

一.引言
21世纪以高科技为核心的知识经济将占主导地位,国家的综合国力和国际竞争力将越来越取决于科学技术创新水平。教育作为知识创新、传播和应用的基础,培养和输送人才的摇篮,已经成为经济发展和社会进步的基础。
尽管人类进步的程度随着不同时代,不同地区而有所变化,教育的口径却在不断扩宽,以便使过去仅供少数人使用的教育资源能够为更多各种年龄、不同社会阶层和背景的人们所用。在信息爆炸的时代,传统教学管理面临着诸多挑战。
当今时代是飞速发展的信息时代,在各行各业中离不开信息处理,这正是计算机被广泛应用于信息系统的环境。计算机的最到好处的于利用它能够进行信息管理,使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。 尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。计算机进行信息管理与信息管理系统的开发密切相关,系统的开发是系统管理的前提。本系统就是为了管理好学生选课信息而设计的。 数据处理手工操作,工作量大,出错率高,出错后不易更改,造成了时间上的浪费。 基于这个问题,我认为有必要建立一个学生选课系统,使学生选课信息管理工作规范化、系统化、程序化,避免学生选课管理的随意性,提高信息处理的速度和准确性,能够及时、准确、有效的查询选课情况。选课信息即可完成原来几倍的作业量。

二.总体设计

  1. 数据结构:采用链表作为核心数据结构
  2. 功能分区:课程管理模块与学生选课模块构成了系统的功能分区
  3. 函数定义清单:
    读取课程信息的函数定义为:void file_read(LESSON * ,FILE * );
    录入课程信息的函数定义为:void data(LESSON * );
    录入学生选课信息的函数定义为:void sign(LESSON * );
    课程信息浏览界面的函数定义为:void presen(LESSON * );
    关键字查询功能的函数定义为:void find(LESSON * );
    查询课程选修情况的函数定义为:void situation(LESSON * );
    课程排序操作的功能函数定义为:void order(LESSON * );

三.功能模块函数设计

在这里插入图片描述

流程图

在这里插入图片描述

三.详细设计
运行环境:Visual Studio2005 语言:C++
1.界面设计

在这里插入图片描述

菜单选择:

    1. 录入课程信息
    1. 学生录入选课信息
    1. 浏览课程相关信息
    1. 通过关键字快速查找课程
    1. 查询当前课程的选修人数
  • 退出系统

四.程序清单

复制代码
    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    typedef struct lesson{
    	int num;  //定义编号 
    	char name[10];  //定义姓名 
    	char nature[10]; //定义性质 
    	int stime; //定义学时 
    	int ctime; //定义授课时间 
    	int etime; //定义实验或上机学时 
    	int grade; //定义学分 
    	int time;  //定义开学时间 
    	int inum; //定义选课人数 
    	struct lesson *next;
    }LESSON;
    void file_read(LESSON * ,FILE * ); //文件读取函数
    void data(LESSON * ); //课程信息录入函数 
    void sign(LESSON * ); //学生选课信息录入函数 
    void presen(LESSON * );//课程信息浏览函数 
    void find(LESSON * ); //以关键字查询的函数 
    void situation(LESSON * );// 查询课程选修情况
    void order(LESSON * );//排序函数 
    int main()
    {
    	int n;
    LESSON *head,*p,*pr;
    head=(LESSON*)malloc(sizeof(LESSON));//向内存申请空间并把地址传给链表头 
    head->next=NULL;
    FILE *fp; 
    if((fp=fopen("D:\ da.txt","at+"))==NULL)//读写打开一个空的文本文件 
    {
    	printf("没找到文件\n");
    	exit(0);
    	}
    file_read(head,fp);//调用函数 
    printf("          菜单项:\n");
    	printf("          1:课程信息录入\t\t");
    	printf("2:学生选课信息录入\n");
    printf("          3:课程信息浏览\t\t");
    	printf("4:查询:关键字\n");
    printf("          5:查询课程选修情况\t\t");
    	printf("6:排序\n");
    	printf("          0:结束\n");
    scanf("%d",&n);
    while(n!=0)
    {
    	switch(n){                    //进入菜单项后提供给用户的功能选择 
    		case 1:data(head);break;
    		case 2:sign(head);break;
    		case 3:presen(head);break;
    		case 4:find(head);break;
    		case 5:situation(head);break;
    		case 6:order(head);break;
    		}
    	scanf("%d",&n);
    	}
    	p=head->next;
    	fp=fopen("D:\ da.txt","wt+");  	// 读写打开da文件 
    	while(p!=NULL)
    {
    	   fprintf(fp,"%d %s %s %d %d %d %d %d %d\n",p->num,p->name,p->nature,p->stime,p->ctime,p->etime,p->grade,p->time,p->inum);//把链表的内容传到文件 
     	   p=p->next;
    	}
    p=head->next;
    pr=head;
    while(p!=NULL)
    {
    	free(pr);//销毁链表 
    	pr=p;
    	p=p->next;	
    	}
    	free(pr);// 销毁链表 
    	return 0;
    }
    /****************************************************** 
    函数功能:把文件的内容读到链表上,如果文件为空,则为空链表 
     传入参数: 链表头指针head; 文件指针fp 
     无返回值 
     *****************************************************/ 
    void file_read(LESSON *head,FILE *fp)
    {
    	
    LESSON *tail,*p,*temp;
    	tail=head;
    	while(!feof(fp))
    	{
    		temp=tail;
    		p=(LESSON*)malloc(sizeof(LESSON));
    		if(p==NULL) exit(0);
    		p->next=NULL;
    		fscanf(fp,"%d%s%s%d%d%d%d%d%d",&p->num,p->name,p->nature,&p->stime,&p->ctime,&p->etime,&p->grade,&p->time,&p->inum);
    		tail->next=p;
    		tail=p;
    	}
    	temp->next=NULL;
    	if(head->next==NULL) printf("这是一个空文件\n");
    }
    /****************************************************** 
    函数功能: 查询课程信息,遍历链表,打印出链表内容 
     传入参数: 链表头指针head 
     无返回值 
     *****************************************************/ 
    void presen(LESSON *head)
    {
    	LESSON *p=head->next;
    	printf("编号  名称  性质  学时  授课学时  实验或上机学时  学分  开学时间  选课;已选人数\n"); 
    	while(p!=NULL)
    	{
    	  	printf("%d    %s    %s     %d       %d        %d         %d      %4d        %d\n",p->num,p->name,p->nature,p->stime,p->ctime,p->etime,p->grade,p->time,p->inum);
    		p=p->next;	
    	} 
    }
    /****************************************************** 
    函数功能: 用尾插法录入课程信息 
     传入参数: 链表头指针head
     无返回值 
     *****************************************************/ 
    void data(LESSON *head)
    {
    	int n;
    LESSON *temp=head,*tail,*p;
    if(temp->next==NULL)
    	 tail=head;
    	else
    	 {
      while(temp->next!=NULL)
         temp=temp->next;
      tail=temp;
     }
    printf("请输入课程信息,输入0结束\n");
    printf("编号  名称  性质  学时  授课学时  实验或上机学时  学分  开学时间 选课;已选人数\n");
    scanf("%4d",&n);
    while(n!=0)
    {
    	p=(LESSON*)malloc(sizeof(LESSON));
    		if(p==NULL) exit(0);
    		p->next=NULL;
    		p->num=n;
    		scanf("%s%s%d%d%d%d%d%d",p->name,p->nature,&p->stime,&p->ctime,&p->etime,&p->grade,&p->time,&p->inum);
    		tail->next=p;
    		tail=p;
    		scanf("%d",&n);
    	}	
    } 
    /****************************************************** 
    函数功能: 当输入编号即n不为0时,遍历链表,如果n等于p->num,
    则inum加一,即当学生输入有编号的课程的编号时,选课人数加一 
     传入参数: 链表头指针head
     无返回值 
     *****************************************************/ 
    void sign(LESSON *head)
    {
    	LESSON *p;
    	int n;
    printf("开始选课,输入你要选的课程编号\n");
    printf("如要结束选课,请输入0\n");
    scanf("%d",&n);
    while(n!=0)
    {
        p=head->next;
        while(p!=NULL)
        {
        	if(p->num==n) p->inum++;
        	p=p->next;
    		}
    	scanf("%d",&n);
    	}
    }
    /****************************************************** 
    函数功能: 查询功能,分三种方法查询 ,分别是编号查询,
    学分查询以及学时查询当用户输入所想要查询的编号(学分,学时)
    时遍历链表,输出与该用户输入的编号(学分,学时)相同的课程的信息 
     传入参数: 链表头指针head
     无返回值 
    *****************************************************/ 
    void find(LESSON *head)
    {
    	LESSON *p;
    	printf("输入你要查询的课程\n1:编号查询\n2:学分查询\n3:学时查询\n");
    	int n,m;
    	scanf("%d",&n);
    	if(n==1)
    	{
    		printf("输入你要查找的课程编号\n");
    	    scanf("%d",&m);
    	    printf("编号  名称  性质  学时  授课学时  实验或上机学时  学分  开学时间 选课;已选人数\n");
    		p=head->next;
    		while(p!=NULL)
    		{
    			if(p->num==m) printf("%d %s %s %d %d %d %d %d %d\n",p->num,p->name,p->nature,p->stime,p->ctime,p->etime,p->grade,p->time,p->inum);
    			p=p->next;
    		}
    	}
    	if(n==2)
    	{
    		printf("输入你要查找课程的学分\n");
    		scanf("%d",&m);
    		printf("编号  名称  性质  学时  授课学时  实验或上机学时  学分  开学时间 选课;已选人数\n");
    		p=head->next;
    		while(p!=NULL)
    		{
    		  	if(p->grade==m)  printf("%d %s %s %d %d %d %d %d %d\n",p->num,p->name,p->nature,p->stime,p->ctime,p->etime,p->grade,p->time,p->inum);
    			p=p->next;
    		} 
    	}
    	if(n==3)
    	{
    		printf("输入你要查找的课程学时\n");
    	    scanf("%d",&m);
    	    printf("编号  名称  性质  学时  授课学时  实验或上机学时  学分  开学时间 选课;已选人数\n");
    		p=head->next;
    		while(p!=NULL)
    		{
    			if(p->stime==m) printf("%d %s %s %d %d %d %d %d %d\n",p->num,p->name,p->nature,p->stime,p->ctime,p->etime,p->grade,p->time,p->inum);
    			p=p->next;
    		}
    		
    		
    	}
     } 
     /****************************************************** 
    函数功能: 查询课程的已选人数,当用户输入想要查询的课程
    编号时,遍历链表,当链表中有值与用户输入值相等时,输出
    已选人数p->num 
     传入参数: 链表头指针head
     无返回值 
     *****************************************************/ 
     void situation(LESSON *head)
     {
     	LESSON *p=head->next; 
     	printf("输入你想要了解课程的选修情况:以编号查询\n");
     	int n;
    scanf("%d",&n);
    while(p!=NULL)
    	{
    	  if(p->num==n)
    	  {
    	  	printf("已选人数为\n");
    		printf("%4d",p->inum);
    		break;
    	  }	
    	  p=p->next;
    	} 
     }
     /****************************************************** 
    函数功能: 排序功能,有两种排序渠道,分别是按编号排序,以及按开课学期排序
    这两种渠道都是使用冒泡排序来实现的 
    
     传入参数: 链表头指针head
     无返回值 
     *****************************************************/ 
     void order(LESSON *head)
     {
       printf("1:按编号排序\n2:按开课学期\n"); 
       LESSON *p,*q;
       int flag_swap,n;
       scanf("%d",&n); 
       do{
         flag_swap = 0;
         p = head;
        while (p->next->next)
    		{
    		  if(n==1)
    		  {
           if (p->next->num>p->next->next->num) 
              {
                flag_swap++;
                q = p->next;
                p->next=p->next->next;
                q->next=q->next->next;
                p->next->next=q;
              }
             else p = p->next;
          }
          if(n==2)
          {
          	if (p->next->time>p->next->next->time) 
              {
                flag_swap++;
                q = p->next;
                p->next=p->next->next;
                q->next=q->next->next;
                p->next->next=q;
              }
           else p = p->next;
    		  }
       }
       } while (flag_swap > 0);
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI助手

五.心得体会
通过本系统课程的设计与分析过程,我不仅掌握了模块化设计的方法论,并且深入理解并熟练运用了结构化程序设计的思想与方法论,在实际应用中进一步提升了利用C语言进行程序开发的能力。
在程序开发的过程中,实际上是确定解决问题的具体操作步骤序列的过程,在这个过程中理清解决问题的整体流程是非常重要的一步,在此基础上采用逐步细化的方法实现整个系统的功能开发。
对于大型的应用系统开发项目而言,在实际开发过程中往往不可能一次就完成一个非常完善的系统方案。因此一般需要先构建一个满足基本功能要求的初步系统框架,在后续的测试运行或者实际应用过程中不断地进行完善优化工作,在这个不断迭代的过程中最终能够完成一个功能完善、性能优越的选修课程管理系统。 总结而言,在本次课程设计实践中我对C语言的应用与理解有了显著提升,并对编程思想的认识也更加深刻了。
六:附录
参考文献:《C程序设计教程》,主编H.M.Deitel, P.J.Deitel
《C++程序设计教程详解—过程化编程》,主编钱能
《百度资料》
《李戈及翁恺视频》

全部评论 (0)

还没有任何评论哟~