个人账户管理系统

来源:互联网 发布:c语言最长升序片段 编辑:程序博客网 时间:2024/04/30 12:38
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//文件保存路径
#define FilePath1 "Myfile.dat"
#define FilePath2 "Myfile.txt"
//查询用声明
#define Ok 1       //宏定义
#define Error 0    //宏定义
#define Notfind 2  //宏定义
//定义个人基本信息结构体变量
//c代表const费用
//ele代表electricity电
typedef struct 
{
 int month;             //定义月份
 int food_c;            //定义食品费用
 int rent_c;            //定义房租费用
 int children_c;        //定义子女费用
 int water_ele_c;//定义水电费用
 int hospital_c;        //定义医疗费用
 int carring_c; //定义存储费用
 int income_c;  //定义收入费用
}Infor;
typedef struct
{//定义链接查询的结构体变量
 int number;
 int data;
}Type;
int mode;//定义字符型(选择的操作模式)
void Show_open_picture(void);               //声明显示开机画面函数
void Show_personal_infomation(void); //声明个人管理系统功能提示及操作函数
void Show_close_infomation(void);   //声明关闭个人管理系统函数
void Input(Infor *);                           //声明接收按键输入的数据函数
void WriteInfor(Infor *);                      //声明向文件内写入内容的函数
void ChangeFormat(void);                    //声明将dat格式文件转换为txt文件
int Search(Infor *);                           //声明查询函数(返回查询的结果及状态)
void Sort(Infor *);                                    //声明排序函数
void Sum_const(Infor *);                       //声明消费之和函数
void Modify(Infor *, int);                      //声明修改数据函数
void Delete(int);                                   //声明删除数据函数
void Search_one(Infor *);                  //声明收缩单个错误函数
int main(void)
{/*主函数*/
 Show_open_picture();             /*调用开机画面函数*/
 printf("请按Enter建进入个人管理系统---------------------->");
 getchar();
 system("cls");                               /*调用系统清屏函数*/
 while(1)
 {
         Show_personal_infomation();      /*调用个人管系统功能提示及操作函数*/
 }
 return 0;
}
void Show_open_picture(void)
{/*显示开机画面*/
 system("color d");
 printf("<------------------------------------------------>\n");
 printf("**\t\t\t\t\t\t**\n");
 printf("**\t\t欢迎使用个人管理系统\t\t**\n");
 printf("**\t\t\t\t\t\t**\n");
 printf("<------------------------------------------------>\n");
 printf("**\t\t个人管理系统设计人基本信息\t**\n");
 printf("**\t\t河南科技学院新科学院\t\t**\n");  
 printf("**\t\t信工系-计科111班\t\t**\n");
 printf("**\t\t1、杨帅\t\t\t\t**\n");
 printf("**\t\t2、宋晓东\t\t\t**\n");
 printf("**\t\t3、张卫东\t\t\t**\n");
 printf("<------------------------------------------------>\n");
 printf("<------------------------------------------------>\n\n");
}
void Show_close_infomation(void)
{/*关闭个人管理系统*/
 system("cls");                               /*调用系统清屏函数*/
 system("color a");
 printf("\t请输入Enter键关闭个人管理系统\t\t\n");
 getchar();
 printf("<------------------------------------------------>\n");
 printf("<------------------------------------------------>\n");
 printf("**\t\t\t\t\t\t**\n");
 printf("**\t\t\t\t\t\t**\n");
 printf("**\t\t\t\t\t\t**\n");
 printf("**\t\t欢迎下次使用个人管理系统\t**\n");
 printf("**\t\t\t\t\t\t**\n");
 printf("**\t\t\t\t\t\t**\n");
 printf("**\t\t\t\t\t\t**\n");
 printf("<------------------------------------------------>\n");
 printf("<------------------------------------------------>\n\n");
 exit(0);
}
void Show_personal_infomation(void)
{/*个人管理系统功能提示及操作*/
 int mode;      //定义字符型(选择的操作模式)
 int mon;       //定义整形
 int flag;      //标记错与与否
 int choice;    //修改的模式
 Infor *data;
 data = (Infor *)malloc(sizeof(Infor));
 do
 {
         system("cls");                               /*调用系统清屏函数*/
         system("color b");
         printf("<------------------------------------------------>\n");
         printf("**\t\t\t\t\t\t**\n");
         printf("**\t      欢迎进入个人账簿管理系统      \t**\n");
         printf("**\t\t\t\t\t\t**\n");
         printf("<------------------------------------------------>\n");
         printf("<------------------------------------------------>\n");
         printf("**\t1、输入数据\t\t2、查看数据\t**\n");
         printf("**\t3、修改数据\t\t4、查询数据\t**\n");
         printf("**\t5、排序数据\t\t6、删除数据\t**\n");
         printf("**\t7、求和数据\t\t0、退出系统\t**\n");
         printf("<------------------------------------------------>\n");
         printf("<------------------------------------------------>\n\n");
         printf("\t\t请输入要进行的操作:\n");
         scanf("%d", &mode);
 }while(mode > 8 || mode < -1);     
 switch(mode)
 {
         case 1://1、输入数据
                 mode = Search(data);       //赋值
                 if(mode == Ok)
                         printf("已经存在该月份\n");
                 else
                 {
                         Input(data);                   //调用输入数据函数
                         WriteInfor(data);              //调用向文件内写入内容函数
                 }
                 system("pause");             //调用按任意按键输出函数
                 system("color d");
                 break;
         case 2://2、查看数据
                 ChangeFormat();                  //调用查看数据函数
                 system("pause");
                 system("color e");
                 break;
         case 3://3、修改数据
                 system("color 3");
                 mode = Search(data);       //赋值
                 mon = data->month;              //赋值
                 if(mode != Ok) printf("\n没有符合条件的记录\n");
                 else
                 {
                         printf("\n记录月份 食品消费 房租费用 子女费用 水电费用 医疗费用 储蓄费用 本月收入\n");//输出
                         printf("<---------------------------------------------------------------------->\n");
                         printf("%7d %8d %8d %8d %8d %8d %8d %8d\n", data->month, data->food_c, data->rent_c,
                                 data->children_c, data->water_ele_c, data->hospital_c, data->carring_c, data->income_c);
                         printf("<---------------------------------------------------------------------->\n");
                         
                         do{
                                 printf("请输入选择的模式:\t(1):修改该所有的数据\t(2) :修改单个数据\n");
                                 scanf("%d", &choice);
                         }while(choice < 0 || choice > 3);
                         
                         switch(choice)
                         {
                                 case 1:
                                         do{
                                                 Input(data);
                                                 printf("\n输入数据是否成功!\n如果成功请入 0 (退出)!\n如果失败请输入 1 (重新输入数据)!\n");
                                                 scanf("%d", &flag);
                                                 printf("\n");
                                         }while(flag != 0);//调用输入数据函数
                                         Modify(data, mon);      //调用修改数据函数
                                         break;
                                 case 2:
                                         do{
                                                 Search_one(data);
                                                 printf("\n输入数据是否成功!\n如果成功请入 0 (退出)!\n如果失败请输入 1 (重新输入数据)!\n");
                                                 scanf("%d", &flag);
                                                 printf("\n");
                                         }while(flag != 0);//调用输入数据函数
                                         Modify(data, mon);      //调用修改数据函数
                                         break;
                         }
                 }
                 system("pause"); 
                 break;
          case 4://4、查询数据
                 system("color e");
                 mode = Search(data);
                 if(mode != Ok) printf("\n没有符合条件的记录\n");
                 else
                 {
                         printf("\n记录月份 食品消费 房租费用 子女费用 水电费用 医疗费用 储蓄费用 本月收入 \n");//输出
                         printf("<---------------------------------------------------------------------->\n");
                         printf("%7d %8d %8d %8d %8d %8d %8d %8d\n", data->month, data->food_c, data->rent_c,
                                 data->children_c, data->water_ele_c, data->hospital_c, data->carring_c, data->income_c);
                 }
                 system("pause"); 
                 break;
          case 5://5、排序数据
                  system("color ff");
                  mode = Search(data);//复制
                  if(mode != Ok) printf("\n没有符合条件的记录!\n"); //判断输出
                  else Sort(data);     //调用排序函数
                 system("pause"); 
                 break;
          case 6://6、删除数据
                  system("color a");
                  mode = Search(data);//复制
                  mon = data->month;      //复制
                  if(mode != Ok) printf("\n没有符合条件的记录!\n"); //判断输出
                  else
                  {
                         printf("\n记录月份 食品消费 房租费用 子女费用 水电费用 医疗费用 储蓄费用 本月收入 \n");//输出
                         printf("<---------------------------------------------------------------------->\n");
                         printf("%7d %8d %8d %8d %8d %8d %8d %8d\n", data->month, data->food_c, data->rent_c,
                                 data->children_c, data->water_ele_c, data->hospital_c, data->carring_c, data->income_c);
                         Delete(mon);//调用输入数据函数
                  }
                  system("pause"); 
                  break;
         case 7://7、求本月消费之和
                  system("color a");
                  mode = Search(data);//赋值
                  if(mode != Ok) printf("\n没有符合条件的记录!\n"); //判断输出
                  else Sum_const(data);
                  system("pause");
                  break;
         case 0://0、退出系统
                 getchar();                               //调用系统函数
                 Show_close_infomation();//调用关机画面函数
                 system("color c");
                 break;
 }
 free(data);//释放内存空间
}
void Input(Infor *newI)
{//声明接收按键输入的数据函数
 do{
         printf("\n记录月份 食品消费 房租费用 子女费用 水电费用 医疗费用 储蓄费用 本月收入 \n");//输出
         scanf("%7d %8d %8d %8d %8d %8d %8d %8d", &newI->month, &newI->food_c, &newI->rent_c,
                 &newI->children_c, &newI->water_ele_c, &newI->hospital_c, &newI->carring_c, &newI->income_c);
         fflush(stdin);//系统函数调用(即清理标准输入流,把多余的仍未被保存的数据丢掉)
 }while(newI->month < 1 || newI->month > 12);
}
void WriteInfor(Infor *new1)
{//声明向文件内写入内容的函数
 FILE *fp;//定义指针
 fp = fopen(FilePath1, "ab+");//打开或创建一个二进制文件,可读取或在文件的尾部添加数据
 if(fp == NULL)//判断文件是否为空
 {
         printf("无法创建文件:%s\n", FilePath1);
         exit(0);
 }
 //从new1所指向的数据存储区获取数据,向fp所指向的文件写入数据,每次写sizeof(Infor)个字节,写入1次
 fwrite(new1, sizeof(Infor), 1, fp);//这里可以做特别处理可防止存在同一月份有2条以上的记录问题。
 fclose(fp);            //关闭文件,避免内存泄露
 printf("数据存入文件成功!\n");
}
void ChangeFormat(void)
{//声明将dat格式文件转换为txt文件
 FILE *fp1, *fp2;//定义文件指针
 Infor *data;    //定义结构指针
 data = (Infor *)malloc(sizeof(Infor));//开辟空间
 fp1 = fopen(FilePath1, "rb+");            //打开一个二进制文件,可读取或写入其中数据
 if(fp1 == NULL) 
 {
         printf("无法找到文件:%s\n", FilePath2);//输出
         return;          //返回主函数
 }
 fp2 = fopen(FilePath2, "wt+");
 if(fp2 == NULL)
 {
         printf("无法创建文件:%s\n", FilePath2);
         return;//返回主函数
 }
 fputs("\n个人账簿管理系统\n", fp2);
 fputs("记录月份 食品消费 房租费用 子女费用 水电费用 医疗费用 储蓄费用 本月收入 \n",fp2);
 printf("\n记录月份 食品消费 房租费用 子女费用 水电费用 医疗费用 储蓄费用 本月收入 \n");//输出
 printf("<---------------------------------------------------------------------->\n");//输出
 rewind(fp1);//函数调用(将文件内部的位置指针重新指向一个流[数据流/文件])的开头
 //从fp1所指向的文件读取数据,每次读取sizeof(Infor)个字节,读取1次,将读取的数据存储到data所指向的数据存储区
 fread(data, sizeof(Infor), 1, fp1);
 //feof(stream)函数有两个返回值,如果遇到文件结束,函数返回值为非零值,否则为0
 while(!feof(fp1))
 {
         printf("%7d %8d %8d %8d %8d %8d %8d %8d\n", data->month, data->food_c, data->rent_c,
                                         data->children_c, data->water_ele_c, data->hospital_c, data->carring_c, data->income_c);
         //将数据写入fp2指向的文件
         fprintf(fp2, "%7d %8d %8d %8d %8d %8d %8d %8d\n", data->month, data->food_c, data->rent_c,
                                         data->children_c, data->water_ele_c, data->hospital_c, data->carring_c, data->income_c);
         fread(data, sizeof(Infor), 1, fp1);             
 }
 printf("<---------------------------------------------------------------------->\n");
 fputs("关闭本程序继续原程序!\n", fp2);
 fclose(fp1);//关闭文件
 fclose(fp2);//关闭文件
 remove(FilePath2);//删除文本文件
}
                  
int Search(Infor *data)
{//声明查询函数(返回查询的结果及状态)
 FILE *fp1;                     //定义文件指针
 int mon,  Find = 0; //定义整形数据
 
 printf("请输入要查询的月份:");
 scanf("%d", &mon);
 fflush(stdin);              //清楚缓冲区
 fp1 = fopen(FilePath1, "rb+");//打开一个二进制文件,可读取或写入其中数据
 if(fp1 == NULL)
 {
         printf("无法找到文件:%s\n", FilePath1);
         return Error;//返回函数
 }
 rewind(fp1);   //调用系统函数
 fread(data, sizeof(Infor), 1, fp1);
 while(!feof(fp1))//查询操作
 {
         if(data->month == mon)
         {
                 Find = 1;//找到返回1
                 break;     //结束操作
         }
         else 
                 Find = 0;//没找到返回0
         fread(data, sizeof(Infor), 1, fp1);
 }
 fclose(fp1);   //关闭文件
 if(Find) 
         return Ok;
 else 
         return Error;
 
 return Notfind;
}
/*收缩单个错误*/
void Search_one(Infor *data)
{
 Type Sort_info[8] = {0};       //初值赋值为0
 int num;
 char Str_info[8][10] = {"记录月份", "食品消费", "房租费用", "子女费用",
         "水电费用", "医疗费用", "储蓄费用", "本月收入"};
 printf("<---------------------------------------------------------------------->\n");
 printf("   1         2        3       4         5       6         7       8\n");     
 printf("<---------------------------------------------------------------------->\n");
 printf("记录月份 食品消费 房租费用 子女费用 水电费用 医疗费用 储蓄费用 本月收入\n");//输出
 printf("<---------------------------------------------------------------------->\n\n");
 
 printf("请输入要修改的单个位置消费记录:");
 scanf("%d",  &num);
 Sort_info[0].data = data->month;
 Sort_info[1].data = data->food_c;
 Sort_info[2].data = data->rent_c;
 Sort_info[3].data = data->children_c;
 Sort_info[4].data = data->water_ele_c;
 Sort_info[5].data = data->hospital_c;
 Sort_info[6].data = data->carring_c;
 Sort_info[7].data = data->income_c;
 
 Sort_info[num - 1].number = num - 1;
 printf("\n<---------------------------------------------------------------------->\n");
 printf("请输入要修改%s记录:", Str_info[Sort_info[num - 1].number]);
 scanf("%d", &Sort_info[num - 1].data);
 
 data->month = Sort_info[0].data;
 data->food_c = Sort_info[1].data;
 data->rent_c = Sort_info[2].data;
 data->children_c = Sort_info[3].data;
 data->water_ele_c = Sort_info[4].data;
 data->hospital_c = Sort_info[5].data;
 data->carring_c = Sort_info[6].data;
 data->income_c = Sort_info[7].data;
 }
  
void Sort(Infor *dat)
{//声明排序函数
 int i = 0, j = 0;                       //定义整形变量
 Type Sort_info[8] = {0};       //初值赋值为0
 int temp;                                      //作为中间变量      
 char Str_info[8][10] = {"记录月份", "食品消费", "房租费用", "子女费用",
         "水电费用", "医疗费用", "储蓄费用", "本月收入"};
 for(i = 0; i < 8; i++)
         Sort_info[i].number = i;
 Sort_info[0].data = dat->month;
 Sort_info[1].data = dat->food_c;
 Sort_info[2].data = dat->rent_c;
 Sort_info[3].data = dat->children_c;
 Sort_info[4].data = dat->water_ele_c;
 Sort_info[5].data = dat->hospital_c;
 Sort_info[6].data = dat->carring_c;
 Sort_info[7].data = dat->income_c;
 for(i = 1; i < 8; i++)//冒泡排序核心算法(由小到大排序)
 {
         for(j = 0; j < 8 - i; j++)
         {
                 if(Sort_info[j].data > Sort_info[j + 1].data)
                 {     //交换位置,temp作为中间变量
                         temp = Sort_info[j].data;
                         Sort_info[j].data = Sort_info[j + 1].data;
                         Sort_info[j + 1].data = temp;        
                         temp = Sort_info[j].number;
                         Sort_info[j].number = Sort_info[j + 1].number;
                         Sort_info[j + 1].number = temp;
                 }
         }
 }
 
 printf("\n");        //输出
 for(i = 0; i < 8; i++)
         printf("%s ", Str_info[Sort_info[i].number]);
 printf("\n<---------------------------------------------------------------------->\n");
 for(i = 0; i < 8; i++)
         printf("%6d   ", Sort_info[i].data);
 printf("\n");
}
void Sum_const(Infor *dat)
{//声明消费之和函数
 int i = 0, sum = 0;                     //定义整形变量
 Type Sort_info[9] = {0};       //初值赋值为0
 char Str_info[9][10] = {"记录月份", "食品消费", "房租费用", "子女费用",
         "水电费用", "医疗费用", "储蓄费用", "本月收入", "月消费和"};
 for(i = 0; i < 9; i++)//为结构体变量赋值
         Sort_info[i].number = i;
 Sort_info[0].data = dat->month;
 Sort_info[1].data = dat->food_c;
 Sort_info[2].data = dat->rent_c;
 Sort_info[3].data = dat->children_c;
 Sort_info[4].data = dat->water_ele_c;
 Sort_info[5].data = dat->hospital_c;
 Sort_info[6].data = dat->carring_c;
 Sort_info[7].data = dat->income_c;
 for(i = 0; i < 8; i++)//循环求和
         sum += Sort_info[i].data;
 Sort_info[8].data = sum;
 printf("\n");        //输出
 for(i = 0; i < 9; i++)
         printf("%s ", Str_info[Sort_info[i].number]);
 printf("\n<------------------------------------------------------------------------------>\n");
 for(i = 0; i < 9; i++)
         printf("%6d   ", Sort_info[i].data);
 printf("\n");
}
                  
void Modify(Infor *data, int mon)
{//声明修改数据函数
 FILE *fp1, *fp2;   //定义结构体指针
 Infor *dat;               //定义结构体指针
 dat = (Infor *)malloc(sizeof(Infor));
 fp1 = fopen(FilePath1, "rt");             //只读方式打开一个文本文件,只允许读数据
 fp2 = fopen("temp.dat", "wt+");         //读写打开或创建一个文本文件,允许读写
 rewind(fp1);//函数调用(将文件内部的位置指针重新指向一个流[数据流/文件])的开头
 //从fp1所指向的文件读取数据,每次读取sizeof(Infor)个字节,读取1,将读取的数据存储到dat所指向
 fread(dat, sizeof(Infor), 1, fp1);
 while(!feof(fp1))//重写数据
 {
         if(dat->month == mon)//判断是否为要修改的月份
                 fwrite(data, sizeof(Infor), 1, fp2);//     修改数据
         else
                 fwrite(dat, sizeof(Infor), 1, fp2);
         fread(dat, sizeof(Infor), 1, fp1);              //函数调用
 }
 fclose(fp1);           //关闭文件
 fclose(fp2);           //关闭文件
 remove(FilePath1);     //删除原文件
 rename("temp.dat", FilePath1);//重命名中间文件
 printf("修改数据成功!\n");
 ChangeFormat();          //显示数据
}
                  
void Delete(int mon)
{//声明删除数据函数
 FILE *fp1, *fp2;   //定义文件的指针
 Infor *dat;                       //定义结构体指针
 dat = (Infor *)malloc(sizeof(Infor));
 fp1 = fopen(FilePath1, "rt");
 fp2 = fopen("temp.dat", "wt+");
 rewind(fp1);           //调用库函数
 fread(dat, sizeof(Infor), 1, fp1);
 while(!feof(fp1))
 {
         if(dat->month != mon)
                 fwrite(dat, sizeof(Infor), 1, fp2);
         fread(dat, sizeof(Infor), 1, fp1);
 }
 fclose(fp1);           //关闭文件
 fclose(fp2);           //关闭文件
 remove(FilePath1);     //调用库函数,删除源文件
 printf("删除数据成功!\n");
 ChangeFormat();          //显示数据
}   

0 0