#include <stdlib.h>
#include <string.h>
void Menu();
void enterdata();
void output1();
void find();
void cal();
void output2();
void output3();
int inputState;//用户输入状态
int ifexit;//是否退出系统判定
int usercnt;//用户个数
typedef struct {
char ID[10][6];
char Username[10][11];
int income[10];
int payment[10];
}Store;
Store accountdata;
int main()
{
while(ifexit==0)
{
Menu();//调用菜单函数
}
return 0;
}
void Menu()
{
int Usernum;//用户输入的选项
//打印菜单
printf("\n");
printf("Here is the menu:\n");
printf("1.Input record\n");
printf("2.Sort and list records in alphabetical order by user name\n");
printf("3.Search records by user name");
printf("4.Calculate and list per capita income and expenses\n");
printf("5.List records which have more expenses than per capita expenses\n");
printf("6.List all records\n");
printf("7.Write to a file\n");
printf("8.Read from file\n");
printf("0.Exit\n");
printf("Please enter your choice:\n");
printf("\n");
//打印结束
if(inputState==0)//如果用户未输入或者输入选项已被执行时要重新录入选择
{
printf("waiting for your choice:\n");
inputState=1;
scanf("%d",&Usernum);
}
switch (Usernum)//采用switchcase分别执行用户命令
{
case 1:
enterdata();//调用录入数据函数
inputState=0;//执行完毕,用户输入状态归零
break;
case 2:
output1();
inputState=0;//执行完毕,用户输入状态归零
break;
case 3:
find();
inputState=0;//执行完毕,用户输入状态归零
break;
case 4:
cal();
inputState=0;//执行完毕,用户输入状态归零
break;
case 5:
output2();
inputState=0;//执行完毕,用户输入状态归零
break;
case 6:
output3();
inputState=0;//执行完毕,用户输入状态归零
break;
case 0:
ifexit=1;
printf("退出系统\n");
inputState=0;//执行完毕,用户输入状态归零
break;
case 7:
WritetoFile();
inputState=0;
break;
case 8:
ReadFromFile();
inputState=0;
break;
default:
printf("请输入正确的选项\n");
inputState=0;//执行完毕,用户输入状态归零
break;
}
}
void enterdata()
{
printf("please enter quantity of users :\n");
scanf("%d",&usercnt);
for(int i=0;i<usercnt;i++)//i为当前录入的用户位次下标
{
printf("\tID:");
for(int j=0;j<5;j++)
{
scanf(" %c",&(accountdata.ID[i][j]));
}
printf("\tUsername:");
int ret=0;
while(getchar()!=10);
int j;
for(j=0;j<10 && ret!=10;j++)
{
scanf("%c",&(accountdata.Username[i][j]));
ret=(int)accountdata.Username[i][j];
}
accountdata.Username[i][j-1]=0;
ret=0;
printf("\tincome:");
scanf("%d",&(accountdata.income[i]));
printf("\tpayment:");
scanf("%d",&(accountdata.payment[i]));
printf("\n");
}
}
void output1()//字典序排列后输出用户记账信息
{
for(int i=0;i<9;i++)
{
if(strcmp(accountdata.Username[i],accountdata.Username[i+1])>0)
{
char swap1[6]={"\0"};
char swap2[11]={"\0"};
int s1,s2;
for(int cnt1=0;cnt1<6;cnt1++)
{
swap1[cnt1]=accountdata.ID[i][cnt1];
accountdata.ID[i][cnt1]=accountdata.ID[i+1][cnt1];
accountdata.ID[i+1][cnt1]=swap1[cnt1];
}
for(int cnt2=0;cnt2<10;cnt2++)
{
swap2[cnt2]=accountdata.Username[i][cnt2];
accountdata.Username[i][cnt2]=accountdata.Username[i+1][cnt2];
accountdata.Username[i+1][cnt2]=swap2[cnt2];
}
s1=accountdata.income[i];
accountdata.income[i]=accountdata.income[i+1];
accountdata.income[i+1]=s1;
s2=accountdata.payment[i];
accountdata.payment[i]=accountdata.payment[i+1];
accountdata.payment[i+1]=s2;
}
}
output3();
}
void find()//查找用户名打印
{
printf("please input your target username\n");
char tarname[11];//设置数组来存放被查找用户名
int ret=0;//读取终止判断变量
while(getchar()!=10);//清空缓冲区
int i;
for(i=0;i<10 && ret!=10;i++)//循环读入目标用户名
{
scanf("%c",&tarname[i]);//
ret=(int)tarname[i];//
}
tarname[i-1]=0;
ret=0;
int jdg=1,equalnum;//设置判断变量jdg和搜索结果(原数组行下标)变量
for(int i=0;i<10;i++)//(行循环)一行代表一个用户名
{
for(int j=0;j<10;j++)//单个用户名比较
{
if(tarname[j]!=accountdata.Username[i][j])//如果不等于
{
jdg=0;/eg置为代表本次不匹配
break;
}
}//单个用户名比较结束
if(jdg==1)//如果本个用户名匹配
{
equalnum=i;//记录行下标
break;//跳出循环
}
}//匹配结束
if(jdg==1)//匹配就打印
{
printf("\nHere is the data:\n");
printf("ID:");
for(int j=0;j<5;j++)
{
printf("%c",accountdata.ID[equalnum][j]);
}
printf("\nUsername");
for(int j=0;j<10;j++)
{
printf("%c",accountdata.Username[equalnum][j]);
}
printf("\n");
printf("income:%d\n",accountdata.income[equalnum]);
printf("payment:%d\n",accountdata.payment[equalnum]);
}
else printf("not found!\n");//未找到输出
}
测试用例2:
输入:选择菜单项1:
请输入用户人数:5
10001 zero 6000 1500
10023 Aef 10000 3000
20011 eric001 20000 10000
20012 abcd 15000 0
30004 abc 8000 14000
测试用例9:
显示菜单
输入:选择菜单项7
输出:please input the file name:
输入:data.txt
输出:Save Successfule(同时检查文件中是否有正确内容)
测试用例10:
显示菜单
输入:选择菜单项8
输出:Please input the file name:
输入:test.txt
输出:Cannot find this file!
测试用例11:
显示菜单
输入:选择菜单项8
输出:Please input the file name:
输入:data.txt
输出:
ID UserName Income Expenses
10001 zero 6000 1500
10023 Aef 10000 3000
20011 eric001 20000 10000
20012 abcd 15000 0
30004 abc 8000 14000