Member 13884445 Ответов: 1

Мой цикл while внутри main() работает не более одного раза?


я пытаюсь решить покерные руки проектов Эйлера. Задача 54 - Проект Эйлера[^]

мой код:

#include<iostream>
#include<fstream>
std::ifstream infile("poker.txt");
char a[10000][2];
int b=0;
using namespace std;
void read()
{
     int i;
     for(i=0;i<=10000;i++)
       {

          infile>>a[i][0]>>a[i][1];
       }
}


class play
{

  public:
     int high1,high2;
     char p;
     void display()
       {
         for(int i=b;i<b+5;i++)
         cout<<a[i][0]<<a[i][1];
       }
     void check( int b)
       {

         int c[10];
         int n=0,temp[2];
         int str=0,fl=0,four=0,three=0,two=0;
         for(int i=b;i<(5+b);i++)
            {

               if(isdigit(a[i][0]))
                  c[i]=(int)a[i][0]-'0';
               else if(a[i][0]=='T')
                  c[i]=10;
               else if(a[i][0]=='J')
                  c[i]=11;
               else if(a[i][0]=='Q')
                  c[i]=12;
               else if(a[i][0]=='K')
                  c[i]=13;
               else if(a[i][0]=='A')
                  c[i]=14;
                else
                  cout<<"invalid";


             }
         for(int k=b;k<5+b;k++)
             {
                for(int j=k+1+b;j<5+b;j++)
                {
                if (c[k]<c[j])
                  {
                    int temp=c[k];
                    c[k]=c[j];
                    c[j]=temp;
                  }
                }
             }
         if((c[0+b]==c[1+b]-1) &&(c[1+b]==c[2+b]-1) && (c[2+b]==c[3+b]-1) && (c[3+b]==c[4+b]-1) )
             {
                 p='E';
                 str=1;
                 high1=c[0+b];

             }
         if((a[0+b][0+b]==a[0+b][1+b]) && (a[0+b][0+b]==a[0+b][2+b]) && (a[0+b][0+b]==a[0+b][3+b]) && (a[0+b][0+b]==a[0+b][4+b]))
             {
                p='F';
                fl=1;
                high1=c[0+b];
                high2=c[1+b];

             }
         for(int l=0+b;l<5+b;l++)
             {
               if(c[l]==c[l+1])
                 {
                     two=two+1;
                     temp[n]=c[l];
                     n++;
                 }

             }
         for(int m=b;m<3+b;m++)
             {
                 if (c[m]==c[m+2])
                 {
                     two=two-2;
                     three=three+1;
                     high1=c[m];
                     if(two==1)
                        {
                           if(temp[0]==c[m])
                             high2=temp[1];
                           else
                             high2=temp[0];
                        }
                   else
                   {
                       high2=c[m+3];
                   }


                }

          }
       for(int q=b;q<2+b;q++)
          {
              if(c[q]==c[q+3])
                 {
                   two=two-3;
                   three=three-2;
                   four=four+1;
                   high1=c[q];
                   if(q==0)
                       high2=c[4];
                   else
                        high2=c[0];
                }
        }
     if(two==1)
       p='B';
     if (two==2)
        p='C';
     if(three==1)
     {
         if (two==1)
            p='G';
         else
            p='D';
     }
     if(four==1)
        p='H';
     if(str==1 && fl==1)
        p='I';

     if(str==1 && fl==1 && c[4]>9)
        p='J';
     if(str!=1 && fl!=1 && two!=1 && three!=1 && four!=1)
     {
         p='A';
         high1=c[0];
         high2=c[1];
     }

}




};
int main()
{

    int counter=0,anti=0;
    read();
    play player1,player2;
    b=0;
    while(b<=10000)
    {
        player1.check(b);
        b=b+5;
        player2.check(b);
        b=b+5;
        if((int)player1.p>(int)player2.p)
            {
             counter++;
            }

        else if((int)player1.p==(int)player2.p)
           {
             if(player1.high1>player2.high1)
                counter++;

        if(player1.high1==player2.high1)
           {
               if(player1.high2>player2.high2)
                  counter++;

           }

         }

    }
        anti++;
    cout<<b;
cout<<a[100][1];
cout<<counter;
 return 0;
}


Что я уже пробовал:

я использовал другую переменную для выполнения цикла вместо b и других циклов(для & do).

я думаю, что у меня есть проблема с отступом, но я не могу понять этого.

jeron1

char a[10000][2];
int b=0;
using namespace std;
void read()
{
     int i;
     for(i=0;i<=10000;i++)
       {

          infile>>a[i][0]>>a[i][1];
       }
}


Самый большой индекс в массиве a-это a[9999][1], Вы для цикла в методе read() пытаетесь получить доступ к a[10000][1], это, вероятно, приведет к нарушению доступа.

1 Ответов

Рейтинг:
5

Patrice T

Цитата:
Мой цикл while внутри main() работает не более одного раза?

На первый взгляд, я не вижу причин для того, чтобы зацикливаться только один раз.
добавьте эту линию внутри цикла, чтобы иметь след цикла.
cout<<b;

-----
Ваш код ведет себя не так, как вы ожидаете, и вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что вы должны делать, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладка кода C# в Visual Studio - YouTube[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.