求C语言编程很长的程序100多行的

求C语言编程很长的程序100多行的,第1张

C语言写的21点程灶塌正序!

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define NULL 0

int compare(char sum1,char sum2)

{

if(sum1>=sum2)

return 1

else

return 0

}

int breakal(int sum)

{

if(sum>21)

return 0

else

return 1

}

char change(int card)

{

char ch,n,m,x

switch(card)

{

case 1: ch='A'

break

case 10:

{

n=1+int(rand()/(RAND_MAX+1.0))

if(n==1)

ch='K'

else

{

m=1+int(rand()/(RAND_MAX+1.0))

if(m==1)

ch='Q'

else

{

x=1+int(rand()/(RAND_MAX+1.0))

if(x==1)

ch='隐悔J'

}

}

break

}

} //以上switch语句用于将数字衫数转换成字符

return ch

}

void game()

{

int i,k,n

char host_ch,player_ch,host_card[15],player_card[15]

int host_sum=0,player_sum=0

srand(time(NULL))

for(i=0i<2i++)

{

int (10.0*rand()/(RAND_MAX+1.0))

player_card[i]=1+int (10.0*rand()/(RAND_MAX+1.0))

player_ch=change(player_card[i])

if(player_card[i]>1 &&player_card[i]<10) //输出玩家抽到的牌的点数

printf("您抽到的第%d张牌是%d\n",i+1,player_card[i])

else if(player_card[i]==10)

printf("您要到的第%d张牌是%c\n",i+1,player_ch)

else

printf("您要到的第%d张牌是A\n",i+1)

if(player_ch=='A') //询问判断玩家的A的点值为1或11

{

printf(" 您有一张A,您想要A作1还是11?\n")

printf(" 1. 1\n" )

printf(" 2. 11\n")

if(scanf("%d",&n) &&n==1)

player_card[i]=1

else

player_card[i]=11

}

host_card[i]=1+int (10.0*rand()/(RAND_MAX+1.0))

host_ch=change(host_card[i])

if(host_ch=='A') //电脑自动判断庄家的A的点值为1或11

{

k=1+int(rand()/(RAND_MAX+1.0))

if(k==1)

host_card[i]=11

else

host_card[i]=1

}

player_sum+=player_card[i] //分别对庄家和玩家的点数求和

host_sum+=host_card[i]

}

printf("您现在的总面值为%d\n",player_sum)//输出玩家的总面值

for(i=2i<5i++)

{

if(host_sum<18 &&host_sum>0)//电脑自动判断庄家是否要牌

{

host_card[i]=1+int (10.0*rand()/(RAND_MAX+1.0))

host_ch=change(host_card[i])

if(host_ch=='A') //电脑自动判断庄家的A的点值为1或11

{

k=1+int(rand()/(RAND_MAX+1.0))

if(k==1)

host_card[i]=11

else

host_card[i]=1

}

host_sum+=host_card[i]

}

printf("您还要继续要牌吗?\n")

printf(" 1.要\n")

printf(" 2.不要\n")

scanf("%d",&k)

if(k==1)

{

{

player_card[i]=1+int (10.0*rand()/(RAND_MAX+1.0))

player_ch=change(player_card[i])

if(player_ch=='A') //询问判断玩家的A的点值为1或11

{

printf("您有一张A,您想要A作1还是11?\n")

printf(" 1. 1\n" )

printf(" 2. 11\n")

if(scanf("%d",&n) &&n==1)

player_card[i]=1

else

player_card[i]=11

printf("您要到的第%d张牌是A\n",i+1)

}

else

printf("您要到的第%d张牌是%d\n",i+1,player_card[i])

player_sum+=player_card[i]

if(i==4)

printf("您手中已有5张牌,一决胜负的时刻到啦!\n")

if(breakal(host_sum)==0)

{

if(breakal(player_sum)==0)

{

printf("庄家爆牌了,您也爆牌了!庄家的牌面值是%d,您的牌面值是%d\n",host_sum,player_sum)

printf("\nYou lose..\n")

break

}

}

else

if(breakal(player_sum)==0)

{

printf("您爆牌了!您的牌面值是%d\n \nYou lose..\n",player_sum)

break

}

}

if(breakal(host_sum)==0)

{

printf("庄家爆牌了!庄家的牌面值是%d\n",host_sum)

printf("\nCongratulations! YOu win!\n")

break

}

}

else

{

printf("庄家的牌面值是%d,您的牌面值是%d\n",host_sum,player_sum)

if(compare(host_sum,player_sum)==1)

printf("\nYou lose..\n")

else

printf("\nCongratulations! You win!\n")

break

}

}

}

int main()

{

kaishi:

int n

printf(" 欢迎进入21点游戏!\n")

printf("************************************\n")

printf(" 1.开始游戏\n")

printf(" 2.退出游戏\n")

printf("************************************\n")

if(scanf("%d",&n)&&n==1)

game()

else if(n==2)

{

printf(" ******************************\n")

printf("游戏结束!祝您愉快!\n")

printf("\n\n")

printf(" 再见!\n")

printf(" ******************************\n")

return 0

}

goto kaishi

}

用字符串呀。static char s[10000]int i,j,t,L

输入后,L = strlen(s)然后对唯拦 一个一个字符作排册衡队。

for (i=0i<L-1i++) for (j=i+1j<Lj++) {

if (s[i]<s[j]) { t=s[i]s[i]=s[j]s[j]=t}

处理指姿胡完了打印出来 printf("%s",s)

}

高精度加法(以下程序只是整数相加,可举一反三)

就相当于竖式加法。

PS,我是个OIer

#include<stdio.h>

#include<string.h>

/*功能是返拍世回两个大整数的和,用字符数据组c返回.*/

char c[200]

char *add(char *a,char *b)

{

char tmp

int i,max,lc

int la=strlen(a)

int lb=strlen(b)

for(i=0i<la/2i++) {tmp=a[i]a[i]=a[la-1-i]a[la-1-i]=tmp}

for(i=0i<lb/2i++) {tmp=b[i]b[i]=b[lb-1-i]b[lb-1-i]=tmp}

if(la>lb) { max=lafor(i=lbi<maxi++) b[i]='0'b[max]='\0'}

else {max=lb for(i=lai<maxi++) a[i]='0'a[max]='\0'}

for (i=0i<=maxi++)

c[i]='0'

for(i=0i<maxi++)

{

c[i]+=a[i]+b[i]-'0'-'0'

if(c[i]>'9')

{

c[i]-=10

c[i+1]+=1

}

}

if(c[max]>'袭尘肢0') {c[max+1]='\0'lc=max}

else {c[max]='\0'lc=max-1}

for(i=0i<lc/2i++)

{tmp=c[i]c[i]=c[lc-i]c[lc-i]=tmp}

return c

}

int main()

{

int n

char a[200],b[200]

while(scanf("%d",&n)!=EOF &&n)

{

scanf("%s",a)

n--

while(n--)

{

scanf("%s",b)

strcpy(a,add(a,b))

}

printf("%s\n",c)

}

return 0

}

由于计算机输入计算结果的精度通常受到计算机的限制,如:在双精度方式下,计算机最多只能输出16位有效数字,如果超过16位,则只能按浮点形式输出,另外,一般计算机实数表示的范围为1038,如果超过这个范围,计算机就无法表示了。但是我们可以通过一些简单的办法来解决这个问题,这就是我们要说的高精度计算。

这个算法究竟是怎样的呢?我兄谨这里举个例子,如4597+1250这个式子(当然这个式子不用高精度计算也行,我用小一点的数是便于理解),我们大脑是从低位算起的,即先算0+7=7,,再算9+5=14,注意这里有一个进位(即10),程序中用g的值为1表示然后只留下4作此位的数接着再计算5 +2+g=8最后计算4+1=5这样就得到了结果。

此过程再换另一种描述方法:

将g的初值设为0。当两数相加时,从低位到高位,各位数字分别相加,如果相加后某个单元中的数大于10,则将该单元中的数减去10,并将进位标志g 设为1,当对下一单元进行相加时,还要再加上前一个单元的进位标志g。同时将g再次置为0,不断重复,直到最高位为止。

这里给出高精度加法的程序,我已经调试好并加上了注释。

#include <stdio.h>

int main()

{

int a1[2001],a2[2001],a3[2001],he,g,i,length,length1,length2

char s[2001]

for (i=0i<=2000i++)

{

a1[i]=0 a2[i]=0 a3[i]=0

}

gets(s) /*将字符数组(即被加数)倒序存储到数值型数组(即a1[2001])中*/

length1=strlen(s)

for (i=0i

a1[i]=s[length1-i-1]-'0'

gets(s) /*将字符数组(即加数)倒序存储到数值型数组(即a2[2001])中*/

length2=strlen(s)

for (i=0i

a2[i]=s[length2-i-1]-'0'

length=length1>length2?length1++:length2++/*这里确定计算结果的位数:两数之和的位数最大为较大的数的位数加1*/

g=0

for (i=0i<=lengthi++)

{

he=a2[i]+a1[i]+g

g=he/10/*这里用g表示进位标志,如6+6的和为12,则进位标志g的值为1*/

a3[i]=he%10

}

if (a3[length]==0) length-- /*由于最高位是在两个加数中的较大数的位数人为加1,实际结果有可能没有这么多的位数,就会出现0368这样的数字,则应去掉前面的0,成为368*/

for (i=lengthi>=0i--)

printf("%d",a3[i])/*输出得到的和即a3[i]的值*/

printf("\n")

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12301047.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存