VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 1543|回复: 10

[原创软件源码] C语言做的旅游记录管理系统

[复制链接]
48_avatar_middle
在线会员 heiyang1563 发表于 2017-6-7 00:20:52 | 显示全部楼层 |阅读模式
好久没有写代码了,这次静下心来做了个课程报告的题,原题目为下面这个,由于审题过急,没有审清题意,第一次做完直接把处理的记录信息放入了文件中,后来又加入了在控制面板进行查询等处理操作,粘贴代码希望和读者一起进步!QQ:1249223183
题目
在一个数据文件中存放若干旅游信息数据记录,每条记录都有如下数据项:
线路编号、目的地、旅游天数、旅游类别、出行月份、价格。
编写一个程序,采用链式存储结构存储这批数据,并对该数据进行排序。
要求:链表按旅游目的地进行分类存取,同一目的地的旅游线路按照月份升序排序。
分别统计每个月、每个目的地的旅游线路总数。
把排序后的旅游记录及旅游线路总数存入另一个数据文件中。

话不多说,直接上代码↓↓↓↓↓

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

struct journey{
        int num;                        //线路编号
        char addr[100];                //目的地
        int day;                        //旅游天数
        char type[30];                //旅游类别
        int month;                        //出行月份
        int value;                        //价格
        struct journey *next;
};
//目的地统计
struct address{
char Add[100];                        //目的地
int Num;                                //目的地记录数
struct address* next;
};
//月份统计
struct Month
{
int mon;        //月份
int cou;                //每月记录数
struct Month *next;
};


struct address* ah;                //目的地链表头
struct Month *        monp;                //月份链表头

int count=0;  //记录数量

struct journey * read(char* filename);        //打开文件并读取数据到链表
void write(struct journey * head,char* filename);        //写入数据到文件
void fen(struct journey * head);        //按目的地分类
void sort(struct journey * flag,int High);        //按月份排序
void tongji(char* filename);        //输出统计信息

int main()
{
        int a,k;
        struct journey *head;        //链表头指针
        struct journey * monthp;  //月份指针
        struct journey * addrp;  //目的地指针
        struct Month * monthp1;  //月份指针
        struct address* addrp1;  //目的地指针
        char filebefore[50]="journeydate.txt";        //原文件
        char fileafter[50]="finishdate.txt";        //处理后文件
        char ADDress[100];                                //目的地
        int  MOUnth;
        head=read(filebefore);                                        //读取数据到链表head
        fen(head);                                                                //分类排序链表
        write(head,fileafter);                                        //写入数据到文件
        while(1)
        {
                k=0;
                printf("************旅游记录管理************\n");
                printf("*     1.按月份查询记录             *\n");
                printf("*     2.按目的地查询记录           *\n");
                printf("*     3.按月份统计                 *\n");
                printf("*     4.按目的地统计               *\n");
                printf("请输入操作的序号:\n");
                scanf("%d",&a);
                switch(a)
                {
                case 1:
                        monthp=head;
                        printf("请输入月份\n");
                        scanf("%d",&MOUnth);
                        printf("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n");
                        printf("*****************************************************\n");
                        printf("#\t线路编号\t目的地\t旅游天数\t旅游类别\t出行月份\t价格\t#\n");
                        while(monthp!=NULL)                                                //输出统计的月份信息
                        {
                                if(monthp->month==MOUnth)
                                                printf("*\t%4d\t%10s\t%4d\t%10s\t%8d\t%8d\t*\n",monthp->num,monthp->addr,monthp->day,monthp->type,monthp->month,monthp->value);       
                                monthp=monthp->next;
                        }
                        break;
                case 2:
                        addrp=head;
                        printf("请输入目的地:\n");
                        scanf("%s",ADDress);
                        printf("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n");
                        printf("*****************************************************\n");
                        printf("#\t线路编号\t目的地\t旅游天数\t旅游类别\t出行月份\t价格\t#\n");
                        while(addrp!=NULL)                                                //输出统计的目的地链表的信息
                        {
                                if(strcmp(ADDress,addrp->addr)==0)
                                {
                                printf("*\t%4d\t%10s\t%4d\t%10s\t%8d\t%8d\t*\n",addrp->num,addrp->addr,addrp->day,addrp->type,addrp->month,addrp->value);
                                k=1;
                                }
                                addrp=addrp->next;
                        }
                        if(k==0)
                                printf("目的地%s不存在!\n",ADDress);
                        break;
                case 3:
                        monthp1=monp;
                        printf("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n");
                        printf("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n");
                        printf("\t\t#\t\t月份路线统计信息:\t\t#\n");
                        printf("\t\t#\t\t月份\t\t路线数\t\t#\n");
                        while(monthp1!=NULL)                                                //输出统计的月份信息
                        {
                                printf("\t\t#%10d\t\t%6d\t\t\t#\n",monthp1->mon,monthp1->cou);       
                                monthp1=monthp1->next;
                        }
                        break;
                case 4:
                        addrp1=ah;
                        printf("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n");
                        printf("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n");
                        printf("\t\t#\t\t目的地路线统计信息:\t#\n");
                        printf("\t\t#\t目的地\t\t路线数\t\t\t#\n");
                        while(addrp1!=NULL)                                                //输出统计的目的地链表的信息
                        {
                                printf("\t\t#%8s\t\t%4d\t\t\t#\n",addrp1->Add,addrp1->Num);       
                                addrp1=addrp1->next;
                        }
                        break;
                default:
                        printf("输入有误,请重新输入!\n");
                }
                //system("CLS");
        }
        return 0;
}

struct journey * read(char* filename)        //打开文件并读取数据到链表
{
        FILE *fb;
        struct journey *Head;                                //连表头
        char buf[100];                                                //目的地缓冲
        long int bf,cf;                                                //文件指针
        char temp[10] = {0};                                //读取多余字符
        char c;
        int fla=1;                                                //fla为1时首次输入目的地链表
        struct journey *p,*q,*k;
        struct address* mp,*mq,*p1,*p2;                        //统计目的地指针
        struct Month *Monp,*Monq,*Monp1,*Monp2;        //统计月份指针
        mp=(struct address *)malloc(sizeof(struct address));        //新建目的地连表头
        Monp=(struct Month *)malloc(sizeof(struct Month));                //新建月份连表头
        ah=mp;
        monp=Monp;
        if(!(fb=fopen(filename,"r")))                                        //打开文件
                printf("open file failed!");
        p=(struct journey *)malloc(sizeof(struct journey));                //新建记录头
        Head=p;
        while(!feof(fb))                //读取整个文件
        {
                c = fgetc(fb);
                if (c == '#')                        //跳过#所在行
                {
                        while(fgetc(fb)!='#');
                }
                else if(c=='*')                //读取*所在行
                {
                       
                        long int af = 0,n=sizeof(char);
                        bf=ftell(fb);
                        while(fgetc(fb)!='*')        //定位*所在行尾位置
                        {
                                af=ftell(fb);
                                n+=sizeof(char);
                        }
                        fseek(fb,-n,SEEK_CUR);                //回到*所在行首
                        cf = ftell(fb);
                        while(ftell(fb)<=af&&ftell(fb)>=bf)        //一组一组读取文件记录到链表
                        {       
                                fscanf(fb,"%d%s%d%s%d%d",&p->num,p->addr,&p->day,p->type,&p->month,&p->value);
                                fscanf(fb,"%s",temp);
                                if(fla==1)                                //首次读取统计数据到目的地链表和月份链表
                                {
                                        strcpy(mp->Add,p->addr);
                                        mp->Num=0;
                                        mp->next=NULL;
                                        Monp->mon=p->month;
                                        Monp->cou=0;
                                        Monp->next=NULL;
                                        fla=0;
                                }
                                mp=ah;                                //目的地指针指向连表头
                                while(mp!=NULL)                //遍历目的地链表查找是否有相同的目的地
                                {
                                        if(strcmp(mp->Add,p->addr)==0)        //找到相同目的地,计数加1
                                        {
                                                mp->Num++;
                                                break;
                                        }
                                        p1=mp;
                                        mp=mp->next;
                                        if(mp==NULL)                                        //没找到找到相同目的地,新建节点
                                        {
                                                p2=(struct address *)malloc(sizeof(struct address));
                                                p1->next=p2;
                                                mp=p2;
                                                strcpy(mp->Add,p->addr);
                                                mp->Num=0;
                                                mp->next=NULL;
                                        }
                                }
                                Monp=monp;                                //月份指针指向连表头
                                while(Monp!=NULL)                //遍历目的地链表查找是否有相同的目的地
                                {
                                        if(Monp->mon==p->month)                                //找到相同月份,计数加1
                                        {
                                                Monp->cou++;
                                                break;
                                        }
                                        Monp1=Monp;
                                        Monp=Monp->next;
                                        if(Monp==NULL)                                        //没找到找到相同月份,新建节点
                                        {
                                                Monp2=(struct Month *)malloc(sizeof(struct Month));
                                                Monp1->next=Monp2;
                                                Monp=Monp2;
                                                Monp->mon=p->month;
                                                Monp->cou=0;
                                                Monp->next=NULL;
                                        }
                                }

                                count++;                        //记录数
                                q=(struct journey *)malloc(sizeof(struct journey));
                                k=p;                                        //保存前一个节点到k,在尾节点没有数据时恢复到k
                                p->next=q;
                                p=q;
                        }
                }
        }
        free(p);                                //释放空的尾节点
        k->next=NULL;                        //置空尾节点
        fclose(fb);
        return Head;
}

void write(struct journey * head,char* filename)        //写入数据到文件
{
                FILE *fa;
                struct journey *p;
                p=head;
                if(!(fa=fopen(filename,"w")))                        //打开文件
                        printf("build file failed!");
                fprintf(fa,"#\t线路编号\t目的地\t旅游天数\t旅游类别\t出行月份\t价格\t#\n");
                while(p!=NULL)                                                                //输出整理后数据
                {
                        fprintf(fa,"*\t%4d\t%10s\t%4d\t%10s\t%8d\t%8d\t*\n",p->num,p->addr,p->day,p->type,p->month,p->value);
                        p=p->next;
                }
                fclose(fa);       
                tongji(filename);        //输出统计信息               
}
       
void fen(struct journey * head)        //按目的地分类
{
        struct journey *pbase;        //当前比对值指针
        struct journey *temp;        //临时交换中间变量指针
        struct journey *pmove;        //移动指针
        struct journey *pfllow;        //跟着移动指针移动的,移动指针前一个位置
        struct journey *flag;                                //相同目的地的首位置
        int high;                                                        //相同目的地的数量
        char bufaddr[100] = {0};
        pbase = head;
        pfllow = pbase;
        pmove = pbase->next;
        while(pbase != NULL)                //遍历链表
        {
                strcpy(bufaddr, pbase->addr);

                flag=pbase;
                high=1;
                while(pmove != NULL)
                {
                        if (!strcmp(pmove->addr,bufaddr))                        //遍历链表查找有相同的目的地,将其插入前面相同目的地的节点后面
                        {
                                high++;
                                if (pbase->next == pmove)
                                {
                                        pbase = pmove;
                                        pfllow = pmove;
                                        pmove = pmove->next;
                                        continue;
                                }
                                else if (pmove->next == NULL)               
                                {
                                        temp = pbase->next;
                                        pbase->next = pmove;
                                        pmove->next = temp;
                                        pbase = pbase->next;
                                        pmove = pfllow->next;
                                        pfllow->next = NULL;
                                }
                                else                               
                                {
                                        temp = pbase->next;
                                        pbase->next = pmove;
                                        pfllow ->next = pmove->next;
                                        pmove->next = temp;
                                        pbase = pbase->next;
                                        pmove = pfllow->next;
                                        continue;
                                }
                        }
                        pfllow = pmove;
                        pmove = pmove->next;
                }
                sort(flag,high);
                pbase = pbase->next;
                if (pbase != NULL)
                {
                        pmove = pbase->next;
                        pfllow = pbase;
                }
        }
}

void sort(struct journey * flag,int High)        //按月份排序
{
        if(High>1&&flag!=NULL)
        {
                struct journey *first;                        //首指针
                struct journey *temp;                        //用于比较的指针
                struct journey *move;                        //移动指针
                struct journey buf;                                        //用来临时存储节点值
                int i,high;
                high=High;
                first=flag;
                temp=first;
                move=first;
                for(i=0;i<high&&move!=NULL;i++)                //遍历链表,使temp指向最小月份节点
                {
                        if(temp->month>move->month)               
                        {
                                temp=move;
                        }
                        move=move->next;
                }
                if(temp!=first)               
                {
                        strcpy(buf.addr,first->addr);                        //复制first指针内存数据到buf缓冲区
                        buf.day=first->day;
                        buf.month=first->month;
                        buf.num=first->num;
                        strcpy(buf.type,first->type);
                        buf.value=first->value;
                        strcpy(first->addr,temp->addr);                        //复制temp指针内存数据到first指针内存
                        first->day=temp->day;
                        first->month=temp->month;
                        first->num=temp->num;
                        strcpy(first->type,temp->type);
                        first->value=temp->value;
                        strcpy(temp->addr,buf.addr);                //复制buf缓冲区数据内容到temp指针内存
                        temp->day=buf.day;
                        temp->month=buf.month;
                        temp->num=buf.num;
                        strcpy(temp->type,buf.type);
                        temp->value=buf.value;
                }
                high=High;
                sort(first->next,--high);        //递归操作剩余链表
        }
        else  return;
}

void tongji(char* filename)        //输出统计的目的地和月份信息
{
        FILE *fp;
        struct address* addrp;       
        struct Month * monthp;
        if(!(fp=fopen(filename,"a")))
                        printf("build and write file failed!");
        addrp=ah;
        fprintf(fp,"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n");
        fprintf(fp,"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n");
        fprintf(fp,"\t\t#\t\t目的地路线统计信息:\t#\n");
        fprintf(fp,"\t\t#\t目的地\t\t路线数\t\t\t#\n");
        while(addrp!=NULL)                                                //输出统计的目的地链表的信息
        {
                fprintf(fp,"\t\t#%8s\t\t%4d\t\t\t#\n",addrp->Add,addrp->Num);       
                addrp=addrp->next;
        }
        monthp=monp;
        fprintf(fp,"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n");
        fprintf(fp,"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n");
        fprintf(fp,"\t\t#\t\t月份路线统计信息:\t\t#\n");
        fprintf(fp,"\t\t#\t\t月份\t\t路线数\t\t#\n");
        while(monthp!=NULL)                                                //输出统计的月份信息
        {
                fprintf(fp,"\t\t#%10d\t\t%6d\t\t\t#\n",monthp->mon,monthp->cou);       
                monthp=monthp->next;
        }
        fclose(fp);
}







上一篇:注册有积分,可以查论文,适合学生。
下一篇:驿站首发:Vc++传奇私服辅助开发教程 持续更新...

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

48_avatar_middle
ico_lz  楼主| heiyang1563 发表于 2017-6-7 00:27:13 | 显示全部楼层
# 这个是我测试用的文件里的内容,文件名命为journeydate.txt,生成文件名为finishdate.txt #
# 此回复内容可直接全部复制到文件中,两边加#的行视为注释行  #
# 线路编号  目的地  旅游天数  旅游类别  出行月份   价格  #
*        12                张掖                3                玩                        11                900  *
*        5                上海                3                玩                        8                900  *
*        9                珠海                2                吃                        9                800  *
*        12                张掖                3                玩                        10                900  *
*        9                珠海                2                吃                        4                800  *
*        12                张掖                3                玩                        1                900  *
*        5                上海                3                玩                        3                900  *

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

29_avatar_middle
online_vip CDocking 发表于 2017-6-7 01:45:41 | 显示全部楼层
怎么不做个界面管理的。。。。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

48_avatar_middle
ico_lz  楼主| heiyang1563 发表于 2017-6-7 09:20:50 来自手机 | 显示全部楼层
mfc不是很熟练,还有这个题目是要用C语言写,所以就写了个控制台的

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

48_avatar_middle
ico_lz  楼主| heiyang1563 发表于 2017-6-7 09:21:40 来自手机 | 显示全部楼层
mfc不是很熟练,还有这个题目是要用C语言写,所以就写了个控制台的

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

48_avatar_middle
ico_lz  楼主| heiyang1563 发表于 2017-6-7 09:21:55 来自手机 | 显示全部楼层
mfc不是很熟练,还有这个题目是要用C语言写,所以就写了个控制台的

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

48_avatar_middle
ico_lz  楼主| heiyang1563 发表于 2017-6-7 09:23:49 来自手机 | 显示全部楼层
mfc不是很熟练,还有这个题目是要用C语言写,所以就写了个控制台的

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

48_avatar_middle
ico_lz  楼主| heiyang1563 发表于 2017-6-7 09:24:05 来自手机 | 显示全部楼层
mfc不是很熟练,还有这个题目是要用C语言写,所以就写了个控制台的

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

48_avatar_middle
ico_lz  楼主| heiyang1563 发表于 2017-6-7 09:24:46 来自手机 | 显示全部楼层
mfc不是很熟练,还有这个题目是要用C语言写,所以就写了个控制台的

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

48_avatar_middle
ico_lz  楼主| heiyang1563 发表于 2017-6-7 09:25:41 来自手机 | 显示全部楼层
擦,点了回复没反应,竟然一次弄了三个!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

75_avatar_middle
在线会员 besteast 发表于 2018-1-27 15:38:30 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-11-16 12:21

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表