课程设计材料
学生姓名: 学 号:
系 (院):
专 业:
设计(论文)题目:
完成日期:
指导教师:
课程设计目的
1)通过课程设计,加深对结构化程序设计思想的理解,能对系统功能进行分析,并设计合理的模块化结构。
2)通过课程设计,进一步掌握C有并重要的数据结构。掌握并熟练运用指针、链表、结构体、文件等数据结构。
3)通过课程设计,提高程序开发能力,能运用合理的控制流编写清晰高效的程序。
4)通过课程设计,培养C语言知识运用和自学能力,真正的把课堂上获得的知识运用起来,培养自己对程序编写的兴趣,并能设计和实现一个中小型系统。
5)通过课程设计,加强了自己的程序分析能力。
课程设计内容
用C语言编写软件完成以下任务:
1 储户开户(储户数据包括帐号,姓名,身份证号,密码和账户余额等),储户的信息保存在account.dat文件中,应对储户的开户金额做出(如金额不低于10元钱)。
2 储户的密码修改。
3 储户的余额查询。
4 储户销户。
5 储户的各项信息更改后,应同时更新account.dat文件中的内容。
总体设计
本系统的功能模块如图1所示,主要有以下模块:
(1)银行个人账户管理系统主界面:构造函数void menu1(),实现系统主菜单的显示。
(2)第二菜单:构造函数void menu2(),实现系统第二菜单的显示。
(3)用户信息录入:构造函数void add(),实现用户个人信息的录入及保存。
(4)用户密码修改:构造函数void chasec(i),实现对该用户密码的修改并通过构造函数void (struct User use[X],int n)对修改后的密码保存。
(5)用户余额查询:构造函数void show(i),实现对相应用户的账户余额的显示并通过构造函数(struct User use[X],int n)对余额和存储日期做更新。
(6)用户销户:构造函数void del(i),实现对指定用户信息的删除并通过构造函数(struct User use[X],int n)对数据库的更新。
详细设计
(一)数据结构设计
本程序用到的数据结构主要有:指针、链表、结构体、文件等。先声明一个类型为struct student的结构体,其成员为个人账户信息。然后通过对指针、链表、文件等数据结构的操作,实现对个人账户的录入,插入,存盘,查询,浏览,删除,修改等一系列操作。其中,结构体定义如下:
struct User
{
char cardnum[20];
char name[10];
char id[20];
char sex[4];
long sec;
double money;
int year;
int mon;
int day;
};
(二)模块接口设计
1.所有函数模块声明如下:
void menu1();
void menu2(char name[10]);
void add();
void tpro();
void perorg(int i);
int reads(struct User use[X]);
void save(struct User use[X],int n);
void del(int i);
void chasec(int i);
void show(int i);
2.并定义两个全局变量:
#define X 100
#define P 1.002
3.主要模块的实现
1. 程序总体结构图
主菜单结构图
| 当1 | |||
| 真 | 输入值n=1 假 | ||
| 用户开户函数 add() | 真 | n=2 假 | |
| 个人账户管理函数tpro()&perorg(int i) | n=3 | ||
| 退出 | |||
| 真 | 输入值n=1 假 | ||
| 查询余额函数show(int i) | 真 | n=2 假 | |
| 修改密码函数chasec(int i) | 真 | n=3 假 | |
| 销户函数del(int i) | n=4 | ||
| 返回上一菜单 | |||
(1)储户开户函数add
| 真 | 以追加方式打开account.dat文件 假 | ||
| 真 以只写方式打开account.dat | 文件 假 | ||
| 输入用户账号、姓名 | 输出文件失败 | ||
| 输入用户身份证号、性别 | |||
| 输入用户密码 | |||
| 输入存入金额 | |||
| 假 存入金额 | 小于10元 真 | 返回 | |
| 用户信息写入文件 | 不予开户 | ||
| 关闭文件 | |||
| 真 以追加方式打开account.dat文件 | 假 | |
| 循环变量i=0 | 输入文件 打开失败 | |
| 当文件未结束时 | ||
| 读取用户信息到数组元素use[i]中 | ||
| i++ | 返回 | |
| 关闭文件 | ||
| 返回用户人数i | ||
| i,n=read(use) | ||
| Y 确认删除? | Y/N N | |
| j=i+1 | 返回 | |
| 当j | ||
| use[j-1]=use[j] | ||
| j++ | ||
| 调用保存函数save()保存 | ||
| 输出提示“销户成功” | ||
主菜单界面:
信息录入界面:
信息浏览界面:
信息修改界面:
信息删除界面:
编程体会
这次编程课题时间还是挺长的,不过却给了我很深的启示。
因为自己电脑出故障的关系,我的课程设计停了好多天,幸好之前有些大纲,才不至于拖延完成课程设计的时间。其实这次课程设计的内容不是很难,加之我在动笔之前搜集了相当多的资料,完成课程设计就相对容易了很多。现在就谈谈我在课程设计这段时间内的体会:
我的所有子函数都是自己写的,这是非常有成就感的事情。在刚完成初稿的时候很多问题让我颇为头疼,首先是乱码问题,即在录入数据时,记录的某些数据是乱码,这是很常见的一个问题,我在排查问题时发现是字符类型不匹配造成的,double类型与%f的不匹配造成了乱码。在修改密码的再存储问题上我也出现了问题,这让我深刻体会到格式的重要性,在修改了数据存储的格式后这个问题也得到了解决。还有就是数组大小的重要性,如果数组大小不控制好,也会出现或多或少的问题,就比如录入性别时,大小为二的数组能存储“男”或“女”,但之后也会出现乱码的问题,将之调为四后,问题解决。这些问题看上去都是小问题,但是就是这么一个小问题,往往就是阻碍程序正常运行的罪魁祸首,这正应了那句话,细节决定成败,我们在编程时就应该注意这些细微的不同,这样才能做出好程序来。
源程序
#include #include #include #include #define X 100 #define P 1.002 struct User { char cardnum[20]; char name[10]; char id[20]; char sex[4]; long sec; double money; int year; int mon; int day; }; void menu1(); void menu2(char name[10]); void add(); void tpro(); void perorg(int i); int reads(struct User use[X]); void save(struct User use[X],int n); void del(int i); void chasec(int i); void show(int i); void main() { int n; while(1) { menu1(); printf("\\n 请输入您要选择的操作序号,按回车键确认:"); scanf("%d",&n); switch(n) { case 1: add();break; case 2: tpro();break; case 3: exit(0); default: printf("输入错误,请输入列表中存在的序号!\n "); } } } void menu1() { printf("************************************************************************* "); printf("\\n***************************银行个人账户管理系统************************** "); printf("\\n 1 用户开户"); printf("\\n 2 个人账户管理"); printf("\\n 3 退出系统"); printf("\\n************************************************************************* "); printf("\\n************************************************************************* "); } void menu2(char name[10]) { printf("************************************************************************* "); printf(" 欢迎进入%s的银行个人账户 ",name); printf("\\n 1 余额查询"); printf("\\n 2 密码修改"); printf("\\n 3 销户"); printf("\\n 4 返回上一菜单"); printf("\\n************************************************************************* "); printf("\\n************************************************************************* "); } void save(struct User use[X],int n) /*保存用户信息*/ { FILE *fp; int i=0; if((fp=fopen("account.dat { printf("文件打开失败!\n"); return ; } else { for(i=0;i fprintf(fp,"\\n%s\\n",use[i].cardnum); fprintf(fp,"\\n%s\\n",use[i].name); fprintf(fp,"\\n%s\\n",use[i].id); fprintf(fp,"\\n%s\\n",use[i].sex); fprintf(fp,"\\n%ld\\n",use[i].sec); fprintf(fp,"\\n%lf\\n",use[i].money); fprintf(fp,"\\n%d\\n",use[i].year); fprintf(fp,"\\n%d\\n",use[i].mon); fprintf(fp,"\\n%d\\n",use[i].day); } } fclose(fp); } void add()/*用户开户*/ { FILE *fp; struct User use; if((fp=fopen("account.dat如果文件已经存在,可以追加用户信息*/ { if((fp=fopen("account.dat文件不存在时,创建新文件,输入用户信息*/ { printf("用户不存在!\n"); return ; } } printf("\\n请输入用户帐号,并按回车键确认:\n"); scanf("%s",use.cardnum); fprintf(fp,"\\n%s\\n",use.cardnum); printf("\\n请输入用户姓名,并用回车键确认: \\n"); scanf("%s",use.name); fprintf(fp,"\\n%s\\n",use.name); printf("\\n请输入用户身份证号,并用回车键确认: \\n"); scanf("%s",use.id); fprintf(fp,"\\n%s\\n",use.id); printf("\\n请输入用户性别,并按回车键确认:\n"); scanf("%s",use.sex); fprintf(fp,"\\n%s\\n",use.sex); printf("\\n请输入用户密码,并用回车键确认: \\n"); scanf("%ld",&use.sec); fprintf(fp,"\\n%ld\\n",use.sec); printf("\\n请输入用户储入金额,并按回车键确认: \\n"); scanf("%lf",&use.money); fprintf(fp,"\\n%lf\\n",use.money); printf("\\n请输入年份,并按回车键确认: \\n"); scanf("%d",&use.year); fprintf(fp,"\\n%d\\n",use.year); printf("\\n请输入月份,并按回车键确认: \\n"); scanf("%d",&use.mon); fprintf(fp,"\\n%d\\n",use.mon); printf("\\n请输入日期,并按回车键确认: \\n"); scanf("%d",&use.day); fprintf(fp,"\\n%d\\n",use.day); if(use.money<10.00) { printf("\\n用户金额低于十元,不予开户\n"); return ; } else { printf("\\n***********************开户成功*************************\\n"); } fclose(fp); } void tpro()/*过渡程序,用于开启个人账户*/ { struct User use[X]; int i,n; char s[20]; long t; n=reads(use); printf("\\n请用户输入账号,密码,用空格隔开,按回车键确认:\n"); scanf("%s %ld",s,&t); for(i=0;i if(strcmp(s,use[i].cardnum)==0&&t==use[i].sec) { break; } } if(i>=n||t!=use[i].sec) { printf("\\n **输入错误**\\n"); return; } perorg(i); } void perorg(int i)/*第二菜单的程序*/ { struct User use[X]; int n,p; n=reads(use); if(i while(1) { menu2(use[i].name); printf("\\n 请输入您要选择的操作序号,按回车键确认:"); scanf("%d",&p); switch(p) { case 1: show(i);break; case 2: chasec(i);break; case 3: del(i);break; case 4: return ; default: printf("输入错误,请输入列表中存在的序号!\n "); } } } } int reads(struct User use[X]) /* 读取用户内容,返回值为数据个数*/ { FILE *fp; int i=0; if((fp=fopen("account.dat { printf("文件打开失败!\n"); return 0; } else { for(i=0;!feof(fp)/*新函数,检查文件是否结束*/;i++) { fscanf(fp,"\\n%s %s %s %s %ld %lf %d %d %d\\n",use[i].cardnum,use[i].name,use[i].id,use[i].sex,&use[i].sec,&use[i].money,&use[i].year,&use[i].mon,&use[i].day); } } fclose(fp); return i; } void show(int i) /*余额查询*/ { struct User use[X]; int year,mon,day,m,n; double money; n=reads(use); printf("\\n请输入日期(年月日),用空格隔开,按回车键确认:\n"); scanf("%d %d %d",&year,&mon,&day); m=(year-use[i].year)*12+mon-use[i].mon; money=pow(P,m)*use[i].money; use[i].money=money; use[i].year=year; use[i].mon=mon; use[i].day=day; printf("*********************您的余额如下**********************\\n"); printf("余额:"); printf("%11.2lf \\n",money); printf("*******************************************************\\n"); save(use,n); } void chasec(int i) /*用户密码更改*/ { struct User use[X]; int n; n=reads(use); printf("\\n请输入更改后密码,按回车键确认:\n"); scanf("%ld",&use[i].sec); save(use,n); printf("\\n修改成功\n"); } void del(int i) /*用户信息删除函数*/ { struct User use[X]; char a[2]; int n,j; n=reads(use); printf("\\n 确认删除?\n Y/N\\n"); scanf("%s",a); if(strcmp(a,"N")==0) { return; } else { for(j=i+1;j use[j-1]=use[j]; } save(use,n-1); printf("销户成功!\n"); exit(0); } }下载本文