69,573
社区成员
发帖
与我相关
我的任务
分享
程序语言设计基础的课程设计【大哭】,C语言小白表示太难了,题目是会员卡计费系统,想问问有没有C语言大佬帮我解答一下疑问,我的消费总额和充值总额算不出来【大哭】,不知道是什么原因,代码如有雷同他人的,我就是借鉴的那个。
#include<stdio.h>
#include<string.h>
#include<time.h>//说明运用了一些用于处理时间和日期的类型和函数
#include<windows.h>//主要是含入文件
#define N 100
struct employee
{
int num;
char name[30];
char sex;
int age;
float wage;//充值金额
float balance;//余额
float xiao;//消费金额
float cost;//消费总金额
float money;//充值总金额
char addr[30];
char tel[12];
struct employee *next;
}em[100];//定义一个结构体
void menu();//定义菜单函数
void input();
void save(int);//把定义为全局变量值直接存入磁盘中
void display();//定义一个显示输出函数display
void del();//定义del函数,实现调用del实现删除操作
void add();//定义求和运算函数add
void search();//定义查询函数
void search_num();
void search_tel();
void modify();//定义了一个修改函数,定义各种函数
void menu()//菜单函数
{
printf("**************菜单管理****************\n");
printf("1.新会员登记\n");
printf("2.统计功能\n");
printf("3.会员消费结算\n");
printf("4.会员退卡\n");
printf("5.会员卡续费\n");
printf("6.会员信息修改\n");
printf("7.退出\n");
printf("********欢迎使用会员卡计费系统********\n");
printf("\n");
printf("\n");
}
int main()
{
int n,flag;
char a;
char* s1=NULL;
int b,j,flg=0;
menu();//调用菜单函数
{
printf("请选择你的需要操作的步骤(1--7):\n");
scanf("%d",&n);
if(n>=1&&n<=7)
{
flag=1;
}
else
{
flag=0;
printf("您输入有误!请重新进行选择!");
}
}
while(flag==0);
while(flag==1)
{
switch(n)
{
case 1:printf("---新会员登记---\n");printf("\n");input();break;
case 2:printf("---统计功能---\n");printf("\n");display();break;
case 3:printf("---会员消费结算---\n");printf("\n");search();break;
case 4:printf("---会员退卡---\n");printf("\n");del();break;
case 5:printf("---会员卡续费---\n");printf("\n");add();break;
case 6:printf("---会员信息修改---\n");printf("\n");modify();break;
case 7:exit(0);break;
dafault:break;
}
getchar();
printf("\n");
printf("是否继续进行(y or n):\n");
scanf("%c",&a);
if(a=='y')
{
flag=1;
system("cls");//清屏
menu();//调用菜单函数
printf("请再次选择你需要操作的步骤(1--6):\n");
scanf("%d",&n);
printf("\n");
}
else
exit(0);
}
}
void input()//录入函数
{
int i,m;
printf("请输入需要创建信息的会员人数(1--100):\n");
scanf("%d",&m);
for (i=0;i<m;i++)
{
printf("卡号为:");
srand((int)time(0));//使用系统时间来初始化,srand函数是随机数发生器的初始化函数
em[i].num=rand()%100+2000000;//rand函数可以用来产生随机数
if(em[i].num!=em[i-1].num)
printf("%8d",em[i].num);
printf("\n");
printf("请输入姓名:");
scanf("%s",em[i].name);
getchar();
printf("请输入性别(f--女 m--男):");
scanf("%c",&em[i].sex);
getchar();
printf("请输入年龄:");
scanf("%d",&em[i].age);
getchar();
printf("请输入充值金额:");
scanf("%f",&em[i].wage);
getchar();
printf("请输入家庭住址:");
scanf("%s",em[i].addr);
getchar();
printf("请输入电话号码:");
scanf("%s",&em[i].tel);
printf("\n");
}
printf("\n创建完毕!\n");
save(m);
}
void save(int m)//把m的全部变量存储起来
{
int i;
FILE*fp;
if((fp=fopen("employee_list","wb"))==NULL)//创建文件并判断是否能打开
{
printf("Can not open file\n");
exit(0);
}
for(i=0;i<m;i++)//将内存中会员的信息输出到磁盘文件中去
if(fwrite(&em[i],sizeof(struct employee),1,fp)!=1)//将em[i]中的一个数据写入文件中
printf("file write error\n");
fclose(fp);//关闭文件指针所指向的文件
}
int load()//将save保存的全部变量导入
{
FILE*fp;
int i=0;
if((fp=fopen("employee_list","rb"))==NULL)
{
printf("Can not file\n");
exit(0);
}
else
{
do
{
fread(&em[i],sizeof(struct employee),1,fp);//将一个数据项读到em[i]数组中
i++;
}
while(feof(fp)==0);//feof检测fp所指文件的读写指针是否结束
}
fclose(fp);
return(i-1);
}
float summ()//计算充值总额
{
int i;
int m=load();
float wage;
float summ=0;
for(i=0;i<m;i++)
{
summ+=em[i].wage;
}
em[i].money=summ;
return em[i].money;
}
float sumc()//计算消费总额
{
int i;
int m=load();
float cost;
float sumc=0;
for(i=0;i<m;i++)
{
sumc+=em[i].xiao;
}
em[i].cost=sumc;
return em[i].cost;
}
void display()//浏览函数
{
int i;
int m=load();
printf("\n 卡号 \t姓名\t 性别 \t年龄\t 充值金额\t消费金额\t家庭住址\t电话号码\n");
for(i=0;i<m;i++)//m为输入部分的会员人数
printf("\n %d %s\t %c\t %d\t %f\t %f\t %s\t %s\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].wage,em[i].xiao,em[i].addr,em[i].tel);
float summ();
float sumc();
printf("\n 消费总额为:%f\n",em[i].cost);
printf("\n 充值总额为:%f\n",em[i].money);
}
void del()//删除函数
{
int m=load();
int i,j,n,t,flag;
char name[30];
printf("\n原来会员信息:\n");
display();//调用浏览函数
printf("\n");
printf("请输入要删除的会员名字:\n");
scanf("%s",name);
for(flag=1,i=0;flag&&i<m;i++)
{
if(strcmp(em[i].name,name)==0)//strcmp为比较函数,若 em[i].name=name则返回0
{
printf("\n已找到此人!原始记录为:\n");
printf("\n卡号 姓名 性别 年龄 充值金额 余额\n");
printf("\n %d\t%s\t%c\t%d\t%f\t%f\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].wage,em[i].balance);
printf("\n确认要删除此人信息请按1,不删除请按0\n");
scanf("%d",&n);
if(n==1)//如果删除,则其他的信息都往上移一行
{
for(j=i;j<m-1;j++)
{
strcpy(em[j].name,em[j+1].name);//strcpy函数是对字符串进行拷贝
em[j].num=em[j+1].num;
em[j].sex=em[j+1].sex;
em[j].age=em[j+1].age;
em[j].wage=em[j+1].wage;
em[j].balance=em[j+1].balance;
}
flag=0;
}
}
}
if(!flag)
m=m-1;
else
printf("\n对不起,查无此人!\n");
printf("退回余额%.2f元!\n",em[i].balance);
printf("\n浏览后删除所有会员信息:\n");
save(m);//调用保存函数
display();//调用浏览函数
printf("\n继续删除请按1 不再删除请按0\n");
scanf("%d",&t);
switch(t)
{
case 1:del();break;
case 0:break;
}
}
void add()//添加函数
{
FILE*fp;
int num;
float t;
int i;
int m=load();
printf("\n 原来的会员信息:\n");
display();//调用浏览函数
printf("\n");
fp=fopen("emploee_list","a");
printf("请输入充值会员卡号:\n");
scanf("%d",&num);
for(i=0;i<m;i++)
if(num==em[i].num)
{
printf("\n已找到此人,其记录为:\n");
printf("\n卡号\t姓名\t充值金额\t余额\n");
printf("\n%d\t%s\t%f \t\t%f\n",em[i].num,em[i].name,em[i].wage,em[i].balance);
printf("请输入充值金额:\n");
scanf("%f",&t);
em[i].wage=em[i].wage+t;
printf("\n充值后金额:\t%f\n",em[i].wage);
printf("充值成功!\n");
}
}
void search()//查询函数,用于会员消费结算
{
int t,flag;
do
{
printf("按卡号查询请按1;按电话号码查询请按2,返回主菜单按3\n");
scanf("%f",&t);
if(t>=1&&t<=3)
{
flag=1;break;
}
else
{
flag=0;
printf("您输入有误,请重新选择!");
}
}
while(flag==0);
while(flag==1)
{
switch(t)
{
case 1:printf("按卡号查询\n");search_num();break;
case 2:printf("按电话号码查询\n");search_tel();break;
case 3:main();break;
default:break;
}
}
}
void search_num()//按卡号查询
{
int num;
int i;
float t;
int a;
int m=load();
printf("请输入要查找的卡号(2000001--2000100):\n");
scanf("%d",&num);
for (i=0;i<m;i++)
if(num==em[i].num)
{
printf("\n已找到此人,其记录为:\n");
printf("\n 卡号\t 姓名 \t性别\t年龄 \t充值金额 \t电话\n");
printf("\n%d\t%s\t%c\t%d\t %f\t %s\t\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].wage,em[i].tel);
printf("此次消费为:\n");
scanf("%f",&em[i].xiao);
if(em[i].xiao>=1000)
{
printf("恭喜你已经升级为VIP会员,本次消费享受9折优惠!");
em[i].xiao=em[i].xiao*0.9;
printf("本次实际消费%.2f元!",em[i].xiao*0.9);
}
if(em[i].balance<em[i].xiao)
printf("对不起,您的余额不足,请及时充值!");
else
{
printf("结算成功!");
em[i].balance=em[i].wage-em[i].xiao;
printf("\n 卡号\t 姓名 \t性别\t年龄 \t充值金额 \t消费金额 余额\t电话\n");
printf("\n%d\t %s\t%c\t%d\t %f\t %f\t %f\t %s\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].wage,em[i].xiao,em[i].balance,em[i].tel);
break;
}
}
if(i==m)
printf("对不起,查无此人!\n");
printf("返回查询请按1,继续查询卡号请按2\n");
scanf("%d",&a);
switch(a)
{
case 1:search();break;
case 2:break;
default:break;
}
}
void search_tel()//按电话号码查询
{
char tel[12];
int i,t;
int m=load();
printf("请输入要查询的电话号码:\n");
scanf("%s",&tel);
for(i=0;i<m;i++)
if(tel==em[i].tel)
{
printf("已查找到此人,其记录为:\n");
printf("\n 卡号\t 姓名 \t性别\t年龄 \t充值金额 \t电话\n");
printf("\n%d\t %s\t%c\t%d\t %f\t %s\t\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].wage,em[i]);
printf("此次消费为:\n");
scanf("%f",&em[i].xiao);
if(em[i].xiao>=1000)
{
printf("恭喜你已经升级为VIP会员,本次消费享受9折优惠!");
em[i].xiao=em[i].xiao*0.9;
printf("本次实际消费%.2f元!",em[i].xiao*0.9);
}
if(em[i].balance<em[i].xiao)
printf("对不起,您的余额不足,请及时充值!");
else
{
printf("结算成功!");
em[i].balance=em[i].wage-em[i].xiao;
printf("\n 卡号\t 姓名 \t性别\t年龄 \t充值金额 \t消费金额 余额\t电话\n");
printf("\n%d\t %s\t%c\t%d\t %f\t %f\t %f\t %s\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].wage,em[i].xiao,em[i].balance,em[i].tel);
break;
}
}
if(i==m)
printf("对不起,查无此人!\n");
printf("返回查询请按1,继续查询电话号码请按2\n");
scanf("%f",&t);
switch(t)
{
case 1:search();break;
case 2:break;
default:break;
}
}
void modify()//修改函数
{
int num;
char name[30];
char sex;
int age;
float wage;
char addr[30];
char tel[12];
int i,t,n,b,c,flag;
int m=load();//导入文件内的信息
printf("\n 原来会员信息:\n");
display();//调用浏览函数
printf("\n");
printf("请输入要修改的会员的姓名:\n");
scanf("%s",name);
for(flag=1,i=0;flag&&i<m;i++)
{
if(strcmp(em[i].name,name)==0)//比较两值是否相等
{
printf("\n已找到此人,原始记录为:\n");
printf("\n 卡号 姓名 \t性别\t年龄 \t充值金额 余额\t 家庭住址 \t电话\n");
printf("\n%d %s\t%c\t%d \t%f\t %f \t%s\t %s\t\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].wage,em[i].balance,em[i].addr,em[i].tel);
printf("\n确认要修改此人信息请按1,不修改请按2!\n");
scanf("%d",&n);
if(n==1)
{
printf("\n需要进行修改的选项:\n 1.卡号 2.姓名 3.性别 4.年龄 5.充值金额 6. 家庭住址 7.电话");
scanf("%d",&c);
if(c>8||c<1)
printf("\n选择错误,请重新选择!\n");
}
flag=0;
}
}
if(flag==1)
printf("\n对不起,查无此人!\n");
do
{
switch(c)//因为当找到第i个会员时,for语句后i自加了,所以下面的应该把改后的信息赋值给第i-1个
{
case 1:printf("卡号改为:");
scanf("%d",&num);
em[i-1].num=num;break;
case 2:printf("姓名改为:");
scanf("%s",name);
strcpy(em[i-1].name,name);break;
case 3:printf("性别改为:");
getchar();
scanf("%c",&sex);
em[i-1].sex=sex;break;
case 4:printf("年龄改为:");
scanf("%d",&age);
em[i-1].age=age;break;
case 5:printf("充值金额改为:");
scanf("%f",&wage);
em[i-1].wage=wage;break;
case 6:printf("家庭住址改为:");
scanf("%s",&addr);
strcpy(em[i-1].addr,addr );break;
case 7:printf("电话号码改为:");
scanf("%s",&tel);
strcpy(em[i-1].tel,tel);break;
}
printf("\n");
printf("\n是否确定所修改的信息,是请按1;不,重新修改请按2:\n");
scanf("%d",&b);
}
while(b==2);
printf("\n浏览修改后的所有会员信息:\n");
printf("\n");
save(m);
display();
printf("\n继续修改请按1,不再修改请按2\n");scanf("%d",&t);
switch(t)
{
case 1:modify();break;
case 2:break;
default:break;
}
getchar();
}
加油,继续努力!!
你add()函数里打开文件进行追加时(fp=fopen(“emploee_list”,“a”);),文件名有拼写错误。它应该是“employee_list”,
建议使用charGPT
希望有大佬能为我解答,急!