#include
#include
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//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");//未找到输出
}
测试用例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
写入文件的函数
void WritetoFile() //将每个用户的记账系统写入文件
{
FILE *fp;
char buf[100], str[20], file_name[256] = {0};
printf("please input the file name:");
scanf("%s", file_name);
fp = fopen(file_name, "w");
if(fp == NULL)
{
return;
}
for(int i=0;i<usercnt;i++)
{
memset(buf, 0, sizeof(buf));
strcat(buf, accountdata.ID[i]);
strcat(buf, "\t");
strcat(buf, accountdata.Username[i]);
strcat(buf, "\t");
itoa(accountdata.income[i], str, 10);
strcat(buf, str);
strcat(buf, "\t");
itoa(accountdata.payment[i], str, 10);
strcat(buf, str);
strcat(buf, "\n");
fwrite(buf, 1, strlen(buf), fp);
}
fclose(fp);
printf("Save Successfule\n");
}
读取文件内容并显示的函数
void ReadFromFile() //读取文件中的记账信息并显示
{
FILE *fp;
char *buf, file_name[256] = {0};
int size, len, ret;
char *p;
char line[20][100];
int i, count = 0;
printf("Please input the file name:");
scanf("%s", file_name);
fp = fopen(file_name, "r");
if(fp == NULL)
{
printf("Cannot find this file!\n");
return;
}
fseek(fp, 0, SEEK_END);
size = ftell(fp);
fseek(fp, 0, SEEK_SET);
buf = (char *)malloc(size + 1);
memset(buf, 0, size + 1);
len = 0;
printf("ID\tUserName\tIncome\tExpenses\n");
while(!feof(fp))
{
ret = fread(buf, 1, size - len, fp);
if(ret <= 0)
{
break;
}
len += len;
}
// 第一种输出显示的方法,直接输出从文件中读取的内容
// printf("%s", buf);
// 第二种输出显示的方法,将文件内容按\n和\t分割,拆分每一行、每一列
p = strtok(buf, "\n");
while(p)
{
strcpy(line[count], p); // 保存一行数据
count++;
p = strtok(NULL, "\n");
}
for(i = 0; i < count; i++)
{
p = strtok(line[i], "\t");
while(p)
{
printf("%s", p); // 显示每一列数据
p = strtok(NULL, "\t");
if(p)
{
printf("\t");
}
}
printf("\n");
}
fclose(fp);
free(buf);
}
这是要问啥?
需求是什么,这个代码的作用,问题在哪(⊙o⊙)!