C語言實現學生籍貫信息記錄簿

本文實例為大傢分享瞭C語言實現學生籍貫信息記錄簿的具體代碼,供大傢參考,具體內容如下

一、任務概述(文章僅供參考)

進一步掌握和利用C語言進行課程設計的能力;
進一步理解和運用結構化程序設計的思想和方法;
初步掌握開發一個小型實用系統的基本方法;

二、設計功能

1.創建信息鏈表並以磁盤文件保存;
2.讀取磁盤文件並顯示輸出所有學生的籍貫信息;
3.按學號或姓名查詢其籍貫;
4.按籍貫查詢並輸出該籍貫的所有學生;
5.能添加、刪除和修改學生的籍貫信息

三、功能展示

四、思維導圖

五、程序源碼

#include "dos.h"
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "math.h"
#include "string.h" 
/**********************建立鏈表******************************/
struct hj   
{ long number;
  char name[10],address[50];
  struct hj *next;
};
/********************文件操作函數******************************/
FILE *fp;
void openfile(char xx[20])
{
 
 fp=fopen(xx,"ab+");
 if(fp==NULL)
    fp=fopen(xx,"wb");
}
/**************錄入信息函數***********************************/
void hjnew(void) 
{
 system("cls");
 int n=0;
 long xnumber;
 char xname[10];
 char xaddress[50];
 struct hj *head;
 struct hj *x1,*x2;
 head=NULL;
 x2=NULL;
 printf("\n                ★★★★★歡迎使用戶籍管理系統★★★★★\n");
 printf("\n                          ★★★錄入信息★★★\n");
 printf("\n                        〓提示輸入0返回上級菜單〓\n\n\n");
 printf("\n                         請輸入學號【15字內】:");
 scanf("%ld",&xnumber);
 if(xnumber==0)
  goto haha;
 printf("\n                         請輸入姓名【10字內】:");
 scanf("%s",xname);
 printf("\n                         請輸入籍貫【25字內】:");
 scanf("%s",xaddress);
    while(xnumber!=0)
 {
  n++;
  x1=(struct hj *)malloc(sizeof(struct hj));
  x1->number=xnumber; 
  strcpy(x1->name,xname);
  strcpy(x1->address,xaddress);
  if(n==1)
   head=x1;
  else
   x2->next=x1;
     x2=x1;
 printf("\n                         請輸入學號【15字內】:");
 scanf("%ld",&xnumber);
 if(xnumber==0)
  break;
 printf("\n                         請輸入姓名【10字內】:");
 scanf("%s",xname);
 printf("\n                         請輸入籍貫【25字內】:");
 scanf("%s",xaddress);
 }
 x2->next=NULL;
 x1=head;
 while(x1!=NULL)
 {
  openfile("hj.txt");
  char d[5]="山西";
  fwrite(x1,sizeof(struct hj),1,fp);
  fclose(fp);
  
  if(strstr(x1->address,d)!=NULL)
  { 
   openfile("schj.txt");
   fwrite(x1,sizeof(struct hj),1,fp);
   fclose(fp);
  }
  else
  {
   openfile("qthj.txt");
   fwrite(x1,sizeof(struct hj),1,fp);
   fclose(fp);
  }
  x1=x1->next;
 }
 
haha:;
}
/*****************************查詢函數*************************/
void hjxmselect(void) //按學號方式查詢函數
{
ssmmx:
 int n=0;
 long hh;
 system("cls");
 printf("\n                ★★★★★歡迎使用戶籍管理系統★★★★★\n");
 printf("\n                        ★★★查詢編輯信息★★★\n");
 printf("\n                        〓提示輸入0返回上級菜單〓\n\n\n");
 printf("                         請您輸入學號:");
 scanf("%ld",&hh);
 if(hh!=0)
 { 
  struct hj *p;
  struct hj *q=NULL,*head=NULL;
  fp=fopen("hj.txt","rb");
    if(fp==NULL)
  {
   printf("\n沒有記錄,請輸入記錄然後再查詢!");
   getch();
   goto jjx;
  }
  while(!feof(fp))
  {
   n++;
   p=(struct hj *)malloc(sizeof(struct hj));
   fread(p,sizeof(struct hj),1,fp);
   if(n==1)
    head=p;
   else
    q->next=p;
   q=p;

  }
  q->next=NULL;
  p=head;
  while(p!=NULL)
  {
   if(p->number==hh)
   {   
    int a;
    printf("\n  結 果 →     學號=%ld   姓名=%s",p->number,p->name);
    printf("\n               地址=%s",p->address);
    printf("\n\n  操 作 →    ⑴更改數據  ⑵刪除數據  ⑶查詢其他數據  ⑷返回上頁  ⑸退出程序\n\n  請您選擇操作:");
ssmx:
    scanf("%d",&a);
    switch(a)
    { 
     void hjedit(struct hj *headd,struct hj *pp);
     void hjdelete(struct hj *headdd,struct hj *ss);
     case 1: hjedit(head,p);
       goto ssmmx;break;
     case 2: hjdelete(head,p);
       goto ssmmx;break;
     case 3: goto ssmmx;
     case 4: goto jjx;
     case 5:exit(0);
     default:printf("\n                        錯誤的選擇,請重新選擇:");
     goto ssmx;
    }
     }
   else
    p=p->next;
  }
  int iiii=0;
  printf("\n                         沒有此記錄 1.重新查詢 2.返回上一頁 3.退出程序!");
  printf("\n                         請選擇:");
qqqq:
  scanf("%d",&iiii);
  switch(iiii)
  {
   case 1:  goto ssmmx;
   case 2:  goto jjx;
   case 3:  exit(0);
   default: printf("\n                        錯誤的選擇,請重新選擇:");
     goto qqqq;
  }
     goto jjx;
 }
jjx:;
}
void hjxhselect(void)//按姓名方式查詢函數
{
ssmm:
 int n=0;
 char hh[10];
 system("cls");
 printf("\n                ★★★★★歡迎使用戶籍管理系統★★★★★\n");
 printf("\n                        ★★★查詢編輯信息★★★\n");
 printf("\n                        〓提示輸入0返回上級菜單〓\n\n\n");
 printf("                         請您輸入姓名:");
 scanf("%s",hh);
 if(strcmp(hh,"0")!=0)
 { 
  struct hj *p;
  struct hj *q=NULL,*head=NULL;
  fp=fopen("hj.txt","rb");
  if(fp==NULL)
  {
   printf("\n沒有記錄,請輸入記錄然後再查詢!");
   getch();
   goto jjj;
  }
  while(!feof(fp))
  {
   n++;
   p=(struct hj *)malloc(sizeof(struct hj));
   fread(p,sizeof(struct hj),1,fp);
   if(n==1)
    head=p;
   else
    q->next=p;
   q=p;
  }
  q->next=NULL;
  p=head;
        while(p!=NULL)
  {
   if(strcmp(p->name,hh)==0)
   {   
    int a;
    printf("\n  結 果 →     學號=%ld   姓名=%s  ",p->number,p->name);
    printf("\n               地址=%s",p->address);
    printf("\n\n  操 作 →    ⑴更改數據  ⑵刪除數據  ⑶查詢其他數據  ⑷返回上頁  ⑸退出程序\n\n  請您選擇操作:");
ssm:
    scanf("%d",&a);
    switch(a)
    { 
     void hjedit(struct hj *headd,struct hj *pp);
     void hjdelete(struct hj *headdd,struct hj *ss);
     case 1: hjedit(head,p);
       goto ssmm;break;
     case 2: hjdelete(head,p);
       goto ssmm;break;
     case 3: goto ssmm;
     case 4: goto jjj;
     case 5:exit(0);
     default:printf("\n                        錯誤的選擇,請重新選擇:");
     goto ssm;
    }
     }
   else
    p=p->next;
  }
  int iii=0;
  printf("\n                         沒有此記錄 1.重新查詢 2.返回上一頁 3.退出程序!");
  printf("\n                         請選擇:");
qqq:
  scanf("%d",&iii);
  switch(iii)
  {
   case 1:  goto ssmm;
   case 2:  goto jjj;
   case 3:  exit(0);
   default: printf("\n                        錯誤的選擇,請重新選擇:");
     goto qqq;
  }
     goto jjj;
 }
jjj:  ;
}
void hjjgselect(void)//按籍貫方式查詢
{
yyy: 
 int i;
    system("cls");
 printf("\n                ★★★★★歡迎使用戶籍管理系統★★★★★\n");
 printf("\n                      ★★★籍貫方式查詢信息★★★\n\n\n");
 printf("\n                         一  顯示所有信息\n");
 printf("\n                         二  顯示山西籍所有信息\n");
 printf("\n                         三  顯示其它籍所有信息\n");
 printf("\n                         四  自定義查詢信息\n");
 printf("\n                         五  ←返回上級菜單\n");
 printf("\n                         六  ↓退出程序\n");
 printf("\n\n                          請選擇:");
 scanf("%d",&i);
 switch(i)
 { void zdyselect(void);
  void allselect(char a[8]);
  case 1:allselect("hj.txt");
       goto yyy;break;
  case 2: allselect("schj.txt");
    goto yyy;break;
  case 3: allselect("qthj.txt");
    goto yyy;break;
  case 4: zdyselect();
  case 5: break;
  case 6: exit(0);
 }
}
void zdyselect(void)
{ 
ssmmz:
 int n=0,j=0;
 char hh[10];
 system("cls");
 printf("\n                ★★★★★歡迎使用戶籍管理系統★★★★★\n");
 printf("\n                        ★★★自定義查詢信息★★★\n\n\n");
 printf("                         請您輸入地址關鍵字:");
    scanf("%s",hh);
 if(strcmp(hh,"0")!=0)
 { 
  struct hj *p;
  struct hj *q=NULL,*head=NULL;
  fp=fopen("hj.txt","rb");
  
  if(fp==NULL)
  {
   printf("\n       沒有記錄,請輸入記錄然後再查詢!");
   getch();
   goto jjz;
  }
  while(!feof(fp))
  {
   n++;
   p=(struct hj *)malloc(sizeof(struct hj));
   fread(p,sizeof(struct hj),1,fp);
   if(n==1)
    head=p;
   else
    q->next=p;
   q=p;
  }
  q->next=NULL;
  p=head;

  while(p!=NULL)
  {
   
   if(strstr(p->address,hh)!=NULL)
   {   
    
    int a;
    j++;
    printf("\n  結 果 →     學號=%ld   姓名=%s  ",p->number,p->name);
    printf("\n               地址=%s",p->address);
    printf("\n\n  操 作 →    ⑴更改數據  ⑵刪除數據  ⑶查詢下一條數據  ⑷返回上頁  ⑸退出程序\n\n  請您選擇操作:");
ssmz:
    scanf("%d",&a);
    switch(a)
    { 
     void hjedit(struct hj *headd,struct hj *pp);
     void hjdelete(struct hj *headdd,struct hj *ss);
     case 1: hjedit(head,p);
       goto ssmmz;break;
     case 2: hjdelete(head,p);
       goto ssmmz;break;
     case 3: p=p->next;continue;
     case 4: goto jjz;
     case 5:exit(0);
     default:printf("\n                        錯誤的選擇,請重新選擇:");
     goto ssmz;
    }
    p=p->next;
   }
   else
    p=p->next;
  }
  if(j==0)
  {
   printf("\n\n\n沒有匹配的記錄 按任意鍵繼續!");
   getch();
   fclose(fp);
   goto ssmmz;
  }
  else
  { int xx;
   printf("\n\n查詢完畢!    ⑴  繼續查詢  ⑵  返回上一級菜單  ⑶   退出程序");
   printf("\n請選擇:");
   scanf("%d",&xx);
   if(xx==2)
    goto jjz;
   else if(xx==3)
    exit(0);
    
  }
  goto ssmmz;
jjz:  ;
 }
 
}
void allselect(char a[8])//全部查詢
{
 int n=0;

 int k=0;
 system("cls");
 printf("\n                ★★★★★歡迎使用戶籍管理系統★★★★★\n");
 printf("\n                        ★★★籍貫方式信息★★★\n\n\n");
 
    struct hj *p;

 struct hj *q=NULL,*head=NULL;
 fp=fopen(a,"rb");
 if(fp==NULL)
 {
  printf("\n對不起,沒有記錄無法查詢!");
  goto xxxx;
 }
 rewind(fp);
 while(!feof(fp))
 {
   n++;
   p=(struct hj *)malloc(sizeof(struct hj));
   fread(p,sizeof(struct hj),1,fp);
   if(n==1)
    head=p;
   else
    q->next=p;
   q=p;

 }

 q->next=NULL;
    struct hj *h1,*p2,*q3,*r4,*s5;
 h1=p2=(hj *)malloc(sizeof(struct hj));
 p2->next=head;
 
 while(p2->next!=NULL) 
 { 
  q3=p2->next; 
  r4=p2; 
  while(q3->next!=NULL) 
  { 
   if(q3->next->number<p2->next->number) 
   r4=q3; 
   q3=q3->next; 
  } 
  if(r4!=p2) 
  { 
   s5=r4->next; 
   r4->next=s5->next; 
   s5->next=p2->next; 
   p2->next=s5; 
  } 
  p2=p2->next; 
 } 
 head=h1->next->next; 
 free(h1); 
    p=head;
 while(p!=NULL&&n>0)
 {
  n--;
  printf("\n學號=%ld  姓名=%s",p->number,p->name);
  printf("\n地址=%s",p->address);
        p=p->next;
 }
xxxx:
 printf("\n→顯示完畢←\n⑴ ↑返回上級菜單   ⑵ ↓退出程序 \n請 選 擇 :");
xxx:
 scanf("%d",&n);
 switch(n)
 {
  case 1:break;
  case 2:exit(0);
  default:printf("\n錯誤的選擇,請重新選擇:");
    goto xxx;
 }
}
void hjselect(void)//查詢編輯信息函數
{ 
cxbegin:
 int a;
 system("cls");
 printf("\n                ★★★★★歡迎使用戶籍管理系統★★★★★\n");
 printf("\n                        ★★★查詢編輯信息★★★\n\n\n");
 printf("\n                         一    按學號方式查詢\n");
 printf("\n                         二    按姓名方式查詢\n");
 printf("\n                         三    按籍貫方式查詢\n");
 printf("\n                         四    →顯示全部信息\n");
 printf("\n                         五    ←返回上級菜單\n");
 printf("\n                         請 選 擇 查 詢 方 式:");
cxmm:
 scanf("%d",&a);
 switch(a)
 { 
  case 1: hjxmselect();goto cxbegin;break;
  case 2: hjxhselect();goto cxbegin;break;
  case 3: hjjgselect();goto cxbegin;break;
  case 4: allselect("hj.txt");goto cxbegin;break;
  case 5: break;
  default:printf("\n錯誤的選擇,請重新選擇:");
       goto cxmm;
 }
}
void hjde(void)//刪除界面函數
{
cxxbegin:
 int a;
 system("cls");
 printf("\n                ★★★★★歡迎使用戶籍管理系統★★★★★\n");
 printf("\n                          ★★★刪除信息★★★\n\n\n");
 printf("\n                         一    按學號方式刪除\n");
 printf("\n                         二    按姓名方式刪除\n");
 printf("\n                         三    按籍貫方式刪除\n");
 printf("\n                         四    →刪除全部信息\n");
 printf("\n                         五    ←返回上級菜單\n");
 printf("\n                         請 選 擇 刪 除 方 式:");
cxxmm:
 scanf("%d",&a);
 int i=0;
 switch(a)
 { 
  case 1: hjxmselect();goto cxxbegin;break;
  case 2: hjxhselect();goto cxxbegin;break;
  case 3: zdyselect();goto cxxbegin;break;
  case 4:  
     fp=fopen("hj.txt","wb");
     if(fp!=NULL)
      i++;
     fp=fopen("schj.txt","wb");
     if(fp!=NULL)
      i++;
     fp=fopen("qthj.txt","wb");
     if(fp!=NULL)
      i++;
     if(i==3)
     {
      printf("\n                         全部數據已經刪除!!!!!!敲任意鍵繼續");
      getch();
     }
     goto cxxbegin;break;
  case 5: break;
  default:printf("\n錯誤的選擇,請重新選擇:");
       goto cxxmm;
 }
}
//==============刪除函數接口===============
void hjdelete(struct hj *headdd,struct hj *ss)
{
 struct hj *q;
 char d[5]="山西";
 if(headdd==ss)
 {
  headdd=headdd->next;
  goto gogo;
 }
 q=headdd;
 while(q!=NULL)
 {
  if(q->next->number==ss->number)
  { 
             break;
  }
  q=q->next;
 }
    q->next=ss->next;
gogo:
 q=headdd;
    fp=fopen("hj.txt","wb");
 while(q!=NULL)
 {
  
  fwrite(q,sizeof(struct hj),1,fp);
  q=q->next;
 }
 fclose(fp);
 q=headdd;
 fp=fopen("schj.txt","wb");
 while(q!=NULL)
    {
  if(strstr(q->address,d)!=NULL)
  { 
   fwrite(q,sizeof(struct hj),1,fp);
  }
  q=q->next;
 }
 fclose(fp);
 q=headdd;
 fp=fopen("qthj.txt","wb");
 while(q!=NULL)
    {
  if(strstr(q->address,d)==NULL)
  { 
   fwrite(q,sizeof(struct hj),1,fp);
  }
  q=q->next;
 }
 fclose(fp);

}
//===============編輯函數接口==============
void hjedit(struct hj *headd,struct hj *pp)
{
 int n=0;
 struct hj *p,*p1,*p2;
 char d[5]="江蘇";
 printf("\n  輸 入 →    學號=");
 scanf("%ld",&pp->number);
 printf("\n              姓名=");
 scanf("%s",pp->name);
 printf("\n              地址=");
 scanf("%s",pp->address);
 p=headd;
 fp=fopen("hj.txt","wb");
 while(p!=NULL)
 {
  
  fwrite(p,sizeof(struct hj),1,fp);
  p=p->next;
 }
 fclose(fp);
 p1=headd;
 fp=fopen("schj.txt","wb");
 while(p1!=NULL)
    {
  if(strstr(p1->address,d)!=NULL)
  { 

   fwrite(p1,sizeof(struct hj),1,fp);
      
  }
  p1=p1->next;
 }
 fclose(fp);
 p2=headd;
 fp=fopen("qthj.txt","wb");
 while(p2!=NULL)
    {
  if(strstr(p2->address,d)==NULL)
  { 
   fwrite(p2,sizeof(struct hj),1,fp);
  }
  p2=p2->next;
 }
 fclose(fp);
}
/**************************主函數***********************/
int main(int argc, char* argv[])
{   
begin: 
    int t;
 system("cls");
 printf("\n                ★★★★★歡迎使用戶籍管理系統★★★★★\n\n\n\n\n");
 printf("                        一 錄入學生籍貫信息\n\n");
 printf("                        二 查編學生籍貫信息\n\n");
 printf("                        三 刪除學生籍貫信息\n\n");
 printf("                        四 退出程序\n\n");
 printf("                        請您選擇:");
mm: 
 scanf("%d",&t);
 switch(t)
 { 
  case 1: hjnew();break;
  case 2: hjselect();break;
  case 3: hjde();break;
  case 4:exit(0);
  default:printf("\n                        錯誤的選擇,請重新選擇:");
       goto mm;
 }
 goto begin;
    return 0;
} 

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: