| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 510 人关注过本帖
标题:简单的逻辑问题,改不出来了,求指点
只看楼主 加入收藏
给我毅刀
Rank: 1
等 级:新手上路
帖 子:30
专家分:9
注 册:2012-9-2
收藏
 问题点数:0 回复次数:3 
简单的逻辑问题,改不出来了,求指点
#include<stdio.h>
#include<conio.h>
int main()
{
    int a=0,b=0,cai,answer,i,j;
    int answer1[3];
    int cai1[3];
    printf("请输入一个被猜测的数字:");
    scanf("%d",&answer);
    j=10000;
    for(i=0;i<=3;i++)
    {
        j=j/10;
        answer1[i]=answer/j;
        answer=answer%j;   
    }
    for(i=0;i<=3;i++)
    {
        printf("%d\n",answer1[i]);   
    }

ex:
        printf("请您猜字:");
        scanf("%d",&cai);
        if(cai<1000||cai>9999)
        {
            printf("输入错误,请重新输入!\n");
            goto ex;
        }
        else
        {
            while(1)
            {
                j=10000;
                for(i=0;i<=3;i++)
                {
                    j=j/10;
                    cai1[i]=cai/j;
                    cai=cai%j;
                }
                for(i=0;i<=3;i++)
                {
                    printf("%d\n",cai1[i]);   
                }
                for(i=0;i<=3;i++)
                {
                    if(answer1[i]==cai1[i])
                    {
                        a++;
                        continue;
                    }
                    else
                    {
                        for(j=0;j<=3;j++)
                        {
                            if(answer1[i]==cai1[j])
                            {
                                b++;
                                break;
                            }
                            else
                                continue;
                        }
                    }
                }
                printf("%d a%d b",a,b);
                if(a==4)
                {
                    break;
                }
                a=0;
                b=0;
                goto ex;
            }
        }
        getch();
        return 0;
}
这是一个猜字游戏,要求数字无重复,a表示位置和数值都对,b表示数值对,位置不对,可是这里有点小问题,哪位能帮忙改下,指点一下小弟问题出在哪里了
搜索更多相关主题的帖子: include 
2013-08-03 19:47
给我毅刀
Rank: 1
等 级:新手上路
帖 子:30
专家分:9
注 册:2012-9-2
收藏
得分:0 
这个游戏的设计思路是这样的,由于本人是初学者,所以设计比较简单,并且是抱着先实现再完善的态度,所以这个游戏写的十分简单,但是自己调了一天也没有调通
首先定义两个数组,用来分别存放被猜数和输入的猜数,并且我输出了他们,这样可以看到数组存放的是否正确,接着就是问题,也是这个小程序的难点,比较两个数组,这里我的想法是先设置一个i变量,用于存放被猜数的数组下标,如果answer[i]==cai[i],则a++,否则进入下一层循环,answer[i]依次和输入的数比较,相同就b++,同时跳出内层循环,进入下一次外层的循环,结束后输出xaxb,如果a=4结束循环(显然这里也是出了问题,这个循环并不会结束),运行后,输入1234,我猜6789输出0a1b,输入1234,输出2a1b,这里的错误很明显,1b是一直被执行的而且a的判断也不对,哪位能帮助我指出错误呢?
谢谢大家了!
2013-08-03 20:10
XiaoXiao_Ren
Rank: 3Rank: 3
来 自:西安
等 级:论坛游侠
威 望:1
帖 子:80
专家分:198
注 册:2013-7-17
收藏
得分:0 
回复 楼主 给我毅刀
int answer1[3];
    int cai1[3];
    printf("请输入一个被猜测的数字:");
    scanf("%d",&answer);
    j=10000;
    for(i=0;i<=3;i++)  //数组越界了,数组大小仅仅是3,却用for存放了4个数。
    {
        j=j/10;
        answer1[i]=answer/j;
        answer=answer%j;   
    }


==============================
另外我的运行结果正确,输入1234和6789  输出0 a0 b, 再次输入1234,则输出4 a0 b,并且程序此时正常结束。
我是用Linux编译的,所以没有使用那第二个头文件,这应该不影响吧!!

不过为什么不直接用 if(answer==cai)来判断呢——一位一位判断没必要呀?
==============================

[ 本帖最后由 XiaoXiao_Ren 于 2013-8-3 22:39 编辑 ]

否极泰来
2013-08-03 22:12
艺术的生活
Rank: 2
等 级:论坛游民
帖 子:51
专家分:77
注 册:2013-7-28
收藏
得分:0 
回复 2楼 给我毅刀
真巧。我也是初学者,前不久也写了一个猜数字的小游戏。参考一下吧。(共同切磋)
程序代码:
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#define Output_red  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED)//设置字体颜色的,和程序没太大关系,可以不管
#define Output_normal  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE)//设置字体颜色的,和程序没太大关系,可以不管
int IsNum(void);
int main()
{
    int a[3],s ;//a[3]为存储自动生成的3个不相同的随机数的数组,s为计数器
    int b[3];//b[3]为存储用户手动输入的用于猜数的数组
    int sum=0 ;//sum用于记录用户用户试猜的次数
    int i,j ;
    int SA=0 ;//SA记录位置与数值和电脑给出的数都相符合的数的个数
    int SB=0 ;//SB记录数值与电脑给出的数相符但位置不相符的数的个数
    int n=1 ;//控制游戏重新执行或退出的变量
  
    do
    {
        srand(time(NULL)); //以当前时间作为种子
     
        for(s=0;s<=2;s++)
            a[s]=rand()%10 ;//生成3个随机数,rand()生成一个随机数,再对10取余则把这个数控制在0-9之间
      
    }
    while(a[0]==a[1]||a[1]==a[2]||a[2]==a[0]);//如果其中有相同的数,重新生成
  
    char st[]="***|猜数字|***" ;
    int c ;
    for(c=0;c<(80-strlen(st))/2;c++)
         printf(" ");// 打空白,个数等于(屏幕宽度-字符串长度)/2,此语句让标题居中
  
    Output_red;//设置输出红色字符
    printf("%s\n",st);
    Output_normal;//设置输出正常字符
  
    printf("\n");
    printf("程序已经生成了一个各位数字不相同的3位数(从0到9)");
    printf("来猜猜看这是个什么数吧!\n");
    printf("计算机会将你提交的数与它生成的数作比较,产生如*A*B的提示。\n");
    printf("如1A1B表示你有一个数数值正确且位置正确,有一个数数值正确但位置不正确.\n");
    printf("你总共有10次机会。\n");

 
    printf("\n");
    printf("请依次输入你所猜的3位数的每一位(各位上的数字不相同)\n");
  
    while(n!=0)
    {
        fflush(stdin);//清空一次输入缓冲区,以避免游戏第二次运行时接受上一次游戏中多余的输入
        Output_normal;//设置输出正常字符
        do
        {
            printf("请输入第1位数字(从0到9):");
            b[0]=IsNum();
            printf("请输入第2位数字(从0到9),");
           do
            {
                  printf("不能与第1位相同:");
                b[1]=IsNum();
            }while(b[1]==b[0]);
            printf("请输入第3位数字(从0到9),");
             do
            {
                  printf("不能与第1位或第2位相同:");
                b[2]=IsNum();
            }while(b[2]==b[1] || b[2]==b[0]);
          
          
            for(i=0;i<=2;i++)//用一个循环逐位对各数进行比较
            {
                for(j=0;j<=2;j++)
                {
                  
                    if(b[i]==a[j]&&(i==j))//如果数值相同并且位置也相同
                        SA++;     
                    if(b[i]==a[j]&&i!=j) //如果数值相同但位置不同
                        SB++;
                }
              
            }
            sum++; //每猜一次,sum加上1
         
            printf("\n");
            Output_red;//设置输出红色字符
          
            printf("您所猜的3位数是:%d%d%d",b[0],b[1],b[2]);
            printf("   状态:%dA%dB  ",SA,SB);
            printf("   您已经猜了:%d次,还剩:%d次\n",sum,10-sum);
          
            Output_normal; //设置输出正常字符
         
            printf("\n");
            if(SA==3)//SA等于3代表你所猜的数与计算机生成的数吻合
            {
                Output_red;//设置输出红色字符
              
                printf("^_^恭喜你,猜对了。正确答案是:");
                for(s=0;s<=2;s++)
                    printf("%3d",a[s]);//输出正确答案
                  
                break ;//退出循环,游戏结束
              
            }
            else
            {
                SA=0 ; //重新初始化SA          
                SB=0 ; //重新初始化SB
             
            }
          
        }
        while(sum!=10);//当猜到10次时结束
                    
        if(SA!=3)//如果与正确答案不完全一致
        {
            Output_red;//设置输出红色字符
          
            printf("╯﹏╰很遗憾,你没有猜对。正确答案是: ");
            for(s=0;s<=2;s++)
               printf("%3d",a[s]);      
        }
        printf("\n");
        printf("\n");
        printf("还想再玩一次吗?(1:再玩一次 0:退出游戏)\n");
        scanf("%d",&n);
        sum=0;//重新初始化sum
        system("cls");//清屏
    }
}
int IsNum(void)
{
    int a ;
   
    while(a=getchar())//循环条件
    {
        fflush(stdin);//清空输入缓冲区,避免游戏重复执行时接受上一次游戏中的遗留数据
      
     
        if(isdigit(a)==0) // 用isdigi判断,为0表示不是数字
        {
            fflush(stdin);//清空输入缓冲区,以免输入一个字符后按回车时把回车认为是下一个输入
          
            printf("错误!这不是一个数字,请重新输入。");
        }
      
        else //如果不为0,则表示是数字
             break ;//退出循环
             
    }
    
    return a - '0';
}
这段程序的缺点是main函数有点大。应该再细分一下就好了。


[ 本帖最后由 艺术的生活 于 2013-8-4 23:01 编辑 ]
2013-08-04 22:59
快速回复:简单的逻辑问题,改不出来了,求指点
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.093024 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved