用c语言编写gps程序,GPS模拟C语言

A:7654321

B:1714171

C:1711717

D:7177171 48. 以下程序的输出是( C)。 #include

main(){ char a[]="language",*p; p=a; while(*p!=‘u’){ printf("%c",*p-‘u’+‘U’);p++;} }

A:LANGUAGE

B:language

C:LANG

D:LANGuage 49. struct s1 {

char a[3];

int num; }t={‘a’,‘b’,‘x’,4},*p; p=&t; 则输出为x的语句是(B)。

A:printf(“%c\n”,p->t.a[2]);

B:printf(“%c\n”,(*p).a[2])

C:printf(“%c\n”,p->a[3]);

D:printf(“%c\n”,(*p).t.a[2]);

50. 以下程序的输出是(D )。 #include main(){

struct st

{int x;

int y;

}cnum[2]={1,3,2,7};

printf("%d\n",cnum[0].y/cnum[0].x*cnum[1].x); }

A:0

B:1

C:3

D:6 51. 以下对age的非法引用是(B)。 struct student {int age;

int num; }stu1,*p; p=&stu1;

A:stu1.age

B:student.age

C:p->age

D:(*p).age 52. 以下程序的输出是(B )。 #include union myun {struct {int x,y,z;}u; int k; }a; void main() {a.u.x=4;a.u.y=5;a.u.z=6; a.k=0; printf("%d\n",a.u.y); }

A:4

B:5

C:6

D:0 53. 若要用fopen函数打开一个二进制文件,该文件要既能读也能写,当文件不存在时新建文件,则文件打开方式字符串应是(C )。

A:"ab+"

B:"rb+"

C:"wb+"

D:"ab" 54. 若执行fopen函数时发生错误,则函数的返回值是 (B)。

A:地址值

B:0

C:1

D:EOF 55. 要打开文件c:\user\text.txt用于追加数据,正确的语句是(C)。

A:fp=fopen("c:\turboc2\abc.txt","r");

B:fp=fopen("c:urboc2\abc.txt","r");

C:fp=fopen("c:urboc2\abc.txt","a+");

D:fp=fopen("c:\turboc2\abc.txt","a+"); 56. 在执行fopen函数时,ferror函数的初值是 (D )。

A:TRUE

B:-1

C:1

D:0

57. #include main() {

char * s1="Hello",*s2="Beijing";

FILE *pf=fopen("abc.dat","wb+");

fwrite(s2,7,1,pf);

fseek(pf,-1,SEEK_CUR);

fwrite(s1,5,1,pf);

fclose(pf); } 以上程序执行后,文件abc.dat中的内容为 (C)。

A:Hellong

B:Beijing Hello

C:BeijinHello

D:Hello 58. 若fp为文件指针,且文件已正确打开,i为整型数据,以下语句的输出结果是(B)。 fseek(fp,0,SEEK_END); i=ftell(fp); printf("i=%d\n",i);

A:fp所指的文件记录长度

B:fp所指的文件长度,以字节为单位

C:fp所指的文件长度,以比特为单位

D:fp所指的文件当前位置,以字节为单位 59. 函数调用语句:fseek(fp,-20L,2);的含义是 (C )。

A:将文件位置指针移到距离文件头20个字节处

B:将文件位置指针从当前位置向后移动20个字节

C:将文件位置指针从文件末尾处后退20个字节

D:将文件位置指针移到离当前位置20个字节处

60. 若将文件指针的读写位置指针移动到距离文件头200个字节的位置,对应正确的操作是 (A)。

A:fseek ( fp, 200, SEEK_SET )

B:fseek ( fp, 200, SEEK_CUR )

C:fseek ( fp, 200, SEEK_END )

D:ftell ( 200 )

一、 实验目的

通过设计一个ATM机模拟操作的程序,全面运用课程的主要知识点,巩固对模块化程序设计、文件操作的理解,提高软件编程能力。

二、 实验要求

要求每人独立完成设计,编写一个ATM机模拟操作程序。提交实验报告、源程序、程序运行截图。

1. 程序具有以下功能:

1) 登录系统:

输入卡号(16位)、密码(6位),只有卡号、密码同时正确(帐户信息存放在文件中)才能进入系统; 2) 操作功能:

 查询:查询帐户的存款余额。按任意键返回主菜单;

 修改密码:连续输入两次新密码(两次输入结果完全相同)后,新密码取代旧密码,并存放到帐户信息文件中。之后可返回主菜单;

 取款:输入50或100的倍数模拟为取款金额,请注意:取款金额不得超过帐户余额,操作后帐户余额应相应减少。之后可返回主菜单;

 存款:输入50或100的倍数模拟为存款金额,现假设存款金额不得超过20000元,操作后帐户余额应相应增加。之后可返回主菜单;

 转帐:先输入一个帐户号(已保存在帐户信息文件中),然后显示一部分用户名(如:张*山),储户确认无误后,再输入50或100的倍数模拟为转帐金额,请注意:转帐金额不得超过帐户余额,操作后帐户余额应相应减少。之后可返回主菜单;  退出:退出系统。

2. 定义如下结构体类型:

 “日期”结构体Date:成员有:year(年)、month(月)、day(日);

 “帐户”结构体Account:成员有:no(帐户号)、name(姓名)、balance(余额)  “存取款记录”结构体Record,:成员有:no(帐户号)、date(日期)、number(数量,可正可负,正表示存款,负表示取款) 3. 帐户信息存放在accounts.txt文件,储户存取款记录保存在records.txt中; 4. 采用模块化程序设计方法来实现,即main()显示主菜单、调用相关函数实现相应功能,起主控作用。 5. 附加功能:

 储户一天内输错密码的次数不能超过3次,否则无法进入系统;  应避免输入存款金额、取款金额为负数等异常情况的出现。

三、 程序已经实现的功能点

实验要求均已实现。此外还有:

1. 卡号、密码位数输错时,提示并返回重新输入, 2. 简化取款时的输入

3. 转账时,转账账户为原账户时,提示并返回重新输入 4. 在多个模块中添加了退出功能,无需回到主菜单即可退出系统 5. 在查询模块中加入了存取记录明细查询

四、 程序运行截图及说明

1. 登陆模块

1) 卡号不为16位时,输出提示并返回重新输入

2) 卡号不存在时,输出提示并返回重新输入

3) 密码位数输错时,输出提示并返回重新输入密码,不作为密码错误处理,也无需重新输入卡号

4) 密码连续输错三次时,锁定卡号,今日无法登录

2. 登录后的系统主菜单

3. 查询模块

1) 查询模块主菜单

2) 查询明细

4. 取款模块

1) 当余额不足50时,无法进入取款模块

2) 取款模块主菜单

3) 便捷取款

4) 手动输入取款金额

输错时,返回重新输入

5) 取款后的菜单

6) 取款完成后选择显示余额

5. 存款模块

1) 解决输入错误问题

2) 存款成功

6. 密码修改模块

1) 原密码输错时,返回重新输入,不提供退出功能

2) 密码位数输错、两次输入新密码不一致时,返回重新输入

3) 输入无误时

7. 转账模块

1) 转入卡号位数输错时,提示并返回重新输入

2) 未查找到该卡号时,输出提示,提供退出功能,键入除*外任意键重新输入

3) 转入卡号与当前卡号相同时,输出提示

4) 输出转入卡账户的部分用户名

5) 解决转账金额输错的问题

6) 转账成功

五、 采用的主要技术

1. 宏定义:由于本程序的printf语句较多,为了便于编写,故用PR代替 2. 链表:账户信息采用链表结构,内存动态分配,使用内存无限制,可以扩展到所有可以使用的内存 3. switch多分支选择结构 4. 文本文件的读写

5. 利用time.h头文件,简便地获取系统日期 6. system()函数和fflush()函数的简单使用

六、 设计心得

1. 各函数的功能要相对独立,逐步求精。

2. 如果函数的参数为指针,且仅作为输入参数,则应在类型前加const,以防止该指针在函数体内被意外修改

附:程序代码

/*** * 运行本程序前,请在本程序根目录下建立文件“accounts.txt”,格式如下: * 卡号1(16位)

姓名1 账户余额1 密码1 * 卡号2(16位)

姓名2 账户余额2 密码2 * …… ****/

#include #include #include #include #define PR printf

typedef struct {

short int year; short int month; short int day; }Date;//日期

typedef struct Account { char no[17]; char name[20]; double balance; char password[7]; struct Account* next; }Account;

typedef struct { char no[17]; Date date; double number; }Record;//记录

Account *head = NULL;//账户信息链表表头 Account *now_acc = NULL;//当前账户

/************函数申明************/ void InitializeAccount();//导入账户信息 //------- char LockAccountTopic(const char *no);//检测账户是否被锁定 void LockAccount(const char *no);//锁定账户 //------- void Login();//登录

Account* FindbyNo(const char *no);//查找卡号对应账户信息在链表中的地址 //------- void Demand();//查询主菜单 void PrintBalance();//输出余额 void Printetail();//输出明细 //------- void Modifiy();//修改密码 //------- void Withdrawal();//取款主界面

void WithdrawalOt(long money);//取款 //------- void Depositing();//存款 //------- void Transfer();//转账

char *CoverUpName(const char *name);//掩盖部分用户名 //------- void Log(double money, const char *no);//将存款记录写入文件中 void Save();//保存账号信息 void FreeData();//释放链表空间 //-------

int main() { char choose;

InitializeAccount();//导入账户信息 Login();//登录 do { system("cls"); PR("\t\t

\n"); PR("\t\t

请选择服务

\n"); PR("\t\t+-+---------+

+---------+-+\n"); PR("\t\t|5|\33转账|

|查询\32|1|\n"); PR("\t\t+-+---------+

+---------+-+\n\n"); PR("\t\t

+---------+-+\n");

PR("\t\t

|取款\32|2|\n"); PR("\t\t

+---------+-+\n\n"); PR("\t\t

+---------+-+\n"); PR("\t\t

|存款\32|3|\n"); PR("\t\t

+---------+-+\n\n"); PR("\t\t+-+---------+

+---------+-+\n"); PR("\t\t|0|\33退出系统|

|修改密码\32|4|\n"); PR("\t\t+-+---------+

+---------+-+\n\n"); PR("请选择服务:"); fflush(stdin); choose = getchar(); switch (choose) { case '1': Demand(); break;//查询 case '2': Withdrawal(); break;//取款 case '3': Depositing(); break;//存款 case '4': Modifiy(); break;//修改密码 case '5': Transfer(); break;//转账 case '0': FreeData(); return 0;//退出 default:

printf("输入错误,请重新选择\n"); //解决用户可能的输入错误

system("pause");

} } while (1); return 0; }

/**********导入账户信息**********/ void InitializeAccount() { FILE *fp; Account temp; PR("系统初始化中,请稍侯...\n"); if (!(fp = fopen("accounts.txt", "r"))) {

PR("\07");//响铃

PR("读取帐户信息失败,请在本程序根目录建立帐户信息文件(accounts.txt)。格式如下:\n");

PR("卡号1(16位)

姓名1 账户余额1 密码1\n");

PR("卡号2(16位)

姓名2 账户余额2 密码2\n");

PR("……\n");

exit(0); } while (fscanf(fp, "%s %s %lf %s", temp.no, temp.name, &temp.balance, temp.password) == 4)

} {//读入账户信息

Account *t = head; head = (Account*)malloc(sizeof(Account)); *head = temp; head->next = t; } fclose(fp); system("cls");//清除“系统初始化中,请稍侯...”提示

/**********登录**********/ void Login() { do {

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值