A. c语言54扑克问题
这个游戏要保证先手必胜,先手方只需要每次取牌以后让剩余的牌数为5的整数倍+1就可以了,这样对手无论如何都只能拿到最后一张。以下代码VS2019测试通过。
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
// 电脑取牌,返回张数 1~4
int ComputerChoice(int CardsRemain);
// 人取牌,返回张数 1~4
int HumanChoice(int CardsRemain);
// 游戏函数
void Game(int CardsRemain, bool HumanFirst);
void main()
{
int CardsRemain; // 剩余张数
bool HumanFirst; // 人先拿 或 电脑先拿
char c = '/0'; // 先手选择
// 显示游戏规则
printf("游戏规则:\n\n");
printf("54张牌,人和电脑轮流抽,1到4张任选,抽到最后一张牌者败。\n\n");
printf("按任意键继续...\n");
getch();
while (1)
{
CardsRemain = 54;
// 确定谁先拿牌
while (1)
{
system("cls");
printf("\n让电脑先拿牌吗?(Y/N)");
c = getch();
if ((c == 'Y') || (c == 'y'))
{
HumanFirst = false;
break;
}
if ((c == 'N') || (c == 'n'))
{
HumanFirst = true;
break;
}
}
// 开始游戏
Game(CardsRemain, HumanFirst);
getch();
// 再来一次?
while (1)
{
system("cls");
printf("\n\n不服!再来一次?(Y/N)");
c = getch();
if ((c == 'Y') || (c == 'y'))
break;
if ((c == 'N') || (c == 'n'))
return;
}
}
}
// 电脑取牌
int ComputerChoice(int CardsRemain)
{
int i;
// 拿掉n张,使得剩下张数为 5 的整数倍+1,必胜
switch (CardsRemain % 5)
{
case 1:
while (1) // 拿不到最佳张数,就在 1~4 张之间随机拿, 要确保电脑所拿张数不大于剩余张数
{
i = rand() % 4 + 1;
if (i <= CardsRemain)
return i;
}
case 0: return 4;
default: return (CardsRemain % 5) - 1;
}
}
// 人取牌
int HumanChoice(int CardsRemain)
{
int i;
while (1)
{
printf("\n请输入要拿掉的张数[1~4]:");
scanf("%d", &i);
if (i > CardsRemain)
continue;
if ((i >= 1) && (i <= 4))
return i;
}
}
// 游戏函数
void Game(int CardsRemain, bool HumanFirst)
{
int LastComChoice = 0; // 电脑 上轮拿牌张数
int LastManChoice = 0; // 人 上轮拿牌张数
int Rounds = 0; // 回合数
bool HumansTurn = HumanFirst; // 本轮取牌者是 人 还是 电脑。初始值由 HumanFirst 决定
// 初始化随机数
srand(time(0));
system("cls");
// 取牌循环,直到剩下张数为 1
while (CardsRemain > 0)
{
if (HumansTurn) // 轮到人拿牌
{
// 想让电脑互P,把这里 HumanChoice 改成 ComputerChoice, 相应输出文字改成电脑1、2就可以了。
LastManChoice = HumanChoice(CardsRemain);
CardsRemain -= LastManChoice;
printf("\n你拿走 %d 张,剩 %d 张。\n", LastManChoice, CardsRemain);
if (CardsRemain == 0)
{
printf("\n\n你拿到最后 1 张牌,你输了! 按任意键结束游戏...");
getch();
return;
}
}
else // 轮到电脑拿牌
{
LastComChoice = ComputerChoice(CardsRemain);
CardsRemain -= LastComChoice;
printf("\n电脑拿走 %d 张,剩 %d 张。\n", LastComChoice, CardsRemain);
if (CardsRemain == 0)
{
printf("\n\n电脑拿到最后 1 张牌,电脑负! 按任意键结束游戏...");
getch();
return;
}
}
HumansTurn = !HumansTurn; // 更换拿牌者
Rounds++;
if ((Rounds % 2) == 0) // 双方各取一次牌为 1 回合
{
if (HumanFirst)
printf("\n第 %d 轮, 人类:%d张 电脑:%d张 剩下:%d张\n", Rounds / 2, LastManChoice, LastComChoice, CardsRemain);
else
printf("\n第 %d 轮, 电脑:%d张 人类:%d张 剩下:%d张\n", Rounds / 2, LastComChoice, LastManChoice, CardsRemain);
printf("--------------------------------------------------\n");
}
}
}
B. C语言:为什么每次产生的rand随机数全都一样例如第一个是9,后面全都是9
/*
Enter the number of sets: enter q to stop.
5 9
How many sides and how many dice:3
Here are 5 sets of 3 9-sided throws.
25 18 14 13 17
How many sets? Enter q to stop.
q
Press any key to continue
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
intdiceroll(intnum,intside);//返回骰子产生的数字的总和
intmain(void){
intsets,side,dice;//sets为回合数,side面,dice:骰子个数
inti;//变量初始化
srand((unsigned)time(NULL));//应在main()初始化随机数种子
printf("Enterthenumberofsets:enterqtostop. ");//set组
while(scanf("%d",&sets)==1&&sets>0){
printf("Howmanysidesandhowmanydice:");
if(scanf("%d%d",&side,&dice)==2){
printf("Hereare%dsetsof%d%d-sidedthrows. ",sets,dice,side);
for(i=0;i<sets;i++)//0-sets个回合
printf("%d",diceroll(side,dice));//打印出返回值
printf(" ");
printf("Howmanysets?Enterqtostop. ");
}
elseprintf("inputside,anddice: ");
}
return0;
}
intdiceroll(intside,intdice){
inti,sum;
for(i=0,sum=0;i<dice;i++)
sum+=rand()%side+1;//产生3个骰子摇出的总和sum
returnsum;//返回3个骰子摇出的总数sum
}
C. C语言编程回文数
main()
{
int x,n,i,j,a[20],c;
long sum;
scanf("%d",&n);
for (x=1;x<=n;x++)
{ sum=x*x;
for(i=1;i<20;i++)
a[i]=0;
for (i=1;i<20;i++)
{a[i]=sum%10;
sum=sum/10;
if (sum==0) break;
}
if (i%2==0) {c=0; for (j=1;j<=i/2;j++) {if(a[j]!=a[i+1-j]) c=1;}
if (c==0){printf("%d %d\n",x,x*x);}}
else {c=0; for (j=1;j<=(i-1)/2;j++) {if (a[j]!=a[i+1-j]) c=1;}
if (c==0){printf("%d %d\n",x,x*x);}}
}
}
D. C语言中常说的返回值是指什么返回数值
函数的返回值有很多类型。我们先大略了解一下函数
函数,在英文版c中为“funtion”,意思是“功能”。
一个函数的目的是实现某一个功能。函数的作用是处理数据。
不同函数有不同的返回值。
我们把洗衣机和电饭锅,洗衣机给我们的返回值是干净的衣服,电饭锅给我们的返回值是饭。
有些函数还需要参数值,对这些数值进行处理。
比如洗衣机需要我们传的参数是脏衣服。电饭锅需要我们传的参数是生米、水。
函数可以是我们自己编写的,也可以是c语言开发者已经帮我们编写好的。
我们自己写的比如
int
max(int
x,int
y)
{
return
x:y?x>y;
}
这个函数作用是挑出两个数中的最大的那个数并返回,类型是int;
C语言开发者提供的比如float
sqrt(float
n);这个函数作用是求开方,返回一个开方值,类型是float;
E. 请问C语言中的返回值是什么意思,为什么要有返回值,解释一下,越通俗易懂越好!
所谓返回值,函数才有,就类似于数学中的函数的概念f(x),其实跟数学概念一开始是一个意思,你传入一个值x,经过处理,然后返回处理的结果,处理的结果就叫做返回值。
就好像你拿原材料做衣服,需要拿材料到工厂里面加工,工厂就生产出衣服给你,衣服就是返回值。
这其实跟数学中函数的概念是一样的。
当然不是所有函数都有返回值,如一些函数只要完成某些特定的功能即可,不需要返回特定的值给主函数。如C语言中的printf这个方法,有些时候只希望屏幕输出一段加工过的文字,这就可以放在子函数中处理,而不需要将处理结果返回给主函数再处理,能够节省代码量。
又如一些多线程的函数,很多都是没有返回值。具体情况具体分析。。。
F. c语言里的 回文数是什么
就是左右到中间加起来一样的数
如 12321,4004
G. 编写一段C语言与汇编程序的回合程序,用汇编程序实现两个64位数的加法运算,在C文件中调用该函数。
是:
#include <stdio.h>
#include <stdlib.h>
int main();
{
int a,b,c;
scanf("%d %d",a,b);//输入a和b的值。
c=a+b;//c是两数之和。
printf("%d",c);//输出c的值。
system("pause");
return 0;
}
H. C语言问题
6月9日 09:30 第一个问题,x[3][4]是一个二维数组,所以要用两重星号,你可以这么理解,*(x+1)是第一行的行首地址,也就是说,它相对于一个数组y[4]={5,6,7,8}的首地址,那么*(*(x+1))就是这个y[4]的首个元素了,也就是5,即x[1][0]的值
这样说一下,答案A也就很好理解了,首先*(x+1)的值是二维数组第1行(从0开始计数)的首地址,然后*(x+1)+1就是二维数组第1行第1列的地址,再取一个*就变成了该地址中的内容,即x[1][1]为6
总结一下就是,n维数组,就需要取n重星号,每取一重星号就降一维,但是注意除非取了n重星号,否则前面的1到n-1重星号得到的都是地址值,也可以勉强理解为该维的首元素地址
第二个问题,你这种写法是错误的,因为p是一个指向struct sk的指针,不应该强制转成指向整型的指针,除非你非有这样做的理由。
下面的论述仅在你非要这样强制转换时成立:
data.n是一个整型变量(int),所谓的用指针指向它,其实可以理解为把一个指针型变量的值赋为data.n的地址,这样我们通过&data.n首先获取了n的地址。
这里存在一个问题,因为指针赋值要求是同类型的,也就是,一般意义下,一个int*的指针只能指向int型的数据,一个doulbe*的指针只能指向double型的数据,同样,一个stack sk *型的指针也只能指向stack sk型的数据,所以,这里如果直接赋值是不行的,必须要把int *强制转换成stack sp *,所以就有了你上面的赋值公式
I. C语言的发展及其特点
C 语言特点
C语言是一种成功的系统描述语言,用C语言开发的UNIX操作系统就是一个成功的范例;同时C语言又是一种通用的程序设计语言,在国际上广泛流行。世界上很多着名的计算公司都成功的开发了不同版本的C语言,很多优秀的应用程序也都使用C语言开发的,它是一种很有发展前途的高级程序设计语言。 1. C是中级语言。它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。 2.C是结构式语言。结构式语言的显着特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。 3.C语言功能齐全。具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。而且计算功能、逻辑判断功能也比较强大,可以实现决策目的的游戏。 c语言
4. C语言适用范围大。适合于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。 C语言对编写需要硬件进行操作的场合,明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。 C语言具有较好的可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。 常用的C语言IDE(集成开发环境)有Microsoft Visual C++,Dev-C++,Code::Blocks,Borland C++,Watcom C++,Borland C++ Builder,GNU DJGPP C++,Lccwin32 C Compiler 3.1,High C,Turbo C,C-Free,win-tc 等等…… c语言的学习 对于一个初学者,Microsoft Visual C++是一个比较好的软件。界面友好,功能强大,调试也很方便。这是微软出的一个C语言集成开发环境(IDE),主要有:VC++6.0、VS2005、VS2008、VS2010等,分为企业版和学生版等。对于初学者VC++6.0是比较容易上手的,但由于其对标准支持的不好可能使人养成不良编程习惯,因此论坛上也有人主张舍弃VC++6.0。 在unix/linux操作系统上,学习c语言一般使用vim/emacx来编辑源文件,使用gcc/cc来编译源文件,使用make程序来管理编译过程。
编辑本段发展历史
c语言
C语言的祖先是BCPL语言。 1967年,剑桥大学的Martin Richards 对CPL语言进行了简化,于是产生了BCPL(Basic Combined Pogramming Language)语言。 1970年,美国贝尔实验室的Ken Thompson。以BCPL语言为基础,设计出很简单且很接近硬件的B语言(取BCPL的首字母)。并且他用B语言写了第一个UNIX操作系统。 在1972年,美国贝尔实验室的D.M.Ritchie在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。 为了使UNIX操作系统推广,1977年Dennis M.Ritchie 发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。 1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchie合着 c语言程序设计
了着名的《The C Programming Language》一书。通常简称为《K&R》,也有人称之为《K&R》标准。但是,在《K&R》中并没有定义一个完整的标准C语言,后来由美国国家标准化协会(American National Standards Institute)在此基础上制定了一个C语言标准,于一九八三年发表。通常称之为ANSI C。 K&R第一版在很多语言细节上也不够精确,对于pcc这个“参照编译器”来说,它日益显得不切实际;K&R甚至没有很好表达它所要描述的语言,把后续扩展扔到了一边。最后,C在早期项目中的使用受商业和政府合同支配,它意味着一个认可的正式标准是重要的。因此(在M. D. McIlroy的催促下),ANSI于1983年夏天,在CBEMA的领导下建立了X3J11委员会,目的是产生一个C标准。X3J11在1989年末提出了一个他们的报告[ANSI 89],后来这个标准被ISO接受为ISO/IEC 9899-1990。 1990年,国际标准化组织ISO(International Organization for Standards)接受了89 ANSI C 为I SO C 的标准(ISO9899-1990)。1994年,ISO修订了C语言的标准。 1995年,ISO对C90做了一些修订,即“1995基准增补1(ISO/IEC/9899/AMD1:1995)”。1999年,ISO有对C语言标准进行修订,在基本保留原来C语言特征的基础上,针对应该的需要,增加了一些功能,尤其是对C++中的一些功能,命名为ISO/IEC9899:1999。 2001年和2004年先后进行了两次技术修正。 目前流行的C语言编译系统大多是以ANSI C为基础进行开发的,但不同版本的C编译系统所实现的语言功能和语法规则有略有差别。
J. C语言中,什么是回文数
回文数"回文数"是一种数字.如:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,所以这个数字
就是回文数.
任意某一个数通过以下方式相加也可得到
如:29+92=121 还有 194+491=586,586+685=1271,1271+1721=2992
不过很多数还没有发现此类特征(比如196,下面会讲到)
另外个别平方数是回文数
1的平方=1
11的平方=121
111的平方=12321
1111的平方=1234321
。
。
。
。
依次类推
3×51=153
6×21=126
4307×62=267034
9×7×533=33579
上面这些算式,等号左边是两个(或三个)因数相乘,右边是它们的乘积。如果把每个算式中的“×”和“=”去掉,那么,它们都变成回文数,所以,我们不妨把这些算式叫做“回文算式”。还有一些回文算式,等号两边各有两个因数。请看:
12×42=24×21
34×86=68×43
102×402=204×201
1012×4202=2024×2101
不知你是否注意到,如果分别把上面的回文算式等号两边的因数交换位置,得到的仍是一个回文算式,比如:分别把“12×42=24×21”等号两边的因数交换位置,得到算式是:
42×12=21×24
这仍是一个回文算式。
还有更奇妙的回文算式,请看:
12×231=132×21(积是2772)
12×4032=2304×21(积是48384)
这种回文算式,连乘积都是回文数。
四位的回文数有一个特点,就是它决不会是一个质数。设它为abba,那它等于a*1000+b*100+b*10+a,1001a+101b。能被11整除。
六位的也一样,也能被11整除
还有,人们借助电子计算机发现,在完全平方数、完全立方数中的回文数,其比例要比一般自然数中回文数所占的比例大得多。例如11^2=121,22^2=484,7^3=343,11^3=1331,11^4=14641……都是回文数。
人们迄今未能找到五次方,以及更高次幂的回文数。于是数学家们猜想:不存在nk(k≥5;n、k均是自然数)形式的回文数。
在电子计算器的实践中,还发现了一桩趣事:任何一个自然数与它的倒序数相加,所得的和再与和的倒序数相加,……如此反复进行下去,经过有限次步骤后,最后必定能得到一个回文数。
这也仅仅是个猜想,因为有些数并不“驯服”。比如说196这个数,按照上述变换规则重复了数十万次,仍未得到回文数。但是人们既不能肯定运算下去永远得不到回文数,也不知道需要再运算多少步才能最终得到回文数。