计算机专业,毕业答辩项目 自写信息管理系统——利用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基础入门教程,欢迎初学和进阶中的小伙伴。

猜你喜欢

转载自blog.csdn.net/weixin_42743471/article/details/85218620