急求c语言编程题目
#includeint main(){int i,n=0,s=1; printf("Input days:
"); scanf("%d",&n); if(n<=0)return 0; for(;--n;) s=(s+1)*2; printf("x=%d",s); return 0;}
DFA 引擎在线性时状态下执行,因为它们不要求回溯(并因此它们永远不测试相同的字符两次)。DFA 引擎还可以确保匹配最长的可能的字符串。但是,因为 DFA 引擎只包含有限的状态,所以它不能匹配具有反向引用的模式;并且因为它不构造显示扩展,所以它不可以捕获子表达式。
传统的 NFA 引擎运行所谓的“贪婪的”匹配回溯算法,以指定顺序测试正则表达式的所有可能的扩展并接受第一个匹配项。因为传统的 NFA 构造正则表达式的特定扩展以获得成功的匹配,所以它可以捕获子表达式匹配和匹配的反向引用。但是,因为传统的 NFA 回溯,所以它可以访问完全相同的状态多次(如果通过不同的路径到达该状态)。因此,在最坏情况下,它的执行速度可能非常慢。因为传统的 NFA 接受它找到的第一个匹配,所以它还可能会导致其他(可能更长)匹配未被发现。
POSIX NFA 引擎与传统的 NFA 引擎类似,不同的一点在于:在它们可以确保已找到了可能的最长的匹配之前,它们将继续回溯。因此,POSIX NFA 引擎的速度慢于传统的 NFA 引擎;并且在使用 POSIX NFA 时,您恐怕不会愿意在更改回溯搜索的顺序的情况下来支持较短的匹配搜索,而非较长的匹配搜索。
使用DFA引擎的程序主要有:awk,egrep,flex,lex,MySQL,Procmail等;
使用传统型NFA引擎的程序主要有:GNU Emacs,Java,ergp,less,more,.NET语言,PCRE library,Perl,PHP,Python,Ruby,sed,vi;
使用POSIX NFA引擎的程序主要有:mawk,Mortice Kern Systems’ utilities,GNU Emacs(使用时可以明确指定);
也有使用DFA/NFA混合的引擎:GNU awk,GNU grep/egrep,Tcl。
举例简单说明NFA与DFA工作的区别:
比如有字符串this is yansen’s blog,正则表达式为 /ya(msen|nsen|nsem)/ (不要在乎表达式怎么样,这里只是为了说明引擎间的工作区别)。 NFA工作方式如下,先在字符串中查找 y 然后匹配其后是否为 a ,如果是 a 则继续,查找其后是否为 m 如果不是则匹配其后是否为 n (此时淘汰msen选择支)。然后继续看其后是否依次为 s,e,接着测试是否为 n ,是 n 则匹配成功,不是则测试是否为 m 。为什么是 m ?因为 NFA 工作方式是以正则表达式为标准,反复测试字符串,这样同样一个字符串有可能被反复测试了很多次!
而DFA则不是如此,DFA会从 this 中 t 开始依次查找 y,定位到 y ,已知其后为a,则查看表达式是否有 a ,此处正好有a 。然后字符串a 后为n ,DFA依次测试表达式,此时 msen 不符合要求淘汰。nsen 和 nsem 符合要求,然后DFA依次检查字符串,检测到sen 中的 n 时只有nsen 分支符合,则匹配成功!
由此可以看出来,两种引擎的工作方式完全不同,一个(NFA)以表达式为主导,一个(DFA)以文本为主导!一般而论,DFA引擎则搜索更快一些!但是NFA以表达式为主导,反而更容易操纵,因此一般程序员更偏爱NFA引擎! 两种引擎各有所长,而真正的引用则取决与你的需要以及所使用的语言!
早上看到问题需求,中午用休息时间刚好大半代码,发现问题居然已经采纳了。。。
代码完成了。测试过了。直接运行。
滚轮实现动态,三角型指针沿着滚盘数字转动,随机停在一个数字上,如果和之前下注的数值一致就是猜中,反之没猜中
你提出的所有功能都实现了,太多了,我截图列举几个说明一下,其它你自己看吧。
是可以猜中!!可以猜中!!,我第一次2轮就中,忘记截图了。1/36的概率能猜中,有耐心慢慢试,记得充值!
后台还有很多功能,但必须用管理员账户才能进入:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <conio.h>
#include <time.h>
#define maxMShow 10//最大下注金额显示字符数,修改该值需要同步修改showDisc函数的格式参数!
typedef struct user
{
char uName[21];
char psw[21];
int money;//余额
int pay;//历史消费
int win;//历史赢钱
int type;//用户类型->0: 管理员;1:普通玩家
struct user *next;
}USER;
typedef struct disc//圆盘数字
{
char flag;//数字前标识
int num;//圆盘数字
int money;//对应下注金额
char mStr[maxMShow+1];//下注金额字符串形式,为了排面整齐,最多显示10个字节
struct disc *next;
}DISC;
void meError(void *p);//内存申请失败
DISC *init();//初始化圆盘,生成链表头指针
void showDisc(DISC *discHead,USER *logUser);//显示圆盘
DISC *bets(DISC *discHead,USER *user);//下注,成功返回下注节点,失败返回NULL。参数:user:下注人ID;
int regUser(USER **userHead,USER **userTail,char *uName,char *psw,int money,int type);//注册用户,成功返回1,失败返回0。参数:uName:用户名。psw:密码。money:开户金额。type:用户类型0管理员1普通用户
USER * login(USER *userHead,char *uName,char *psw);//登录。登录成功返回用户节点,失败返回NULL
int recharge(USER *logUser);//充值,成功返回1,失败返回0
void showMenu1(DISC *discHead,USER **userHead,USER **userTail);//显示一级菜单
void showMenu2(DISC * discHead,USER *logUser,USER *userHead);//显示二级菜单
void showMenu3(DISC * discHead,USER *logUser,USER *userHead);//显示三级菜单
int roll(DISC *discHead,USER *logUser);//滚动转盘,猜中增加奖金,猜中返回1,没猜中返回0。参数:num=猜的数字,money=下的注
void reDisc(DISC *discHead);//重置转盘,每次滚动后调用
void showUser(USER *userHead,char *uName);//查看指定玩家账户,参数uName传NULL,查看所有玩家账户
void showProfit(USER *userHead);//统计赌场盈利状况;
int main()
{
DISC *discHead=NULL;
USER *userHead=NULL,*userTail=NULL;
srand(time(NULL));
discHead=init();
showMenu1(discHead,&userHead,&userTail);
return 0;
}
void showMenu1(DISC *discHead,USER **userHead,USER **userTail)//显示一级菜单
{
USER *logUser=NULL;
char uName[21]={0},psw[21]={0};
int n,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);
}
}
}
void showMenu2(DISC *discHead,USER *logUser,USER *userHead)//显示二级菜单
{
int n;
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);//后台管理
}
}
}
void showMenu3(DISC * discHead,USER *logUser,USER *userHead)//显示三级菜单
{
int n;
char uName[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;
}
}
void showProfit(USER *userHead)//统计赌场盈利状况
{
int sumPay=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();
}
void showUser(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();
return NULL;
}
while(userHead->next)
{
if(!strcmp(userHead->next->uName,uName) && !strcmp(userHead->next->psw,psw))
return userHead->next;
userHead=userHead->next;
}
printf("用户不存在或密码输入错误!
按任意键继续。。。
");
getch();
return NULL;
}
int recharge(USER *logUser)//充值,成功返回1,失败返回0
{
int money=-1;
if(!logUser)
return 0;
while(money<0)
printf("输入要充值的金额(输入0返回主菜单):"),scanf("%d",&money);
logUser->money+=money;
return 1;
}
int regUser(USER **userHead,USER **userTail,char *uName,char *psw,int money,int type)//注册用户,成功返回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();
return 0;
}
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();
return 1;
}
DISC *init()
{
int i;
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;
}
return discHead;
}
void reDisc(DISC *discHead)//重置转盘,每次滚动后调用
{
while(discHead->next)
{
discHead->next->flag=' ';
discHead->next->money=0;
memset(discHead->next->mStr,0,sizeof(discHead->next));
discHead=discHead->next;
}
}
int roll(DISC *discHead,USER *logUser)//滚动转盘,猜中增加奖金,猜中返回1,没猜中返回0。参数:num=猜的数字,money=下的注
{
DISC *discHeadSave=discHead;
int i,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();
return flag;
}
DISC *bets(DISC *discHead,USER *user)//下注
{
int money=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();
return NULL;
}
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);
return disc;
}
void showDisc(DISC *discHead,USER *logUser)
{
int clo=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;
}
}
void meError(void *p)//内存申请失败
{
if(p==NULL)
{
printf("异常:内存申请失败!回车结束程序!
");
while(getch()!='');
exit(0);
}
}
rand()函数是按指定的顺序来产生整数,因此每次执行上面的语句都打印相同的两个值,所以说C语言的随机并不是真正意义上的随机,有时候也叫伪随机数,使用 rand() 生成随机数之前需要用随机发生器的初始化函数 srand(unsigned seed)(也位于 stdlib.h 中) 进行伪随机数序列初始化,seed 又叫随机种子,通俗讲就是,如果每次提供的 seed 是一样的话,最后每一轮生成的几个随机值也都是一样的,因此叫伪随机数,所以需要每次提供不同的 seed 达到完全的随机,我们通常用时间函数 time(NULL) 作为 seed ,因为时间值每秒都不同,这个函数需要包含以下头文件:
#include <time.h>
1
理论太泛,下面用例子分析理解。
举例分析
先来理解以下伪随机数,编译以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(1);
int i;
for (i = 0; i < 10; i++)
printf("%d, ", rand()%11);
}
1
2
3
4
5
6
7
8
9
10
运行结果
8, 9, 9, 1, 7, 5, 5, 10, 1, 0,
可以的这个
666
44444
C语言编程题目
下面是一些C编程题目:1. 编写程序,从键盘输入两个整数,输出它们的和、差、积、商、余数。2. 编写程序,从键盘输入三角形的三条边长,判断它们是否可以构成三角形,并输出三角形的类型(等边、等腰、一般)。3. 编写程序,从键盘输入字符串,统计其中的大写字母、小写字母、数字和其他字符的个数,并...
c语言编程题目求解
printf("学生的成绩等级为C\\n");}else if(score>=60 && score<=69){ printf("学生的成绩等级为D\\n");}else if(score>=0 && score<=59){ printf("学生的成绩等级为E\\n");}else{ printf("输入的成绩不合法\\n");} return 0;} 使用switch多分支结构:c include<stdio.h> int main(...
C语言编程序,求100以内能被8整除的数,并求出它们的和。
以下是一个求解 100 以内能被 8 整除的数,并求它们的和的程序示例:```c include <stdio.h> int main() { int sum = 0;printf("100以内能被8整除的数有:");for(int i = 1; i <= 100; i++) { if(i % 8 == 0) { printf("%d ", i);sum += i;} } printf("它们的...
C语言编程作业,求解答
作业1:result(int)= c (char) * i (int) + f (float) \/ d (double) -(f + i);第一步:f+i, 一个float和int相加,按精度高的float进行计算,结果为float result = char * int + float\/double - float;第二步:char * int, 他们都是整数相加为int result =int + float\/double...
C语言题目求编程:已知梯形的上底a=2,下底b=6,高h=3.6,求梯形的面积
2. 其次,我们确保了代码的时态一致性,将`main`函数中的`int a=2,b=6;`改为`int a=2, b=6;`,以符合C语言的语法规则。3. 接下来,我们保留了原有代码的功能,计算梯形面积的公式为`(a+b)*h\/2`,此处应用了基本的算术运算和格式化输出。4. 最后,我们通过`printf`函数输出梯形的面积,...
用c语言编程---求100以内的奇数和?
1、解析题目首先,我们知道100以内的奇数为1、3、7……97、99,即从1开始依次增加2。本题要求的是奇数和,即为sum=1+3+7+……+97+99 将变量i从1开始,依次赋值每一个奇数,直到不符合条件(i<=100),即到i=99停止循环。将每一个i值依次累加,求得的和即为题目所求奇数和。2、设计程序...
C语言编程问题求解答
9题:include <stdio.h>int main(){int N=1;scanf("%d",&N);if(N<=0){N=1;}int numSpaceFirst=N-1;for(int row=0; row<N; row++,numSpaceFirst--){for(int i=0; i<numSpaceFirst; i++){printf(" ");}for(int i=0; i<2*row-1; i++){printf("*");}printf("\\n...
C语言编程 1:输入一行字符,求其中数字,英文字母,空格,其他字符的个数...
int main(){int i,sz=0,zm=0,kg=0,qt=0;char s[200];gets(s);for(i=0;s[i];i++)if(s[i]>='0'&&s[i]<='9')sz++;else if(s[i]>='A'&&s[i]<='Z'||s[i]>='a'&&s[i]<='z')zm++;else if(s[i]==' ')kg++;else qt++;printf("数字:%d\\n英文字母:%d...
C语言编程题目:0、1、2、3、4、5六个数字不重复使用,能构成多少个4位奇...
int main(int argc,char *argv[]){ int s,i,j,k,t,n;for(n=s=0,i=1;i<6;i++)for(j=0;j<6;j++)if(j!=i)for(k=0;k<6;k++)if(k!=i && k!=j)for(t=1;t<6;t+=2)if(t!=k && t!=j && t!=i){ printf(++n%13 ? "%5d" : "%5d\\n",i*1000+j*100...
C语言编程问题:求 1!+2!+3!+...+n!
把sum=sum+x;移到}后、x=1;前。int main(void){ int sum,n,x,t;scanf("%d",&n);for(sum=0,x=t=1;t<=n;sum+=x*=t++);printf("%d\\n",sum);return 0;}
童许福松:这是我的源程序,你看看 #include<stdio.h> void main() { int n=0 ,j=0; char c1,c2; printf("请输入两个数字字符:"); scanf("%c%c",&c1,&c2); for(int i='0';i<'10';i++) { if(c1==i) n+=j; if(c2==i) n+=j*10; j++; } printf("整数得到的数为:%d\n",n); }
台江区13367895590: 跪求两道C语言编程题,急!!!!!!!!!?
童许福松: 恩 好方法, 记的我一次面试的时候主考官就是出的这道题目,我当时是用下面这方法的 #include "stdio.h" void fun(char *p) { int i=0,j=0; int m,n; char a[100]; /*数组下标据P的大小而定*/ char b[100]; char *str,*s2,*s3; char c; a[0]='\0'; b[0]='\0'; str...
台江区13367895590: C语言编程题,急,非常感谢?
童许福松: 第一题 main() { float n,s=0,t=1; for(n=1;n<=20;n++) { t*=n; s+=t; } printf("1+2!+3!...+20!=%e\n",s); } 第2题 main() { int i,j,k,n; printf("'water flower'number is:"); for(n=100;n<1000;n++) { i=n/100;/*分解出百位*/ j=n/10%10;/*分解出十位*/ k=n...
台江区13367895590: 几道c语言编程题,急用!!!!?
童许福松: 都是基础的题呀~2#include<stdio.h>main(){ int a[3][4]={{2,546,34,32},{0,-12,5,-124},{43,57,36,547}}; int i,j,max,x=0,y=0; max = a[0][0]; for(i=0;i!=3;i++) for(j=0;j!=4;j++) if(a[i][j]>max) { max=a[i][j]; x=i; y=j; } printf("a[%d][%d]=%d",x,y,max);}
台江区13367895590: C语言,编程题.急.!?
童许福松: #include <stdio.h> main() { int a,b; printf("input a,b\n"); scanf("%d%d",&a,&b); if((a*a+b*b)>100) printf("%d",(a*a+b*b)%100); else printf("a-b=%d",a-b); }
台江区13367895590: 急求一道c语言编程题 - ?
童许福松: #include void fun(int m) { char c; if(m==0) { } else { c=m%10+'0'; fun(m/10); printf("%c",c); } } void main() { int i; char c; printf("输入整数i:"); scanf("%d",&i); c=i%10+'0'; fun(i/10); printf("%c\n",c); }
台江区13367895590: 高手帮帮忙做几道c语言编程题 急求?
童许福松: 第一题: int i,sum,iFlag; iFlag = 1; sum = 0; for (i=1;i<102;i+=2) { sum+=(i*iFlag); iFlag *= -1; } // 打印结果 printf("result=%d",sum); 第二题: (1): double e,jc; int i,j; // 计算前50项 e=1; for(i=1;i<51;i++) { jc=1; // 计算阶乘 for(j=2;j<=i;j++) { jc*...
台江区13367895590: C语言编程题,急求解答!?
童许福松: 可能方法不是很好.主要思路是输入16进制数(不用输0x前缀,ABCDEF大小写均可),将每一位做一个处理,乘以每一位乘以16的N-1次方,N为16进制数的长度,比如15B = 1*16*16 + 5*16 + 11 = 347 #include <stdio.h> #include <string.h> ...
台江区13367895590: 急!C语言编程题 - ?
童许福松: #include<stdio.h> void main() {int i,j,k;for(i=1;i<=4;i++){for(j=1;j<=i;j++)printf(" ");for(k=1;k<=9-2*i;k++)printf("*");printf("\n");} }
台江区13367895590: 急求C语言题目?
童许福松: 我X... 刚才那边你又不采纳我. #include <stdio.h> int main() { int a[2][2] = { {1, 2}, {3, 4} }; int b[2][2] = { {1, 0}, {0, 1} }; int c[2][2] = { {0, 0}, {0, 0} }; int i, j, k;for(i = 0; i != 2; i++) { for(j = 0; j != 2; j++) { for(k = 0; k != 2; k++) { c[i][j] += (a[i][k] * b[k][j]); } } ...