学生档案系统.cpp

本文介绍了一个用于创建、显示、删除、添加、查找学生信息,并进行密码修改和保存资料的系统。系统提供了丰富的功能,包括按学号和姓名查找学生信息、显示学生总数、保存和读取资料等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


#include <stdio.h>
#include <string.h>
#include <malloc.h>

#define NULL 0 

#define LEN sizeof (struct student)

struct student {
 int num;
 char name[10];
 char sex[5];
 char birthday[10];            
 struct student *prev; 
 struct student *next;  
};


struct student *creat(void)
{
 struct student * head,*tail;
 struct student *p1,*p2,*p3;
 int n=0;
 int i;
   
 p1= (struct student * )malloc(LEN);
    printf ("请依次输入:/n学生学号/t姓名/t性别/t生日/t:输入“0”结束/n");
 printf("学生学号:");scanf("%d",&p1->num);getchar();
 printf("姓名:");gets(p1->name);
 printf("性别:");gets(p1->sex);
 printf("生日:");gets(p1->birthday);

 
 p1->next=NULL;
 p1->prev=NULL;
 while (p1->num != 0)
 {
  n=n+1;
     if (n == 1)
   head=p1;
     else
  {
   p2->next=p1;
   p1->prev=p2;
   p1->next=NULL;
   
  }
     p2=p1;
     p1=(struct student * )malloc (LEN);
rp1:      printf("学生学号:");scanf("%d",&p1->num);
   p3=head;
       for(i=0;i<n;i++ )
    {
    if (p1->num!=p3->num)
      p3=p3->next;
          else 
    {
       printf("学号重复,请重输!/n");
                goto rp1;

    }
    }
    getchar();
     printf("姓名:");gets(p1->name);
     printf("性别:");gets(p1->sex);
     printf("生日:");gets(p1->birthday);
   

    
 }
 if(p1->num == 0)
 {
  tail=p2;
 
 }
 
 
 return(head);
}


void print(struct student * head)
{
 struct student *p;

 p=head;
 if (p== NULL)
 {
  printf("尚未建立学生信息/n");
  return;
  
 }
 else
    { printf("/n 学生信息如下:/n");
     printf("学号/t姓名/t性别/t生日/t/n");
  while ( p != NULL)
  {printf("%d/t%s/t%s/t%s/n",p->num,p->name,p->sex,p->birthday);
  p=p->next;
  }
 }
 
}


struct student *del(struct student *head ,int num)
{
 struct student *p1,*p2,*p3;
    if (head == NULL)
 {
  printf("/n尚未建立学生信息/n");
 }
 
    p1=head ;
    while (num != p1->num &&p1->next!=NULL)
 {
     p2=p1;
     p1=p1->next;
 }
    if(num == p1->num)
 {
  if (p1==head)
  {
       head=p1->next;
    free(p1);
  }
       else if(num==p1->num&&p1->next != NULL)
    {
   
     p3=p1->next;
     p3->prev=p2;
     p2->next=p3;
     free(p1);
    }
    else if(num== p1->num&& p1->next == NULL)
    {
     p2->next=NULL;
     free(p1);
    
    }
       printf(" 学生%d已经成功删除/n",num);
 }
 else printf(" 没有该学生!/n",num);
 return head;
}


struct student *insert(struct student * head ,struct student *stud)
{
 struct student *p0,*p1,*p2;
    p1=head;
    p0=stud;
    if (head == NULL)
 {
  head=p0;
  p0->next=NULL;
  p0->prev=NULL;
 }
 else
 {
 while ((p0->num > p1->num)&&(p1->next != NULL))
 {
     p2=p1;
     p1=p1->next;
 }
    if(p0->num <= p1->num)
 {
  if(head == p1)
  {
   head=p0;
   p0->next=p1;
   p1->prev=p0;
   p1->next=NULL;
  }
        else
  {
   p2->next=p0;
   p0->prev=p2;
   p1->prev=p0;
            p0->next=p1;
  }
 }
  else
  {
   p1->next=p0;
      p0->next=NULL;
   p0->prev=p1;
  }
 }
 
 return (head);
}

 

void searchnum(struct student *head )
{
 int num;
 struct student *p1;
    p1=head ;
    if (p1 == NULL)
 {
  printf("/n没有任何信息!/n");
  return;
 }
 else
 {
     printf("/n请输入要查找的学号: /n");
   scanf("%d",&num);

        while (num!=p1->num &&p1->next!=NULL)
  {    
         p1=p1->next;
  }
            
       if(num == p1->num)
    {
       printf("学号/t姓名/t性别/t生日/t/n");
      printf("%d/t%s/t%s/t%s/t",p1->num,p1->name,p1->sex,p1->birthday);
    }
     else
      printf ("/n不存在这个学生/n");
 }

}

 


void searchname(struct student *head)
{
 struct student *p1;
    char name[10];
    p1=head ;
    if (head == NULL)
 {
  printf("/n没有任何信息!/n");
  return;
 }
   else
   {
     printf("/n请输入要查找的姓名: /n"); 
   scanf("%s",name);
        while ( strcmp(p1->name,name)!=0 && p1->next!=NULL)
  {   
         p1=p1->next;
  }
       
   

       if(strcmp(p1->name,name)==0)
    {
      printf("学号/t姓名/t性别/t生日/t/n");
      printf("%d/t%s/t%s/t%s/t",p1->num,p1->name,p1->sex,p1->birthday);
    }
     else
  printf ("/n不存在这个学生/n");
   }
}
 

 

 


int getlength(struct student *head)
{
 
 int n=0;
 struct student *p;
 p=head;
 while(p!=NULL)
 {
  p=p->next;
  n=n+1;
 }
 return n;
}

 

long  modi()
{
 long be,bi,b;
lp2: printf("/n请输入新密码:");
    scanf("%ld",&be);
 printf("/n请确认新密码:");
 scanf("%ld",&bi);
 if (be == bi)
 {
  b=be;
  printf("/n你的新密码已经确认,请重新进入系统:");
 }
 else
 {
  printf("/n你的密码不一致,请重新输入:");
  goto lp2;
 }

 return b;
}


void save(struct student * head)
{
 struct student *p;
 p=head;
 FILE * fp;
 
 if((fp=fopen("stulist","wb")) == NULL)
 {
  printf("不能打开文件/n");
  return;
 }
 while (p!=NULL)
 {
  if (fwrite(p,sizeof (struct student),1,fp)!=1)
   printf("file write error/n");
  p=p->next;
 }
    printf("文件已经成功保存/n");

  fclose(fp);
}

 

void read(struct student * head)
{
 struct student *p;
 p=head;
 FILE*fp;

   
 if((fp=fopen("stulist","rb")) == NULL)
 {
  printf("没有任何资料/n");
  return;
 }

 printf("学号/t姓名/t性别/t生日/t/n");
 while (p!=NULL)
 {
     fread(p,sizeof(struct student),1,fp);
     printf("%d/t%s/t%s/t%s/t/n",p->num,p->name,p->sex,p->birthday);
  p=p->next;
 }

 fclose(fp);
}

 

void main()
{
 
     struct student *stu,*p3,*head=NULL;
  long a,b=1;
     int num;  
     int option;
  
lp1: printf("      /n  进入系统  请输入密码:/n");
     scanf("%d",&a);
  
         if (a == b)
   {while(1)
        
  { 
  
            printf("/n **********学生档案管理系统**************/n");
          printf("/n ****************************************/n");
      printf("              1.创建学生信息/n");
      printf("              2.显示学生信息/n");
      printf("              3.删除学生信息/n");
      printf("              4.添加学生信息/n");
      printf("              5.按学号查找/n");
         printf("              6.按姓名查找/n");
         printf("              7.保存资料/n");
       printf("              8.打开文件/n");
            printf("              9.修改密码/n");
            printf("              10.显示学生数目/n");
            printf("              11.退出/n");
         printf(" ****************************************/n");
       printf("   Please enter your choice (1-11)...");
      scanf("%d",&option);
  
         switch(option) 
   {
       case 1:
                    head=creat();
        break;
   
             case 2 :
        print(head);
        break;

       case 3:
        printf("/n请输入要删除的学号 :/n");
        scanf ("%d",&num);
        head=del(head,num);
         break;
    
          case 4:  
                     printf ("/n请输入要添加的学生的资料:/n");
        stu= (struct student * )malloc(LEN);
                   
           rp2:      printf("学生学号:");scanf("%d",&stu->num);
               p3=head;
                   
     
                   while (stu->num != p3->num && p3->next!=0)
       {
                      p3=p3->next;
       }
                      if (stu->num == p3->num)
       {
                   printf("学号重复,请重输!/n");
                            goto rp2;      
     }    
     
     getchar();
                 printf("姓名:");gets(stu->name);
                 printf("性别:");gets(stu->sex);
                 printf("生日:");gets(stu->birthday);

   
        head=insert(head,stu);
        break;
    case 5:
     
                    searchnum(head);
     break;

    case 6:
    
                    searchname(head);
     break;
  
             case 7:save(head);break;

          case 8:read(head);break;
   
   
       case 9:
                    b=modi();
               goto lp1;
     break;

       case 10:
         printf("总共有%d个学生/n",getlength(head));
         break;
 
       case 11:
        return;

               default:
        printf("错误,只能输入1--11/n");
   
   }
  }
  }

        else
  {
      printf("/n密码错误/n");
       goto lp1;
  }

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值