我写的学生信息管理系统(数据结构版),请多多指教

qianjinrail 2006-01-01 03:41:01
我是计算机专业大四的学生,其实编程的时间不长,只是在最近半年陆续写了点。这个管理系统,我花了一天的时间完成。包括写代码到调试成功。

实际应用中的管理系统,信息都是海量的,且需要长期保存在硬盘中,数据自然应该存储在数据库里。之前也用C和嵌入式SQL写过一个学生信息管理系统。现在这个是数据结构版的,目的只是想练习一下指针和链表等等
代码如下:(该代码在vc++6.0下运行)

//  该管理系统的登录用户名为zhang密码为8147086 在代码中也可找到


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

#define max 20

typedef struct student //学生
{
char sno[max]; // 学号
char sname[max]; //姓名
char sex[max]; //性别
char age[max]; //年龄
char depart[max]; //系
char classs[max]; //班
char grade[max]; //年级

struct student* next;
} student;

student* head;


int LogOn() //登录模块,已实现输入密码不回显,如果中途发现输错某几位,可退格键重输
{
char username[max],password[max];
printf("\n请输入用户名:");
scanf("%s",username);
printf("\n请输入密码(最多15位):");

//开始以不回显且支持退格方式获取输入密码
int i=0;
while((i>=0)&&(password[i++]=getch())!=13)//条件i>=0是用于限制退格的范围
{
if(password[i-1]=='\b')//对退格键的处理
{
printf("%c%c%c",'\b','\0','\b');
i=i-2;
}
else
printf("*");
}
password[--i]='\0';

//已获取密码。验证用户身份
if(!strcmp(username,"zhang")&&!strcmp(password,"8147086"))
{
printf("\n登录成功!");
return 1;
}
else
return 0;

}

void regist()
{
char ch;
student *s,*ptr; //s用来建新结点,ptr用来暂存头结点

do
{

s=(student*)malloc(sizeof(student)); // 新建一个学生结点


printf("\n开始注册..."); //开始注册
printf("\n请输入该学生的学号:");
scanf("%s",s->sno);
printf("\n请输入该学生的姓名:");
scanf("%s",s->sname);
printf("\n请输入该学生的性别:");
scanf("%s",s->sex);
printf("\n请输入该学生的年龄:");
scanf("%s",s->age);
printf("\n请输入该学生的系:");
scanf("%s",s->depart);
printf("\n请输入该学生所在的班:");
scanf("%s",s->classs);
printf("\n请输入该学生所在的年级");
scanf("%s",s->grade);

ptr=head;
head=s;//将新结点插入队头
s->next=ptr;

fflush(stdin);
printf("\n请问是否继续注册?(Y/N)");
scanf("%c",&ch);
}while(ch=='Y'||ch=='y');

return;
}

void ElePrint(char str[]) //输出单个元素
{
if(str==NULL) exit(0);
printf("%s",str);
for(unsigned int i=0;i<12-strlen(str);i++) printf(" ");//为了对齐输出,需插入一些空格
return;
}

int LinePrint(student *ptr) //输出一行
{
if(ptr==NULL) //检查传进来的指针
return 0;

printf("\n");
ElePrint(ptr->sno);
ElePrint(ptr->sname);
ElePrint(ptr->age);
ElePrint(ptr->sex);
ElePrint(ptr->depart);
ElePrint(ptr->classs);
ElePrint(ptr->grade);

return 1;
}

void print() //输出全部学生信息
{
student *ptr=head;
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
while(ptr)
{
LinePrint(ptr);
ptr=ptr->next;
}
printf("\n");
return;
}
void search()//查询模块
{
int method;//查询方式
char no[max],name[max],departm[max],clss[max],grades[max]; //用来接收查询关键字
while(1)
{
printf("\n请选择查询方式");
printf("\n1.按学号查询");
  printf("\n2.按姓名查询");
printf("\n3.按所在系查询");
printf("\n4.按所在班级查询");
printf("\n5.按所在年级查询");
printf("\n6.打印全部学生信息");
printf("\n7.返回主菜单\n");

scanf("%d",&method);

student *p=head,*temp;

switch(method)
{
case 1:
printf("\n请输入要查询的学号:");
scanf("%s",no);
while(p)
{
if(!strcmp(p->sno,no))
break;
else
{
temp=p;
p=p->next;
}
}
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
LinePrint(p);
break;
case 2:
printf("\n请输入要查询的姓名:");
scanf("%s",name);
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
while(p)
{
if(!strcmp(p->sname,name))
LinePrint(p);
p=p->next;
}
break;
case 3:
printf("\n请输入学生所在的系:");
scanf("%s",departm);
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
while(p)
{
if(!strcmp(p->depart,departm))
LinePrint(p);
p=p->next;
}
break;
case 4:
printf("\n请输入学生所在的班:");
scanf("%s",clss);
printf("\n请输入学生所在的年级:");
scanf("%s",grades);
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
while(p)
{
if(!strcmp(p->classs,clss)&&!strcmp(p->grade,grades))
LinePrint(p);
p=p->next;
}
break;

case 5:
printf("\n请输入学生所在的年级:");
scanf("%s",grades);
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
while(p)
{
if(!strcmp(p->grade,grades))
LinePrint(p);
p=p->next;
}
break;

case 6:
print();
break;

case 7:
return;
default:
printf("很抱歉,暂无此查询方式!");
break;
}
}

}
...全文
1389 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
lengsehuoyan 2006-01-09
  • 打赏
  • 举报
回复
学习!
qianjinrail 2006-01-08
  • 打赏
  • 举报
回复
呵呵 学海无涯 回头是岸的建议 不错 还有根指针最好不要设为静态变量,应该作为行参传入 可否说一下理由???
qianjinrail 2006-01-08
  • 打赏
  • 举报
回复
呵呵 小明指出的问题确实存在 看来对头结点的删除是个特殊情况 应当另行处理


月满C楼 空形参中加void在教材中未见过 我再去找一下 head未赋初值是个失误 谢谢提醒

fflush(stdin) 这个函数我也是知其然不知其所以然 只知道在有些地方getchar()和scanf函数会不执行 加上这个后就解决了
结构体的建议很好 search中的temp是从del模块中拿过来的 是个失误 在del中用来保存被删除结点的前一个结点 在这里无用 if else 也不一定非要一起吧
我不知道字符可以这样对齐输出 呵呵
modify中 search函数只是一个模块 不是一个根据参数操作的函数 无法调用
看了你的自我介绍 我深为惭愧 呵呵
RainWindy 2006-01-05
  • 打赏
  • 举报
回复
先看看。
karlfly 2006-01-04
  • 打赏
  • 举报
回复
弓虽!
youzelin 2006-01-04
  • 打赏
  • 举报
回复
真的很不错
bo.cui 2006-01-04
  • 打赏
  • 举报
回复
楼上 :
知道head是NULL 所以说 是风格问题
写上head=NULL 比较好 看上去也会比较舒服 尽量不要依赖编译器进行初始变量值
hellobcb 2006-01-04
  • 打赏
  • 举报
回复
//ptr=head; 虽然是对的! 但是尽量让head先有个值,风格问题。
这里head是静态变量,默认为NULL,而且初始只能是NULL
hellobcb 2006-01-04
  • 打赏
  • 举报
回复
//删除函数部分
s=p->next;
temp->next=s;
free(p);
//作如下修改就可以了
if(p==head)//这个结构类似堆栈的指针实现,此处排除了删除栈顶元素的特殊情况
head=p->next;
else
temp->next=p->next;
free(p);
还有根指针最好不要设为静态变量,应该作为行参传入
dx30611 2006-01-03
  • 打赏
  • 举报
回复
LZ要把自己写的程序收藏起来
等你水平提高了再回过头来看看,你会学到很多东东
shenmea00000 2006-01-03
  • 打赏
  • 举报
回复
楼上的,不错啊,呵呵
clever101 2006-01-02
  • 打赏
  • 举报
回复
提一点小意见,在命名方面最好应英文,如search_chengji最好改为search_mark
bo.cui 2006-01-02
  • 打赏
  • 举报
回复
clever101(小明)说的以外:

void regist() 中:
尽量void regist(void)吧,养成风格很重要的,毕竟以后要和别人一起写东西的!
ptr=head; 虽然是对的! 但是尽量让head先有个值,风格问题。
fflush(stdin); 此函数尽量不要用,很多编译器不支持,兼容问题。
return; return 0;比较好吧! return;DEV-C++调成c99就过不去了!

void search()//查询模块:
//用来接收查询关键字 建议定义成一个结构体,虽然浪费了4B,但会使程序更清晰。
*temp是干什么用的?


int LinePrint(student *ptr):
if最好和else一起用。


void ElePrint(char str[])
对齐?用格式输出不是更好吗?printf("%12s","aaaaa");


void modify():
此中的查找功能何不调用您写的查找函数?使程序代码更清晰,功能更强大。

void sort():没看,不知道什么叫泡沫,我还没学到数据结构那!

还有2点
1:楼主exit()和return用的都不是很恰当,exit(0)多用于因人为输入或程序异常时候的退出,return则用于正常的返回或退出。比如某程序需要打开一个文件,如果可以正常打开并且处理完毕,就用return 0结束,如果文件没能打开,用exit(0)结束程序,这样,看原代的时候,就明白什么时候是按照希望的结果退出,什么时候是出现异常退出的了。
2:输出内容的时候,尽量加一些getch()或者空循环,否则,别人还没看到是什么内容,就闪过去了。


本人20,大专未毕业,全学校就剩我们一个班级了,17个人,我们毕业了,学校就要关门了,爱好程序,主要是自学,以上都是个人观点,也不知道对错,希望不要误人子弟。

很喜欢交爱计算机的朋友,msn:cuibo1224@163.com
szh3210 2006-01-02
  • 打赏
  • 举报
回复
学习
argenCHN 2006-01-02
  • 打赏
  • 举报
回复
学习下
clever101 2006-01-02
  • 打赏
  • 举报
回复
我看了一下你的程序(学生信息管理系统(数据结构版)),,觉得你的程序有一个隐蔽的大错误。接着我试着运行了一下你的程序,证实了我的判断。你的注册函数是将每一个新节点都成为头节点。这样做有很大弊端,你试一下输入几个数据,然后把最后一个数据删除,然后再查询这个数据,你会发现程序会出错,原因是此时你的头节点已删除,链表已不复存在。还有你试着把输入的全部数据删除,你也会发觉会出错,因为你的头节点的内存空间是在注册函数void regist()申请的,表面上这样的内存空间是有效的,基本上也能实现删除,但是你把链表的头节点删除了就会出错或者你根本删除不了头节点。我认为建立链表要么使用双指针,要么使用指针返回类型的函数。
Azure_ceil 2006-01-02
  • 打赏
  • 举报
回复
支持一下...不错的说..
ywchen2000 2006-01-01
  • 打赏
  • 举报
回复
#include<stdlib.h>
#include<stdio.h>
struct list{
int num;
char name[256];
int china;
int english;
int math;
struct list *next;
};
typedef struct list node;
typedef node *link;
printf_list(link head)
{
link pointer;
pointer=head;
while(pointer!=NULL)
{
printf("number:%d\n",pointer->num);
printf("name:%s\n",pointer->name);
printf("china:%d\n",pointer->china);
printf("english:%d\n",pointer->english);
printf("math:%d\n",pointer->math);
pointer=pointer->next;
}
}
link creat_list(link head)
{
int cnum;
char cname[256];
int cchina;
int cenglish;
int cmath;
link pointer,new;
int i;
head=(link)malloc(sizeof(node));
if(head==NULL)
{ printf("memory allocate failure!!\n");
exit(0);}
else{
printf("please input number:");
scanf("%d",&cnum);
printf("please input name:");
scanf("%s",&cname);
printf("please input china:");
scanf("%d",&cchina);
printf("please input english:");
scanf("%d",&cenglish);
printf("please input math:");
scanf("%d",&cmath);
head->num=cnum;
for(i=0;i<256;i++)
{
head->name[i]=cname[i];
}
head->china=cchina;
head->english=cenglish;
head->math=cmath;
head->next=NULL;
pointer=head;
while(1)
{
new=(link)malloc(sizeof(node));
if(new==NULL){
printf("memory allocate failure!!\n");
exit(0);}
printf("please input number:");
scanf("%d",&cnum);
if(cnum==0){
break; }
printf("please input name:");
scanf("%s",cname);
printf("please input china:");
scanf("%d",&cchina);
printf("please input english:");
scanf("%d",&cenglish);
printf("please input math:");
scanf("%d",&cmath);
new->num=cnum;
for(i=0;i<256;i++){
new->name[i]=cname[i];}
new->china=cchina;
new->english=cenglish;
new->math=cmath;
new->next=NULL;
pointer->next=new;
pointer=new;
}
}
return head;
}
search_chengji(int key1,link head)
{
link pointer;
pointer=head;
while(pointer!=NULL)
{
if(pointer->num==key1)
{
printf("number:%d\n",pointer->num);
printf("name:%s\n",pointer->name);
printf("china:%d\n",pointer->china);
printf("english:%d\n",pointer->english);
printf("math:%d\n",pointer->math);
}
pointer=pointer->next;
}
}
link modify_chengji(link head,int key3)
{

link pointer;
char xname[256];
int xchina;
int xenglish;
int xmath;
int choose,i;
pointer=head;
printf("enter 0 exit modefiy\n");
printf("enter 1 modefiy name\n");
printf("enter 2 modefiy china\n");
printf("enter 3 modefiy english\n");
printf("enter 4 modefiy math\n");
scanf("%d",&choose);
switch(choose)
{
case 1:
printf("please input name:");
scanf("%s",&xname);
break;
case 2:
printf("please input china:");
scanf("%d",&xchina);
break;
case 3:
printf("please input english:");
scanf("%d",&xenglish);
break;
case 4:
printf("please input math:");
scanf("%d",&xmath);
break;
}
while(1){
pointer=pointer->next;
if(pointer->num==key3)
{
if(choose==1)
{ for(i=0;i<256;i++)
{
pointer->name[i]=xname[i];
}
break;
}
else if(choose==2)
{ pointer->china=xchina;
break;}
else if(choose==3)
{ pointer->english=xenglish;
break;
}
else if(choose==4)
{pointer->math=xmath;
break;}
}
}
return head;
}
link delete_chengji(link head,int key2)
{
link pointer;
link back;
pointer=head;
while(1)
{
if(head->num==key2)
{ head=pointer->next;
free(pointer);
break;
}
back=pointer;
pointer=pointer->next;
if(pointer->num==key2)
{
back->next=pointer->next;
free(pointer);
break;}
}
return head;
}
link insert_chengji(link head,link new,int key3)
{
link pointer;
pointer=head;
while(1)
{
if(pointer==NULL){
new->next=head;
head=new;
break;}
if(pointer->num==key3){
new->next=pointer->next;
pointer->next=new;
break;}
pointer=pointer->next;
}
return head;
}
pingjufen(link head)
{
link pointer;
int pchina,ppchina;
int penglish,ppenglish;
int pmath,ppmath;
int count;
pchina=0;
penglish=0;
pmath=0;
count=0;
pointer=head;
while(1)
{
pchina=pchina+pointer->china;
penglish=penglish+pointer->english;
pmath=pmath+pointer->math;
count=++count;
if(pointer->next==NULL)
{
break;
}
pointer=pointer->next;
}
ppchina=pchina/count;
ppenglish=penglish/count;
ppmath=pmath/count;
printf("china ping jun fen:%d\n",ppchina);
printf("english ping jun fen:%d\n",ppenglish);
printf("math ping jun fen:%d\n",ppmath);
}
main()
{
for(;;)
{
link head;
link new;
int key;
int keynum;
printf("0>exit the programm.\n");
printf("1>create list.\n");
printf("2>search chengji.\n");
printf("3>modify chengji.\n");
printf("4>delete chengji.\n");
printf("5>add chengji.\n");
printf("6>pingjunfeng.\n");
printf("7>print chengji.\n");
scanf("%d",&key);
switch(key){
case 0:
exit(0);
case 1:
head=creat_list(head);
if(head!=NULL)
{ printf_list(head);}
break;
case 2:
printf("please input 0 Exit.\n");
printf("please input number for search:");
scanf("%d",&keynum);
if(keynum==0){
break; }
search_chengji(keynum,head);
break;
case 3:
printf("please input number for modify:");
scanf("%d",&keynum);
head=modify_chengji(head,keynum);
if(head!=NULL)
{
printf_list(head);
}
break;
case 4:
printf("please input 0 exit\n");
printf("please input number for delete:");
scanf("%d",&keynum);
if(keynum==0){
break; }
head=delete_chengji(head,keynum);
break;
case 5:
if(head!=NULL){
new=(link)malloc(sizeof(node));
printf("please input number:");
scanf("%d",&new->num);
if(new->num==0){
break;}
printf("please input name:");
scanf("%s",&new->name);
printf("please input china:");
scanf("%d",&new->china);
printf("please input english:");
scanf("%d",&new->english);
printf("please input math:");
scanf("%d",&new->math);
printf("please input the data number for insert:");
scanf("%d",&keynum);
head=insert_chengji(head,new,keynum);
if(head!=NULL) {
printf_list(head);}
}
break;
case 6:
pingjufen(head);
break;
case 7:
printf_list(head);
break;
}
}
}
zhangxing10 2006-01-01
  • 打赏
  • 举报
回复
学习了!
appleyy 2006-01-01
  • 打赏
  • 举报
回复
学习
加载更多回复(10)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧