вопрос по С++

Модератор: Злобный

Аватара пользователя
=MIA=
Отец
Сообщения: 4635
Зарегистрирован: Сб июл 02, 2005 15:25
Откуда: Кишинев
Контактная информация:

вопрос по С++

Сообщение =MIA= »

уважаемые програмисты...объясните пожалуйста задачу:
Условие: Программа рисует цветок, который летает по кривой...(у меня не совсем кривая...но главное летает)...надо чтоб этот цветок останавливал полет при нажатии пробела и летел дальше по нажатию двух пробелов...уже неделю мучаемся и все никак..
вот сам код

Код: Выделить всё

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include<dos.h>
class cDrawing
{private:
int midx, midy;

public:
void flower(int color)
{int stangle = 180, endangle = 360;
int xrad = 30, yrad = 60;
/**************down sector********************************/
setcolor(color);
setfillstyle(SOLID_FILL,color);

sector(midx, midy, stangle, endangle, xrad, yrad);
/*************left sector*********************************/
sector(midx-10, midy, stangle, endangle-225, xrad-10, yrad-10);
/*************right sector************************/
sector(midx+10, midy, stangle-180, endangle-315, xrad-10, yrad-10);
/*************middle sector*************************/
int poly[5];
setcolor(BLACK);

poly[0] =midx;
poly[1] =midy-35;

poly[2] =midx+10;
poly[3] =midy;

poly[4] =midx-10;
poly[5] =midy;

poly[6] =poly[0];
poly[7] =poly[1];

setfillstyle(SOLID_FILL,color);
fillpoly(4,poly);

}
/******************************************/
void move()
{int z=175; char c;
while(z<426)
 {while(midx<z)
  {flower(RED);
    delay(100);
    flower(BLACK);
    midx=midx+5;
    midy=midy+5;
   }
z=z+125;
  while(midx<z)
  { flower(RED);
    delay(100);
    flower(BLACK);
    midx=midx+5;
    midy=midy-5;
   }
z=z+125;
 }
}
/*****************/
cDrawing()
{midx=50;midy=150;}
};
/*******************************************************/
int main(void)
{cDrawing p;

   /* request auto detection */
   int gdriver = DETECT, gmode, errorcode;

   /* initialize graphics and local variables */
   initgraph(&gdriver, &gmode, "C:\\TC\\BGI");

   /* read result of initialization */
   errorcode = graphresult();
   if (errorcode != grOk)  /* an error occurred */
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
      printf("Press any key to halt:");
      getch();
      exit(1); /* terminate with an error code */
   }

p.flower(RED);
p.move();
/******************************************/
   /* clean up */
   getch();
   closegraph();
   return 0;
}
Аватара пользователя
stalin
Завсегдатай
Сообщения: 2928
Зарегистрирован: Чт июн 10, 2004 00:02

Сообщение stalin »

домашние задание..ну и ну! :lol:
Аватара пользователя
sadman
Завсегдатай
Сообщения: 2001
Зарегистрирован: Чт дек 15, 2005 23:46
Откуда: с ботаники
Контактная информация:

Сообщение sadman »

для начала: в классе cDrawing ты объвляешь массив poly типа int, из 5
элементов, а дальше встречаются строки poly[6] =poly[0] и poly[7]=poly[1]! Массив по-больше короче нужен;)

К сожалению в данный момент нет возможности тестить, но, попробую чем-нибудь помочь. Единственное что пока приходит в голову это метки :( . Итак:

Код: Выделить всё

void move() 
{int z=175; char c; 
Label:
do
{
  while(z<426) 
   {while(midx<z) 
     {flower(RED); 
       delay(100); 
       flower(BLACK); 
       midx=midx+5; 
       midy=midy+5; 
     } 
   z=z+125; 
   while(midx<z) 
    { flower(RED); 
      delay(100); 
      flower(BLACK); 
      midx=midx+5; 
      midy=midy-5; 
     } 
   z=z+125; 
   if(!kbhit())goto Label; // если в этом месте не произошло нажатия на клаве - продолжаем не проверяя условие!
 } 
while((int)getch()!=32); //тут проверяется был-ли нажат Пробел. 
if((int)getch()==32)if((int)getch()==32)goto Label; // 2 пробела
} 
Маленькая оговорка - после остановки движения листа, он двигается после 2-х нажатий на пробел, НО, интервал между нажатиями неограничен. То-есть ты можешь сразу нажать 2 пробела, а можешь нажать, пойти попить чаю и потом нажать еще раз и цветок двинется.

зы за работу кода не отвечаю, т.к. см. время ;)
webmoon
Юзер
Сообщения: 204
Зарегистрирован: Ср сен 01, 2004 23:41
Откуда: Moldova
Контактная информация:

Сообщение webmoon »

sadman,
Опять этот go to.
Аватара пользователя
sadman
Завсегдатай
Сообщения: 2001
Зарегистрирован: Чт дек 15, 2005 23:46
Откуда: с ботаники
Контактная информация:

Сообщение sadman »

webmoon,
да сам не люблю и никогда не использую. но я тут подумал, в принципе можно рекурсией заменить goto! но для начала надо переделать пару строчек (не успел отредактировать))):
вместо

Код: Выделить всё

if(!kbhit())goto Label; // если в этом месте не произошло нажатия на клаве - продолжаем не проверяя условие! 
 } 
while((int)getch()!=32); //тут проверяется был-ли нажат Пробел. 
вставляем

Код: Выделить всё

if(kbhit())c = getch();
}
while((int)c!=32);
=MIA=,
если с метками не понравится, могу показать как с рекурсией
Аватара пользователя
=MIA=
Отец
Сообщения: 4635
Зарегистрирован: Сб июл 02, 2005 15:25
Откуда: Кишинев
Контактная информация:

Сообщение =MIA= »

stalin,
смеешься да...а нам каково...

sadman,
[off]я думала ты уже забыл про форум..рада видеть=)[/off]
боюсь чтоо не понравится ей go to, попробуй с рекусией...а я пока с метками проверю...
Аватара пользователя
sadman
Завсегдатай
Сообщения: 2001
Зарегистрирован: Чт дек 15, 2005 23:46
Откуда: с ботаники
Контактная информация:

Сообщение sadman »

=MIA=,
[off]тебя тоже давно не видел)))[/off]

ну собсна схема проста. во первых переменную z мы уберём отсюда, и будем ее передавать как параметр функции:

Код: Выделить всё

void move(int z)...
дальше все просто, для ясности привожу еще раз листинг всей функции move, тока уже без комментов:

Код: Выделить всё

void move(int z) 
{
char c; 

do 
{ 
  while(z<426) 
   {while(midx<z) 
     {flower(RED); 
       delay(100); 
       flower(BLACK); 
       midx=midx+5; 
       midy=midy+5; 
     } 
   z=z+125; 
   while(midx<z) 
    { flower(RED); 
      delay(100); 
      flower(BLACK); 
      midx=midx+5; 
      midy=midy-5; 
     } 
   z=z+125; 
   if(!kbhit())move(z);
 } 
while((int)getch()!=32); 
if((int)getch()==32)if((int)getch()==32)move(z); 
} 
вроде так.
Аватара пользователя
=MIA=
Отец
Сообщения: 4635
Зарегистрирован: Сб июл 02, 2005 15:25
Откуда: Кишинев
Контактная информация:

Сообщение =MIA= »

что-то он ругается благим матом "Declaration terminaed incorrectly" :ermm:
Аватара пользователя
sadman
Завсегдатай
Сообщения: 2001
Зарегистрирован: Чт дек 15, 2005 23:46
Откуда: с ботаники
Контактная информация:

Сообщение sadman »

на что ругается, конкретно? на какой из двух кодов и на какую строку?
Аватара пользователя
=MIA=
Отец
Сообщения: 4635
Зарегистрирован: Сб июл 02, 2005 15:25
Откуда: Кишинев
Контактная информация:

Сообщение =MIA= »

на код с рекурсией на строку do и на конец программы..
Аватара пользователя
sadman
Завсегдатай
Сообщения: 2001
Зарегистрирован: Чт дек 15, 2005 23:46
Откуда: с ботаники
Контактная информация:

Сообщение sadman »

наконец-то поставил себе Турбо Си! (перешел блин, с Visual Studio 6 на dos :D)
вот функция move() без рекурсий и меток! все проще чем я думал ))):

Код: Выделить всё

void move() 
{int z=175; char c; 
while(z<426)
 {while(midx<z) 
  {flower(RED); 
    delay(100); 
    flower(BLACK);
    midx=midx+5;
    midy=midy+5;
    if(kbhit())if((int)getch()==32)
                 {
                  flower(RED);
                  if((int)getch()==32)if((int)getch()==32);else delay(1000);
                 }
   }
z=z+125;
  while(midx<z)
  { flower(RED);
    delay(100);
    flower(BLACK);
    midx=midx+5; 
    midy=midy-5;
   if(kbhit())if((int)getch()==32)
                {
                  flower(RED);
                  if((int)getch()==32)if((int)getch()==32);else delay(1000);
                }
   }
z=z+125; 
 } 
} 
Аватара пользователя
=MIA=
Отец
Сообщения: 4635
Зарегистрирован: Сб июл 02, 2005 15:25
Откуда: Кишинев
Контактная информация:

Сообщение =MIA= »

sadman,
оо..премного благодарна))
Аватара пользователя
sadman
Завсегдатай
Сообщения: 2001
Зарегистрирован: Чт дек 15, 2005 23:46
Откуда: с ботаники
Контактная информация:

Сообщение sadman »

=MIA=,
на здоровье)))
Veronika86
Новичок
Сообщения: 12
Зарегистрирован: Сб ноя 25, 2006 12:53

Сообщение Veronika86 »

как наити НОД 2-х чисел по алгоритму Евклида и сделать программу на c++
dmn
Юзер
Сообщения: 177
Зарегистрирован: Вт мар 01, 2005 22:25

Сообщение dmn »

Veronika86,
[off]Снимаю шляпу. 10 сообшений - 3 замечания. Респект!!![/off]
Аватара пользователя
=MIA=
Отец
Сообщения: 4635
Зарегистрирован: Сб июл 02, 2005 15:25
Откуда: Кишинев
Контактная информация:

Сообщение =MIA= »

объясните пожалуйста как вот в этой проге сделать шаблонированный класс

Код: Выделить всё

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<iostream.h>
class cStroka
{
public:
char *s;

 cStroka(){s=new char[1];s[0]='\x0';}
 cStroka(char*);

/***************************/
cStroka operator+(int x)
 {
  int d; cStroka str;
  delete []str.s;

  d=strlen(this->s);
  str.s=new char[d+x];
	/*****/
  for(int i=0;i<d;i++)
  {*(str.s+i)=this->s[i];}

  for(i=d;i<(d+x);i++)
  {*(str.s+i)='*';}
  str.s[i]='\0';

  return str;
 }
/*********************************/
cStroka operator+(float f)
 {
  int d; cStroka str;
  delete []str.s;

  d=strlen(this->s);
  str.s=new char[d+f];
	/*****/
  for(int i=0;i<d;i++)
  {*(str.s+i)=this->s[i];}

  for(i=d;i<(d+f);i++)
  {*(str.s+i)='*';}
  str.s[i]='\0';

  return str;
 }
/*****************************/
friend int operator+(cStroka &);


};

/*** konstr. kopirovania ***/
cStroka::cStroka(char *st)
{strcpy(s,st);}

/***********************************/
int operator+(int x,const cStroka& A)
{ int t=strlen(A.s)+x;
  return t;
}

/*********************************/
void main()
{clrscr();
 char *st;
 cout<<"vvedite stroku:"<<endl;
 cin>>st;
 cStroka s1(st);

 int x=0;
 cout<<"vvedite cislo"<<endl;
 cin>>x;

 float f=0;
 cout<<"vvedite cislo"<<endl;
 cin>>f;

 cStroka s2=s1+x;
 int v=0;v=x+s1;

 printf("\n%s\t%d",s2,v);
 getch();
}
Аватара пользователя
dmitriid
Новичок
Сообщения: 28
Зарегистрирован: Пн ноя 06, 2006 17:16
Контактная информация:

Сообщение dmitriid »

webmoon писал(а):sadman,
Опять этот go to.
При грамотном использовании _к месту_ goto облегчает жизнь программисту. Есть ситуации, когда без него не обойтись.

Например, выход по break во вложенных циклах, это ничто иное, как замаскированный goto:

Код: Выделить всё

for(;;)
{
    for(;;)
    {
       if(cond()) break;
    }
}

Код: Выделить всё

for(;;)
{
    for(;;)
    {
       if(cond()) goto label;
    }
}
:label
Аватара пользователя
sadman
Завсегдатай
Сообщения: 2001
Зарегистрирован: Чт дек 15, 2005 23:46
Откуда: с ботаники
Контактная информация:

Сообщение sadman »

dmitriid,
могу предложить вариант как выйти из вложеных циклов БЕЗ goto:

Код: Выделить всё

for(i=0; i<50; i++)
{
  for(j=0; j<100; j++)
  { 
     ......
     if(cond()){ i=50; j=100; continue; }
     ......
  }
}
Аватара пользователя
keisik
Юзер
Сообщения: 197
Зарегистрирован: Вс фев 26, 2006 23:29

Сообщение keisik »

sadman, имхо, вариант тоже не очень. имхо лучший вариант - вообще выходить из функции, а если уж нельзя - то завести флажок на продолжение циклов и проверять его тоже.
dmitriid [off] на всякий случай - break прервёт только внутренний цикл, так что аналогия несколько неверная ;)[/off]
Аватара пользователя
dmitriid
Новичок
Сообщения: 28
Зарегистрирован: Пн ноя 06, 2006 17:16
Контактная информация:

Сообщение dmitriid »

sadman писал(а):dmitriid,
могу предложить вариант как выйти из вложеных циклов БЕЗ goto:

Код: Выделить всё

for(i=0; i<50; i++)
{
  for(j=0; j<100; j++)
  { 
     ......
     if(cond()){ i=50; j=100; continue; }
     ......
  }
}
Это тот же goto только в профиль :) Вернее, эмуляция goto другими средствами

[off]добавлено спустя 33 секунды:[/off]
keisik писал(а): dmitriid [off] на всякий случай - break прервёт только внутренний цикл, так что аналогия несколько неверная ;)[/off]
Согласен :) Что-то меня сглючило :) Но идея понятна :)
Ответить

Вернуться в «Программирование»