求解编程题目<猜数字>C++/C
我觉得解决这个问题有几点要注意:实现方面:生成随机数、防止待猜测的数中重复数字
异常方面:处理输入不为四位的情况。
我练习输入输出、类型转换的时候做过一个类似功能的,但是有些地方不完善。
guess0.cpp
//Guess0.cpp:Definestheentrypointfortheconsoleapplication.
//最后一次正确时,运行不正确
//猜数字
//产生的随机数每次都是1740,而给result赋值时每次都是1242。
//前者原因:rand的问题,该方法需要与srand一起使用;后者是类型转化过程出错
//可以考虑加上时间,按照时间长短给予不同提示。
#include"StdAfx.h"
#include"head.h"
#include
#include
#include
#defineARRAY_SIZE4//宏,定义要猜的数字位数,默认为4,可以修改
#defineCHANCE10//可以猜测的次数
charresult[ARRAY_SIZE+1]={0};//要猜的数字数组;多定义一位,用于存储结束符
intcounter=0;//记录次数,不得大于CHANCE
intmain(intargc,char*argv[])
charans;
process();
printf("是否继续?(是,输入“y”;否输入“n”)");
scanf("%c",&ans);
fflush(stdin);
}while(ans==y||ans==Y);
return0;
voidmyRand()//生成一个4位数字
{//应该在初始化中首次调用此方法
//把值传给result时容易出错,注意选择方式
//先生成随机数,截取其各位数字,当有重复时重新生成。
memset(result,0,ARRAY_SIZE);
result[ARRAY_SIZE]=0;
inti,j;
intnums[ARRAY_SIZE];//中间数组
memset(nums,0,ARRAY_SIZE);
chartemp[ARRAY_SIZE][1];//注意!temp[]以及它以后的存储区域都是连续的,不能用temp首地址输出。
for(i=0;i
memset(temp[i],\0,1);
srand((unsigned)time(NULL));//使从当前时刻开始生成的随机数不存在重复
//若无此语句,程序每次执行,产生的随机数是按照顺序来的,依次为1740,9482。。。
for(i=0;i
nums[i]=rand();
nums[i]=nums[i]%10;
for(j=0;j
{//新生成的数字要和前面所有数字比较
while(nums[i]==nums[j])//遇到重复数字时,重新生成;
{//此处不可用if,因为重新生成的数字也需要比较一次
nums[i]=rand();
nums[i]=nums[i]%10;
j=0;//一旦重新生成就重新开始比较,计数置0
sprintf(temp[i],"%d",nums[i]);
result[i]=temp[i][0];//把处理好的数字赋给result
result[ARRAY_SIZE]=0;//结束符
voidprocess()//将获得的数字与已生成数字比较
//在菜单中说明
printf("欢迎进入本游戏。\n");
printf("程序将随机生成一个不含重复数字的四位数,然后请您猜测这个四位数。\n");
printf("在猜测的过程中我讲给您适当提示,其中\n");
printf("A代表结果中有且位置正确的数字,B代表结果中有但位置不正确的数字。\n");
printf("在一次游戏结束后,您可以查看结果或者重新开始。\n");
CStringinpt;//下面的GetAt调用出现问题,给inpt赋值可以解决
//但是赋值比如为0的话,又会提示长度不对;赋值为0000的话会提示重复数字
//明明在读入的时候,初始赋值已经改变了。
//调试发现虽然inpt已经获得了输入,但是其长度却未改变,应该是接受输入的过程出错
//根本原因在于用scanf读入CString对象的值。虽然能读入,但那只是一个临时值,随时
//会发生“不可预知”的错误。
//所以,改用字符数组或者字符指针实现这一问题
/*//使用字符指针
char*inpt;//缓存输入
inpt=(char*)malloc(ARRAY_SIZE+1);
free(inpt);
charinpt[]={0,0,0,-,0};
charans=NULL;
myRand();
printf("请输入一个不含重复数字的%d位数(多于四位将只处理前四位):\n",ARRAY_SIZE);
intcount1=0,//结果中含该数字、位置正确,即A的值
count2=0;//结果中含该数字、位置不正确,即B的值
while(counter
scanf("%s",inpt);
fflush(stdin);
while(judge_length(inpt)||judge_repeat(inpt))
printf("请重新输入:\n");
scanf("%s",inpt);
fflush(stdin);
inti,j;
count1=0;
count2=0;
for(i=0;i
for(j=0;j
if(inpt[j]==result[i])
if(i!=j)
count2++;
count1++;
if(count1==ARRAY_SIZE)
printf("恭喜您,猜对了!\n");
break;
printf("%s%d%c%d%c\n",inpt,count1,A,count2,B);
counter++;
if(counter==CHANCE)
printf("对不起,您已经用完了10次机会!您可以查看结果或者重新开始。");
printf("您可以输入0来查看正确结果。\n");
charchoice;
scanf("%c",&choice);
if(choice==0)
printf("正确结果是%s\n",result);
counter=0;
printf("继续?(y/n)\n");
scanf("%c",&ans);
fflush(stdin);
}while(ans==y||ans==Y);
booljudge_repeat(charinpt[])//判断有无重复数字
inti,j;
for(i=0;i
for(j=0;j
if(inpt[i]==inpt[j])
printf("您的输入含有重复数字。\n");
returntrue;
returnfalse;
booljudge_length(charinpt[])//判断输入数字的位数
if(inpt[ARRAY_SIZE-1]==-)//如果C/C++数组名可以调用类似length的
{//函数,那样实现比较理想
//在声明inpt多加一位,加上条件inpt[ARRAY_SIZE]!=(指定字符),应该可以处理超出的输入
printf("您的输入长度不对。\n");
printf("inpt[ARRAY_SIZE-1]=%c\n",inpt[ARRAY_SIZE-1]);
printf("inpt[ARRAY_SIZE]=%c",inpt[ARRAY_SIZE]);
returntrue;
returnfalse;
guess0.h
#include"StdAfx.h"
#include
voidprocess();
booljudge_repeat(charinp[]);
booljudge_length(charinp[]);
用编程来判断系统是大端还是小端
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放; 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。 下面这段代码可以用来确定机器是大端法还是小端法机器: short x; char x0; x=0x1122; x0=((char*)&x)[0]; //低地址单元 if(x0==0x11)printf("大端\n"); else printf("小端\n");