活动介绍
file-type

C++深入剖析:scanf(), getchar(), gets()与cin的输入机制

5星 · 超过95%的资源 | 下载需积分: 45 | 23KB | 更新于2024-09-16 | 181 浏览量 | 14 下载量 举报 3 收藏
download 立即下载
深入理解C++中的scanf()、getchar()和gets()函数在程序设计中的作用与潜在问题 C++中,scanf()、getchar()和gets()是一组用于从标准输入设备(如键盘)获取用户输入的常用函数。它们在处理字符和字符串输入时有着不同的行为和适用场景。 **scanf()与getchar()读取字符分析:** scanf()函数用于按照指定格式读取数据,包括字符。在提供的示例程序中,用户可能期望连续输入两个字符,但观察到的现象是,一旦输入一个字符后,程序就会结束,这是因为scanf()函数默认读取一个字符后,如果没有遇到预期的分隔符(如空格或换行),它会继续等待直到遇到,或者缓冲区被填满。如果输入一个字符后没有继续输入,scanf()停止等待,导致后续读取失败。 getchar()函数则单独获取并返回下一个可用的输入字符,不受格式控制。它不依赖于格式字符串,因此即使用户未提供分隔符,getchar()也能连续获取字符,直到遇到换行或EOF(文件结束)。这个特性解释了为什么使用getchar()连续获取字符时,程序可以正常接收两个字符,即使用户只输入了一个。 **问题描述二:scanf()与gets()读取字符串分析:** gets()函数用于从标准输入获取一行字符串,直到遇到换行符为止。然而,gets()存在一个严重的安全风险,那就是它没有长度检查,容易导致缓冲区溢出。如果用户输入的字符串过长,超过了预先分配的内存空间,可能会覆盖相邻的内存区域,导致程序崩溃或安全隐患。 相比之下,scanf()提供了对输入字符串长度的控制,可以通过添加限制符如"%s"指定最大读取字符数量,从而避免此类问题。但在处理用户输入时,还是推荐使用更现代和安全的`std::getline()`函数,它可以明确指定接收的字符数量,并能处理换行符。 总结来说,scanf()和getchar()在读取字符时更注重格式化和控制,适合处理简单的输入需求;而gets()在处理字符串时需谨慎使用,尤其是涉及到安全性时,应改用scanf()或更安全的替代方法。同时,理解输入流的工作原理,如缓冲区机制,对于正确处理用户输入至关重要。

相关推荐

filetype

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #include <time.h> //结构体的定义 typedef struct date //日期类型 { short year; short month; short day; }SDATE; typedef struct phone //手机信息类型 { char ID[20]; //手机编号 char modle[20]; //手机型号 char brand[20]; //品牌 float pprice; //进价 int num; //数量 }SPHO; typedef struct sale //销售信息类型 { char ID[20]; char modle[20]; char brand[20]; float sprice; //售价 SDATE sale_time; //销售时间 int num; //销售数量 }SSALE; #define SDATE_LEN sizeof(SDATE) #define SPHO_LEN sizeof(SPHO) #define SSALE_LEN sizeof(SSALE) #define PHONENUM 1000 //PHONENUM为系统允许的最大手机数量 #define SALENUM 1000 //SALENUM为系统允许的最大销售数量 SPHO phone[PHONENUM]={0}; //手机数组,初始化为0 SSALE sale[SALENUM]={0}; //销售数组,初始化为0 //登陆模块函数声明 void Login(int *ppn,int *psn); //手机信息管理模块的函数声明 void InputOnephone(int i); //输入一个手机信息的函数 int Loadphones(void); //从文件中载入全部手机信息的函数 void SaveAllphones(int pn); //保存全部手机信息的函数 int Originalphone(void); //手机信息的初始化函数 void Modifyphone(int pn); //修改手机信息的函数 int Addphone(int pn); //添加手机信息的函数 int Delphone(int pn); //删除手机信息的函数 void OutputOnephone(int i); //输出一个手机信息的函数 //销售信息管理模块的函数声明 void InputOnesale(int i,int pn); //输入一个销售信息的函数 void SaveOnesale(int i); //保存一个销售信息的函数 void SaveAllsales(int sn); //保存全部销售信息的函数 int Originalsale(int pn); //销售信息的初始化函数 int Addsale(int sn,int pn); //添加销售信息的函数 int Loadsales(void); //从文件中载入全部销售信息的函数 void OutputOnesale(int i); int SALE(int sn,int pn); //销售管理函数 //int Looksale(int sn); //手机信息查询的函数声明 void SearchMenu(int pn,int sn); //手机查询函数 void SearchID(int pn); //按手机编号查询函数 void Searchbrand(int sn); //按品牌查询 void Searchdate(int sn); //按时间查询 //销售信息统计信息查询的函数声明 void StatisticsMenu(int sn,int pn); //销售信息统计函数 void Statisticsbrand(int sn); //按手机品牌统计 void Statisticsmodle(int sn,int pn); //按手机型号统计 void Statisticsdate(int sn); //按日期统计 //排序的函数声明 void SortMenu(int pn,int sn); //排序函数 void Sortpprice(int pn); //对手机进价进行排序 void Sortsale_time(int sn); //对销售时间进行排序 void main(void) { int select,pn,sn; pn=Loadphones(); //调用Loadphone(),返回值为手机信息,将其赋值给pn if(pn0) printf(“手机信息为空!\n\n”); sn=Loadsales(); if(sn0) printf(“销售信息为空!\n\n”); while(1) { printf(“\n”); printf(“\t*****************************************************************\n”); printf(“\t*****************************************************************\n”); printf(“\t** \n"); printf(“\t \n”); printf(“\t 手机销售管理系统 \n”); printf(“\t \n”); printf(“\t \n”); printf(“\t***************************************************************\n”); printf(“\t*****************************************************************\n”); printf(“\n”); printf(“\t-----------------------------------------------------------------\n”); printf(“\t 1.创建手机信息 2.修改手机信息\n”); printf(“\t 3.增加手机信息 4.删除手机信息\n”); printf(“\t 5.手机销售管理 6.销售查询信息\n”); printf(“\t 7.手机信息统计 8.手机信息排序\n”); printf(“\t 0.退出管理系统\n”); printf(“\t ****************************************************************\n”); printf(“请选择你要进行的服务(0-8):\n”); scanf(“%d”,&select); getchar(); //用于读取回车符,消除对以后数据的影响 switch(select) { case 1: pn=Originalphone(); break; case 2: Modifyphone(pn); break; case 3: pn=Addphone(pn); break; case 4: pn=Delphone(pn); break; case 5: sn=SALE(sn,pn); break; case 6: SearchMenu(pn,sn); break; case 7: StatisticsMenu(sn,pn); break; case 8: SortMenu(pn,sn); break; case 0: printf(“\n谢谢使用!再见\n”); exit(1); default: printf(“\n按键错误,请重新选择!\n”); } } } //从文件"phone.dat"中载入全部手机信息 int Loadphones(void) { FILE *fb; int pn=0; if((fb=fopen(“phone.dat”,“rb+”))==NULL) { printf(“Can`t open file phone.dat\n”); return(pn); } while(!feof(fb)) if(fread(&phone[pn],SPHO_LEN,1,fb)) pn++; fclose(fb); return(pn); } //从键盘输入一个手机的全部信息 void InputOnephone(int i) { printf(” 手机编号:“); gets(phone[i].ID); printf(” 手机型号: “); gets(phone[i].modle); printf(” 品牌: “); gets(phone[i].brand); printf(” 进价: “); scanf(”%f",&phone[i].pprice); printf(“数量:”); scanf(“%f”,&phone[i].num); getchar(); } //输出一个手机的全部信息 void OutputOnephone(int i) { printf(“\n”); printf(“手机编号:”); puts(phone[i].ID); printf(“手机型号:”); puts(phone[i].modle); printf(“品牌:”); puts(phone[i].brand); printf(“进价:”); printf(“%.2f\n”,phone[i].pprice); printf(“数量:”); printf(“%.2f”,phone[i].num); } //将一个手机的信息保存到文件"phone.dat"中 void SaveOnephone(int i) { FILE fb; if((fb=fopen(“phone.dat”,“rb+”))==NULL) { printf(“Can`t open file phone.dat\n”); exit(1); } fseek(fb,SPHO_LENi,0); //文件指针定位到第i个手机 fwrite(&phone[i],SPHO_LEN,1,fb); fclose(fb); } //将全部信息保存到文件"phone,dat"中 void SaveAllphones(int pn) { FILE *fb; if((fb=fopen(“phone.dat”,“wb”))==NULL) { printf(“Can`t open file phone.dat\n”); exit(1); } fwrite(phone,SPHO_LEN,pn,fb); fclose(fb); } //手机信息初始化 int Originalphone() { int n; char c=‘y’; for(n=0;c==‘y’||c==‘Y’;n++) { printf(“\n输入手机%d的信息:\n”,n+1); InputOnephone(n); //调用函数,输入第n个手机数据 printf("\n继续输入请按’y’,停止输入请按’n’😊; c=getchar(); getchar(); } SaveAllphones(n); //将输入的n个手机的数据保存至文件 return(n); //返回n的值,即输出手机的数量 } //添加手机信息 int Addphone(int pn) { char c=‘y’; FILE *fb; if((fb=fopen(“phone.dat”,“ab”))NULL) { printf(“Can`t open file phone.dat\n”); exit(1); } while(c’y’||c==‘Y’) { InputOnephone(pn); //调用函数输入第n个手机的信息 fwrite(&phone[pn],SPHO_LEN,1,fb); pn++; printf(“\n继续输入其他手机的信息吗?(y/n)😊; c=getchar(); getchar(); } printf(”\n按任意键继续!\n"); getch(); fclose(fb); return(pn); } //删除手机信息 int Delphone(int pn) { int i,k=-1; char id[20],c1=‘y’,c2; if(pn0) { printf(“\n手机信息为空,无法执行操作!\n”); return(pn); } while(c1’y’||c1==‘Y’) { c2=‘n’; printf(“\n请输入要删除的手机的手机编号:”); gets(id); for(i=0;i<pn;i++) if(strcmp(phone[i].ID,id)0) { k=i; break; } if(k<0) printf(“\n输入的手机编号有误,请重新输入!\n”); else { printf(“\n显示该手机的信息:\n”); OutputOnephone(k); printf(“\n确定要删除该手机的全部信息吗?(y/n)😊; c2=getchar(); getchar(); if(c2’y’) { for(i=k;i<pn;i++) phone[i]=phone[i+1]; pn–; printf(“\n删除成功!\n”); } else printf(“\n取消删除!\n”); printf(“\n继续删除其他手机的信息吗?(y/n)😊; c1=getchar(); getchar(); } } SaveAllphones(pn); printf(”\n按任意键继续!\n”); getch(); return(pn); } //手机信息的修改 void Modifyphone(int pn) { int select,k,i; char id[20],c1=‘y’,c2; if(pn0) { printf(“\n手机信息为空,无法进行操作!\n”); return; } while(c1’y’||c1==‘Y’) { k=-1; c2=‘y’; printf(“\n请输入要修改的手机的编号:”); gets(id); for(i=0;i<pn;i++) if(strcmp(phone[i].ID,id)0) { k=i; break; } if(k<0) //k小于0,在数组phone中没找到输入编号的手机 printf(“\n输入的手机编号有误,请重新输入!\n”); else //k大于0,找到该手机 { printf(“\n显示该手机的信息:\n”); OutputOnephone(k); //显示该手机的全部信息 while(c2’y’||c2==‘Y’) { printf(“\n 手机信息包括以下数据项\n”); printf(“----------------------------------------------\n”); printf(" 1.手机编号 2.手机型号\n"); printf(" 3.手机品牌 4.手机进价\n"); printf(" 5.手机数量 \n"); printf(“---------------------------------------------\n”); printf(“\n输入要修改的数据项(1–5)😊; scanf(”%d",&select); getchar(); switch(select) { case 1:printf(“手机编号:”); gets(phone[k].ID); break; case 2:printf(“手机型号:”); gets(phone[k].modle); break; case 3:printf(“品牌:”); gets(phone[k].brand); break; case 4:printf(“进价:”); scanf(“%f”,&phone[k].pprice); getchar(); break; case 5:printf(“数量:”); scanf(“%f”,&phone[k].num); getchar(); default:printf(“\n按键错误,请重新输入!\n”); } printf(“\n还要修改此手机的其他信息吗?(y/n)😊; c2=getchar(); getchar(); } } SaveOnephone(k); //保存修改后手机的信息 printf(”\n还需要修改其他手机的信息吗?(y/n)😊; c1=getchar(); getchar(); } printf(“\n按任意键继续!\n”); getch(); } //销售管理 int SALE(int sn,int pn) { if(sn==0) { printf(“\n销售文件无任何数据\n”); sn=Originalsale(pn); } else sn=Addsale(sn,pn); return(sn); } //从文件"save.dat"中载入全部手机信息 int Loadsales(void) { FILE *fb; int sn=0; if((fb=fopen(“sale.dat”,“rb+”))==NULL) { printf(“Can`t open file sale.dat\n”); return(sn); } while(!feof(fb)) if(fread(&sale[sn],SSALE_LEN,1,fb)) sn++; fclose(fb); return(sn); } //将全部销售信息保存到文件"sale,dat"中 void SaveAllsale(int sn) { FILE *fb; if((fb=fopen(“sale.dat”,“wb”))==NULL) { printf(“Can`t open file sale.dat\n”); exit(1); } fwrite(sale,SSALE_LEN,sn,fb); fclose(fb); } //销售信息的初始化 int Originalsale(int pn) { int n; char c=‘y’; for(n=0;c==‘y’||c==‘Y’;n++) { printf(“\n输入销售手机%d的信息:\n”,n+1); InputOnesale(n,pn); //调用函数,输入第n个销售手机数据 printf("\n继续输入请按’y’,停止输入请按’n’😊; c=getchar(); getchar(); } SaveAllsale(n); //将输入的n个销售手机的数据保存至文件 return(n); //返回n的值,即输出销售手机的数量 } //从键盘输入一个销售手机的全部信息 void InputOnesale(int i,int pn) { int k=-1,n; char id[20],c1=‘y’; if(pn==0) { printf(“\n手机信息为空,无法进行操作!\n”); return; } printf(“\n请输入的销售的手机的编号:”); gets(id); for(n=0;n<pn;n++) if(strcmp(phone[n].ID,id)==0) { k=n; break; } if(k<0) //k小于0,在数组phone中没找到输入编号的手机 printf(“\n输入的手机编号有误,请重新输入!\n”); else //k大于0,找到该手机 { strcpy(sale[i].ID,id); printf(" 手机型号:“); puts(phone[n].modle); strcpy(sale[i].modle,phone[n].modle); printf(” 品牌: “); puts(phone[n].brand); strcpy(sale[i].brand,phone[n].brand); printf(” 售价: “); scanf(”%f",&sale[i].sprice); getchar(); printf(" 数量: “); scanf(”%d",&sale[n].num); printf(“销售日期(年.月.日)😊; scanf(”%d.%d.%d",&sale[i].sale_time.year,&sale[i].sale_time.month,&sale[i].sale_time.day); getchar(); } } //输出一个手机的销售信息 void OutputOnesale(int i) { printf(“\n”); printf(“手机编号:”); puts(sale[i].ID); printf(“手机型号:”); puts(sale[i].modle); printf(“品牌:”); puts(sale[i].brand); printf(“售价:”); printf(“%.2f\n”,sale[i].sprice); printf(“数量:”); printf(“%.2f”,sale[i].num); } //添加销售手机信息 int Addsale(int sn,int pn) { char c=‘y’; FILE *fb; if((fb=fopen(“sale.dat”,“ab”))NULL) { printf(“Can`t open file sale.dat\n”); exit(1); } while(c’y’||c==‘Y’) { printf(“\n请输入要添加的销售手机信息:\n”); InputOnesale(sn,pn); //调用函数输入第n个销售手机的信息 fwrite(&sale[sn],SSALE_LEN,1,fb); sn++; printf(“\n继续输入其他要输入的销售手机的信息吗?(y/n)😊; c=getchar(); getchar(); } printf(”\n按任意键继续!\n"); getch(); fclose(fb); return(sn); } //查询功能模块 void SearchMenu(int pn,int sn) { int select; while(1) { printf(“\n 欢迎使用查询服务\n”); printf(“############################################################\n”); printf(“\n”); printf(" 1.按编号查询 2.按品牌查询\n"); printf(" 3.按日期查询 0.退出查询系统 \n"); printf(“\n”); printf(“############################################################\n”); printf(“请选择查询方式(0-3)😊; scanf(”%d",&select); getchar(); switch(select) { case 1:SearchID(pn); break; case 2:Searchbrand(sn); break; case 3:Searchdate(sn); break; case 0: return; default: printf(“\n按键错误,请重新选择!\n”); } } } //按手机编号号查询 void SearchID(int pn) { int i,j,k; char sID[20],c=‘y’; while(c==‘y’||c==‘Y’) { k=-1; printf(“\n请输入手机编号:”); gets(sID); for(i=0,j=1;i<pn;i++) if(strcmp(phone[i].ID,sID)==0) { k=i; printf(“\n手机%d的信息是:\n”,j++); OutputOnephone(k); } if(j1||k-1) printf(“\n抱歉!没有找到相应的手机信息!\n”); printf(“\n要继续按手机编号查询其他手机的信息吗?(y/n)😊; c=getchar(); getchar(); } printf(”\n按任意键继续!\n"); getch(); } //按品牌查询 void Searchbrand(int sn) { int i,j,k; char sbrand[20],c=‘y’; while(c==‘y’||c==‘Y’) { k=-1; printf(“\n请输入销售品牌:”); gets(sbrand); for(i=0,j=1;i<sn;i++) if(strcmp(sale[i].brand,sbrand)==0) { k=i; printf(“\n销售手机%d的信息是:”,j++); OutputOnesale(k); } if(j1||k-1) printf(“\n抱歉!没有找到相应的销售手机信息!\n”); printf(“\n要继续按品牌查询其他销售手机的信息吗?(y/n)😊; c=getchar(); getchar(); } printf(”\n按任意键继续!\n"); getch(); } //按时间查询 void Searchdate(int sn) { int i,j,k,year,month,day; char c=‘y’; while(c==‘y’||c==‘Y’) { k=-1; printf(“\n请输入时间(年.月.日):”); scanf(“%d.%d.%d”,&year,&month,&day); getchar(); for(i=0,j=1;i<sn;i++) if(sale[i].sale_time.yearyear) { k=i; if(sale[i].sale_time.month!=month) continue; if(sale[i].sale_time.day!=day) continue; printf(“\n销售手机%d的信息:\n”,j++); OutputOnesale(k); } if(k-1||j==1) printf(“\n抱歉!没有找到相应的销售手机信息!\n”); printf(“\n继续按时间查询其他销售手机的信息吗?(y/n)😊; c=getchar(); getchar(); } printf(”\n按任意键继续!\n"); getch(); } //统计功能模块 void StatisticsMenu(int sn,int pn) { int select; while(1) { printf(“\n 统计系统\n”); printf(“#############################################################\n”); printf(“\n”); printf(" 1.按品牌统计 2.按手机型号统计\n"); printf(" 3.按日期统计 0.退出统计系统\n"); printf(“\n”); printf(“#############################################################\n”); printf(“请选择统计方式(0-3)😊; scanf(”%d",&select); getchar(); switch(select) { case 1:Statisticsbrand(sn); break; case 2:Statisticsmodle(sn,pn); break; case 3:Statisticsdate(sn); break; case 0: return; default: printf(“\n按键错误,请重新选择!\n”); } } } //按品牌统计 void Statisticsbrand(int sn) { int i,j,k=-1; float m; char sbrand[20],c=‘y’; while(c==‘y’||c==‘Y’) { m=0; printf(“\n请输入销售品牌:”); gets(sbrand); for(i=0,j=0;i<sn;i++) if(strcmp(sale[i].brand,sbrand)0) { k=i; j++; m=m+sale[k].sprice; } if(j0||k==-1) printf(“\n抱歉,没找到相应的销售信息!\n”); else { printf(“\n该品牌手机的总销售量为:%d”,j); printf(“\n该品牌手机的总销售金额为:%.2f”,m); } printf(“\n是否还要统计其他品牌手机的信息?(y/n)😊; c=getchar(); getchar(); } printf(“按任意键继续!”); getch(); } //按型号统计 void Statisticsmodle(sn,pn) { int i,j,n; float m,k; char smodle[20],id[20],c=‘y’; while(c==‘y’||c==‘Y’) { k=0; m=0; printf(“\n请输入销售的手机型号:”); gets(smodle); for(i=0,j=0;i<sn;i++) { if(strcmp(sale[i].modle,smodle)0) { strcpy(id,sale[i].ID); for(n=0;n<pn;n++) if(strcmp(phone[n].ID,id)0) { k=sale[i].sprice-phone[n].pprice; j++; m=m+k; } } } if(j0) printf(“\n抱歉,没找到相应的销售信息!\n”); else printf(“\n该手机型号的手机手机总销售利润为:%.2f”,m); printf(“\n 是否还要统计其他手机型号手机的信息?(y/n)”); c=getchar(); getchar(); } printf(“按任意键继续!”); getch(); } //按销售日期统计 void Statisticsdate(int sn) { int i,j,k,m,year,month; char c=‘y’; float n; while(c’y’||c==‘Y’) { n=0; m=0; printf(“\n请输入要统计的时间(年.月)😊; scanf(”%d.%d”,&year,&month); getchar(); for(i=0,j=0;i<sn;i++) { if(sale[i].sale_time.year==year) { k=i; if(sale[k].sale_time.month!=month) continue; m++; n=n+sale[k].sprice; } } if(j=0) printf(“\n抱歉,没找到相应的销售信息!\n”); else { printf(“\n该月手机的销售总量为:%d”,m); printf(“\n该月手机的总销售金额为:%.2f”,n); } printf(“\n 是否还要统计其他日期手机的信息?(y/n)”); c=getchar(); getchar(); } printf(“按任意键继续!”); getch(); } //排序函数 void SortMenu(int pn,int sn) { int select; while(1) { printf(“\n 排序系统\n”); printf(“##########################################\n”); printf(“\n”); printf(" 1.按手机进价排序:\n"); printf(" 2.按销售日期排序:\n"); printf(" 0.退出排序系统:\n"); printf(“\n”); printf(“##########################################\n”); printf(“请选择排序方式(0-2)😊; scanf(”%d",&select); getchar(); switch(select) { case 1:Sortpprice(pn); break; case 2:Sortsale_time(sn); break; case 0: return; default: printf(“\n按键错误,请重新选择!\n”); } } } //按手机进价排序 void Sortpprice(int pn) { SPHO temp; int i,j; for(i=0;i<pn-1;i++) for(j=0;j<pn-i-1;j++) if(phone[j].pprice>phone[j+1].pprice) { temp=phone[j]; phone[j]=phone[j+1]; phone[j+1]=temp; } printf(“\n排序后的手机信息为:\n”); printf(“\n手机编号 手机型号 品牌 数量 进价\n”); for(i=0;i<pn;i++) { printf(“%-11s %-10s%-10s %.2f %.2f”,phone[i].ID,phone[i].modle,phone[i].brand,phone[i].num,phone[i].pprice); printf(“\n”); } printf(“\n按任意键继续!\n”); getch(); } // void Sortsale_time(int sn) { SSALE temp; int i,j; for(i=0;i<sn-1;i++) for(j=0;j<sn-i-1;j++) if(sale[j].sale_time.year>sale[j+1].sale_time.year||(sale[j].sale_time.yearsale[j+1].sale_time.year&&sale[j].sale_time.month>sale[j+1].sale_time.month)||(sale[j].sale_time.yearsale[j+1].sale_time.year&&sale[j].sale_time.month==sale[j+1].sale_time.month&&sale[j].sale_time.day>sale[j+1].sale_time.day)) { temp=sale[j]; sale[j]=sale[j+1]; sale[j+1]=temp; } printf(“\n排序后的销售手机信息为:\n”); printf(“\n手机编号 手机型号 品牌 售价 数量 销售日期(年月日) \n”); for(i=0;i<sn;i++) { printf(“%-11s %-10s%-10s %.2f %d %d %d %d “,sale[i].ID,sale[i].modle,sale[i].brand,sale[i].sprice,sale[i].num,sale[i].sale_time.year,sale[i].sale_time.month,sale[i].sale_time.day); printf(”\n”); } printf(“\n按任意键继续!\n”); getch(); } 根据上述代码转化为qt项目,请给出完整的qt版代码和详细的对应的UI界面设计

filetype

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #include <time.h> //结构体的定义 typedef struct date //日期类型 { short year; short month; short day; }SDATE; typedef struct phone //手机信息类型 { char ID[20]; //手机编号 char modle[20]; //手机型号 char brand[20]; //品牌 float pprice; //进价 int num; //数量 }SPHO; typedef struct sale //销售信息类型 { char ID[20]; char modle[20]; char brand[20]; float sprice; //售价 SDATE sale_time; //销售时间 int num; //销售数量 }SSALE; #define SDATE_LEN sizeof(SDATE) #define SPHO_LEN sizeof(SPHO) #define SSALE_LEN sizeof(SSALE) #define PHONENUM 1000 //PHONENUM为系统允许的最大手机数量 #define SALENUM 1000 //SALENUM为系统允许的最大销售数量 SPHO phone[PHONENUM]={0}; //手机数组,初始化为0 SSALE sale[SALENUM]={0}; //销售数组,初始化为0 //登陆模块函数声明 void Login(int *ppn,int *psn); //手机信息管理模块的函数声明 void InputOnephone(int i); //输入一个手机信息的函数 int Loadphones(void); //从文件中载入全部手机信息的函数 void SaveAllphones(int pn); //保存全部手机信息的函数 int Originalphone(void); //手机信息的初始化函数 void Modifyphone(int pn); //修改手机信息的函数 int Addphone(int pn); //添加手机信息的函数 int Delphone(int pn); //删除手机信息的函数 void OutputOnephone(int i); //输出一个手机信息的函数 //销售信息管理模块的函数声明 void InputOnesale(int i,int pn); //输入一个销售信息的函数 void SaveOnesale(int i); //保存一个销售信息的函数 void SaveAllsales(int sn); //保存全部销售信息的函数 int Originalsale(int pn); //销售信息的初始化函数 int Addsale(int sn,int pn); //添加销售信息的函数 int Loadsales(void); //从文件中载入全部销售信息的函数 void OutputOnesale(int i); int SALE(int sn,int pn); //销售管理函数 //int Looksale(int sn); //手机信息查询的函数声明 void SearchMenu(int pn,int sn); //手机查询函数 void SearchID(int pn); //按手机编号查询函数 void Searchbrand(int sn); //按品牌查询 void Searchdate(int sn); //按时间查询 //销售信息统计信息查询的函数声明 void StatisticsMenu(int sn,int pn); //销售信息统计函数 void Statisticsbrand(int sn); //按手机品牌统计 void Statisticsmodle(int sn,int pn); //按手机型号统计 void Statisticsdate(int sn); //按日期统计 //排序的函数声明 void SortMenu(int pn,int sn); //排序函数 void Sortpprice(int pn); //对手机进价进行排序 void Sortsale_time(int sn); //对销售时间进行排序 void main(void) { int select,pn,sn; pn=Loadphones(); //调用Loadphone(),返回值为手机信息,将其赋值给pn if(pn==0) printf("手机信息为空!\n\n"); sn=Loadsales(); if(sn==0) printf("销售信息为空!\n\n"); while(1) { printf("\n"); printf("\t*****************************************************************\n"); printf("\t*****************************************************************\n"); printf("\t** **\n"); printf("\t** **\n"); printf("\t** 手机销售管理系统 **\n"); printf("\t** **\n"); printf("\t** **\n"); printf("\t*****************************************************************\n"); printf("\t*****************************************************************\n"); printf("\n"); printf("\t-----------------------------------------------------------------\n"); printf("\t 1.创建手机信息 2.修改手机信息\n"); printf("\t 3.增加手机信息 4.删除手机信息\n"); printf("\t 5.手机销售管理 6.销售查询信息\n"); printf("\t 7.手机信息统计 8.手机信息排序\n"); printf("\t 0.退出管理系统\n"); printf("\t ****************************************************************\n"); printf("请选择你要进行的服务(0-8):\n"); scanf("%d",&select); getchar(); //用于读取回车符,消除对以后数据的影响 switch(select) { case 1: pn=Originalphone(); break; case 2: Modifyphone(pn); break; case 3: pn=Addphone(pn); break; case 4: pn=Delphone(pn); break; case 5: sn=SALE(sn,pn); break; case 6: SearchMenu(pn,sn); break; case 7: StatisticsMenu(sn,pn); break; case 8: SortMenu(pn,sn); break; case 0: printf("\n谢谢使用!再见\n"); exit(1); default: printf("\n按键错误,请重新选择!\n"); } } } //从文件"phone.dat"中载入全部手机信息 int Loadphones(void) { FILE *fb; int pn=0; if((fb=fopen("phone.dat","rb+"))==NULL) { printf("Can`t open file phone.dat\n"); return(pn); } while(!feof(fb)) if(fread(&phone[pn],SPHO_LEN,1,fb)) pn++; fclose(fb); return(pn); } //从键盘输入一个手机的全部信息 void InputOnephone(int i) { printf(" 手机编号:"); gets(phone[i].ID); printf(" 手机型号: "); gets(phone[i].modle); printf(" 品牌: "); gets(phone[i].brand); printf(" 进价: "); scanf("%f",&phone[i].pprice); printf("数量:"); scanf("%f",&phone[i].num); getchar(); } //输出一个手机的全部信息 void OutputOnephone(int i) { printf("\n"); printf("手机编号:"); puts(phone[i].ID); printf("手机型号:"); puts(phone[i].modle); printf("品牌:"); puts(phone[i].brand); printf("进价:"); printf("%.2f\n",phone[i].pprice); printf("数量:"); printf("%.2f",phone[i].num); } //将一个手机的信息保存到文件"phone.dat"中 void SaveOnephone(int i) { FILE *fb; if((fb=fopen("phone.dat","rb+"))==NULL) { printf("Can`t open file phone.dat\n"); exit(1); } fseek(fb,SPHO_LEN*i,0); //文件指针定位到第i个手机 fwrite(&phone[i],SPHO_LEN,1,fb); fclose(fb); } //将全部信息保存到文件"phone,dat"中 void SaveAllphones(int pn) { FILE *fb; if((fb=fopen("phone.dat","wb"))==NULL) { printf("Can`t open file phone.dat\n"); exit(1); } fwrite(phone,SPHO_LEN,pn,fb); fclose(fb); } //手机信息初始化 int Originalphone() { int n; char c='y'; for(n=0;c=='y'||c=='Y';n++) { printf("\n输入手机%d的信息:\n",n+1); InputOnephone(n); //调用函数,输入第n个手机数据 printf("\n继续输入请按'y',停止输入请按'n':"); c=getchar(); getchar(); } SaveAllphones(n); //将输入的n个手机的数据保存至文件 return(n); //返回n的值,即输出手机的数量 } //添加手机信息 int Addphone(int pn) { char c='y'; FILE *fb; if((fb=fopen("phone.dat","ab"))==NULL) { printf("Can`t open file phone.dat\n"); exit(1); } while(c=='y'||c=='Y') { InputOnephone(pn); //调用函数输入第n个手机的信息 fwrite(&phone[pn],SPHO_LEN,1,fb); pn++; printf("\n继续输入其他手机的信息吗?(y/n):"); c=getchar(); getchar(); } printf("\n按任意键继续!\n"); getch(); fclose(fb); return(pn); } //删除手机信息 int Delphone(int pn) { int i,k=-1; char id[20],c1='y',c2; if(pn==0) { printf("\n手机信息为空,无法执行操作!\n"); return(pn); } while(c1=='y'||c1=='Y') { c2='n'; printf("\n请输入要删除的手机的手机编号:"); gets(id); for(i=0;i<pn;i++) if(strcmp(phone[i].ID,id)==0) { k=i; break; } if(k<0) printf("\n输入的手机编号有误,请重新输入!\n"); else { printf("\n显示该手机的信息:\n"); OutputOnephone(k); printf("\n确定要删除该手机的全部信息吗?(y/n):"); c2=getchar(); getchar(); if(c2=='y') { for(i=k;i<pn;i++) phone[i]=phone[i+1]; pn--; printf("\n删除成功!\n"); } else printf("\n取消删除!\n"); printf("\n继续删除其他手机的信息吗?(y/n):"); c1=getchar(); getchar(); } } SaveAllphones(pn); printf("\n按任意键继续!\n"); getch(); return(pn); } //手机信息的修改 void Modifyphone(int pn) { int select,k,i; char id[20],c1='y',c2; if(pn==0) { printf("\n手机信息为空,无法进行操作!\n"); return; } while(c1=='y'||c1=='Y') { k=-1; c2='y'; printf("\n请输入要修改的手机的编号:"); gets(id); for(i=0;i<pn;i++) if(strcmp(phone[i].ID,id)==0) { k=i; break; } if(k<0) //k小于0,在数组phone中没找到输入编号的手机 printf("\n输入的手机编号有误,请重新输入!\n"); else //k大于0,找到该手机 { printf("\n显示该手机的信息:\n"); OutputOnephone(k); //显示该手机的全部信息 while(c2=='y'||c2=='Y') { printf("\n 手机信息包括以下数据项\n"); printf("----------------------------------------------\n"); printf(" 1.手机编号 2.手机型号\n"); printf(" 3.手机品牌 4.手机进价\n"); printf(" 5.手机数量 \n"); printf("---------------------------------------------\n"); printf("\n输入要修改的数据项(1--5):"); scanf("%d",&select); getchar(); switch(select) { case 1:printf("手机编号:"); gets(phone[k].ID); break; case 2:printf("手机型号:"); gets(phone[k].modle); break; case 3:printf("品牌:"); gets(phone[k].brand); break; case 4:printf("进价:"); scanf("%f",&phone[k].pprice); getchar(); break; case 5:printf("数量:"); scanf("%f",&phone[k].num); getchar(); default:printf("\n按键错误,请重新输入!\n"); } printf("\n还要修改此手机的其他信息吗?(y/n):"); c2=getchar(); getchar(); } } SaveOnephone(k); //保存修改后手机的信息 printf("\n还需要修改其他手机的信息吗?(y/n):"); c1=getchar(); getchar(); } printf("\n按任意键继续!\n"); getch(); } //销售管理 int SALE(int sn,int pn) { if(sn==0) { printf("\n销售文件无任何数据\n"); sn=Originalsale(pn); } else sn=Addsale(sn,pn); return(sn); } //从文件"save.dat"中载入全部手机信息 int Loadsales(void) { FILE *fb; int sn=0; if((fb=fopen("sale.dat","rb+"))==NULL) { printf("Can`t open file sale.dat\n"); return(sn); } while(!feof(fb)) if(fread(&sale[sn],SSALE_LEN,1,fb)) sn++; fclose(fb); return(sn); } //将全部销售信息保存到文件"sale,dat"中 void SaveAllsale(int sn) { FILE *fb; if((fb=fopen("sale.dat","wb"))==NULL) { printf("Can`t open file sale.dat\n"); exit(1); } fwrite(sale,SSALE_LEN,sn,fb); fclose(fb); } //销售信息的初始化 int Originalsale(int pn) { int n; char c='y'; for(n=0;c=='y'||c=='Y';n++) { printf("\n输入销售手机%d的信息:\n",n+1); InputOnesale(n,pn); //调用函数,输入第n个销售手机数据 printf("\n继续输入请按'y',停止输入请按'n':"); c=getchar(); getchar(); } SaveAllsale(n); //将输入的n个销售手机的数据保存至文件 return(n); //返回n的值,即输出销售手机的数量 } //从键盘输入一个销售手机的全部信息 void InputOnesale(int i,int pn) { int k=-1,n; char id[20],c1='y'; if(pn==0) { printf("\n手机信息为空,无法进行操作!\n"); return; } printf("\n请输入的销售的手机的编号:"); gets(id); for(n=0;n<pn;n++) if(strcmp(phone[n].ID,id)==0) { k=n; break; } if(k<0) //k小于0,在数组phone中没找到输入编号的手机 printf("\n输入的手机编号有误,请重新输入!\n"); else //k大于0,找到该手机 { strcpy(sale[i].ID,id); printf(" 手机型号:"); puts(phone[n].modle); strcpy(sale[i].modle,phone[n].modle); printf(" 品牌: "); puts(phone[n].brand); strcpy(sale[i].brand,phone[n].brand); printf(" 售价: "); scanf("%f",&sale[i].sprice); getchar(); printf(" 数量: "); scanf("%d",&sale[n].num); printf("销售日期(年.月.日):"); scanf("%d.%d.%d",&sale[i].sale_time.year,&sale[i].sale_time.month,&sale[i].sale_time.day); getchar(); } } //输出一个手机的销售信息 void OutputOnesale(int i) { printf("\n"); printf("手机编号:"); puts(sale[i].ID); printf("手机型号:"); puts(sale[i].modle); printf("品牌:"); puts(sale[i].brand); printf("售价:"); printf("%.2f\n",sale[i].sprice); printf("数量:"); printf("%.2f",sale[i].num); } //添加销售手机信息 int Addsale(int sn,int pn) { char c='y'; FILE *fb; if((fb=fopen("sale.dat","ab"))==NULL) { printf("Can`t open file sale.dat\n"); exit(1); } while(c=='y'||c=='Y') { printf("\n请输入要添加的销售手机信息:\n"); InputOnesale(sn,pn); //调用函数输入第n个销售手机的信息 fwrite(&sale[sn],SSALE_LEN,1,fb); sn++; printf("\n继续输入其他要输入的销售手机的信息吗?(y/n):"); c=getchar(); getchar(); } printf("\n按任意键继续!\n"); getch(); fclose(fb); return(sn); } //查询功能模块 void SearchMenu(int pn,int sn) { int select; while(1) { printf("\n 欢迎使用查询服务\n"); printf("############################################################\n"); printf("\n"); printf(" 1.按编号查询 2.按品牌查询\n"); printf(" 3.按日期查询 0.退出查询系统 \n"); printf("\n"); printf("############################################################\n"); printf("请选择查询方式(0-3):"); scanf("%d",&select); getchar(); switch(select) { case 1:SearchID(pn); break; case 2:Searchbrand(sn); break; case 3:Searchdate(sn); break; case 0: return; default: printf("\n按键错误,请重新选择!\n"); } } } //按手机编号号查询 void SearchID(int pn) { int i,j,k; char sID[20],c='y'; while(c=='y'||c=='Y') { k=-1; printf("\n请输入手机编号:"); gets(sID); for(i=0,j=1;i<pn;i++) if(strcmp(phone[i].ID,sID)==0) { k=i; printf("\n手机%d的信息是:\n",j++); OutputOnephone(k); } if(j==1||k==-1) printf("\n抱歉!没有找到相应的手机信息!\n"); printf("\n要继续按手机编号查询其他手机的信息吗?(y/n):"); c=getchar(); getchar(); } printf("\n按任意键继续!\n"); getch(); } //按品牌查询 void Searchbrand(int sn) { int i,j,k; char sbrand[20],c='y'; while(c=='y'||c=='Y') { k=-1; printf("\n请输入销售品牌:"); gets(sbrand); for(i=0,j=1;i<sn;i++) if(strcmp(sale[i].brand,sbrand)==0) { k=i; printf("\n销售手机%d的信息是:",j++); OutputOnesale(k); } if(j==1||k==-1) printf("\n抱歉!没有找到相应的销售手机信息!\n"); printf("\n要继续按品牌查询其他销售手机的信息吗?(y/n):"); c=getchar(); getchar(); } printf("\n按任意键继续!\n"); getch(); } //按时间查询 void Searchdate(int sn) { int i,j,k,year,month,day; char c='y'; while(c=='y'||c=='Y') { k=-1; printf("\n请输入时间(年.月.日):"); scanf("%d.%d.%d",&year,&month,&day); getchar(); for(i=0,j=1;i<sn;i++) if(sale[i].sale_time.year==year) { k=i; if(sale[i].sale_time.month!=month) continue; if(sale[i].sale_time.day!=day) continue; printf("\n销售手机%d的信息:\n",j++); OutputOnesale(k); } if(k==-1||j==1) printf("\n抱歉!没有找到相应的销售手机信息!\n"); printf("\n继续按时间查询其他销售手机的信息吗?(y/n):"); c=getchar(); getchar(); } printf("\n按任意键继续!\n"); getch(); } //统计功能模块 void StatisticsMenu(int sn,int pn) { int select; while(1) { printf("\n 统计系统\n"); printf("#############################################################\n"); printf("\n"); printf(" 1.按品牌统计 2.按手机型号统计\n"); printf(" 3.按日期统计 0.退出统计系统\n"); printf("\n"); printf("#############################################################\n"); printf("请选择统计方式(0-3):"); scanf("%d",&select); getchar(); switch(select) { case 1:Statisticsbrand(sn); break; case 2:Statisticsmodle(sn,pn); break; case 3:Statisticsdate(sn); break; case 0: return; default: printf("\n按键错误,请重新选择!\n"); } } } //按品牌统计 void Statisticsbrand(int sn) { int i,j,k=-1; float m; char sbrand[20],c='y'; while(c=='y'||c=='Y') { m=0; printf("\n请输入销售品牌:"); gets(sbrand); for(i=0,j=0;i<sn;i++) if(strcmp(sale[i].brand,sbrand)==0) { k=i; j++; m=m+sale[k].sprice; } if(j==0||k==-1) printf("\n抱歉,没找到相应的销售信息!\n"); else { printf("\n该品牌手机的总销售量为:%d",j); printf("\n该品牌手机的总销售金额为:%.2f",m); } printf("\n是否还要统计其他品牌手机的信息?(y/n):"); c=getchar(); getchar(); } printf("按任意键继续!"); getch(); } //按型号统计 void Statisticsmodle(sn,pn) { int i,j,n; float m,k; char smodle[20],id[20],c='y'; while(c=='y'||c=='Y') { k=0; m=0; printf("\n请输入销售的手机型号:"); gets(smodle); for(i=0,j=0;i<sn;i++) { if(strcmp(sale[i].modle,smodle)==0) { strcpy(id,sale[i].ID); for(n=0;n<pn;n++) if(strcmp(phone[n].ID,id)==0) { k=sale[i].sprice-phone[n].pprice; j++; m=m+k; } } } if(j==0) printf("\n抱歉,没找到相应的销售信息!\n"); else printf("\n该手机型号的手机手机总销售利润为:%.2f",m); printf("\n 是否还要统计其他手机型号手机的信息?(y/n)"); c=getchar(); getchar(); } printf("按任意键继续!"); getch(); } //按销售日期统计 void Statisticsdate(int sn) { int i,j,k,m,year,month; char c='y'; float n; while(c=='y'||c=='Y') { n=0; m=0; printf("\n请输入要统计的时间(年.月):"); scanf("%d.%d",&year,&month); getchar(); for(i=0,j=0;i<sn;i++) { if(sale[i].sale_time.year==year) { k=i; if(sale[k].sale_time.month!=month) continue; m++; n=n+sale[k].sprice; } } if(j=0) printf("\n抱歉,没找到相应的销售信息!\n"); else { printf("\n该月手机的销售总量为:%d",m); printf("\n该月手机的总销售金额为:%.2f",n); } printf("\n 是否还要统计其他日期手机的信息?(y/n)"); c=getchar(); getchar(); } printf("按任意键继续!"); getch(); } //排序函数 void SortMenu(int pn,int sn) { int select; while(1) { printf("\n 排序系统\n"); printf("##########################################\n"); printf("\n"); printf(" 1.按手机进价排序:\n"); printf(" 2.按销售日期排序:\n"); printf(" 0.退出排序系统:\n"); printf("\n"); printf("##########################################\n"); printf("请选择排序方式(0-2):"); scanf("%d",&select); getchar(); switch(select) { case 1:Sortpprice(pn); break; case 2:Sortsale_time(sn); break; case 0: return; default: printf("\n按键错误,请重新选择!\n"); } } } //按手机进价排序 void Sortpprice(int pn) { SPHO temp; int i,j; for(i=0;i<pn-1;i++) for(j=0;j<pn-i-1;j++) if(phone[j].pprice>phone[j+1].pprice) { temp=phone[j]; phone[j]=phone[j+1]; phone[j+1]=temp; } printf("\n排序后的手机信息为:\n"); printf("\n手机编号 手机型号 品牌 数量 进价\n"); for(i=0;i<pn;i++) { printf("%-11s %-10s%-10s %.2f %.2f",phone[i].ID,phone[i].modle,phone[i].brand,phone[i].num,phone[i].pprice); printf("\n"); } printf("\n按任意键继续!\n"); getch(); } // void Sortsale_time(int sn) { SSALE temp; int i,j; for(i=0;i<sn-1;i++) for(j=0;j<sn-i-1;j++) if(sale[j].sale_time.year>sale[j+1].sale_time.year||(sale[j].sale_time.year==sale[j+1].sale_time.year&&sale[j].sale_time.month>sale[j+1].sale_time.month)||(sale[j].sale_time.year==sale[j+1].sale_time.year&&sale[j].sale_time.month==sale[j+1].sale_time.month&&sale[j].sale_time.day>sale[j+1].sale_time.day)) { temp=sale[j]; sale[j]=sale[j+1]; sale[j+1]=temp; } printf("\n排序后的销售手机信息为:\n"); printf("\n手机编号 手机型号 品牌 售价 数量 销售日期(年月日) \n"); for(i=0;i<sn;i++) { printf("%-11s %-10s%-10s %.2f %d %d %d %d ",sale[i].ID,sale[i].modle,sale[i].brand,sale[i].sprice,sale[i].num,sale[i].sale_time.year,sale[i].sale_time.month,sale[i].sale_time.day); printf("\n"); } printf("\n按任意键继续!\n"); getch(); } 根据以上.c代码创建一个qt项目,并给出其完整的运行代码和ui界面设计

lspwushu
  • 粉丝: 2
上传资源 快速赚钱