c语言编程题及答案?‖c语言怎么用
大家好,今天给各位分享c语言编程题及答案的一些知识,其中也会对‖c语言怎么用进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
c语言编程题
对于这种类似于OJ的问题,输入和输出不能含有多余的字符,否则提交就会不通过,要严格按照题目要求进行输入和输出。
第一题分析:这题求平均值,题目没有结束输入的条件(标记),该条件一般有多种形式,例如可以输入某个值结束输入(例如-1),或者先输入一个n,然后再用循环输入n个数。在这里就使用输入-1结束输入来编写代码。
整个题目的思路还是比较清晰。
先求全班人数和平均值,再求高的人数和平均值,再求低的人数和平均值。
这里需要注意最后一行的提示,如果平均值是一个整数,应该输出一个整数,例如平均值为 98.00,则应该输出 98,否则保留两位小数输出。
细节方面就是输入数据的问题。例如如果输入-1,则人数、平均值全为 0。如果输入的分数都相同,则所有人都大于或等于全部平均分,此时低于全班平均分的人数为 0,根据求平均值公式(平均分=总分÷人数),此时出现除数为 0的情况。
第一题求解过程:声明一个数组(整型、浮点型都行)用来保存输入的分数。
在输入分数的同时可以累计班级总分和班级人数。
根据班级总分和班级人数求班级平均分。
再循环遍历数组,把高于平均分或低于平均分和相应的人数和分数统计出来。
再求出这两批的平均分。
最后输出数据。
第一题测试代码
第一题测试结果
第一题测试代码:#include<stdio.h>
int main()
{
int a[1000]={0}, L= 0, mid= 0, R= 0;
float sum= 0, Lsum= 0, Rsum= 0;
float Laver= 0, aver= 0, Raver= 0;
while(a[mid]!=-1)
{
sum+= a[mid];
scanf("%d",&a[++mid]);
}
if(mid> 1) aver= sum/--mid;
else--mid;
for(int i= 1; i<= mid; i++)
{
if(a[i]< aver)
{
R++;
Rsum+= a[i];
}
}
Lsum= sum- Rsum;
L= mid- R;
if(L> 0) Laver= Lsum/ L;
if(R> 0) Raver= Rsum/ R;
printf("%d", mid);
if(aver==(int)aver) printf("%.f
", aver);
else printf("%.2f
", aver);
printf("%d", L);
if(Laver==(int)Laver) printf("%.f
", Laver);
else printf("%.2f
", Laver);
printf("%d", R);
if(Raver==(int)Raver) printf("%.f
", Raver);
else printf("%.2f
", Raver);
return 0;
}
第二题分析:这题可以完全用数学来解决。能用数学解决的,最好用数学来解决,运行速度快。
变量a表示 0~ 6,也代表星期一~星期日。
变量n是后面的有n天。
a+ 1+n,其实就是总的天数,除以 7的结果就是有多少周,1周有一个星期五,所以除以 7的结果就是能上机的次数。但是考虑到有余数的问题,如果余数是 5或 6,说明还有一次上机的机会。
第二题运算过程:声明变量和输入数据。
int sum= a+ 1+ n求得总的天数。
int cnt= sum/ 7求得上机的次数。
if(sum% 7>= 5) cnt++,求是否还有一次上机的机会。
输出结果。
第二题测试结果
第二题测试代码:
#include<stdio.h>
int main()
{
int a, n;
scanf("%d%d",&a,&n);
int sum= a+ 1+ n;
int cnt= sum/ 7;
if(sum% 7>= 5) cnt++;
printf("%d", cnt);
return 0;
}
急求c语言编程题目
早上看到问题需求,中午用休息时间刚好大半代码,发现问题居然已经采纳了。。。
代码完成了。测试过了。直接运行。
滚轮实现动态,三角型指针沿着滚盘数字转动,随机停在一个数字上,如果和之前下注的数值一致就是猜中,反之没猜中
你提出的所有功能都实现了,太多了,我截图列举几个说明一下,其它你自己看吧。
是可以猜中!!可以猜中!!,我第一次2轮就中,忘记截图了。1/36的概率能猜中,有耐心慢慢试,记得充值!
后台还有很多功能,但必须用管理员账户才能进入:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<conio.h>
#include<time.h>
#definemaxMShow10//最大下注金额显示字符数,修改该值需要同步修改showDisc函数的格式参数!
typedefstructuser
{
charuName[21];
charpsw[21];
intmoney;//余额
intpay;//历史消费
intwin;//历史赢钱
inttype;//用户类型->0:管理员;1:普通玩家
structuser*next;
}USER;
typedefstructdisc//圆盘数字
{
charflag;//数字前标识
intnum;//圆盘数字
intmoney;//对应下注金额
charmStr[maxMShow+1];//下注金额字符串形式,为了排面整齐,最多显示10个字节
structdisc*next;
}DISC;
voidmeError(void*p);//内存申请失败
DISC*init();//初始化圆盘,生成链表头指针
voidshowDisc(DISC*discHead,USER*logUser);//显示圆盘
DISC*bets(DISC*discHead,USER*user);//下注,成功返回下注节点,失败返回NULL。参数:user:下注人ID;
intregUser(USER**userHead,USER**userTail,char*uName,char*psw,intmoney,inttype);//注册用户,成功返回1,失败返回0。参数:uName:用户名。psw:密码。money:开户金额。type:用户类型0管理员1普通用户
USER*login(USER*userHead,char*uName,char*psw);//登录。登录成功返回用户节点,失败返回NULL
intrecharge(USER*logUser);//充值,成功返回1,失败返回0
voidshowMenu1(DISC*discHead,USER**userHead,USER**userTail);//显示一级菜单
voidshowMenu2(DISC*discHead,USER*logUser,USER*userHead);//显示二级菜单
voidshowMenu3(DISC*discHead,USER*logUser,USER*userHead);//显示三级菜单
introll(DISC*discHead,USER*logUser);//滚动转盘,猜中增加奖金,猜中返回1,没猜中返回0。参数:num=猜的数字,money=下的注
voidreDisc(DISC*discHead);//重置转盘,每次滚动后调用
voidshowUser(USER*userHead,char*uName);//查看指定玩家账户,参数uName传NULL,查看所有玩家账户
voidshowProfit(USER*userHead);//统计赌场盈利状况;
intmain()
{
DISC*discHead=NULL;
USER*userHead=NULL,*userTail=NULL;
srand(time(NULL));
discHead=init();
showMenu1(discHead,&userHead,&userTail);
return0;
}
voidshowMenu1(DISC*discHead,USER**userHead,USER**userTail)//显示一级菜单
{
USER*logUser=NULL;
charuName[21]={0},psw[21]={0};
intn,money=0,type;
while(1)
{
n=0;
memset(uName,0,21);
memset(psw,0,21);
money=0;
type=-1;
system("cls");
printf("1、用户登录
2、用户注册
");
scanf("%d",&n);
if(n==1)
{
system("cls");
printf("请输入ID名:"),scanf("%s",uName);
printf("请输入密码:"),scanf("%s",psw);
logUser=login(*userHead,uName,psw);
if(logUser)
showMenu2(discHead,logUser,*userHead);
}
if(n==2)
{
system("cls");
printf("请输入注册的ID名:"),scanf("%s",uName);
printf("请输入注册的密码:"),scanf("%s",psw);
printf("请输入开户的金额(必须大于0):");
while(!money)
scanf("%d",&money);
printf("请选择要注册的用户类型(0=管理员;1=普通用户):");
while(type!=0&&type!=1)
scanf("%d",&type);
regUser(userHead,userTail,uName,psw,money,type);
}
}
}
voidshowMenu2(DISC*discHead,USER*logUser,USER*userHead)//显示二级菜单
{
intn;
DISC*disc=NULL;
while(1)
{
n=0;
system("cls");
printf("欢迎登录:%s,余额:%d
",logUser->uName,logUser->money);
printf("1、开始转盘
2、账户充值
3、返回上级菜单
4、后台管理
");
scanf("%d",&n);
if(n==1)
{
showDisc(discHead,logUser);
disc=bets(discHead,logUser);
if(disc)
showDisc(discHead,logUser);
printf("任意键开始滚动圆盘。。。
");
getch();
roll(discHead,logUser);
}
if(n==2)
system("cls"),recharge(logUser);
if(n==3)
break;
if(n==4)
{
system("cls");
if(logUser->type!=0)
printf("对不起!您不是管理员,没有该权限!
按任意键继续。。。
"),getch(),getch();
else
showMenu3(discHead,logUser,userHead);//后台管理
}
}
}
voidshowMenu3(DISC*discHead,USER*logUser,USER*userHead)//显示三级菜单
{
intn;
charuName[21]={0};
while(1)
{
n=0;
system("cls");
printf("1、查看指定玩家
2、查看所有玩家
3、查看赌场盈利状况
4、返回上级菜单
");
scanf("%d",&n);
if(n==1)
{
printf("请输入要查找的玩家ID:"),scanf("%s",uName);
showUser(userHead,uName);
}
if(n==2)
showUser(userHead,NULL);
if(n==3)
showProfit(userHead);
if(n==4)
break;
}
}
voidshowProfit(USER*userHead)//统计赌场盈利状况
{
intsumPay=0,sumWin=0;
system("cls");
while(userHead->next)
{
sumPay+=userHead->next->pay;
sumWin+=userHead->next->win;
userHead=userHead->next;
}
printf("玩家共下注%d元,获胜者得到%d元,赌场总获利%d元
按任意键继续。。。
",sumPay,sumWin,sumPay-sumWin),getch();
}
voidshowUser(USER*userHead,char*uName)//查看指定玩家账户,参数uName传NULL,查看所有玩家账户
{
system("cls");
while(userHead->next)
{
if((uName&&strcmp(userHead->next->uName,uName)==0)||!uName)
{
printf("ID:%s,总下注金额%d,总获胜金额%d,当前余额%d
",userHead->next->uName,userHead->next->pay,userHead->next->win,userHead->next->money);
if(uName)
break;
}
userHead=userHead->next;
}
printf("按任意键继续。。。
"),getch();
}
USER*login(USER*userHead,char*uName,char*psw)//登录。登录成功返回用户节点,失败返回NULL
{
if(!userHead)
{
printf("错误!无可匹配数据,请先注册!
按任意键继续。。。
");
getch();
returnNULL;
}
while(userHead->next)
{
if(!strcmp(userHead->next->uName,uName)&&!strcmp(userHead->next->psw,psw))
returnuserHead->next;
userHead=userHead->next;
}
printf("用户不存在或密码输入错误!
按任意键继续。。。
");
getch();
returnNULL;
}
intrecharge(USER*logUser)//充值,成功返回1,失败返回0
{
intmoney=-1;
if(!logUser)
return0;
while(money<0)
printf("输入要充值的金额(输入0返回主菜单):"),scanf("%d",&money);
logUser->money+=money;
return1;
}
intregUser(USER**userHead,USER**userTail,char*uName,char*psw,intmoney,inttype)//注册用户,成功返回1,失败返回0。参数:uName:用户名。psw:密码。money:开户金额
{
USER*user=NULL,*userNew=NULL;
if(!*userHead)
*userHead=(USER*)malloc(sizeof(USER)),(*userHead)->next=NULL,meError(*userHead);
user=*userHead;
while(user->next)
{
if(strcmp(user->next->uName,uName)==0)
{
printf("用户名已存在!请重新输入。
按任意键继续。。。
");
getch();
return0;
}
user=user->next;
}
userNew=(USER*)malloc(sizeof(USER));
meError(userHead);
userNew->money=money;
userNew->pay=0;
userNew->win=0;
userNew->uName[0]=0;
userNew->psw[0]=0;
userNew->type=type;
strcpy(userNew->uName,uName);
strcpy(userNew->psw,psw);
userNew->next=NULL;
if(!((*userHead)->next))
(*userHead)->next=userNew;
else
(*userTail)->next=userNew;
*userTail=userNew;
printf("%s:%s注册成功!
按任意键继续。。。
",type?"普通用户":"管理员",uName);
getch();
return1;
}
DISC*init()
{
inti;
DISC*discHead=(DISC*)malloc(sizeof(DISC)),*discNew=NULL,*discTail=NULL;
meError(discHead);
discHead->next=NULL;
for(i=1;i<=36;i++)
{
discNew=(DISC*)malloc(sizeof(DISC));
meError(discNew);
discNew->flag='';
discNew->money=0;
discNew->num=i;
discNew->next=NULL;
if(!(discHead->next))
discHead->next=discNew;
else
discTail->next=discNew;
discTail=discNew;
}
returndiscHead;
}
voidreDisc(DISC*discHead)//重置转盘,每次滚动后调用
{
while(discHead->next)
{
discHead->next->flag='';
discHead->next->money=0;
memset(discHead->next->mStr,0,sizeof(discHead->next));
discHead=discHead->next;
}
}
introll(DISC*discHead,USER*logUser)//滚动转盘,猜中增加奖金,猜中返回1,没猜中返回0。参数:num=猜的数字,money=下的注
{
DISC*discHeadSave=discHead;
inti,rnum=0,win,flag;
while(1)
{
discHead->next->flag=16;
showDisc(discHeadSave,logUser);
rnum=rand()%36+1;
if(rnum==discHead->next->num)
break;
for(i=0;i<2000;i++);
discHead->next->flag='';
if(discHead->next->next)
discHead=discHead->next;
else
discHead=discHeadSave;
}
if(discHead->next->money>0)//如果随机滚到的数字有下注
{
win=discHead->next->money*5;
logUser->money+=win;
logUser->win+=win;
printf("恭喜猜中了,返还5倍!您获得了%d元。
",win);
flag=1;
}
else
{
printf("对不起!本次没有猜中,再接再厉。
");
flag=0;
}
reDisc(discHeadSave);
printf("按任意键继续。。。
");
getch();
returnflag;
}
DISC*bets(DISC*discHead,USER*user)//下注
{
intmoney=0,num=-1;
DISC*disc=NULL;
while(num<1||num>36)
printf("请输入要下注的数字:"),scanf("%d",&num);
while(!money)
printf("请输入要下注的金额(不超过余额且大于0):"),scanf("%d",&money);
if(money>user->money)
{
printf("对不起,您的余额不足,请充值或重新下注!
按任意键继续。。。
");
getch();
returnNULL;
}
user->money-=money;
user->pay+=money;
while(discHead->next)
{
if(discHead->next->num==num)
{
disc=discHead->next;
break;
}
discHead=discHead->next;
}
disc->money=money;
sprintf(disc->mStr,"%d",disc->money);
returndisc;
}
voidshowDisc(DISC*discHead,USER*logUser)
{
intclo=0;
system("cls");
printf("当前玩家:%s,余额:%d
",logUser->uName,logUser->money);
while(discHead->next)
{
printf("%c%2d%2s%-10s",discHead->next->flag,discHead->next->num,
discHead->next->money?"<-":"",discHead->next->money?discHead->next->mStr:"");//如要修改显示下注金额最大位数,这里%10d要改!!!
clo++;
if(clo==3)
clo=0,printf("
");
discHead=discHead->next;
}
}
voidmeError(void*p)//内存申请失败
{
if(p==NULL)
{
printf("异常:内存申请失败!回车结束程序!
");
while(getch()!='
');
exit(0);
}
}
C语言编程题 求解
按照题意,表格使用结构链表实现。其中成员班级或工龄,使用自定义的联合体union(就是题目要求的共用体)。
函数异常不做处理,直接抛出,你需要可以在调用时判断处理异常。
#include<stdio.h>
#include<malloc.h>
typedef union info4
{
char cName[10];//班级名称
int wAge;//工龄
}IO4;
typedef struct stInfo
{
int id;//编号
char name[10];//姓名
int pType;//职业类别:0表示学生,1表示教师
IO4 cwInfo;//对应职业类别的班级或工龄
struct stInfo*next;
}STINFO;
int inputInfo(STINFO**stHead,STINFO**stTail);//输入,调用一次输入一条信息,并生成或加入链表,成功返回1,失败返回0
void prfInfos(STINFO*stHead);//打印链表
int main()
{
STINFO*stHead=NULL,*stTail=NULL;
int n=4;//测试就输入4个,需要自己改
while(n--)
if(!inputInfo(&stHead,&stTail))
{
printf("异常终止!
");
return 1;
}
prfInfos(stHead);
return 0;
}
void prfInfos(STINFO*stHead)//打印链表
{
printf("编号姓名职业班级\\工龄
");
while(stHead->next)
{
printf("%d%9s%s",stHead->next->id,stHead->next->name,stHead->next->pType?"教师":"学生");
if(stHead->next->pType)
printf("%9d
",stHead->next->cwInfo.wAge);
else
printf("%9s
",stHead->next->cwInfo.cName);
stHead=stHead->next;
}
}
int inputInfo(STINFO**stHead,STINFO**stTail)//输入,调用一次输入一条信息,并生成或加入链表,成功返回1,失败返回0
{
static int id=1;
STINFO*head=*stHead,*tail=*stTail,*stNew=NULL;
stNew=(STINFO*)malloc(sizeof(STINFO));
stNew->pType=-1;
stNew->next=NULL;
if(!stNew)//抛出异常
return 0;
stNew->id=id++;
printf("请输入姓名:"),scanf("%9s",stNew->name);
if(getchar()!='
')//抛出异常
return 0;
while(stNew->pType<0|| stNew->pType>1)
printf("请输入职业编号(0:学生,1:教师):"),scanf("%d",&stNew->pType);
switch(stNew->pType)
{
case 0:printf("请输入学生所在班级名称:");
scanf("%9s",stNew->cwInfo.cName);
if(getchar()!='
')//抛出异常
return 0;
break;
case 1:printf("请输入教师的工龄:"),scanf("%d",&stNew->cwInfo.wAge);break;
}
if(head==NULL)
head=(STINFO*)malloc(sizeof(STINFO)),head->next=NULL;
if(head->next==NULL)
head->next=stNew;
else
tail->next=stNew;
tail=stNew;
*stHead=head,*stTail=tail;
return 1;
}
OK,本文到此结束,希望对大家有所帮助。