計算機專業,畢業答辯項目 自寫信息管理系統——利用C語言快速實現二

 

feature.cpp

#include"head.h"  
  
/********************獲取文件名;讀取內容;給num,fp,head,flieopenname賦值;創建鏈表***********************/  
//打開文件,並讀取文件   
int read_file()  
{  
    int i;  
    int fno,fsize;  
    if((fp=fopen("student_system.txt","rt"))==NULL)//判斷文件是否存在,若存在打開   
    {                                  //否則詢問是否繼續打開   
        printf("\n庫文件不存在!\n");  
        return 0;  
    }  
  
    rewind(fp);                            //使文件內部指針移動到文件的開始位置   
    fno=fileno(fp);              //獲取文件描述字                         
    fsize=filelength(fno);      //計算文件大小,以字節爲單位   
    num=fsize/sizeof(Node);     //計算文件包含的學生信息數目   
    iend=inew=(STUDENT *)malloc(sizeof(STUDENT));//申請動態空間   
    fread(inew,sizeof(Node),1,fp);   //以Node(結構體)的空間大小讀數據   
    for(i=1;i<=num;i++)   //利用for循環創建鏈表,並把數據儲存到其中   
    {  
        if(i==1)          //第一個節點的創建   
        {  
            inew->next=head;  
            inew->last=NULL; //雙向鏈表   
            iend=inew;  
            head=inew;  
        }  
        else  
        {  
            inew->next=NULL;  
            inew->last=iend;  
            iend->next=inew;  
            iend      =inew;  
        }  
        inew=(STUDENT *)malloc(sizeof(STUDENT));  
        fread(inew,sizeof(Node),1,fp);  
    }  
    free(inew);//釋放最後一個沒有儲存數據的節點   
    fclose(fp);//關閉文件   
    return num;  
}  
  
  點擊鏈接加入羣聊【C/C++學習入門】:


 
/****************************輸入函數*******************/   
  
STUDENT *pinput()  
{  
    char ch;  
    if(num==0)//判斷是否是第一次錄入   
    {  
        iend=inew=(STUDENT *)malloc(sizeof(STUDENT));//申請空間   
        inputone(inew);                              //錄入信息   
        while(1)                                        
        {  
            num++;             
            if(num==1)       //錄入第一個學生信息時,第一個節點的指針指向             
            {  
                inew->next=NULL;  
                inew->last=NULL;   
                iend      =inew;  
                head      =inew;  
            }  
            else             //在第一個節點的存在下,進行其他節點的錄入                 
            {  
                inew->next=NULL;     //新建立節點next指向NULL           
                inew->last=iend;     //新建立節點last指向上一個節點   
                iend->next=inew;     //第一個next->下一個節點  
                iend      =inew;     //讓iend指向最後一個節點   
            }  
            inew=(STUDENT *)malloc(sizeof(STUDENT));  
            printf("信息輸入完畢,是否繼續?(是-Y  否-N):");   
            scanf("\n%c",&ch);  
            if(ch=='N'||ch=='n')     break;//判斷是否跳出循環   
            inputone(inew);   
        }  
        free(inew);                  //釋放未存儲數據的節點   
        return head;  
    }  
    else//非第一次錄入時   
    {  
        while(1)//進行循環輸入,並進行判斷,是否跳出循環   
        {  
              
            inew=(STUDENT *)malloc(sizeof(STUDENT));  
            getch();  
            inputone(inew);  
            num++;  
            inew->next=NULL;   //新建立節點next指向NULL      
            inew->last=iend;   //新建立節點last指向上一個節點  
            iend->next=inew;   //第一個next->下一個節點     
            iend      =inew;   //讓iend指向最後一個節點  
            printf("信息輸入完畢,是否繼續?(是-Y  否-N):");  
            scanf("\n%c",&ch);  
            if(ch=='N'||ch=='n')  
             break;  
        }  
        return head;  
    }  
}  
  
void inputone(STUDENT *temp)  
{  
    printf("************************\n");  
    printf("請輸入學生的姓名:");  
    scanf("%s",inew->information.mname);  
    printf("請輸入學生的學號:");  
    scanf("%s",inew->information.schoolnum);  
    printf("請輸入學生的性別(男-M  女-F):");  
    scanf("%s",inew->information.sex);  
    printf("請輸入學生的年齡:");  
    scanf("%d",&inew->information.age);  
    printf("請輸入學生的家庭住址:");  
    scanf("%s",inew->information.address);  
    printf("請輸入學生的電話號碼:");  
    scanf("%s",inew->information.phone);  
}  
  
  
  
  無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多幹貨和技術資料分享!學習裙【  玖四捌,玖伍四,四捌四 】
  
/****************************輸出函數*******************/   
void displayone(STUDENT *temp) //爲簡化程序-  單個輸出函數,用於調用!   
{  
    printf("**********************************\n");   
    printf("姓名:%s\n",temp->information.mname);  
    printf("學號:%s\n",temp->information.schoolnum);   
    printf("性別:%s\n",temp->information.sex);  
    printf("年齡:%d\n",temp->information.age);  
    printf("家庭住址:%s\n",temp->information.address);  
    printf("電話號碼:%s\n",temp->information.phone);  
    printf("===========================\n");  
}  
  
/**************************以head爲起始輸出鏈表******************************/  
void pdisplay()//核心思想:對鏈表進行操作,然後利用while循環輸出   
{  
    STUDENT *temp,*temp1;  
    int page=1,lastnum=num%PAGE,stu=0,i,page1;  
    char ch;  
    int choice;  
    if(head==NULL)//判斷文件中是否有數據   
    {  
        printf("文件中沒有數據!!\n");  
        getch();  
        return;  
    }  
    temp=head;  
    page1=num/PAGE+1;//進行頁數的初始化   
    if(lastnum==0)//判斷最後一頁的數據數   
    {  
        lastnum=PAGE;  
        page1=page1-1;  
    }     
    while(1)//保留最後節點的指針   
    {  
        if(temp->next==NULL)  
        {  
            temp1=temp;  
            break;  
        }  
        temp=temp->next;  
    }   
    temp=head;  
    rewind(fp);       
loop:   printf("----------------------------第%d頁-----------------------------\n",page);  
    while(temp!=NULL)//利用while 結構進行輸出 知道到最後節點   
    {  
        displayone(temp);   
        temp=temp->next;  
        stu++;  
        if(stu==PAGE)//一頁輸出完後進行選擇,對其鏈表進行操作   
        {  
            printf("4---首頁  <--上一頁--1                   3--下一頁-->  尾頁---6  \n");  
            scanf("%d",&choice);  
            switch(choice)  
            {  
                case 1://上一頁,清屏 ,對其鏈表進行操作   
                    for(i=1;i<=PAGE+stu;i++)  
                    {  
                        temp=temp->last;  
                        if(temp==head)  
                        {  
                            temp=head;  
                            page=1;  
                            break;  
                        }  
                    }  
                    if(temp!=head)  
                    page--;  
                    stu=0;  
                    system("cls");  
                    goto loop;  
                      
                    break;  
                case 4://第一頁,清屏 ,把head值賦給temp   
                    system("cls");  
                    temp=head;  
                    stu=0;  
                    page=1;  
                    goto loop;   
                    break;  
                case 6://最後一頁,清屏 ,對鏈表進行操作,找到相應鏈表值賦給temp   
                    system("cls");  
                    temp=temp1;  
                    for(i=1;i<=lastnum-1;i++)  
                    {  
                        temp=temp->last;  
                        if(temp==head)  
                        {  
                            temp=head;  
                            page=1;  
                            break;  
                        }  
                    }  
                    if(temp!=head)  
                    page=page1;   
                    goto loop;    
                    break;  
                case 3://下一頁,清屏 繼續輸出,  
                    system("cls");  
                    stu=0;  
                    page++;  
                    goto loop;  
                    break;                
            }  
            stu=0;  
        }     
    }             
    if(temp==NULL)  
    {  
        printf("\n-------------已到尾頁,是否返回首頁?(是-Y 否-N):---------------");  
        scanf("\n%c",&ch);  
        if(toupper(ch)=='Y')  
        {  
            temp= head;  
            page=1;   
            stu=0;  
            system("cls");  
            goto loop;  
        }  
    }      
    getch();  
}  
  
/***************************加上提示語句*以head爲起始輸出鏈表**********************************/   
void pdisplay_sort()  
{                     //提示語句,表示已經進行排序,然後調用輸出函數   
    printf("\n信息已經進行了排序,排序後信息如下:\n");  
    pdisplay();  
}  
  
  
  
  
  
  

關於怎麼快速學C/C++編程,有什麼方法,這個問題,想必大家都已經心中有數了,打算深入瞭解這個行業的朋友,可以加下小編的C/C++編程學習羣:948954484不管你是小白還是大牛,小編我都歡迎,不定期分享乾貨,包括小編自己整理的一份2018最新的C/C++資料和0基礎入門教程,歡迎初學和進階中的小夥伴。

 

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