一,文件相关操作
1,判断一个程序是否含有合法数量的main函数。
代码:
#include <stdio.h> #include <stdlib.h> /**************************************************** 功能描述:求出由文件读出的字符中有多少'main()‘ 输入参数:*s1-指向由文件中读取的字符串 *s2-指向储存’main()‘的字符串 返回值:s1中'main()’的数量 其他说明:无 ****************************************************/ int is_sub_sring(char *s1,char *s2) { int main_num=0,judge;//judge起判断做用 char *s3,*s4; while(*s1!='\0') { if(*s1==*s2) { judge=1; s3=s1; s4=s2; while(*s4!='\0') { if(*s3!=*s4)//如果相等之后又有不相等的出现,则使judge变为0,并退出 { judge=0; break; } s3++; s4++; if(judge==0) break; } if(judge==1) { main_num++; //break; } } s1++; } return main_num;//返回个数 } /**************************************************** 功能描述:读文件,并讲两个字符串传给is_sub_sring函数 并最后判断结果 输入参数:无 返回值:无 其他说明:无 ****************************************************/ int main() { char str[80];//储存由函数读入的字符 char inmain[7]="main()";//储存main() int num_main=0;//判断个数 FILE *fpbe; if((fpbe=fopen("bereadfile.c","r"))==NULL) { printf("操作目标文件不存在!\n"); exit(1); } while(!feof(fpbe)) { fgets(str,80,fpbe); num_main+=is_sub_sring(str,inmain); if(num_main>1)//如果已经超1,可直接退出 break; } fclose(fpbe); if(num_main==1) printf("right!"); else if(num_main==0) printf("no main!"); else printf("can not more main!"); return 0; }2,将一个程序中 { 和 } 号单独一行代码:
#include <stdio.h> #include <stdlib.h> /**************************************************** 功能描述:读一个程序,将其中的'{'和'}'分别位于单独 一行 函数变量:num_line-标记行数,以便输出 prec-当前字符的前一个字符 ch-当前字符 str-存放由文件读入的字符串 返回值:无 其他说明:无 ****************************************************/ int main() { int num_line=1; char prec,ch; char str[80]; FILE *fpbe,*fpget; if((fpbe=fopen("bereadfile.c","r"))==NULL) { printf("操作目标文件不存在!\n"); exit(1); } if((fpget=fopen("getfile.c","w+"))==NULL) { printf("无法建立新文件!\n"); exit(1); } while(!feof(fpbe)) { ch=fgetc(fpbe); if((ch=='{'||ch=='}')&&prec!='\n')//如果当前字符是’{‘或’}‘,且前一个不是换行则输入一个换行 fputc('\n',fpget); else if((prec=='{'||prec=='}')&&(ch!='\n'))//如果当前字符不是换行,且前一个是’{‘或’}‘,则输入一个换行 fputc('\n',fpget); fputc(ch,fpget); prec=ch; } rewind(fpget);//将文件指针指向文件首以便输出 fgets(str,80,fpget); while(!feof(fpget)) { printf("%d %s",num_line,str); fgets(str,80,fpget); num_line++; } fclose(fpbe); fclose(fpget); return 0; } 3,将一个程序第m到第n行加上//注释代码:
#include <stdio.h> #include <stdlib.h> /**************************************************** 功能描述:读一个程序,将输入的m行到n行加上//注释 函数变量:str-存放由文件读入的字符串 m-输入的值 n-输入的值 vary-从1开始,若在m到m+n之间,则进行加注释 num_line-输出时的行数 返回值:无 其他说明:无 ****************************************************/ int main() { int m,n,vary=1,num_line=1; char str[80]; FILE *fpbe,*fpget; if((fpbe=fopen("bereadfile.c","r"))==NULL) { printf("操作目标文件不存在!\n"); exit(1); } if((fpget=fopen("getfile.c","w+"))==NULL) { printf("无法建立新文件!\n"); exit(1); } printf("请输入两个行数:"); scanf("%d %d",&m,&n); fgets(str,80,fpbe); while(!feof(fpbe)) { if(vary>=m&&vary<m+n-1)//如果vary在m到m+n之间,则加注释 { fputc('/',fpget); fputc('/',fpget); } fputs(str,fpget); fgets(str,80,fpbe); vary++; } rewind(fpget);//将文件指针指向文件首以便输出 fgets(str,80,fpget); while(!feof(fpget)) { printf("%d %s",num_line,str); num_line++; fgets(str,80,fpget); } fclose(fpbe); fclose(fpget); return 0; } 二,简单银行系统的实现。代码:
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> #define Maxnum 10000 typedef struct { int account; //账号 char name[20]; //用户名 int password; //密码 double balance; //账户余额 int status; //状态,挂失为0,正常为1,注销为2 } bank_data; bank_data use_data[Maxnum]; int N; //实际的用户数目 int manager(); //操作员进入系统 void readfile(); //将文件中数据存在结构体数组中 void work();//业务选择 int window(); //业务显示 void writefile(); //将数组中的数据存入文件中 void open(); //开户 void cancel(); //销户 void save(); //存款 void out(); //取款 void show(); //查询 void transfer(); //转账 void loss(); //挂失 void cLoss(); //解除挂失 int inputPassword(); //输入密码 void changePassword(); //更改密码 int search(int); //根据账号找到用户数据对应的下标 /*************************************************** 功能描述:主体控制 输入参数/变量解释:无 返回值:无 其他说明:无 ****************************************************/ int main() { printf("¥$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$¥\n\n"); printf("¥ 欢迎使用本银行系统 ¥\n\n"); printf("¥$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$¥\n"); if (manager()) { readfile(); work(); writefile(); } return 0; } /**************************************************** 功能描述:银行经理登录 输入参数/变量解释:realName-由文件中读出的业务员用户名 realPassword-文件中保存的密码,这一版本中, 用字符保存密码 inputName-业务员登录时输入的用户名 inputPassword2-业务员登录时输入的密码 ch-用于接受密码 try_time-进入系统时尝试的次数 result-要返回的结果:0-不正确 1-正确 i-循环控制变量 返回值:密码正确,返回1;三次输入错误密码,返回0 其他说明:输入密码时利用getch函数(所在头文件:conio.h) 和putchar函数实现*代替密码的输出 ****************************************************/ int manager() { char realName[20]; //由文件中读出的业务员用户名 char realPassword[20]; //文件中保存的密码 char inputName[20]; //业务员登录时输入的用户名 char inputPassword2[20]; //业务员登录时输入的密码 char ch; int try_time=3; //进入系统时尝试的次数 int result = 0; //要返回的结果:0-不正确 1-正确 int i; FILE *fp; //用于文件操作 //密码保存在文件中,先取出 if ((fp=fopen("password.txt", "r"))==NULL) { printf("系统错误,请联系开发人员!"); exit(1); } fscanf(fp, "%s %s", realName, realPassword); //从文件中读业务员用户名和密码密码 while(try_time!=0) { i=0; printf("请您输入经理用户名:"); scanf("%s", inputName); printf("请输入密码:"); while((ch=getch())!='\r') //getch在接受输入后,不在屏幕上显示 { inputPassword2[i]=ch; putchar('*');//接受任何字符,屏幕上只显示* i++; } inputPassword2[i]='\0'; printf("\n"); if(strcmp(realName,inputName)==0&&strcmp(realPassword,inputPassword2)==0) { result=1; break; } else { try_time--; if(try_time==0) //尝试次数超过3次退出 printf("你无权进入该系统!"); else printf("你还有%d次机会!",try_time); } } fclose(fp); return result; } /**************************************************** 功能描述:从文件中读取用户数据 输入参数/变量解释:i-循环控制变量 返回值:无 其他说明:N为全局变量,表示银行用户的总人数 ****************************************************/ void readfile() { int i=0; FILE *fp; if((fp=fopen("account.txt","r"))==NULL) //文件打开失败。 { printf("系统错误,请联系开发人员!"); exit(1); } while(fscanf(fp,"%d %s %d %lf %d",&use_data[i].account, use_data[i].name, &use_data[i].password, &use_data[i].balance,&use_data[i].status ) != EOF) i++; N=i; //N表示银行用户的总人数 fclose(fp); } /**************************************************** 功能描述:显示功能窗口 输入参数/变量解释:choise-数值表示不同的功能 返回值:choise 其他说明:无 ****************************************************/ int window() { int choise; while(1) { printf("|---------------------------------------------------|\n");//操作界面 printf("| 1 开户 | 2 销户 | 3 存款 | 4 取款 | 5 查询|\n\n"); printf("| 6 转账 | 7 挂失 | 8 解挂 | 9 改密 | 0 退出|\n"); printf("|---------------------------------------------------|\n"); printf("请输入操作指令:"); scanf("%d",&choise); if(choise>9||choise<0) printf("指令错误,请重新输入!\n"); else break; } return choise; } /**************************************************** 功能描述:选择办理业务 输入参数/变量解释:choise-数值表示不同的功能 返回值:无 其他说明:无 ****************************************************/ void work() { int choise;//选择功能 while (choise!=0) { choise = window(); switch(choise) { case 1: open(); //开户 break; case 2: cancel(); //注销 break; case 3: save(); //存款 break; case 4: out(); //取款 break; case 5: show(); //查询 break; case 6: transfer(); //转账 break; case 7: loss(); //挂失 break; case 8: cLoss(); //解除挂失 break; case 9: changePassword(); //更改密码 break; case 0: printf("欢迎您再来. \n"); break; } } } /**************************************************** 功能描述:将用户数据保存到文件中 输入参数/变量解释:i-循环控制变量 返回值:无 其他说明:无 ****************************************************/ void writefile() { int i=0; FILE *fp; if((fp=fopen("account.txt","w"))==NULL) { printf("系统错误,请联系开发人员!\n"); exit(1); } while(i<N) { fprintf(fp,"%d %s %d %lf %d\n",use_data[i].account,use_data[i].name,use_data[i].password,use_data[i].balance,use_data[i].status ); i++; } fclose(fp); } /**************************************************** 功能描述:开户 输入参数/变量解释:input-第一次输入的密码 reinput-第二次输入的密码 返回值:无 其他说明:内部调用输入密码函数 ****************************************************/ void open() { int input,reinput; if(N==Maxnum)//判断用户是否已到最大值 { printf("用户已满,开户失败!\n"); return; } printf("开户中!\n"); use_data[N].account=10001+N; printf("这是您的账号: %d,请牢记!\n",use_data[N].account); printf("请输入户主姓名:"); scanf("%s", use_data[N].name); while(1) { printf("请输入密码:"); input=inputPassword(); printf("请再次输入密码:"); reinput=inputPassword(); if(input==reinput)//比较两次输入的密码是否相等 { use_data[N].password=input; use_data[N].status=1; printf("请输入存款金额:"); scanf("%lf",&use_data[N].balance); N++; //用户数加1,以便读入文件 printf("开户成功!\n"); break; } else { printf("两次密码不一致,请重新输入\n"); } } } /**************************************************** 功能描述:销户 输入参数/变量解释:becancel-表示被销户操作的账号 beaccount-表示被销户操作的账号在 结构体中的下标 input-表示输入的密码 返回值:无 其他说明:无 ****************************************************/ void cancel() { int becancel,beaccount,input;//be***表示被**操作的账号,beaccount表示被**操作的账号在结构体中的下标,input表示输入的密码,以下操作函数类似。 printf("请输入销户账号:"); scanf("%d",&becancel); if(search(becancel)==-1)//查询用户,以确保用户存在 printf("未找到该用户,销户失败!\n"); else { beaccount=becancel-10001; printf("该用户为%d号,%s,请您输入密码完成销户:",use_data[beaccount].account,use_data[beaccount].name); input=inputPassword(); if(input==use_data[beaccount].password) { if(use_data[beaccount].status==2)//判断状态 printf("该用户已被注销,无法再次注销!\n"); else { printf("你的账户中还有%lf元\n",use_data[beaccount].balance); printf("确认销户?(按1确认,按0取消)"); if(getchar()==1) { use_data[beaccount].balance='\0'; use_data[beaccount].status=2;//状态改为销户 printf("销户成功!\n"); } else printf("已取消销户!\n"); } } else printf("密码错误,销户失败!\n"); } } /**************************************************** 功能描述:存款 输入参数/变量解释:besave-表示被存款操作的账号 beaccount-表示被存款操作的账号在 结构体中的下标 inputm-表示存入的钱数 返回值:无 其他说明:无 ****************************************************/ void save() { int besave,beaccount,i=0; char str[80]; double inputm; printf("请输入存款账号:"); scanf("%d",&besave); if(search(besave)==-1) printf("未找到该用户,存款失败!\n"); else { beaccount=besave-10001; printf("该用户为%d号,%s\n",use_data[beaccount].account,use_data[beaccount].name); if(use_data[beaccount].status==2||use_data[beaccount].status==0) printf("该用户已被注销或已挂失,无法存款!\n"); else { printf("请输入存款金额:"); if(scanf("%lf",&inputm)==1) { if(inputm<1000.00) { use_data[beaccount].balance+=inputm; printf("存款后,您的账户有%.2lf元\n",use_data[beaccount].balance); } else printf("数值过大不予存款!\n"); fflush(stdin); } else { printf("存款须为数字!\n"); fflush(stdin); } } } } /**************************************************** 功能描述:取款 输入参数/变量解释:beout-表示被取款操作的账号 beaccount-表示被取款操作的账号在 结构体中的下标 input-表示输入的密码 inputm-表示取出的钱数 返回值:无 其他说明:无 ****************************************************/ void out() { int beout,beaccount,input; double inputm; printf("请输入取款账号:"); scanf("%d",&beout); if(search(beout)==-1) printf("未找到该用户,存款失败!\n"); else { beaccount=beout-10001; printf("该用户为%d号,%s,请您输入密码完成存款:",use_data[beaccount].account,use_data[beaccount].name); input=inputPassword(); if(input==use_data[beaccount].password) { if(use_data[beaccount].status==2||use_data[beaccount].status==0) printf("该用户已被注销或已挂失,无法取款!\n"); else { printf("请输入取款金额:"); scanf("%lf",&inputm); if(inputm>use_data[beaccount].balance)//判断提款是否大于余额 printf("余额不足,取款失败!\n"); else { use_data[beaccount].balance-=inputm; printf("取款后,您的账户有%.2lf元\n",use_data[beaccount].balance); } } } else printf("密码错误,存款失败!\n"); } } /**************************************************** 功能描述:查询 输入参数/变量解释:beshow-表示被查询操作的账号 beaccount-表示被查询操作的账号在 结构体中的下标 input-表示输入的密码 返回值:无 其他说明:无 ****************************************************/ void show() { int beshow,beaccount,input; printf("请输入查询账号:"); scanf("%d",&beshow); if(search(beshow)==-1) printf("未找到该用户,查询失败!\n"); else { beaccount=beshow-10001; printf("该用户为%d号,%s,请您输入密码完成查询:",use_data[beaccount].account,use_data[beaccount].name); input=inputPassword(); if(input==use_data[beaccount].password) { if(use_data[beaccount].status==2)//判断状态 printf("该用户已被注销!\n"); else if(use_data[beaccount].status==0) printf("该用户已被挂失!\n"); else printf("该用户状态正常,余额为%.2lf\n",use_data[beaccount].balance);//显示余额 } else printf("密码错误,存款失败!\n"); } } /**************************************************** 功能描述:查询 输入参数/变量解释:betran-表示转出操作的账号 beaccount-表示转出操作的账号在 结构体中的下标 gettran-表示转入操作的账号 getaccount-表示转入操作的账号在 结构体中的下标 input-表示输入的密码 inputm-表示转账的钱数 返回值:无 其他说明:注意判断是否透支 ****************************************************/ void transfer() { int betran,gettran,beaccount,getaccount,input;//be**为转出,get**为转入 double inputm; printf("请输入转出账号:"); scanf("%d",&betran); if(search(betran)==-1)//第一个if,未找到用户 printf("未找到该用户,转账失败!\n"); else { beaccount=betran-10001; printf("该用户为%d号,%s,请您输入您的密码完成转账:",use_data[beaccount].account,use_data[beaccount].name); input=inputPassword(); if(input==use_data[beaccount].password)//第二个if,密码正确 { if(use_data[beaccount].status==2||use_data[beaccount].status==0)//第三个if,状态正常 printf("该用户已被注销或已挂失,无法转账!\n"); else { printf("请输入取款金额:"); scanf("%lf",&inputm); if(inputm>use_data[beaccount].balance)//判断是否透支 printf("余额不足,取款失败!\n"); else { printf("请输入转入账号:"); scanf("%d",&gettran); if(search(gettran)==-1) printf("未找到该用户,转账失败!\n"); else { getaccount=gettran-10001; if(use_data[getaccount].status==2||use_data[getaccount].status==0) printf("该用户已被注销或已挂失,无法转账!\n"); else { use_data[beaccount].balance-=inputm; use_data[getaccount].balance+=inputm; printf("取款后,您还有%.2lf元,转入账号还有%.2lf元! \n",use_data[beaccount].balance,use_data[getaccount].balance);//显示各自余额 } } } } } else printf("密码错误,转账失败!\n"); } } /**************************************************** 功能描述:挂失 输入参数/变量解释:beloss-表示被挂失操作的账号 beaccount-表示被挂失操作的账号在 结构体中的下标 input-表示输入的密码 返回值:无 其他说明:无 ****************************************************/ void loss() { int beloss,beaccount,input; printf("请输入挂失账号:"); scanf("%d",&beloss); if(search(beloss)==-1) printf("未找到该用户,挂失失败!\n"); else { beaccount=beloss-10001; printf("该用户为%d号,%s,请您输入密码完成挂失:",use_data[beaccount].account,use_data[beaccount].name); input=inputPassword(); if(input==use_data[beaccount].password) { if(use_data[beaccount].status==1) { use_data[beaccount].status=0; printf("挂失成功!\n"); } else if(use_data[beaccount].status==0) printf("该账户已处于挂失状态,不能再次挂失!\n"); else printf("该账户处于销户状态,挂失失败!\n"); } } } /**************************************************** 功能描述:解挂 输入参数/变量解释:becloss-表示被解挂操作的账号 beaccount-表示被解挂操作的账号在 结构体中的下标 input-表示输入的密码 返回值:无 其他说明:无 ****************************************************/ void cLoss() { int becloss,beaccount,input; printf("请输入解挂账号:"); scanf("%d",&becloss); if(search(becloss)==-1) printf("未找到该用户,解挂失败!\n"); else { beaccount=becloss-10001; printf("该用户为%d号,%s,请您输入密码完成解挂:",use_data[beaccount].account,use_data[beaccount].name); input=inputPassword(); if(input==use_data[beaccount].password) { if(use_data[beaccount].status==0) { use_data[beaccount].status=1; printf("解挂成功!\n"); } else if(use_data[beaccount].status==1) printf("该账户处于正常状态,不能解挂!\n"); else printf("该账户处于销户状态,解挂失败!\n"); } } } /**************************************************** 功能描述:进行密码输入 输入参数/变量解释:ch-输入的密码为字符型,以便隐藏 judgePass-判断变量,可判断密码是否6位全为0 i-循环控制 返回值:无 其他说明:解释同manager函数 ****************************************************/ int inputPassword() { char ch;//输入的密码为字符型,以便隐藏 int judgePass=0;//判断变量,可判断密码是否6位全为0 int i; while(1) { for(i=0; i<6; i++) { ch=getch(); //输入不显示 putchar('*'); //输出“*” judgePass=judgePass*10+(ch-'0');//已为用户提供只带数字的小键盘,故忽略输入字母的情况 if(judgePass==0) break; //退出for循环后,再次接受 } printf("\n"); if(judgePass==0) //若6位全为零,则重新输入 { printf("密码要求不全为0!\n"); printf("请重新输入密码: "); } else break; } return judgePass; } /**************************************************** 功能描述:改密 输入参数/变量解释:bechange-表示被挂失操作的账号 beaccoun-表示被挂失操作的账号在 结构体中的下标 input-表示输入的密码 newpass1-修改后第一次的密码 newpass2-修改后第二次的密码 返回值:无 其他说明:调用inputPassword函数 ****************************************************/ void changePassword() { int bechange,beaccount,input; int newpass1,newpass2; printf("请输入要更改密码的账号:"); scanf("%d",&bechange); if(search(bechange)==-1) printf("未找到该用户,改密失败!\n"); else { beaccount=bechange-10001; printf("该用户为%d号,%s,请您输入密码完成改密:",use_data[beaccount].account,use_data[beaccount].name); input=inputPassword(); if(input==use_data[beaccount].password) { printf("请输入新密码:"); newpass1=inputPassword(); //输入密码1 printf("请确认密码:"); newpass2=inputPassword(); //输入密码2 if(newpass1==newpass2) { use_data[beaccount].password=newpass1; printf("修改成功!\n"); } else { printf("两次输入不同,修改失败!\n"); } } else printf("密码错误,改密失败!\n"); } } /**************************************************** 功能描述:查询用户 输入参数/变量解释:bework-表示被查询用户操作的账号 index-若找到表示用户的下标,若没找到为-1 low-二分查找中的小值 high-二分查找中的大值 mid-二分查找中的中间值 返回值:若找到,返回值在0~N-1间,否则,返回-1 其他说明:二分查找 ****************************************************/ int search(int bework) { int index=-1; int low=0, high=N-1, mid; while(low<=high) { mid=(low+high)/2; if(use_data[mid].account==bework) { index=mid; break; //若找到则退出 } else if (use_data[mid].account>bework) high=mid-1; else low=mid+1; } return index; //若找到,返回值在0~N-1间,否则,返回-1 } 注:代码中文件解释,password文件中为:manager 123456,account文件中为:10001 caoxinyu 123456 1498.000000 1 10002 machunpeng 123456 1010.000000 1 10003 jiarushan 123456 100.000000 1
三:利用递推,数组,递归构造斐波那契数列时间的差异
代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> /**************************************************** 功能描述:递推法求斐波那契数列以及运算时间 输入参数:start-测试时间的初值 finish-测试时间的完成值 fib1-数列的第一项 fib2-数列的第二项 fib-递推的中间变量 i-循环控制变量 n-欲求的数列的项数 返回值:无 其他说明:无 ****************************************************/ void ditui(int n) { clock_t start,finish; long long fib1=1,fib2=1,fib; int i; if(n<=0) printf("wrong!"); else if(n==1) printf("1"); else { printf("lldlld",fib1,fib2);//先将前两个输出 start=clock(); for(i=2; i<n; i++) { fib=fib1+fib2;//递推公式 printf("lld",fib); //if(i==4) //printf("\n"); //if((i-4)%5==0&&i>4) //printf("\n"); fib1=fib2;//递推过程 fib2=fib; } finish=clock(); printf("The ditui time is %f ms\n",difftime(finish,start)); } } /**************************************************** 功能描述:递归算法 输入参数:n-欲求的数列的项数 返回值:递归结果 其他说明:无 ****************************************************/ int Fib(int n) { if(n==1||n==2)//前一二项为1 1 return 1; else return (Fib(n-1)+Fib(n-2)); } /**************************************************** 功能描述:递归法求斐波那契数列以及运算时间 输入参数:start-测试时间的初值 finish-测试时间的完成值 fib-得到的斐波那契数列 i-循环控制变量 n-欲求的数列的项数 返回值:无 其他说明:无 ****************************************************/ void digui(int n) { clock_t start,finish; int i; long long fib; if(n<=0) printf("wrong!"); else { start=clock(); for(i=1; i<=n; i++) { fib=Fib(i); printf("lld",fib); //if(i%5==0)//5个换一行 //printf("\n"); } finish=clock(); printf("The diugui time is %f ms\n",difftime(finish,start)); } } /**************************************************** 功能描述:数组法求斐波那契数列以及运算时间 输入参数:start-测试时间的初值 finish-测试时间的完成值 fib-存放得到的数列的数组 i-循环控制变量 n-欲求的数列的项数 返回值:无 其他说明:无 ****************************************************/ void shuzu(int n) { clock_t start,finish; long long fib[10000]; int i; fib[0]=1;//赋初值1 1 fib[1]=1; start=clock(); for(i=2; i<n; i++) { fib[i]=fib[i-1]+fib[i-2]; } finish=clock(); for(i=0; i<n; i++) { printf("lld",fib[i]); // if((i+1)%5==0)//5个一换行 //printf("\n"); } printf("The shuzu time is %f ms\n",difftime(finish,start)); } int main() { int n; scanf("%d",&n); if(n>50) printf("数据过大"); else { shuzu(n); ditui(n); digui(n); } return 0; }