标题:我写的学生信息管理系统,请多多指教
只看楼主
what!
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2010-5-18
 问题点数:0 回复次数:0 
我写的学生信息管理系统,请多多指教
实际应用中的管理系统,信息都是海量的,数据自然应该存储在数据库里。之前也用C和嵌入式SQL写过一个学生信息管理系统。现在这个是数据结构版的,目的只是想练习一下指针和链表
代码如下:(该代码在vc++6.0下运行)

#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;
}
}

}

void modify()//修改学生信息
{
char num[max];
student *p=head;
printf("\n请输入要修改的学生的学号:");
scanf("%s",num);
while(p)
{
if(!strcmp(p->sno,num))
break;
else
p=p->next;
}
if(p==NULL)
{
printf("\n错误:没有此学生的信息!\n");
return;

}
LinePrint(p);

printf("\n请输入要修改的该学生的信息:");
printf("\n1.姓名");
printf("\n2.性别");
printf("\n3.年龄");
printf("\n4.所在的系");
printf("\n5.所在的班");
printf("\n6.所在的年级");

char name1[max],sex1[max],age1[max],depart1[max],class1[max],grade1[max];
int select;
fflush(stdin);
scanf("%d",&select);
printf("\n请输入新的信息:");

switch(select)
{
case 1:
scanf("%s",name1);
strcpy(p->sname,name1);
break;
case 2:
scanf("%s",sex1);
strcpy(p->sex,sex1);
break;
case 3:
scanf("%s",age1);
strcpy(p->age,age1);
break;
case 4:
scanf("%s",depart1);
strcpy(p->depart,depart1);
break;
case 5:
scanf("%s",class1);
strcpy(p->classs,class1);
break;
case 6:
scanf("%s",grade1);
strcpy(p->grade,grade1);
break;
default:
printf("\nError!");
break;
}

LinePrint(p);
return;
}


void del()// 删除某学生的信息
{
student *p=head,*temp=head,*s;
char num1[max];
printf("\n请输入要删除的学生的学号:");
scanf("%s",num1);
while(p)//查找该学生所在的结点
{
if(!strcmp(p->sno,num1))
break;
else
{
temp=p;
p=p->next;
}

}//while
if(!p)  
{
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);
printf("\n已经删除该学生的信息.");
}
return;
}

void sort() //排序模块。将学生记录按学号从小到大排列。用起泡排序算法实现
{

student *ptr,*s=head,*p;
int count=0,count1;
while(s)//统计链表结点个数
{
count++;
s=s->next;
}

for(int i=1;i<count;i++)
{
ptr=head;
p=NULL;
count1=count-i; //用来控制每轮起泡排序的终点,即每次把学号最小的结点移到倒数第i个结点
while(ptr&&ptr->next&&(count1--))
{
if(strcmp(ptr->sno,ptr->next->sno)>0)
{
s=ptr->next;
ptr->next=s->next;
if(p==NULL) //ptr处于队头时
head=s;
else
p->next=s;
s->next=ptr;
p=s;
}
else
{
ptr=ptr->next;
if(p==NULL) //ptr处于队头时
p=head;
else
p=p->next;
}
}
}
return;
}




void quit()
{
char ch;
printf("\n真的要退出?(Y/N)");
fflush(stdin);
scanf("%c",&ch);
if(ch=='Y'||ch=='y')
exit(0);
return;
}


int main()
{
int option;

printf("\nCopyright@2005 KongXinCai All rights reserved.");
printf("\n欢迎使用学生信息管理系统!\n");

//登录模块
int icheck=0;
while(icheck<3)
{
if(LogOn()==0)
icheck++;
else
break;

}
if(icheck==3)
{
printf("\n连续登录三次不成功,退出!");
exit(0);
}

//系统界面

while(1)
{
printf("\n\n请选择需要的服务:");
    printf("\n1.注册");
    printf("\n2.查询");
    printf("\n3.修改");
    printf("\n4.删除");
    printf("\n5.排序");
    printf("\n6.退出\n");

scanf("%d",&option);

switch(option)
{
case 1:
regist();
break;
case 2:
search();
break;
case 3:
modify();
break;
case 4:
del();
break;
case 5:
sort();
break;
case 6:
quit();
break;
}

}


return 0;

}
 
搜索更多相关主题的帖子: 信息管理系统 学生 指教 
2010-05-19 21:41



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-307386-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.554240 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved