程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言課程設計——學生學籍管理系統

C語言課程設計——學生學籍管理系統

編輯:關於C語言

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#define N 100 /*存儲100個學生的學籍信息*/
int flag; /*標記是否登錄*/
struct date /*出生日期*/
{
    int year;
    int month;
    int day;
};
struct student
{
	char num[20];/*學號*/
	char name[25];/*姓名*/
	char sex[10];/*性別*/
	struct date birthday;/*出生年月*/
	int age;/*年齡*/
	char addr[50];/*籍貫*/
	char dept[50]; /*系別*/
    char major[30]; /*專業*/
	char classs[30]; /*班級*/
	char phone[20];/*電話*/
}stu[N];

void login() /*登錄*/
{
	void menu();
	system("cls");
	if(flag)
	{
		printf("  已經登錄!\n");
		printf("Press any key to continue…\n");
		getchar();
		getchar();
		system("cls");
		menu();
	}
	int load();
	int n,i,m,w;
	FILE *fp;
    if((fp=fopen("D:\\file.txt","rb"))!=NULL) /*不是空文件*/
      n=load(); /*打開文件*/
	else
	  n=0;
	struct student s;
	char password[20];
	int d,q;
	printf("\n\t請選擇登錄身份:1.管理員      2.用戶     [ ]\b\b");
    scanf("%d",&d);
	if(d==1)
	{
		printf("\n\t\t\t請輸入密碼:");
		getchar();
		int j=0;
		while(1)
        {
            password[j]=getch();
            if(password[j]=='\r')
              break;
            printf("*");
            j++;
        }
        password[j]='\0';
		if(!strcmp(password,"930322")) /*判斷密碼是否正確*/
		{
			flag=1;
			printf("\n\t登錄成功!\n");
			printf("\tPress [ Enter ] key to continue…");
			getchar();
			system("cls");
			menu();
		}
		if(!flag)
		{
		   printf("\t\n密碼錯誤!\n");
           printf("What do you want to do next? 1.繼續登錄  2.返回菜單   [ ]\b\b");
		   scanf("%d",&q);
		   if(q==1) /*繼續登錄*/
		   {
			   system("cls");
		       login();
		   }
		   else if(q==2) /*返回主菜單*/
		   {
			   system("cls");
			   menu();
		   }
		}
	}
    else
	{
	   printf("\n\t\t\t用戶名:");
	   scanf("%s",s.name);
	   printf("\t\t\t密碼:");
	   int j=0;
	   while(1)
        {
            password[j]=getch();
            if(password[j]=='\r')
              break;
            printf("*");
            j++;
        }
       password[j]='\0';
       flag=0; /*未登錄時flag=0*/
	   for(i=0;i<n;i++)
	     if(!strcmp(s.name,stu[i].name)&&!strcmp(s.name,password))
		 {
		   flag=1; /*登錄成功flag=1*/
		   break;
		 }
	  if(flag)
	  {
		 printf("\n\t登錄成功!\n");
		 printf("\tPress any key to continue…\n");
		 getchar(); getchar();
		 system("cls");
	     menu(); /*登錄成功後返回主菜單*/
	  }
	  else
	  {
		m=0; /*設置m是為了避免陷入 登錄失敗時 跳不出登錄界面*/
		w=1; /*設置w是為了避免輸出多次 “用戶不存在”*/
		int q; /*q為選項*/
		do
		{
			if(w>0)
			   printf("用戶名不存在或密碼錯誤!\n"); /*第一次登錄時輸入不存在的用戶時顯示*/
		    printf("What do you want to do next? 1.繼續登錄  2.返回菜單   [ ]\b\b");
		    scanf("%d",&q);
		    if(q==1) /*繼續登錄*/
			{
				login();
				m=1;
			}
		    else if(q==2) /*返回主菜單*/
			{
				system("cls");
				menu();
				m=1;
			}
			else
			{
				printf("選擇錯誤!請重新選擇:\n");
				w=0;
			}
		}while(m==0);
	  }
	}
}

void printf_one(int k) /*輸出一個學生的信息*/
{
	system("color 4e");
	printf("學號:%s\n",stu[k].num);
	printf("姓名:%s\n",stu[k].name);
	printf("性別:%s\n",stu[k].sex);
	printf("出生年月:%d/%d/%d\n",stu[k].birthday.year,stu[k].birthday.month,stu[k].birthday.day);
	printf("年齡:%d\n",stu[k].age);
    printf("籍貫:%s\n",stu[k].addr);
	printf("系別:%s\n",stu[k].dept);
	printf("專業:%s\n",stu[k].major);
	printf("班級:%s\n",stu[k].classs);
	printf("電話:%s\n",stu[k].phone);
}

void printf_n(int n) /*浏覽時輸出所有學生的信息*/
{
	system("color 2e");
	int j,i=1;
    for(j=0;j<n;j++)
	{
		printf("第%d個學生:\n",i++);
		printf_one(j);
 		printf("\n");
	}
  getchar();
}

int load() /*打開文件,讀取裡面的數據*/
{
	FILE *fp;
    int i;
    if((fp=fopen("D:\\file.txt","rb"))==NULL) /*讀入空文件,rb表示打開一個二進制文件,只允許讀數據*/
	{
		printf("\n文件不存在!請輸入:\n");
        return 0;
	}
    for(i=0;!feof(fp);i++)  /*處理到文件結尾*/
       fread(&stu[i],sizeof(struct student),1,fp);  /*fread(buffer,size,cout,fp)將磁盤文件中的一批數據作為一個整體一次性讀取出來,
	buffer指定數據塊位置,sizeof數據塊字節數,count讀取次數,fp指向源磁盤文件*/
    fclose(fp);
    return(i-1);
}

void input(int k) /*輸入學生信息*/
{
	getchar();
	printf("學號:");   gets(stu[k].num);
	printf("姓名:");   gets(stu[k].name);
	printf("性別:");   gets(stu[k].sex);
	printf("出生年月:");  scanf("%d/%d/%d",&stu[k].birthday.year,&stu[k].birthday.month,&stu[k].birthday.day);
	printf("年齡:");   scanf("%d",&stu[k].age);  getchar();
    printf("籍貫:");   gets(stu[k].addr);
	printf("系別:");   gets(stu[k].dept);
	printf("專業:");   gets(stu[k].major);
	printf("班級:");   gets(stu[k].classs);
	printf("電話:");   gets(stu[k].phone);
}

void save(int n) /*保存學生信息*/
{
	void exit();
	FILE *fp;
	int i;
    if((fp=fopen("D:\\file.txt","wb"))==NULL) /*只打開或建立一個二進制文件,只允許寫數據*/
	{
		printf("\nCan not open file!\n");
        exit();
	}
    for(i=0;i<n;i++)
      if(stu[i].name[0]!='\0')
         if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) /*將一批數據作為一個整體一次性寫入磁盤文件*/
            printf("文件寫入錯誤!\n");
    fclose(fp);
}

void printf_back()/*添加學生信息後顯示的“是浏覽還是返回”*/
{
   int w,k=0;
   void browse();
   void menu();
   printf("\n\n\t^_^.插入成功. ^_^\n\n");
   do
   {
      printf("What do you want to do next?\n\n\t1).浏覽所有\t2).返回:  [ ]\b\b");
      scanf("%d",&w);
      if(w==1)
	  {
		  system("cls");
		  browse();
	  }
      else if(w==2)
	  {
		  system("cls");
		  menu();
	  }
      else
	      printf("  選擇錯誤!請重新選擇!\n");
   }while(k==0);
}

void insert() /*添加學生信息*/
{
    int i,n,k,t;
    FILE *fp;
    if((fp=fopen("D:\\file.txt","rb"))==NULL) /*讀入空文件,rb表示打開一個二進制文件,只允許讀數據*/
	{
		printf("How many people do you want to add(1-%d)?:",N-1);
		n=0;
	}
	else
	{
	  n=load();
      printf("How many student do you want to insert (1-%d)?:",N-n-1);
	}
    scanf("%d",&t);
    k=n+t;
    for(i=n;i<k;i++)
	{
	   printf("\n輸入第 %d 個學生學籍信息.\n",i-n+1);
	   input(i);
	}
    save(k); /*保存所有學生的信息*/
    printf_back();
}

void deleter() /*刪除*/
{
	void menu();
	if(!flag)
	{
		printf("\n\n\t請先登錄!\n");
		printf("\n\t請按 Enter 鍵進入登錄界面!");
		getchar();
		getchar();
		login();
	}
	else
	{
	    struct student s;
	    int i,n,k,w0,w1;
        n=load();
        do
		{
	        k=-1;
            //printf_n(n); /*刪除之前先顯示所有學生的信息*/
            do
			{
	             printf("\n\n請輸入您想要刪除的學生的姓名!\nName:");
                 scanf("%s",s.name);
                 for(i=0;i<n;i++)
                   if(strcmp(s.name,stu[i].name)==0)
				   {
		              k=i;
		              s=stu[i];
				   }
                 if(k==-1)
				 {
					 int m;
					 printf("\n\n沒有這個學生的信息!\n");
                     printf("What do you want to do next? 1.繼續輸入  2.返回主菜單    [ ]\b\b");
                     scanf("%d",&m);
					 if(m==1)
						 deleter();
					 else
					 {
						 k=0;
						 menu();
					 }
				 }
			}while(k==-1);
	        printf_one(k);
            printf("\n\t確定刪除?\n\t1).是   2).返回  [ ]\b\b");/*再次詢問是否刪除*/
            scanf("%d",&w0);
            if(w0==1)
			{
		       stu[k].name[0]='\0';
		       save(n);
			}
	        else
		        break;
            printf("\n\t^_^.成功刪除^_^.\n");
            printf("What do you want to do?\n\t1).繼續   2).返回  [ ]\b\b");
            scanf("%d",&w1);
		}while(w1==1);
	  system("cls");
      menu(); /*不再刪除時返回主菜單,w1!=1*/
	}
}

void search() /*查找*/
{
	void menu();
	int w0,k,i,n,w1,w2;
	struct student s;
	FILE *fp;
    if((fp=fopen("D:\\file.txt","rb"))!=NULL) /*不是空文件*/
	   n=load();
    do
	{
		printf("請選擇查找類別:  1.姓名  2.學號   [ ]\b\b");
        scanf("%d",&w1);
		if(w1<1||w1>2)
		{
			printf("輸入錯誤!請重新輸入!\n");
			w2=1;
		}
		else
			w2=0; /*這裡要注意:不加這句話會陷入死循環,跳不出來*/
	}while(w2==1);
    if(w1==1) /*按姓名查找*/
	{
		do
		{
			k=-1;
	        do
			{
				printf("\n請輸入您想要查找的學生的姓名!\nName:");
                scanf("%s",s.name);
                for(i=0;i<n;i++)
                  if(strcmp(s.name,stu[i].name)==0)
				  {
					  k=i;
					  s=stu[i];
				  }
                  if(k==-1) /*沒有找到*/
				  {
				     int o;
			         printf("\n\n沒有這個學生的信息!\n!");
				     printf("What do you want to do?\n\t1.繼續    2.返回菜單  [ ]\b\b");
				     scanf("%d",&o);
				     if(o==1)
					 {
						 system("cls");
						 search(); /*繼續查找*/
					 }
				     else
					 {
						 system("cls");
						 menu();
					 }
				  }
			}while(k==-1);
		   system("cls");
           printf_one(k); /*找到以後輸出這個學生的信息*/
           printf("\nWhat do you want to do next?\n\t1).繼續    2).返回菜單   [ ]\b\b");
           scanf("%d",&w0);
		}while(w0==1);
	  system("cls");
      menu(); /*不再查找時返回主菜單*/
	}
    else /*按學號查找*/
	{
        do
		{
	       k=-1;
	       do
		   {
	           printf("\n請輸入您想要查找的學生的學號!\nNum:");
               scanf("%s",s.num);
               for(i=0;i<n;i++)
                 if(strcmp(s.num,stu[i].num)==0) /*找到了*/
				 {
			       k=i;
			       s=stu[i];
				 }
               if(k==-1) /*沒有找到*/
			   {
				  int o;
			      printf("\n\n沒有這個學生的信息!\n!");
				  printf("What do you want to do?\n\t1.繼續    2.返回菜單  [ ]\b\b");
				  scanf("%d",&o);
				  if(o==1)
				  {
					  system("cls");
					  search(); /*繼續查找*/
				  }
				  else
				  {
					  system("cls");
					  menu();
				  }
			   }
		   }while(k==-1);
		   system("cls");
	       printf_one(k); /*找到以後輸出這個學生的學籍信息*/
           printf("\nWhat do you want to do?\n\t1).繼續   2).返回菜單   [ ]\b\b");
           scanf("%d",&w0);
		}while(w0==1);
	  system("cls");
      menu();/*不再查找時返回主菜單*/
	}
}

int modify_data(int i) /*修改信息函數*/
{
	int c,w1;
	void menu();
    do
	{
		puts("\n請選擇要修改的選項:\n\n1.學號 2.姓名  3.性別  4.出生日期  5.年齡 6.籍貫 7.系別 8.專業 9.班級 10.電話   11.所有信息 12.取消並返回");
        printf("請選擇?: [  ]\b\b\b");
        scanf("%d",&c);
        if(c>12||c<1)
		{
			puts("\n選擇錯誤!請重新選擇!");
			getchar();
		}
	}while(c>12||c<1);
   do
   {
	   switch(c)
	   {
	     case 1: printf("學號:");  scanf("%s",stu[i].num); break;
         case 2: printf("姓名:");  scanf("%s",stu[i].name); break;
         case 3: printf("性別:");  scanf("%s",stu[i].sex); break;
         case 4: printf("出生年月:");  scanf("%d/%d/%d",&stu[i].birthday.year,&stu[i].birthday.month,&stu[i].birthday.day); break;
		 case 5: printf("年齡:");  scanf("%d",&stu[i].age);break;
		 case 6: printf("籍貫:");  scanf("%s",stu[i].addr);break;
		 case 7: printf("系別:");  scanf("%s",stu[i].dept);break;
		 case 8: printf("專業:");  scanf("%s",stu[i].major);break;
		 case 9: printf("班級:");  scanf("%s",stu[i].classs);break;
		 case 10: printf("電話:");  scanf("%s",stu[i].phone);break;
		 case 11: input(i); break;  /*修改這個學生的所有信息*/
		 case 12: menu();  /*返回主菜單*/
	   }
       puts("\nNow:\n");
       printf_one(i); /*輸出 修改後 的這個學生的信息*/
       printf("\n確定?\n\n\t1).是  2).不,重新修改  3).返回不保存 [ ]\b\b");
       scanf("%d",&w1);
   }while(w1==2);
   return(w1); /*修改成功並選擇1後返回1*/
}

void modify() /*修改*/
{
	void menu();
	if(!flag)
	{
		printf("\n\n\t請先登錄!\n");
		printf("\n\t請按 Enter 鍵進入登錄界面!");
		getchar();
		getchar();
		login();
	}
	else
	{
	   struct student s;
	   int i,n,k,w0=1,w1,w2=0;
       n=load();
       do
	   {
	      k=-1;
          //printf_n(n); /*刪除之前先顯示所有學生的信息*/
          do
		  {
	         printf("\n請輸入您想要修改的學生的姓名!\nName:");
             scanf("%s",s.name);
             for(i=0;i<n;i++)
               if(strcmp(s.name,stu[i].name)==0) /*與其中一個學生匹配*/
			   {
		           k=i;
		           s=stu[i];
			   }
             if(k==-1) /*沒有找到輸入的學生*/
			 {
				 int o;
			     printf("\n\n沒有這個學生的信息!\n");
				 printf("What do you want to do?\n\t1.繼續    2.返回菜單  [ ]\b\b");
				 scanf("%d",&o);
				 if(o==1)
				 {
					 system("cls");
					 modify(); /*繼續修改*/
				 }
				 else
				 {
					system("cls");
					menu();
				 }
			 }
		  }while(k==-1);
		  system("cls");
	      printf_one(k); /*輸出這個學生的信息*/
          w1=modify_data(k);
          if(w1==1) /*判斷是否修改成功修改*/
		  {
		     printf("\n\t^_^.修改成功 ^_^.\n\n是否繼續?\n\n\t1).是 2).保存返回\t[ ]\b\b");
             scanf("%d",&w0);
			 w2=1;
		  }
          else
		  {
		     w0=0;
		     if(w2==0)
			     stu[k]=s;
		  }
          if((w0!=1)&&(w2==1)) /*修改成功保存*/
	         save(n);
	   }while(w0==1);
	   system("cls");
     menu();/*不再修改返回主菜單*/
	}
}

void browse()/*浏覽*/
{
	system("color 5f");
    void menu();
    int n;
    n=load();
    printf_n(n);
    printf("  共有 %d 個學生的記錄.\n",n);
    printf("\nPress [ ENTER ] key to back...");
    getchar();
	system("cls");
    menu(); /*返回主函數*/
}

void exit() /*退出*/
{
	exit(0);
}

void face()  /*訪問頁面*/
{
	system("color 4e");
	printf("\n\t    ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★\n\n");
	puts("\t    ※※※※※※※※※※※※※※※※※※※※※※※※※※※");
	puts("\t    ※※                                              ※※");
	puts("\t    ※※                                              ※※");
	puts("\t    ※※           歡迎訪問學生學籍管理系統!          ※※");
	puts("\t    ※※                                              ※※");
	puts("\t    ※※                                              ※※");
	puts("\t    ※※                                              ※※");
	puts("\t    ※※                                              ※※");
	puts("\t    ※※                              制作人:李遠航  ※※");
	puts("\t    ※※                                   2013.6.20  ※※");
    puts("\t    ※※                                              ※※");
	puts("\t    ※※※※※※※※※※※※※※※※※※※※※※※※※※※");
	printf("\n\tPress [ Enter ] key to continue……\n");
	getchar();
	system("cls");
}

void menu() /*主菜單*/
{
	system("color 2e");
	printf("\n\t\t\t歡迎使用學生學籍管理系統!\n");
	printf("\n");
	int n,w1;
    do
	{
	   puts("\t\t★★★★★★★★    菜單  ★★★★★★★★");
	   puts("\t\t★               1.登  錄               ★");
	   puts("\t\t★               2.插  入               ★");
	   puts("\t\t★               3.刪  除               ★");
	   puts("\t\t★               4.查  找               ★");
	   puts("\t\t★               5.修  改               ★");
	   puts("\t\t★               6.浏  覽               ★");
	   puts("\t\t★               7.退  出               ★");
	   puts("\t\t★★★★★★★★★★★★★★★★★★★★★");
	   printf("請選擇服務種類(1-7) : [ ]\b\b");
	   scanf("%d",&n);
	   if(n<1||n>7)
	   {
		   system("cls");
		   printf("選擇錯誤!  請重新選擇!\n");
		   w1=1;
	   }
	   else
		   w1=0;
	}while(w1==1);
	switch(n)
	{
	   case 1: login();  break; /*登錄*/
	   case 2: system("cls");  insert();   break; /*插入*/
	   case 3: system("cls");  deleter();  break; /*刪除*/
	   case 4: system("cls");  search();  break; /*查找*/
	   case 5: system("cls");  modify();  break; /*修改*/
	   case 6: system("cls");  browse();  break; /*浏覽*/
	   case 7: exit(); break; /*退出*/
	}
}

int main()
{
	face();
    menu();
    return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved