学生信息管理系统

来源:互联网 发布:型钢重量计算软件 编辑:程序博客网 时间:2024/04/27 18:51

/*
系统相当的不完善
1 输入两个相同的学号以后 查询时只能显示第二次输入的学号 修改时也只能修改第

二次输入的学号
  只有删除了第2次输入的学号才能对第一次输入的学号做相应的操作;这是一个

BUG!

2 在电脑中新建一个文本文档来存储输入的数据,实现记忆的功能 回到英汉词典的

问题

3 排序方法的实现

4 用户登录时 退格键的使用有问题 如果直接退格 视为登录密码错误

                        modify by 2010-5-12 16:30 zhengchengpeng

*/

#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()  //登录模块,已实现输入密码不回显,如果中途发现输错某几位,可

退格键重输
{
 int  i=0;
 char username[MAX];
 char password[MAX];

 printf("/n请输入用户名:");
 scanf("%s",username);
 printf("/n请输入密码(最多15位):");

 //开始以不回显且支持退格方式获取输入密码
 
 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,"zhengchengpeng")&& !(strcmp

(password,"870219")))
 {
  printf("/n登录成功!");
  return 1;
 }
 else  
  return 0;

}

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

     s = (student*)malloc(sizeof(student)); // 新建一个学生结点
 
     printf("/n开始注册.../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');
}

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];
 char name[MAX];
 char departm[MAX];
 char clss[MAX];
  //char    grades[MAX]; //用来接收查询关键字
 while(1)
 {
  printf("/n请选择查询方式");
  printf("/n1.按学号查询");
  printf("/n2.按姓名查询");
     printf("/n3.按所在系查询");
     printf("/n4.按所在班级查询");
   //printf("/n5.按所在年级查询");
  printf("/n5.打印全部学生信息");
     printf("/n6.返回主菜单/n");

     scanf("%d",&method);

     student *p=head;
  student *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 5:
       print();
       break;
   
      case 6:
       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];
 char sex1[MAX];
 char age1[MAX];
 char depart1[MAX];
 char class1[MAX];
// char 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 delete_()// 删除某学生的信息
{
 student *p = head;
 student *temp = head;
 student *s;
 char num1[MAX];
 char ch;

 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)");  
 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("/r/n/t/tCopyright@2010 zhengchengpeng   All rights

reserved./n");
 printf("/r/n/t/t/t欢迎使用学生信息管理系统!/r/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:
   delete_(); break;
  case 5:
   sort(); break;
  case 6:
   quit(); break;
  }
 }
 return 0;
}

原创粉丝点击