编程1122系统(1122车机系统)

2023-12-10 09:48:07 数码极客 bianji01

 

求解编程题目<猜数字>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");

声明:易趣百科所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系315127732@qq.com
广告位招租
横幅广告