1、个人财政支出管理付欣05计算机四班指导老师:梁新元一、问题描述及分析1二、实验程序设计思想及功能描述I3、主要函数模块的设计思想和具体实现2三、实验程序测试41、程序开始执行时系统的所显示的页面:42、选择退出系统:53、选择登陆,并且输入的帐号和密码都正确:54、用户输入的帐号不正确:55、用户输入的帐号正确,密码不正确:6四、实验程序自我评价7五、课程设计创新7六、课程设计总结7七、参考书目:7八、实验程序源代码8一、问题描述及分析编写一个个人财政支出管理系统,主要解决的问题是作为一个系统而言,它所要面对不 只是某一个人而言,而是要面对很多的用户。那么想要解决这一问题,就必须要求这个系统
2、能够存储许多用户的基本信息和记录。同时也要求系统能够对不同的用户的身份进行查找和 验证。在验证通过之后,在对其进行用户所要求的操作。作为一个财政支出系统,那么就要求对于用户关于金钱的每一项操作都要有相应的记 录,同时并允许用户对于每一条整体的记录进行操作,例如可以根据时间来查找某一确定日 期是否进行了收入或者支出的操作,也可以根据特定的需要来删除某一条整体的记录。但不 允许对每条记录的单项数据进行更改,因为不管是收入还是支出,所涉及的金额都是固定的, 时间也是固定的,所以系统不允许用户对其进行操作。除此之外,还必须有足够大的空间来 存储新的记录。所以此程序就是基于这个思想而编写出来的,基本满足
3、了用户对于一个财政 支出管理系统所要求的相关功能。二、实验程序设计思想及功能描述根据前面对于编写一个个人财政支出管理系统的程序的问题描述和分析,确定了此程序 的基本思想和相关功能。1、 基本思想首先定义个结构体数组,这个数组的功能便是用来所有用户的所有信息。它的成员为每个 用户的帐号(accouni)、密码(code)、姓名(name)、记录(record recmax),以及记录的条 数(recen)。其中记录(record recmax)这个成员本身也是一个结构体数组。它包含了用户 所有的记录(record),并且根据用户的操作,记录这个成员变量也会有所跟改,例如如果拥 护增加了一条记录,
4、那么这一条记录就会存储在此成员变量中。除了这个成员变量是动态变 化之外,记录的条数(rccjcn)也会根据用户的操作进行变化,例如如果用户增加了一条记文件读出 void load() HLE *fp;in( i;if(fp=fopen(wenjian,rb)=null)printf(can not open infileAn);return;)for(i=0;imax;i+)if(frcad(&rlij,sizcof(struct list_rccord), 1 ,fp)!= 1)if(feof(fp)(fclose(fp);return;1fclose(fp);I将用户输入的帐号与系统中原有
5、帐号比拟,查找用户帐号 int lookup_accounts( struct list_record r,char acc) (int i;for(i=0;i3;i+)if(strcmp(ril.account,aec)=0)(return ok;printf(帐号不存在,请重新输入! nH);return null;检查密码函数struct list_record chcck_code(struct iist_record r,char acc,char c) int i;struct list_record a;strcpyCa.account/O1);strcpy(a.code,();
6、a.recJen=0;for(i=0;ia.rec_len;i+)(strcpy(a.reci.date/O);strcpy(a.rec i .operate,0);a.reci.num=0;for(i=0;iname);printf(帐号:sn,(*p).account);I根据用户输入的日期,查找记录ini find_record( struct list_record *p,chard)int i;for(i=0;i(*p).rec_len;i+)(if(strcmp(*p).reci.date,d)=O)(printf(date operate moneyn);printf(%s(*p
7、).recli.date);printf(%s,(*p).reci.operate);printf(%d n,(*p).reci.num);return ok;)Iif(i=(*p).rec_len)printf(the date is not exit!n);return null;插入函数,根据用户输入的信息,增加记录int insert_record( struct list_record *p,struct record *pl,int lop) (int i;if(lop(*p).recen+1)printf(lhe position is wrongAn);return 0;els
8、e for( i=( * p).rec_len; ilop-1 ;i-) strcpy(*p).reci.date,(*p).reci-1 .date);strcpy(*p).reci.operate,(*p).reci-1 .operate);(*p).reci.num=(*p).reci-1 .num;strcpy(p-reclij.date,p 1 -date);strcpy(*p).reci.operate,(*p 1 ).operate);(*p).reci.num=(*p 1 ).num;(*p).rec_len+; return ok;I)/删除记录函数int dcl_rccor
9、d( struct list_rccord *p,int lop2)int i;if(lop2(*p).rec Jen) printf(the position is wrongAn);return null;)elsefor(i=lop2-l ;i(*p).rec_len-l ;i+)(strcpy(*p).reci.date,(*p).reci+1 J.date);strcpy(*p).recil.operate,(*p).reci+ll.opeiate); (*p).reci.num=(*p).reci+l j.num;I(*p).rec_len-;return ok;I输出全部记录函数
10、void all_print( struct list_record *p) int i;printf(date operate numn);for(i=0;i(*p).rec_len;i+) printf(%s ;(*p).reci.date); printf(%s ,(*p).reci.operate);printf(%d ,(*p).rcci.num);printf(nu);计算总的钱数int sum_num( struct list_record *p)int i;int sum=O;int sum_in=O;int sum_out=0;for(i=0;i0)sum_in+=(*p).
11、reci.num;if(*p).rcci.num0) sum_oul+=(*p).reci.num;)prinlf(总金额为:%dn,sum);printff总收入为:%dn,sum_in);printf(总支出为:%dn*sum_out);return ok;I/输出收入记录int acc_print( struct list_record *p)int i;int sum_acc=0;printf(date operate numn);for(i=0;i0)(sum_acc+=(*p).recil.num:printf(%s,(*p).reci.date);printf(%s,(*p).r
12、ecil.operate);printf(%d,(*p).reci.num);printf(n);prinif(总收入金额为:%dn,sum_acc); return ok;if(sum_acc=O)printf(there is no accountAn); return null;输出支出记录int pay_print( struct list_record *p)int i;int suin_pay=0;printf(datc operate numn);for(i=0;irec_len;i+)if(*p).reci.num0)(su m_pay+=( * p). rec i . n u
13、 m;printf(%s,(*p).reci.date);printf(%s,(*p).reci.operate);printf(%d,(*p).reci.num);printf(n);)prinlf(总的支出为:%dnsum_pay);return ok;if(sum_pay=O)printf(there is no payout.Xn);return null;Ivoid main()int j=O,n=O;int x,k,lopl,lop2;char data I 20;char accoul20,cod20J;struct record *p0;struct record a;stru
14、ct list_record b;struct list_record *p;b.rec_len=0;p0=&a:old_record(r);save();load();printfC欢迎使用个人财政支出管理系统! n);printf(n);printf(|n);printf(|1、登陆系统printf(|2、退出系统|n);printf(|n);printf(nH);scanfCH%d,&x);if(x=O)printf(感谢您使用本系统,再见! n);elsedoprimf(请输入帐号:);/whileG3);scanf(%saccou);if(lookup_accounts(r,acco
15、u) printf(请输入密码:);/while(j3) scanf(%s,cod);n+;whilc(n3);if(n=3)printf(您的密码不正确,请退出系统,谢谢使用,再见! n); break;Ielseprintf(-请选择您要进行的操作n);princf(|n);/while(j0)if(k=10)prinlf(感谢您使用本系统,再见! n);if(k=2)(printff请输入您要查询的日期:”);scanf(%s,datal);find_record(p,data 1);)if(k=3)(prinlf(请输入你要插入的位置:n); scanf(%d.&lopl);print
16、f(请输入您要添加的记录:n);printf(日期:);scanf(,%s,pO-date);printf(操作:”);scanf(%s.pO-opcrate);prinlfC金额:”);scanf(%d,&(pO-num);insert_record(p,p(),lop I);)if(k=4)(printf(请输入您要删除的记录的位置:n);scanf(%d,&lop2);del_record(pjop2);)if(k=5)all_print(p);sum_num(p);)if(k=6)acc_print(p);if(k=7) pay_print(p);whiIe(k0);break;)Ij
17、+;while(j3);printf(感谢您使用本系统,再见! n); )附录资料:不需要的可以自行删除Abstract: Based on the comprehensive analysis on the plastic parts structure service requirement, mounding quality and mould menu factoring cost. A corresponding injection mould of internal side core pulling was designed. By adopting the multi-dire
18、ction and multi-combination core-pulling. A corresponding injection mould of internal side core pulling was designed, the working process of the mould was introducedC语言详解-枚举类型注:以下全部代码的执行环境为VC+ 6.0在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这 项工作,您的代码可能是:# define MON 1# define TUE 2# define WED 3# defi
19、neTHU 4# define FRI 5# dcfine SAT 6# define SUN 7在此,我们定义种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。1 .定义一种新的数据类型-枚举型以下代码定义/这种新的数据类型-枚举型enum DAY|MON= 1,TUE, WED, THU, FRI, SAT, SUN);(I)枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号, 隔开。DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。(3)第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。(4)可以人
20、为设定枚举成员的值,从而自定义某个范围内的整数。(5)枚举型是预处理指令#dcfinc的替代。(6)类型定义以分号;结束。2 .使用枚举类型对变量进行声明新的数据类型定义完成后,它就可以使用了。我们已经见过最基本的数据类型,如:整型int, 单精度浮点型float,双精度浮点型double,字符型char,短整型short等等。用这些基本数据 类型声明变量通常是这样:char a; 变量a的类型均为字符型char charletter;int x,y,z; 变量x,y和z的类型均为整型int int number;double m, n;double result; 变量result的类型为双
21、精度浮点型double 既然枚举也是种数据类型,那么它和基本数据类型样也可以对变量进行声明。方法一:枚举类型的定义和变量的声明分开enum DAY |MON=1,TUE, WED, THU. FRI, SAT, SUN ; enum DAY yesterday; enum DAY today;enum DAY tomorrow; 变量omorrow 的类型为枚举型 enum DAYenum DAY good_day, bad_day; /变量 good_day 和 bad_day 的类型均为枚举型 enum DAY 方法二:类型定义与变量声明同时进行:enum/跟第一个定义不同的是,此处的标号
22、DAY省略,这是允许的。 Saturday, sunday = 0, monday, tuesday, Wednesday, thursday, friday workday; 变量workday的类型为枚举型enum DAYenum week Mon=l, Tue, Wed, Thu, Fri Sat, Sun days; 变量 days 的类型为枚举型 enum weekcnum BOOLEAN false, true cnd_flag, match_flag; 定义枚举类型并声明了两个枚举型变量方法三:用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明:typedef
23、enum workday (Saturday, sunday = 0, monday, tuesday, Wednesday, thursday, friday workday;/此处的workday为枚举型enum workday的别名workday today, tomorrow; 变最 today 和 tomorrow 的类型为枚举型 workday,也即 enum workday enum workday 中的 workday 可以省略:typedef enum (Saturday, sunday = 0, monday, tuesday, Wednesday, thursday, f
24、riday workday; 此处的workday为枚举型enum workday的别名workday today, tomorrow; 变量 today 和 tomorrow 的类型为枚举型 workday,也即 enum workday也可以用这种方式:typedef enum workdaySaturday, sunday = 0.nionday, (uesday.Wednesday, (hursday, friday); 录,那么rcccn就会自加1,如果用户删除了一条记录,那么rcccn就会自减1。记录(record recmax|)这个成员变量是以后函数中操作的主要内容。除了这两个
25、成员变量之外,其它的 成员变量那么不会被改变,系统只允许用户对其进行访问,但不允许进行操作,因为这几个成 员变量的作用主要是用来验证用户的身份用的,所以不可以更改。其中的密码(code)甚至 只能别系统调用,而不能对用户进行显示的,也就是说密码(code)对于用户是不可预知的, 这样做的目的是为了系统自身的平安性,以免用户的信息被其他人看到。这就是这个结构体 数组的功能和基本成员变量及各个成员变量的功能。定义了结构体数组之后,首先要做的就是要把所有的记录都存入这个结构体数组中,以 方便用户的操作。所以在main函数中有系统自行调用了 old_record这个函数来存入信息。 在此之后进行的操作
26、便是让用户选择所要进行的是登陆系统的操作还是退出系统的操作。如 果选择登陆,那么要输入帐号和密码。之后由系统来检查帐号的存在性和密码的正确性。如果 这两项都通过了系统的检查,那么用户便可以进行具体记录的操作了。这便是这个程序的基 本设计思想。2、各个函数模块的功能old_record():此函数由系统自行调用,作用是将所有用户信息存入系统。(1) voidsavcO:此函数的作用是将结构体数组中的信息写入文件存储,由系统调用。(2) load():此函数的作用是将结构体数组中写入文件的信息读出,由系统调用。(3) lookup.accounts ():此函数的作用是将用户输入的帐号与系统中的所
27、有帐号进 行比照,查看系统中是否有此帐号。(4) check_code():此函数是作用是在系统查询到了帐号之后,对用户输入的帐号和密 码进行检验,看是否相对应。(5) print_message ():此函数的功能是在系统检查了用户输入的帐号和密码之后, 如果用户通过了系统的检查,在此显示用户可见的基本信息。(6) find_record ():此函数的作用是根据用户输入的日期进行查找操作。(7) inscrt_rccord ():此函数的功能是在记录中增加一条新的记录,这个记录由用户 输入。(8) del_record ():此函数的功能是根据用户的输入的位置,将相应位置的记录删除。(9)
28、 sum_num ():此函数的功能是计算所有收入和支出的总和,计算全部的收入的 总合,计算全部输出的总合。(11)打印输出记录的函数:在本程序中一共有三个打印输出记录的函数,分别为 all_print ( )、acc_print ( )、pay_print ()这三个函数。它们的功能依次是打印输出全部 记录,打印输出输入记录,打印输出支出记录。(12) mian():在主函数中,可以根据用户的选择来操作系统允许用户使用的功能,也 可以随时退出这个系统。3、主要函数模块的设计思想和具体实现(1) void save()函数 和 load()函数。这两个函数的功能是在系统调用了 oldecord
29、()这个函数之后,结构体内就有了所有用 户的所有信息。Savc()函数的作用是将所有的信息都存入文件中,便于数据的保存和读取。 Load ()函数的作用那么是把存入的文件中的信息读出来。这两个函数所涉及的知识点为文件 的读入和写出。主要是freadhe和fwrite两个函数的应用。它们的一般调用形式为:fread(buffer,size,counl,fp);fwrite(buffer,size,count.fp);workday today, tomorrow; 变量 today 和 tomorrow 的类型为枚举型 workday,也即 cnum workday注意:同一个程序中不能定义同名
30、的枚举类型,不同的枚举类型中也不能存在同名的命名常 量。错误例如如下所示:错误声明一:存在同名的枚举类型typedef enum (Wednesday, thursday, friday workday;typedef enum WEEK (Saturday, sunday = 0, nionday, )workday;错误声明二:存在同名的枚举成员typedef enum (Wednesday, thursday, friday workday_l;typedef enum WEEK (Wednesday, sunday = 0, monday, workday_2;3 .使用枚举类型的变量
31、3.1 对枚举型的变量赋值。实例将枚举类型的赋值与基本数据类型的赋值进行了比照:方法一:先声明变量,再对变量赋值#include/*定义枚举类型*/enum DAY MON= I, TUE, WED, THU, FRI, SAT, SUN ;void main()(/*使用基本数据类型声明变量,然后对变量赋值*/ ini x, y, z;x= 10;y = 20;z = 30;/*使用枚举类型声明变量,再对枚举型变量赋值*/ enum DAY yesterday, today, tomorrow;yesterday = MON;today = TUE;tomorrow = WED;printf
32、(%d %d %d n, yesterday, today, tomorrow);方法二:声明变量的同时赋初值#include /*定义枚举类型*/enum DAY MON=1,TUE, WED, THU, FRI, SAT, SUN ;void main()/*使用基本数据类型声明变量同时对变量赋初值*/ ini x=IO, y=20, z=30;/*使用枚举类型声明变最同时对枚举型变最赋初值*/ enum DAY yesterday = MON,today = TUE, tomorrow = WED;printf(%d %d %d n yesterday, today, tomorrow)
33、;方法三:定义类型的同时声明变量,然后对变量赋值。#includc /*定义枚举类型,同时声明该类型的三个变量,它们都为全局变量*/ enum DAY MON=I,TUE, WED, THU, FRI, SAT, SUN yesterday, today, tomorrow;/*定义三个具有基本数据类型的变豉,它们都为全局变豉*/ int x, y, z;void main()(/*对基本数据类型的变量赋值*/ x= 10; y = 20; z = 30;/*对枚举型的变量赋值*/yesterday = MON;today = TUE;tomorrow = WED;printf(%d %d %
34、d n, x, y, z); /输出:1020 30printf(%d %d %d n yesterday, today, tomorrow); 输出:I 2 3)方法四:类型定义,变量声明,赋初值同时进行。#include /*定义枚举类型,同时声明该类型的三个变量,并赋初值。它们都为全局变量*/ enum DAY(MON=I,TUE.WED,THU, FRI, SAT, SUN)yesterday = MON, today = TUE, tomorrow = WED;/*定义三个具有基本数据类型的变量,并赋初值。它们都为全局变量*/ int x = 10, y = 20, z = 30;v
35、oid main()printf(%d %d %d n; x, y, z); 输出:10 20 30printf(%d %d %d n, yesterday, today, tomorrow); 输出:12 3 3.2 对枚举型的变量赋整数值时,需要进行类型转换。#include enum DAY MON=1,TUE. WED, THU, FRL SAT, SUN ;void main()(enum DAY yesterday, today, tomorrow;yesterday = TUE;today = (enuni DAY) (yesterday + 1); 类型转换tomorrow =
36、 (enum DAY) 30; 类型转换/tomorrow = 3; 错误pnntf(%d %d %d n yesterday, today, tomorrow); 输出:2 3 3() )3.3 使用枚举型变显#includcenuni(BELL= a,BACKSPACE = b,HTAB=t,RETURN= r;NEWLINE = n,VTAB=v;SPACE=;enum BOOLEAN FALSE = 0, TRUE match_flag;void main()(ini index = 0;int count_oUetter = 0;ini count_o 匚 space = 0;cha
37、r str = Im Ely cfod;match_flag = FALSE;for(; strindex != 0; index+) if( SPACE != strindex) count_ofLletter+;else(match_flag = (cnuni BOOLEAN) 1; count_oOpace+;)printf(%s %d times %c, match_flag ? match: not matcll, count_of_space, NEWLINE); printf(count of letters: %d %c%c”, count_of_letter, NEWLINE
38、, RETURN);输出:match 2 timescount of letters: 10Press any key to continue4 .枚举类型与sizeof运算符#includc enuniescapes(BELL = a,BACKSPACE = b,HTAB= tRETURN= V;NEWLINE= n,VTAB= v,SPACE=;enum BOOLEAN FALSE = 0, TRUE match_flag;void main()(prinlf(%d bytes n sizeof(enum escapes); /4 bytesprintf(%d bytes n, sizeo
39、f(escapes); /4 bytes printf(%d bytes n, sizeof(enum BOOLEAN); /4 bytes printf(%d bytes n sizeof(BOOLEAN); /4 bytesprintf(%d bytes n, sizeof(match_flag); /4 bytesprintf(%d bytes n sizeof(SPACE); /4 bytesprintf(%d bytes n, sizeof(NEWLINE); /4 bytesprintf(%d bytes n sizeof(FALSE); /4 bytesprintf(%d byt
40、es n, sizeof(0); /4 bytes)5 .综合举例#includeenum Season |spring, suinnier=l()(), fall=96, winter;typedef enum (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday )Weekday;void main() (/* Season */printf(%d n, spring); / 0printf(%d, %c n, summer, summer); / 100, dprintf(%d nM, fall+winter);
41、/ 193Season mySeason=winter;if(winter=iny Season)printf(mySeason is winter n); / mySeason is winterint x=100;if(x=summer)printf(x is equal to summernH); / x is equal to summerprintf(%d bytesn sizeof(spring); / 4 bytes/* Weekday */printf(sizeof Weekday is: %d n, sizeof(Weekday); /sizeof Weekday is: 4
42、Weekday today = Saturday;Weekday tomorrow;if( today = Monday)tomorrow = Tuesday;elsetomorrow = (Weekday) (today + 1); /remember to convert from int to Weekday木文来自CSDN-xiaobai32966博客其中:Buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrile来说,是要输 出数据的地址。Size:要读写的字节数。Count:要进行读写多少个size字节的数据项。Fp;文件型指针。调用这两个函数之后,如果调用
43、成功,那么函数返回值为count的值,即输入或输出数据 项的完整个数。(2) lookup_accounts ()函数和 check_code()函数:这两个函数的功能主要是用来核对用户的身份。系统先检验的是axxounts这个函数。 根据用户输入的帐号与系统中所有的帐号进行比拟,查找看是否有相同的。如果找到了,那么 进行对密码进行检验,看密码与帐号是否对应。在检验帐号的时候,如果用户输入的帐号在 系统中不存在,系统那么会给出提示要求用户从新输入。但如果用户输入了三次体统都找不到 帐号的时候,系统那么会强制要求用户退出系统,此时那么显示结束语的欢迎词。而如果帐号找 到了,但用户输入的密码与原有密码不一致,系统也会给出提示信息要求用户再次输入。同 样的,如果用户输入三次体统都检验到不是正确的密码的时候,系统那么会强制要求用户退出 系统,此时