《C系列-实例相关》学生成绩管理系统

学生信息管理系统

1.题目与要求

1.1 问题提出

​ 由于计算机技术的飞速发展,C语言作为一项编程的基础语言,它对计算机行业有着很大的贡献,我们组计划用C语言编写一个学生信息管理系统,主要用来对学生基本信息的管理,使教师对学生信息进一步了解,为老师提供很好的了解渠道。

1.2 本系统涉及的知识点

switch循环语句,参数的传递,字符串,数组,链表,指针,while语句,简单 输入输出语句,分支,函数定义,函数的递归调用

1.3 功能要求

(1)数据管理:
要求:学生信息数据要以文件的形式保存,此模块包括子模块有:录入学生信息、删除学生信息、修改学生信息
(2)数据查询:
要求:查询时可实现按学号查询、按姓名查询
(3)数据浏览:
要求:输出录入信息的全部学生的基本信息

2.功能设计

2.1 算法设计

本系统需要实现的功能要求:
1) 利用switch语句设计如图1所示的主菜单:

录入学生信息 
学生信息浏览
学生信息查询
修改学生信息
删除学生信息
退出学生管理系统

图1 学生信息管理系统主菜单
(2) 选择2后,程序自动为你提供全部学生信息
(3) 选择3后,进入学生信息查询阶段,可以根据学号和姓名查询学生成绩,也可以打印全部学生信息。

1.按学号查询
2.按姓名查询
3.打印全部学生信息
4.返回主菜单
图2:学生信息查询

(4) 选择4后,程序会根据你提供的学号自动为你找出该学生的信息,并问你需要改学生的哪一项信息,之后可以提供该学生的新的信息。
(5) 选择5后,程序可以根据你提供的学号删除对应的学生信息。
2.2学生信息管理系统的菜单
学生信息管理系统主模块如下:

学生信息管理系统的信息查询模块如下

程序代码设计
程序代码设计中的函数:
录入信息函数:void register()
浏览信息函数:void scan()
信息查询函数:void search()
修改信息函数:void modify()
删除信息函数:void del()
退出程序函数:void quit()
学生信息函数的定义:
char sno[max]; 学号
char sname[max]; 姓名
char age[max]; 年龄
char sex[max]; 性别
char born[max]; 出生年月
char dress[max]; 地址
char phone[max]; 电话
char mail[max]; E-mail
学生信息输出函数:
void ElePrint(char str[]) 单个元素
int LinePrint(student *ptr) 输出一行
void print() 输出全部学生信息
这三个函数是间接递归型
信息查询中的两个函数:
学号查询函数:no[max]
姓名查询函数:name[max]
信息修改中对信息从新输入的函数:
主要用于对新的信息的输入
name1[max] 修改后名字的函数
se1[max] 修改后性别的函数
ag1[max] 修改后年龄的函数
bor1[max] 修改后出生年月函数
dres1[max] 修改后地址函数
phon1[max] 修改后电话函数
mail1[max] 修改后E-mail函数

3.C程序设计总结

(1)学了一年的c语言了,本来以为自己对编程序有了一些了解,但是第一次接触这个程序的时候,我的感觉就是无从下手,看着如此复杂的程序,那时清楚的感受到自己的能力问题。我们利用了一天时间选了一道编程题,并简单的对它进行分析。首先,我们找到它的主程序,再根据主程序需要设计几个分支,利用参数传递的方法,使得我们的程序结构比较清晰,层次感比较分明。我们在编写的过程中充分引用我们学到的知识点,比如:数组,链表,switch语句,并让函数之间互相引用,减少一些繁琐的步骤。
(2)在编译的时候,遇到了不少问题,好多学过的知识点都有所遗忘,我们在学习的过程中也在不断的复习。在调试的时候,也有不少出错的地方,当时感觉真麻烦啊,然后就不断的翻资料,请教老师,同学。然后一点一点的找到错误的那种感觉也是挺好的

4.结束语

短短几天的实践周带给了我们很多的收获,学到了很多知识,也提高了自己的实际动手能力和独立思考能力。在实践中我们运用所学知识,发现,提出,分析和解决实际问题,并且也从中发现了我们的不足。C语言不仅仅是一门语言,它更是我们使用电脑的一种工具,能够帮助我们更好更快的解决问题,是一门实用性极强的课程,掌握并且熟练地使用它将会是我们计算机专业的学生必须要做的。通过这次课程设计,使我们懂得了理论和实践相结合很重要,从理论中得出结论,加深对C语言的理解,提升自己的编程思想,丰富经验。
在做设计的时候,最重要的是团队的力量,小组内成员互相交流,查漏补缺,反复修改完善,运用集体的智慧,团结合作解决问题。所以,通过这些天的努力和老师的指导帮助,我们终于做出了这个学生信息管理系统。在此过程中,我们体会到了团队合作的重要性,同时我们各方面的能力也得到了提升,也许在以后的学习生活中我们会做的更好。

5.参考文献

[1]施荣华,刘卫国.C程序设计与应用.北京:中国铁道出版社,1999.
[2]向南平.实用C语言程序设计.长沙:中南工业大学出版社,1994

6.附录

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
#define max 20
typedef struct student //学生信息输入 (结构体类型名) 
  { 
    char sno[max]; // 学号 
    char sname[max]; //姓名 
    char age[max]; //年龄 
    char sex[max]; //性别 
    char born[max];//出生年月 
    char dress[max];//地址 
    char phone[max];//电话 
    char mail[max];//E-mail 
    struct student *next; 
  } student; //“;”不能省略     student属于结构体变量 
    student *head; //输出链表,用头指针作为参数 
void ElePrint(char str[]) //输出单个元素 ,定义一个str[]; 
  { 
    if(str==NULL) //如果str是空指针 ,判断str字符串是否存在 
    exit(0); //正常状态退出 
    printf("%s",str); //输出信息 
    for(unsigned int i=2;i<12-strlen(str);i++) //strlen函数可以返回字符串的函数  “i”用来控制两个信息之间的间距 
    printf(" ");//为了对齐输出,需插入一些空格 控制信息之间的距离 
    return; 
  } 

int LinePrint(student *ptr) //输出一行 ,后边会引用 
  { 
    if(ptr==NULL) //检查传进来的指针 ,判断ptr字符串是否存在 
    exit(0);//使用“return 0;”也行,作用是正常状态退出 
    printf("\n"); 
    ElePrint(ptr->sno); //利用参数传递,利用指向结构体的指针变量引用结构体成员 
    ElePrint(ptr->sname); 
    ElePrint(ptr->age); 
    ElePrint(ptr->sex); 
    ElePrint(ptr->born);
    ElePrint(ptr->dress);
    ElePrint(ptr->phone);
    ElePrint(ptr->mail);
    return 1; 
  } 
void print() //输出全部学生信息 ,后边会引用 
   { 
	student *ptr=head; //*ptr表示取该地址处储存的变量的值 
	printf("\n学号\t姓名\t  年龄\t    性别   出生年月\t地址\t  电话\t  E-mail"); 
	while(ptr) 
	{ 
		LinePrint(ptr); //参数传递 
		ptr=ptr->next; //表示输出下一个学生的信息 
	} 
	printf("\n"); 
	return; 
   } 
void regist() //1.录入学生信息 
  { 
    system("cls");//清屏 
    char ch; //用来判断是否继续录入 
    student *s,*ptr; //s用来建新结点,ptr用来暂存头结点 
    do 
      { 
        s=(student*)malloc(sizeof(student)); // 新建一个学生结点 
        printf("\n开始录入学生信息..."); //开始录入
        printf("\n请输入该学生的学号:"); 
        scanf("%s",s->sno); //把sno的值录入新的节点s中 
  		printf("\n请输入该学生的姓名:"); 
		scanf("%s",s->sname); 
		printf("\n请输入该学生的年龄:"); 
		scanf("%s",s->age); 
		printf("\n请输入学生的性别:"); 
		scanf("%s",s->sex); 
		printf("\n请输入学生的出生年月:"); 
		scanf("%s",s->born);
		printf("\n请输入学生的地址:"); 
		scanf("%s",s->dress);
		printf("\n请输入学生的电话:"); 
		scanf("%s",s->phone);
		printf("\n请输入学生的E-mail:"); 
		scanf("%s",s->mail);
		ptr=head; 
		head=s;//将新结点插入队头 
		s->next=ptr; 
		fflush(stdin); //清空输入缓存区 
		printf("\n请问是否继续录入?(Y/N)"); 
		scanf("%c",&ch); 
	  } while(ch=='Y'||ch=='y'); 
  		return; 
  }  
void scan()//2.浏览信息 
{
    system("cls");	//清屏 
    printf("*提供全部学生信息*") ;	
    print(); //直接引用“void print()”函数 
}
void search()//3.查询模块 
	{ 
	  system("cls");//清屏 
	  int method;//查询方式 
	  char no[max],name[max];//用来接收查询关键字 
	  while(1) 
	 	{ 
		  printf("\n请选择查询方式"); 
		  printf("\n1.按学号查询");//用到上边定义的no[max] 
		  printf("\n2.按姓名查询"); //用到上边定义的name[max]; 
		  printf("\n3.打印全部学生信息"); 
		  printf("\n4.返回主菜单\n"); 
		  scanf("%d",&method); 
		  student *p=head,*temp; 
		switch(method) 
		  { 
			case 1: 
			printf("\n请输入要查询的学号:"); 
			scanf("%s",no); 
			while(p) 
			 { 
			   if(!strcmp(p->sno,no)) //“strcmp”是字符串比较函数,比较系统中的学号跟你输入的学号是否相等 
				break; 
 				else 
 				{ 
				  temp=p; 
				  p=p->next; 
   				} 
			} 
			printf("\n学号\t姓名\t  年龄\t    性别   出生年月\t地址\t  电话\t  E-mail");  
			LinePrint(p); 
			break;
			case 2:
			printf("\n请输入学生的姓名:");
			scanf("%s",name);
			printf("\n学号\t姓名\t  年龄\t    性别   出生年月\t地址\t  电话\t  E-mail"); 
			while(p)
			{
				if(!strcmp(p->sname,name));//“strcmp”是字符串比较函数,比较系统中的姓名跟你输入的姓名是否相等 
				LinePrint(p);
				p=p->next ;
			}
			break;
			case 3: 
			print(); //输出所有学生的所有信息 
			break; 
			case 4: 
			return; //直接返回主菜单 
			default: 
			printf("很抱歉,暂无此查询方式!"); 
			break; 
		  }
		} 
	
	} 
void modify()//4.修改学生信息 
	{ 
	  system("cls");//清屏 
	  char num[max]; //定义一个num数组 
 	  student *p=head; 
	  printf("\n请输入要修改的学生的学号:"); 
	  scanf("%s",num); 
	  while(p) 
		{ 
		  if(!strcmp(p->sno,num)) 
		  break; //如果sno跟num的字符串长度一样 ,使用break函数直接转至第168行 
		  else 
		  p=p->next; //用strcmp将num一个一个跟sno比较 
	    } 
		  if(p==NULL) //判断p是否存在 
 		{ 
		  printf("\n错误:没有此学生的信息!\n"); 
		  return; //退出修改学生信息界面 
		} 
 		  LinePrint(p); 
		  printf("\n请输入要修改的该学生的信息:"); 
		  printf("\n1.姓名"); 
		  printf("\n2.年龄"); 
		  printf("\n3.性别"); 
		  printf("\n4.出生年月"); 
		  printf("\n5.地址"); 
		  printf("\n6.电话"); 
		  printf("\n7.E-mail"); 
		  char name1[max],se1[max],ag1[max]; 
		  char bor1[max],dres1[max],phon1[max],mail1[max];
		  int select; 
		  fflush(stdin); //清空输入缓存区
	      printf("\n");	 
	      printf("你选择的是:"); 
		  scanf("%d",&select); 
		  printf("\n请输入新的信息:"); 
		  switch(select) 
		    { 
		    	case 1: 
			   scanf("%s",name1); 
			   strcpy(p->sname,name1); //strcpy是复制函数,将新输入的信息“name1”复制到sname中 
			   break; 
			   case 2: 
			   scanf("%s",se1); 
			   strcpy(p->sex,se1); //同上 
			   break; 
			   case 3: 
			   scanf("%s",ag1); 
			   strcpy(p->age,ag1); //同上 
			   break; 
			   case 4: 
			   scanf("%s",bor1); 
			   strcpy(p->born,bor1); //同上 
			   break; 
			   case 5: 
			   scanf("%s",dres1); 
			   strcpy(p->dress,dres1); //同上 
			   break; 
			   case 6: 
			   scanf("%s",phon1); 
			   strcpy(p->phone,phon1); //同上 
			   break; 
   			   case 7: 
			   scanf("%s",mail1); 
			   strcpy(p->mail,mail1); //同上 
			   break; 
			   default: 
			   printf("\nError!"); 
			   break; 
 			} 
 			//	LinePrint(p); 
				return; //返回主菜单 
	}   
void del()// 5.删除某学生的信息 
	{ 
	    system("cls");//清屏 
		student *p=head,*temp=head,*s; 
		char num1[max]; 
		printf("\n请输入要删除的学生的学号:"); 
		scanf("%s",num1); 
		while(p)//查找该学生所在的结点 
		{ 
			if(!strcmp(p->sno,num1)) //strcmp是比较函数 
			break; //如果能查找到该学生所在节点,转至242行,输出此学生信息 
			else 
			{ 
				temp=p; 
				p=p->next; 
			} 
		}//while 
		if(p==NULL) //判断是否存在 
		{ 
			printf("\n不存在此学生的信息."); 
			return; 
		} 
		LinePrint(p);//输出该学生的信息 
		printf("\n请问真的要删除该学生的信息吗?(Y/N)"); 
		char ch; 
		fflush(stdin); //清除输入缓存区 
		scanf("%c",&ch); 
		if(ch=='Y'||ch=='y') 
			{ 
				s=p->next; 
				temp->next=s; 
				free(p); //释放p中的信息 
				printf("\n已经删除该学生的信息."); 
			} 
		return; //返回主菜单 
	} 
void quit() //6.退出程序 
	{ 
	    system("cls");
		char ch; 
		printf("\n真的要退出?(Y/N)"); 
		fflush(stdin); //清空输入缓存区 
		scanf("%c",&ch); 
		if(ch=='Y'||ch=='y') 
		exit(0); //正常退出 
		return; //返回主菜单 
	} 
int main() //主程序 
	{ 
		int option; 
		printf("\n\tWelcome to the student information management system!\n"); 
		printf("\n\t\t欢迎使用学生信息管理系统!\n"); 
		//系统界面 	
		while(1) 
		{ 
		    system("color 2f");
		    printf("\n\t\t* * * * * * * * * * * * * *");
			printf("\n\t\t* 请选择需要的服务:       *");
			printf("\n\t\t*                         *"); 
			printf("\n\t\t*    1.录入学生信息       *"); 
			printf("\n\t\t*    2.学生信息浏览       *"); 
			printf("\n\t\t*    3.学生信息查询       *"); 
			printf("\n\t\t*    4.修改学生信息       *"); 
			printf("\n\t\t*    5.删除学生信息       *");  
			printf("\n\t\t*    6.退出学生管理系统   *");
			printf("\n\t\t*                         *");
			printf("\n\t\t* * * * * * * * * * * * * *");
			printf("\n\t\t  你选择的是:"); 	
			scanf("%d",&option); //option是提供选择
			switch(option) 
			{ 
				case 1: 
				regist(); 
				system("cls");
				break; 
				case 2:
				scan();
				break;
				case 3: 
				search(); 
				system("cls");
				break; 
				case 4: 
				modify(); 
				system("cls");
				break; 
				case 5:
				del();
				system("cls");
				break;
				case 6: 
				quit(); 
				system("cls");
				break; 
			} 
	
		} 
		return 0; 
	}
  • 1
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DATA数据猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值