Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Траектории черепахи (задача)поправте код 
V
    Опции темы
mato
Дата 16.3.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 16.3.2010

Репутация: нет
Всего: нет



Есть задачка по моделяции перемещения черепахи на доске 20*20. Возможно кто-то встречал.
Нужно что бы она реагировала на команды следующим образом:
Input 1 - pero vverh
Input 2 - pero vniz
Input 3 - napravo
Input 4 - nalevo
Input 5.x - pereiti vpered na 'x' shagow"<<endl;
Input 6 - print track
Input 9 - End of date
вот код не могу понять как дороботать 
Код
const int stolb = 20;
    const int stroka =20;
    int floor[stroka][stolb]={0};
    int horizont1(int [][stolb],int,int,int);
    int vertikal1(int [][stolb],int,int,int);
        void runfloor(int [][stolb],int,int,int);
        void printfloor(int [][stolb],int,int);
        
        void main()
    { 
        int comand=0;
        int n=0, q=0,n1=0;
        int vertikal=0;
        int  horizont=0;
        int left=0,right=0;
        while(q<20)
        {
            
        cin>>comand;
        switch(comand)
        {
        case 2:
        printfloor(floor,stroka,stolb);
        break;
        case 3:
            right = 1;
        break;
        case 4:
        left =1;
        break;
        case 5:
            cin >> n;
            for(int x=0;x<n;x++)
            {
                if(right==0 && left == 0)
                horizont = horizont1(floor,vertikal,horizont,right);
                if(right==1 && left == 1)
                    horizont = horizont1(floor,vertikal,horizont,right);
            }
            for( int y=0;y<n;y++)
            {

            if(right == 0 && left == 1)
                 vertikal = vertikal1(floor,vertikal,horizont,left);
            if(right==1 && left==0)
                vertikal = vertikal1(floor,vertikal,horizont,left);
            }    
            
            
                
        }
        
        q++;
        }
        }
        
        int horizont1(int fl[][stolb],int v,int h, int lef)
        {
            if(lef ==1)
            {fl[v][h--]=1;
            return h;
            }
            else{

            fl[v][h++]=1;
            
            return h;
            }
        }
        void printfloor(int f[][stolb],int strok,int stol)
        {
            for(int x=0;x<stroka;x++)
            {
                for(int y=0;y<stol;y++)
                
                    cout << f[x][y];
            cout <<endl;
                }
        }

        int vertikal1(int flo[][stolb],int stroka,int stob,int lef)
        {
            if(lef==1)
            {
                flo[stroka--][stob]=1;
                return stroka;
            }
            else
            {
        
            flo[stroka++][stob]=1;
            
            return stroka;
            }
        
        }




Модератор: Не забываем пользоваться кнопочкой "Код"

Это сообщение отредактировал(а) bsa - 16.3.2010, 16:44
PM MAIL   Вверх
bsa
Дата 16.3.2010, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Для начала так, как написано тут.
PM   Вверх
t_gran
Дата 17.3.2010, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: нет
Всего: 37



Цитата

вот код не могу понять как дороботать 


Что именно не получается и что необходимо конкретно доработать?

Сейчас на работе заняться нечем было, вот, по быстрому наклепал свою версию. Если надо, забирайте. smile
Код

#include <stdio.h>
#include <stdlib.h>

enum EDirect {STOP= 0, UP, DOWN, LEFT, RIGHT};

struct TPosition
{
   int x, y;
   enum EDirect d;
};

//----------------------------------------------//
void PrintField (struct TPosition theTurtle, char **theTrack, int theX, int theY)
{
//   system("cls");
   const char CFloor= '.';
   const char CTrack= '*';
   const char CTurtle[5]= {'@', '\30', '\31', '\33', '\32'};
   int i, j;
   for (i= 0; i<theY; ++i)
   {
      for (j= 0; j<theX; ++j)
      {
         if (theTurtle.x == j && theTurtle.y == i)
            putchar(CTurtle[theTurtle.d]);
         else
            putchar(theTrack[i][j] ? CTrack : CFloor);
      }
      putchar('\n');
   }
}
//----------------------------------------------//
void Move (struct TPosition *theTurtle, char **theTrack, int theX, int theY, int theStep)
{
   int i, buff;
   switch (theTurtle->d)
   {
      case UP:
         while (theStep-- && theTurtle->y != 0)
            theTrack[theTurtle->y--][theTurtle->x]= 1;
      break;

      case DOWN:
         while (theStep-- && theTurtle->y != theY-1)
            theTrack[theTurtle->y++][theTurtle->x]= 1;
      break;

      case LEFT:
         while (theStep-- && theTurtle->x != 0)
            theTrack[theTurtle->y][theTurtle->x--]= 1;
      break;
      
      case RIGHT:
         while (theStep-- && theTurtle->x != theX-1)
            theTrack[theTurtle->y][theTurtle->x++]= 1;
      break;
   }
//   theTurtle->d= STOP;
}
//----------------------------------------------//
int main (int argc, char **argv)
{
   const int X= 20;
   const int Y= 20;
   int i;
   char **track= (char **) calloc(Y, sizeof(char *));
   for (i= 0; i<Y; ++i)
      track[i]= (char*) calloc(X, sizeof(char));

   struct TPosition turtle= {0, 0, STOP};

   char key[8];
   int step;
   do
   {
      system("cls");
      PrintField(turtle, track, X, Y);
      printf("\n[u]p [d]own [r]ight [l]eft [m]ove (format: m[STEP_DIGIT]) [q]uit\n: ");
      scanf("%7s", key);
      switch (*key)
      {
         case 'u':
            turtle.d= UP;
         break;

         case 'd':
            turtle.d= DOWN;
         break;

         case 'r':
            turtle.d= RIGHT;
         break;

         case 'l':
            turtle.d= LEFT;
         break;

         case 'm':
            step= 1;
            sscanf(key+1, "%d", &step);
            Move(&turtle, track, X, Y, step);
         break;
      }
   }
   while (*key != 'q');

   return 0;
}


Единственное, что мне не нравиться вводить цифры, поэтому вводятся буквы [u]p, [l]eft и т.п., а перемещение [m]ove, причём число должно следовать сразу после буквы (например m3 или m12). Если цифру не указываете то перемещается всего на 1.

Исходник с исполняемым файлом ниже. smile


Это сообщение отредактировал(а) t_gran - 17.3.2010, 09:50

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  turtle.zip 2,10 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
mato
Дата 18.3.2010, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 16.3.2010

Репутация: нет
Всего: нет



спасибо что отозвалса 
но я уже сам написал
я только учсь даже ищо до указателей не дошол не то что до класов
вот мой код 
Код
const int stolb = 20;
    const int stroka =20;
    int floor[stroka][stolb]={0};
    int horizont1(int [][stolb],int,int,int);
    int vertikal1(int [][stolb],int,int,int);
    void printfloor(int [][stolb],int,int);
    int runfloor(int [][stolb]);
        
        void main()
    { 
        enum direct{west,east,north,south};
        direct compass = west;
        int comand=0;
        int n=0, q=0;
        int vertikal=0;
        int  horizont=0;
        int left=0,right=0;
        while(q<20)
        {
            
        cin>>comand;
        switch(comand)
        {
        case 6:
        printfloor(floor,stroka,stolb);
        break;
        case 3:
            right = 1;
        break;
        case 1:
            horizont=runfloor(floor);
            break;
        case 4:
        left =1;
        break;
        case 5:
            cin >> n;
            
            
                
                 if(compass==west)
                {
                    if(right == 1)
                    {
                    for(int x=0;x<n;x++)
                        vertikal = vertikal1(floor,vertikal,horizont,left);
                    compass=south;
                    }
                    else if(left==1)
                    {
                        for(int y=0;y<n;y++)
                            vertikal = vertikal1(floor,vertikal,horizont,left);
                        compass=north;
                    }
                    right=0;
                    left=0;
                }    
                 else if(compass==south)
                 {
                     if(right ==1)
                     {
                         for(int z=0;z<n;z++)
                             horizont=horizont1(floor,vertikal,horizont,right);
                             compass=east;
                     }
                     else if(left==1)
                     {
                         for(int q=0;q<n;q++)
                             horizont=horizont1(floor,vertikal,horizont,right);
                             compass = west;
                     }
                     right=0;
                    left=0;
                 }
                 else if(compass==north)
                 {
                     if(right==1)
                     {
                         for(int w=0;w<n;w++)
                             horizont=horizont1(floor,vertikal,horizont,left);
                             compass=west;
                     }
                     else if(left==1)
                     {
                         for(int e=0;e<n;e++)
                             horizont=horizont1(floor,vertikal,horizont,left);
                             compass=east;
                     }
                 }
                 else if(compass==east)
                 {
                     if(right==1)
                     {
                         for(int r=0;r<n;r++)
                         vertikal = vertikal1(floor,vertikal,horizont,right);
                     compass=north;
                     }
                     if(left == 1)
                     {
                         for(int t=0;t<n;t++)
                         vertikal = vertikal1(floor,vertikal,horizont,right);
                     compass=south;
                     }
                 }
                 break;
        }
        
        q++;
        }
        }
        
        int horizont1(int fl[][stolb],int v,int h, int lef)
        {
            if(lef ==1)
            {fl[v][h--]=1;
            return h;
            }
            else{

            fl[v][h++]=1;
            
            return h;
            }
        }
        void printfloor(int f[][stolb],int strok,int stol)
        {
            for(int x=0;x<stroka;x++)
            {
                for(int y=0;y<stol;y++)
                
                    cout << f[x][y];
            cout <<endl;
                }
        }

        int vertikal1(int flo[][stolb],int stroka,int stob,int lef)
        {
            if(lef==1)
            {
                flo[stroka--][stob]=1;
                return stroka;
            }
            else
            {
        
            flo[stroka++][stob]=1;
            
            return stroka;
            }
        
        }
        int runfloor(int mas[][stolb])
        {
            int i=0,b=5,y=0;
            for(i;i<b;i++)
                mas[y][i]=1;
            return i;
        }


Это сообщение отредактировал(а) bsa - 18.3.2010, 17:00
PM MAIL   Вверх
bsa
Дата 18.3.2010, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




 ! 
bsa
mato, замечание про использование кнопки "Код" зачем игнорируем?



M
bsa
mato, если проблема решена, то пометь тему решенной


PM   Вверх
developerplus
Дата 2.7.2011, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 2.7.2011

Репутация: нет
Всего: нет



Задача была сведена к тому что есть 4 направления (вверх, вниз, влево, вправо) и с каждого направления, при нажатии влево/вправо, выбиралось следующее направление и в зависимости от положения пера объект перемещался оставляя за собой следы или не оставляя. Пользуйтесь кодом  smile 

Код

#include <iostream>
using namespace std;

void menu(void);
void turnRight(const int x, const int y, int &side);
void turnLeft(const int x, const int y, int &side);
void moveWdraw(int &x,int &y, const int side, int a[][20]);
void moveWOdraw(int &x,int &y, const int side);


int main()
{
    int a[20][20] = {0};
    int x = 0, y = 0;
    char n;
    bool path = false;
    int side = 2;

    cout << "Current direction: " << (unsigned char) 25 << endl;

    menu();

    while((n = cin.get()) != '9')
    {
        switch(n)
        {
            case '1':
                path = false;
                cout << "draw off" << endl;
                break;
            case '2':
                path = true;
                cout << "draw on" << endl;
                break;
            case '3':        
                turnRight(x, y, side);
                break;
            case '4':
                turnLeft(x, y, side);
                break;
            case '5':
                if(path == false)
                {
                    moveWOdraw(x, y, side);
                    cout << "move" << endl;
                }
                else if(path == true)
                {
                    moveWdraw(x, y, side, a);
                    cout << "draw" << endl;
                }
                break;
            case '6':
                cout << endl << "Traced array" << endl;
                for(int i = 0; i < 20; i++)
                {
                    for(int j = 0; j< 20; j++)
                        if (a[i][j] == 1)
                            cout << '*';
                        else
                            cout << ' ';
                    cout << endl;
                }
                break;
            case '\n':
                break;
            default:
                cout <<  "Incorrect entry!" << endl;
        }
    }    

    fflush(stdin);
    getchar();
    return 0;
}

void menu(void)
{
    cout << endl;
    cout << "1 - draw off" << endl;
    cout << "2 - draw on" << endl;
    cout << "3 - turn " << (unsigned char) 26 << endl;
    cout << "4 - turn " << (unsigned char) 27 << endl;
    cout << "5 - draw/move" << endl;
    cout << "6 - print path" << endl;
    cout << "9 - exit" << endl;
    cout << endl;
}

void turnRight(const int x, const int y, int &side)
{
    if(side == 2)
    {
        if(y == 20)
            cout << "Can not be turned: " << (unsigned char) 26 << endl;
        else
        {
            side = 4;
            cout << "Current direction: " << (unsigned char) 26 << endl;
        }
    }
    else if(side == 4)
    {
        if(x == 0)
            cout << "Can not be turned: " << (unsigned char) 24 << endl;
        else
        {
            side = 1;
            cout << "Current direction: " << (unsigned char) 24 << endl;
        }
    }
    else if(side == 1)
    {
        if(y == 0)
            cout << "Can not be turned: " << (unsigned char) 27 << endl;
        else
        {
            side = 3;
            cout << "Current direction: " << (unsigned char) 27 << endl;
        }
    }
    else if(side == 3)
    {
        if(x == 20)
            cout << "Can not be turned: " << (unsigned char) 25 << endl;
        else
        {
            side = 2;                
            cout << "Current direction: " << (unsigned char) 25 << endl;
        }
    }
}

void turnLeft(const int x, const int y, int &side)
{
    if(side == 2)
    {
        if(y == 0)
            cout << "Can not be turned: " << (unsigned char) 27 << endl;
        else
        {
            side = 3;
            cout << "Current direction: " << (unsigned char) 27 << endl;
        }
    }
    else if(side == 3)
    {
        if(x == 0)
            cout << "Can not be turned: " << (unsigned char) 24 << endl;
        else
        {
            side = 1;
            cout << "Current direction: " << (unsigned char) 24 << endl;
        }
    }
    else if(side == 1)
    {
        if(y == 20)
            cout << "Can not be turned: " << (unsigned char) 26 << endl;
        else
        {
            side = 4;
            cout << "Current direction: " << (unsigned char) 26 << endl;
        }
    }
    else if(side == 4)
    {
        if(x == 20)
            cout << "Can not be turned: " << (unsigned char) 25 << endl;
        else
        {
            side = 2;
            cout << "Current direction: " << (unsigned char) 25 << endl;
        }
    }
}

void moveWdraw(int &x,int &y, const int side, int a[][20])
{
    if(side == 1)
    {
        for(int i = x; i > x - 5; i--)
            a[i][y] = 1;
        x -= 5;
    }
    else if(side == 2)
    {
        for(int i = x; i < x + 5; i++)
            a[i][y] = 1;
        x += 5;
    }
    else if(side == 3)
    {
        for(int i = y; i > y - 5; i--)
            a[x][i] = 1;
        y -= 5;
    }
    else if(side == 4)
    {
        for(int i = y; i < y + 5; i++)
            a[x][i] = 1;
        y += 5;        
    }
}

void moveWOdraw(int &x,int &y, const int side)
{
    if(side == 1)
        x -= 5;
    else if(side == 2)
        x += 5;
    else if(side == 3)
        y -= 5;
    else if(side == 4)
        y += 5;    
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0518 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.