C語言小案例:學生管理系統1.0版

剛學完C語言,嘗試着用C語言寫一個小項目用來練練手,若有不足之處,歡迎各方大佬多多指點!

  1. 定義結構體
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
 char ID[20];  //學號
 char name[9];  //姓名
 char sex;   //性別
 int age;  //年齡
 char nation[9];  //民族
 struct node *next;
}node,*pnode;
  1. 函數聲明
void error_allot(pnode q);                     //輔助函數:內存分配失敗
pnode init(void);                              //操作函數:初始化
void quit(int n);                              //輔助函數:1.選擇時輸入規則以外的數 2.返回系統
void end_error(int n);                         //輔助函數:操作成功和查詢無果以及返回系統
pnode insert(pnode q,int b[1]);                //操作函數:錄入學生信息
void traverse(pnode p);                        //輸出函數:顯示學生信息列表
pnode get(pnode q,pnode *per,int n);           //通過輸入學生姓名或學號獲取要刪除學生在列表中的位置信息並返回給操作函數
pnode delete_list(pnode p,int b[1]);           //操作函數:刪除學生信息
void get_data(pnode q,int n);                  //輔助函數:通過輸入學生姓名或學號獲取要查詢的學生在列表中的位置信息並返回給操作函數
void search(pnode p);                          //操作函數:查詢學生信息
pnode revise_data(pnode q,pnode *per,int t[1]);//輔助函數:通過輸入學生學號獲取要修改的學生在列表中的位置信息並返回給操作函數
pnode revise_element(pnode h,int n);           //操作函數:修改學生學號、姓名、性別、年齡、民族信息
pnode revise(pnode p);                         //選擇函數:選擇要修改學生信息:學號、姓名、性別、年齡、民族
  1. 主函數
int main()    //主函數
{
 int n,a,b[1]={1};
 pnode L;
 printf("\n                                            &歡迎使用學生信息管理系統&\n\n\n  ^*^輸入1進入系統:");
 scanf("%d",&a);
 if(a==1)
 {
        L=init();
     while(a==1)
  {
      system("cls");
         printf("\n                                               $學生信息管理系統$\n\n\n");
         printf("                  1.錄入         2.列表         3.刪除         4.查詢         5.修改         6.退出\n");
         printf("\n\n^*^請選擇:");
         scanf("%d",&n);
      if(n==6)
   {
       system("cls");
       printf("\n\n\n                                     ^*^感謝使用學生管理系統,祝您生活愉快!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
       exit(-1);
   }
         switch(n)
   {
             case 1:L=insert(L,b);break;
             case 2:traverse(L);break;
          case 3:L=delete_list(L,b);break;
          case 4:search(L);break;
    case 5:L=revise(L);break;
       default:quit(1);
   } 
  }
 }
 else
 {
        printf("\n\n                                    @ # @ 無規矩不成方圓,請按規矩辦事,謝謝!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
  exit(-1);
 }
    return 0;
}
  1. 函數塊:內存分配失敗
void error_allot(pnode q)    //輔助函數:內存分配失敗
{
 if(q==NULL)
 {
  printf("內存分配失敗!\n");
  exit(-1);
 }
 return;
}
  1. 函數塊:初始化
pnode init(void)    //操作函數:初始化
{
 pnode head,last,p;
 system("cls");
 head=(pnode)malloc(sizeof(node));
 error_allot(head);
 last=head;
 last->next=NULL;
 p=(pnode)malloc(sizeof(node));
 error_allot(p);
    printf("\n                                                        $初始化$\n\n");
 printf("\n              【 1.輸入:按順序輸入; 2.學號:位數不超過二十位; 3.性別:'M'表示男生,'W'表示女生; 4.民族:如苗族 】\n");
 printf("\n\n^*^請輸入學生信息:學號,姓名,性別,年齡,民族:\n");
 scanf("%s %s %c %d %s",p->ID,p->name,&p->sex,&p->age,p->nation);
 last->next=p;
 p->next=NULL;
 last=p;
 return head;
}
  1. 函數塊:輔助錄入(1)
void quit(int n)    //輔助函數:1.選擇時輸入規則以外的數 2.返回系統
{
 int b;
 if(n==1)
 {
        system("cls");
  printf("\n\n                                         (0)&(0)輸入錯誤,輸入0返回系統\n");
 }
    if(n==2) printf("\n\n\n【輸入0返回系統】");
 scanf("%d",&b);
 if(b==0)
 {
  system("cls");
  return;
 }
 else
 {
        printf("\n\n                                    @ # @ 無規矩不成方圓,請按規矩辦事,謝謝!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
  exit(-1);
 }
}
  1. 函數塊:輔助錄入(2)
void end_error(int n)    //輔助函數:操作成功和查詢無果以及返回系統
{
 int b;
 system("cls");
 if(n==1) printf("\n\n                                         ^$^ 錄入成功,輸入0返回系統\n");
 else if(n==2) printf("\n\n                                         ^$^ 刪除成功,輸入0返回系統\n");
 else if(n==3) printf("\n\n                                       @ # @ 無此信息,輸入0返回系統\n");
    else if(n==4) printf("\n\n                                       @ # @ 無此信息,輸入0返回系統\n");
 else if(n==5) printf("\n\n                                         ^$^ 排序成功,輸入0返回系統\n");
 else printf("\n\n                                         ^$^ 修改成功,輸入0返回系統\n");
 scanf("%d",&b);
 if(b==0) system("cls");
 else
 {
        system("cls");
  printf("\n\n                                @ # @ 無規矩不成方圓,請按規矩辦事,謝謝!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
  exit(-1);
 }
 return;
}
  1. 函數塊:錄入學生信息
pnode insert(pnode q,int b[1])    //操作函數:錄入學生信息
{
 pnode h,k=q->next;
 int n,i;
 system("cls");
 printf("\n                                                        $錄入$\n\n");
 printf("\n    ^*^請輸入要錄入學生人數n(n>0):");
 scanf("%d",&n);
 if(n<=0)
 {
  quit(1);
  return q;
 }
 for(i=1;i<=n;i++)
 {
  system("cls");
     h=(pnode)malloc(sizeof(node));
  error_allot(h);
        printf("\n              【 1.輸入:按順序輸入; 2.學號:位數不超過二十位; 3.性別:'M'表示男生,'W'表示女生; 4.民族:如苗族 】\n");
  printf("\n\n^*^請輸入學生信息:學號,姓名,性別,年齡,民族(第%d次輸入):\n",i);
  scanf("%s %s %c %d %s",h->ID,h->name,&h->sex,&h->age,h->nation);
  q->next=h;
  h->next=k;                                               
  k=h;
  b[0]++;
 }
    end_error(1);
 return q;
}
  1. 函數塊:顯示學生信息列表
void traverse(pnode p)    //輸出函數:顯示學生信息列表
{
 pnode h;
 system("cls");
 h=p->next;
 printf("\n                                                        $列表$\n\n\n\n");
 printf("                               %10s%10s%10s%10s%10s\n\n","ID","name","sex","age","nation");
 if(h==NULL)
 {
  quit(2);
  return;
 }
 while(h!=NULL)
 {
  printf("                               %10s%10s%10c%10d%10s\n",h->ID,h->name,h->sex,h->age,h->nation);
  h=h->next;
 }
 quit(2);
 return;
}
  1. 函數塊:輔助刪除
pnode get(pnode q,pnode *per,int n)    //通過輸入學生姓名或學號獲取要刪除學生在列表中的位置信息並返回給操作函數
{
 pnode h;
 char a[9],b[20];
 *per=q;
 h=q->next;
 system("cls");
 if(n==1)
 {
        printf("\n^*^請輸入要刪除學生的姓名:\n");
     scanf("%s",a);
     while((h!=NULL)&&(strcmp(h->name,a)!=0))
  {
      *per=h;
      h=h->next;
  }
        if(strcmp(h->name,a)!=0) *per=NULL;
 }
 else
 {
        printf("\n^*^請輸入要刪除學生的學號:\n");
     scanf("%s",b);
     while((h!=NULL)&&(strcmp(h->ID,b)!=0))
  {
      *per=h;
      h=h->next;
  }
        if(strcmp(h->ID,b)!=0) *per=NULL;
 }
 return h;
}
  1. 函數塊:刪除學生信息
pnode delete_list(pnode p,int b[1])    //操作函數:刪除學生信息
{
 pnode h,per;
 int n;
 system("cls");
 printf("\n                                                        $刪除$\n\n\n");
 printf("                            1.姓名刪除          2.學號刪除          3.返回系統\n");
 printf("\n  ^*^請選擇:");
 scanf("%d",&n);
 switch(n)
  {
         case 1:h=get(p,&per,n);break;
         case 2:h=get(p,&per,n);break;
   case 3:system("cls");return p;
   default:quit(1);
  }
 if(per==NULL)
 {
  end_error(4);
  return p;
 }
 per->next=h->next;
 b[0]--;
 free(h);
 h=NULL;
    end_error(2);
 return p;
}
  1. 函數塊:輔助查詢
void get_data(pnode q,int n)    //輔助函數:通過輸入學生姓名或學號獲取要查詢的學生在列表中的位置信息並返回給操作函數
{
 pnode h;
 int k,t;
 char a[9],b[20];
 h=q;
    system("cls");
 if(n==1)
 {
  k=0;
  t=0;
        printf("\n^*^請輸入要查詢學生的姓名:\n");
     scanf("%s",a);
        system("cls");
     while(h!=NULL)
  {
            if((strcmp(h->name,a)==0)&&(k==1))
   {
    t=1;
    printf("                               %10s%10s%10c%10d%10s\n",h->ID,h->name,h->sex,h->age,h->nation);
   }
   if((strcmp(h->name,a)==0)&&(k==0))
   {
    k=1;
    t=1;
                printf("\n                                                        $信息$\n\n\n\n");
                printf("                               %10s%10s%10s%10s%10s\n\n","ID","name","sex","age","nation");
                printf("                               %10s%10s%10c%10d%10s\n",h->ID,h->name,h->sex,h->age,h->nation);
   }
      h=h->next;
  }
  if(t==0)
  {
      end_error(3);
      return;
  }
 }
 else
 {
  t=0;
        printf("\n^*^請輸入要查詢學生的學號:\n");
     scanf("%s",b);
        system("cls");
     while(h!=NULL)
  {
   if((strcmp(h->ID,b)==0))
   {
    t=1;
                printf("\n                                                        $信息$\n\n\n\n");
                printf("                               %10s%10s%10s%10s%10s\n\n","ID","name","sex","age","nation");
                printf("                               %10s%10s%10c%10d%10s\n",h->ID,h->name,h->sex,h->age,h->nation);
   }
      h=h->next;
  }
  if(t==0)
  {
      end_error(3);
      return;
  }
 }
    quit(2);
 return;
}
  1. 函數塊:查詢學生信息
void search(pnode p)    //操作函數:查詢學生信息
{
 int n;
 system("cls");
    printf("\n                                                        $查詢$\n\n\n\n");
 printf("                                  1.姓名查詢          2.學號查詢          3.返回系統\n\n");
    printf("\n  ^*^請選擇:");
 scanf("%d",&n);
    system("cls");
    switch(n)
  {
         case 1:get_data(p,n);break;
         case 2:get_data(p,n);break;
   case 3:system("cls");return;
   default:quit(1);
  }
    return;
}
  1. 函數塊:輔助修改(1)
pnode revise_data(pnode q,pnode *per,int t[1])    //輔助函數:通過輸入學生學號獲取要修改的學生在列表中的位置信息並返回給操作函數
{
 char b[20];
 pnode h=q->next;
 *per=q;
    system("cls");
    printf("\n^*^請輸入要修改學生的學號:\n");
 scanf("%s",b);
    system("cls");
 while(h!=NULL && strcmp(h->ID,b)!=0)
 {
     *per=h;
  h=h->next;
 }
 if(h!=NULL) t[0]++;
 return h;
}
  1. 函數塊:輔助修改(2)
pnode revise_element(pnode h,int n)    //操作函數:修改學生學號、姓名、性別、年齡、民族信息
{
 pnode k=h;
 int a;
 char b[20],c[9],f[2],g[9];
    switch(n)
 {
     case 1:
   {
                system("cls");
                printf("\n^*^請輸入新的學號:\n");
             scanf("%s",b);
    strcpy(k->ID,b);
   }return k;
     case 2:
   {
                system("cls");
                printf("\n^*^請輸入新的姓名:\n");
             scanf("%s",c);
    strcpy(k->name,c);
   }return k;
     case 4:
   {
                system("cls");
                printf("\n^*^請輸入新的年齡:\n");
             scanf("%d",&a);
    k->age=a;
   }return k;
     case 5:
   {
                system("cls");
                printf("\n^*^請輸入新的民族:\n");
             scanf("%s",g);
    strcpy(k->nation,g);
   }return k;
        case 3:
   {
                system("cls");
                printf("\n^*^請輸入新的性別:\n");
             scanf("%s",f);
    k->sex=f[0];                 
   }return k;
  default:quit(1);
 }
 return k;
}
  1. 函數塊:修改學生信息
pnode revise(pnode p)    //選擇函數:選擇要修改學生信息:學號、姓名、性別、年齡、民族
{
 int n,a,t[1]={0};
 pnode h,per,k;
    system("cls");
    printf("\n                                                        $修改$\n\n\n\n");
 printf("                                      1.開始修改                      2.返回系統\n\n");
    printf("\n  ^*^請選擇:");
 scanf("%d",&n);
    system("cls");
    switch(n)
 {
     case 1:
   {
                printf("\n                                                        $選擇$\n\n\n\n");
             printf("               1.修改學號          2.修改姓名          3.修改性別          4.修改年齡          5.修改民族\n\n");
                printf("\n  ^*^請選擇:");
             scanf("%d",&a);
                h=revise_data(p,&per,t);
    if(t[0]==0)
    {
              end_error(3);
              return p;
    }
    k=h;
                switch(a)
    {
                 case 1:k=revise_element(h,a);break;
                 case 2:k=revise_element(h,a);break;
           case 3:k=revise_element(h,a);break;
           case 4:k=revise_element(h,a);break;
           case 5:k=revise_element(h,a);break;
           default:quit(1);
    }
    h=k;
   }break;
        case 2:system("cls");return p;
     default:quit(1);
 }
 per->next=h;
 end_error(6);
 return p;
}

小小推薦:
C語言案例系列:
C語言實現——登錄界面
前端案例系列:
前端小案例:登錄頁面
撕爛數據爆錘算法系列:
撕爛數據爆錘算法:單鏈表
撕爛數據爆錘算法:循環鏈表

萌新求帶,望大家多多支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章