1. 程式人生 > >大學宿舍管理系統 C語言實現

大學宿舍管理系統 C語言實現

廢話不說,先上程式碼(本文最後有測試資料):

程式碼:

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

typedef struct pnode          //結構體定義 用於存放學生資訊的節點
{
	char name [10];           //姓名
	char num[16];             //學號
	char dor[30];             //房號
	char group[20];           //班級
}student;

char filename[200]="data.txt";            //檔名
FILE *fp;                     //指向檔案的指標
void creat()                  // 建立一個二進位制檔案   用於存放學生資料
{   student *person;
    person=(student *)malloc(sizeof(student));   //為節點分配記憶體
    if((fp=fopen(filename,"w+"))==NULL)  
	{
		exit(0);
	}
	printf("data.txt檔案已建立。\n\n");
	printf("\n請輸入學生的姓名 學號 房號 班級 用空格隔開 以#結束\n");
	scanf("%s",person->name);
	while(strcmp(person->name,"#"))    //該迴圈用於控制學生資訊的錄入 遇#結束	
	{  scanf("%s %s %s",person->num,person->dor,person->group);
	fprintf(fp,"%-10s%-10s%-10s%-10s\n",person->name,person->num,person->dor,person->group);scanf("%s",person->name);
    }
	fclose(fp);
}

void readfile()                             //檔案讀取函式  
{   
	if((fp=fopen(filename,"r+"))==NULL)
	{printf("\n無法開啟該檔案:\n");exit(0);}
	fclose(fp);
}

void output()                            //輸出函式 用於輸出檔案的全部資訊
{   student *person;
    long offset1,offset2;
    char name1[10],name2[10],name3[10];
    char num1[16],num2[16],num3[16];
    char dor1[30],dor2[30],dor3[30];
    char group1[20],group2[20],group3[20];
	person=(student *)malloc(sizeof(student));
    if((fp=fopen(filename,"r"))==NULL)
	{
		printf("\n 無法開啟該檔案");exit(0);
	}
	
	printf("\n****************************************************************\n");
    printf("%40s\n","輸出的記錄如下\n");
    printf("%-20s%-20s%-20s%-20s\n","姓名","學號","房號","班級");
	while(!feof(fp))                            //次迴圈用於輸出檔案
	{
		fscanf(fp,"%s%s%s%s\n",person->name,person->num,person->dor,person->group);
		printf("%-20s%-20s%-20s%-20s\n",
		person->name,person->num,person->dor,person->group);
	}
	fclose(fp);
	printf("************************************************************\n\n");
}
void namesearch()                              // 按姓名搜尋函式
{   int k=0;
    char namekey[10];
    student *person;
	person=(student *)malloc(sizeof(student));
    printf("\n 請輸入您要查詢的姓名:");
    scanf("%s",namekey);
	if((fp=fopen(filename,"rb"))==NULL)
	{printf("\n 無法開啟檔案");exit(0);}
    while(!feof(fp))
	{
fscanf(fp,"%s %s %s %s\n",person->name,person->num,person->dor,person->group);
if(!strcmp(namekey,person->name))   
		{   printf("\n\n 已經為您找到 以下是記錄:\n\n");
            printf("%-20s%-20s%-20s%-20s\n","姓名","學號","房號","班級");
printf("%-20s%-20s%-20s%-20s\n",person->name,person->num,person->dor,person->group);
			k=1;
		}
	}
    if(!k)
		printf("\n\n 沒有關於此姓名的任何資訊! \n");
	    fclose(fp);
}
void numsearch()                                     //按學號搜尋函式
{   int k=0;
    char xhkey[16];
    student *person;
	person=(student *)malloc(sizeof(student));
    printf("\n 請您輸入需要查詢的學號:");
    scanf("%s",xhkey);
    if((fp=fopen(filename,"rb"))==NULL)
	{
		printf("\n 無法開啟檔案 ");
        exit(0);
    }
    while(!feof(fp))
	{
fscanf(fp,"%s %s %s %s\n",person->name,person->num,person->dor,person->group);  
        if(!strcmp(xhkey,person->num))    
		{   printf("\n\n 已經為您找到 以下是記錄:\n\n"); 
			printf("%-20s%-20s%-20s%-20s\n","姓名","學號","房號","班級");
printf("%-20s%-20s%-20s%-20s\n",person->name,person->num,person->dor,person->group);
			k=1;
		}
	}
    if(!k) 
		printf("\n\n 沒有關於該學號的任何資訊\n");
        fclose(fp);
}
void dorsearch ()                                     //按房號搜尋函式
{   int k=0;
    char fhkey[30];
    student *person;
    person=(student *)malloc(sizeof(student));
    printf("\n 請您輸入想要查詢的房號");
    scanf("%s",fhkey);
    if((fp=fopen(filename,"rb"))==NULL)
	{   printf("\n 無法開啟檔案");
        exit(0);
	}
    while(!feof(fp))
    {
fscanf(fp,"%s %s %s %s\n",person->name,person->num,person->dor,person->group);
       if(!strcmp(fhkey,person->dor))          
	   {   printf("\n\n 已經為您找到 以下是記錄:\n\n");
		   printf("%-20s%-20s%-20s%-20s\n","姓名","學號","房號","班級");
printf("%-20s%-20s%-20s%-20s\n",person->name,person->num,person->dor,person->group);
		   k=1;
	   }
    }
    if(!k) 
		printf("\n\n 沒有關於此房號的任何資訊\n");
        fclose(fp);
}
void  add()                //插入函式  用於像已有檔案插入一條新的學生資訊記錄
{   student *person;
    person=(student *)malloc(sizeof(student));
    if((fp=fopen(filename,"a"))==NULL)
    { printf("\n 無法開啟檔案");exit(0);}
    printf("\n 請您輸入學生姓名 學號 房號 班級 \n");
	scanf("%s %s %s %s",person->name,person->num,person->dor,person->group);
fprintf(fp,"%-10s%-10s%-10s%-10s\n",person->name,person->num,person->dor,person->group);
    fclose(fp);
}
void modify()             //更新函式 用於修改指定學生姓名的記錄
{   int k=0;
    long offset;
    char namekey[10];
    student *person;
    person=(student *)malloc(sizeof(student));
    printf("\n 請您輸入想要更改的學生的姓名 :");
    scanf("%s",namekey);
    if((fp=fopen(filename,"r+"))==NULL)
	{  printf("\n 無法開啟檔案"); exit(0);}
    while(!feof(fp))
    {   offset=ftell(fp);
fscanf(fp,"%s %s %s %s\n",person->name,person->num,person->dor,person->group);
		if(!strcmp(namekey,person->name))    //比較是否相同 如
		{k=1; break;}
	}
	if(k)                   //相同 輸出記錄並進行修改
    {   printf("\n 記錄輸出如下:\n\n"); 
		printf("%-20s%-20s%-20s%-20s\n","姓名","學號","房號","班級");
printf("%-20s%-20s%-20s%-20s\n",person->name,person->num,person->dor,person->group);
        printf("\n 請您輸入新的學生姓名 學號 房號 班級:\n");
        scanf("%s %s %s %s",person->name,person->num,person->dor,person->group);
		fseek(fp,offset,SEEK_SET);
fprintf(fp,"%-10s%-10s%-10s%-10s\n",person->name,person->num,person->dor,person->group);
    }
	else
		printf("\n 沒有關於該姓名的任何記錄\n");
        fclose(fp);
}
void deleted()                      //刪除函式 用於刪除指定學生姓名的記錄
{
	int k=0;
    char m;
    long offset;
    char namekey[10];
    student *person;
    person=(student *)malloc(sizeof(student));
    printf("\n請您輸入想要刪除的姓名:");
    scanf("%s",namekey);
    if((fp=fopen(filename,"r+"))==NULL)
	{
		printf("\n 無法開啟檔案 ");
        exit(0);
	}
    while(!feof(fp))                   //此迴圈遍歷整個檔案 查詢需要刪除的記錄
	{ 
		offset=ftell(fp);
fscanf(fp,"%s %s %s %s\n",person->name,person->num,person->dor,person->group);
        if(!strcmp(namekey,person->name))
		{   k=1; break; }
	}
    if(k)
	{   printf("\n 記錄輸出如下:\n\n");
		printf("%-20s%-20s%-20s%-20s\n","姓名","學號","房號","班級");
printf("%-20s%-20s%-20s%-20s\n",person->name,person->num,person->dor,person->group); printf("\n  您真的確定要刪除?y/n?");
        scanf("%s",&m);
		if(m=='y')       //刪除確認按鈕 
		{   fseek(fp,offset,SEEK_SET);   //刪除記錄
            fprintf(fp,"%-10s%-10s%-10s%-10s\n","","","","");
		}
       else rewind(fp);
	}
    else printf("\n 沒有關於該姓名的任何記錄\n");
	fclose(fp);
}

int main()  //主函式 
{   
	int m,flag=1;             // m用於控制選單的選擇項     flag用於控制選單彈出
	while(flag)
	{
		printf("%40s\n","平頂山大學宿舍管理系統");
		printf("--------------------------------------------------------------------------------\n"); 
        printf("\t\t0 ------------  建立檔案\n");
        printf("\t\t1 ------------  開啟檔案\n");
        printf("\t\t2 ------------  姓名查詢\n");
        printf("\t\t3 ------------  學號查詢\n");
        printf("\t\t4 ------------  房號查詢\n");
        printf("\t\t5 ------------  修改記錄\n");
        printf("\t\t6 ------------  刪除記錄\n");
        printf("\t\t7 ------------  增加紀錄\n");
        printf("\t\t8 ------------  輸出記錄\n");
        printf("\t\t9 ------------  退出\n");
		printf("--------------------------------------------------------------------------------\n");
		printf("\t 請輸入0-9選擇您的操作:\n");
		scanf("%d",&m);
		switch(m)
		{ 
		case 0:creat(); 
		   break;
		case 1:readfile(); 
		   break;
		case 2:namesearch ();
		   break;
		case 3:numsearch(); 
		   break;
		case 4:dorsearch();  
		   break;
		case 5:modify();
		   break;
		case 6: deleted(); 
		   break;
		case 7:add();
		   break;
		case 8:output();  
		   break;
		case 9:exit(0);
		default:break;
	   }
	}
}

測試資料: 

小杰      1701      101       001       
小飛      1702      102       002       
小豪      1703      103       003       
小來      1704      104       004       
小帥      1706      106       006       
小陽      1705      105       005       
#

第一次使用先輸入0然後輸入資料(以#結束)進行建立data.txt檔案