Форум программистов, компьютерный форум CyberForum.ru

Рекурсивный спуск - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как правильно инициализировать статические члены класса? http://www.cyberforum.ru/cpp-beginners/thread43235.html
Я новичок и заранее прошу прощение за тупые вопросы. Имеются два класса: Solution и Pool. Pool состоит из нескольких обьектов класса Solution. Эти обьекты отличаются только переменными *x и y. Все остальные члены одинаковы: **a, n, yFunc. Чтобы предотвратить копирование **a и n во все обьекты Solution, я обьявил их как static. Вопрос такой: правильно ли я инициализирую **a и n внутри конструктора...
C++ Как в консольном приложении узнать текущую директорию? Пишу в Visual C++ 2008. http://www.cyberforum.ru/cpp-beginners/thread43166.html
C++ Условия на переменные
В методе минимизации Ньютона-Рафсона у меня есть условия на переменные.Эта тему уже обсуждалась здесь, но я хотела бы повторится, так как для меня вопрос не остался закрытым и ответ я на него не нашла. Например, я на кладываю условие на вектор: for (i = 0; i < n; i++) { if (x <= 0.0) { printf("x<=0!\n"); ...
C++ Работа с файлами. Срочно
Нужно переделать программу так, чтобы изначально строка считывалась из файла, который предположим в корневом каталоге. и записать результат в другой файл ("результат") #include <string.h> #include <stdio.h> #include <conio.h> void fab(char s1,char s2) {int i,line,line2,lineb; line=strlen(s1);
C++ Не работает цикл for С++ Borland http://www.cyberforum.ru/cpp-beginners/thread42959.html
Элементарная программа: #include <iostream.h> #include <graphics.h> #include <math.h> #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <dos.h> void main ()
C++ Чтение с TDBGrid Уважаемые коллеги! Подскажите, как мне наиболее корректно прокрутить одну комбинацию. Надо из приложения MFC считать содержимое элемента окна другого приложения (написанного на Delphi), а именно - компонента TDBGrid. Окно приложения-родителя нахожу легко (CWnd* FindWindow() ), потом получаю список детей, ищу дочернее окошко, в котором еще раз дочернее и так далее до необходимой глубины. Наконец,... подробнее

Показать сообщение отдельно
anaberne
Сообщений: n/a
08.07.2009, 22:16     Рекурсивный спуск
Догадка оказалась верной, не считало конец строки, поэтому сделал топорно: ставим точку в конце и все гуд.
пример для ввода: asdff>fdsfs.
массив2 (tmp) будет выглядеть криво, но если вводить маленькие значения: asd>dsa. - он выглядит отлично, не подскажите почему??

далее вопросы по задаче:
Как лучше обнулить массив mas для того, чтобы его заново сделать со 2м операндом
Как как их потом сравнить, доведя до strcmp (или подобной функции, которая сравнивает и ей пофиг на то заглавная ли буква или нет).

Код
/*2.	Отношение Операнд знак Операнд, где Операнд - целое или имя  переменной
 (последовательность латинских букв и цифр, начинающаяся не с цифры), знак
  - это знак отношения (>, <, =, <>, >=, <=). Семантическая процедура
   - сгенирировать программу на С++, запрашивающую значения переменных
    (целые числа)  и проверяющую истинность отношения.*/
#include <iostream.h>
//#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>



using namespace std;

char Ch;
int Pos;
int i=0;
//int j=0;
char *mas = new char[i];
char *tmp = new char[i];
//char *zn = new char[j];

// считываем след. символ.
void NextCh()
{
   cin>>Ch;
   Pos++;
   while ( Ch == ' ');

}

//сброс строки
void ResetText()
{
   cout << "vvedite stroku\n" ;
   Pos = 0;
   NextCh();
}

/*void setw (int p)
{
for (int i=0; i<p; i++)
   {
   cout << " ";
   } 
}*/
// ошибка
void Error(char *Message)
{  
  // cout << setw(Pos)<< "^\n" ;
   cout <<  "error:\n "  << Message;
  }



//проверка знака между операндами
void Sign()
{
     //cout << "sign na4alo\n";
                   //int j=0;
                   if (Ch=='>')
                   {//zn[j]=Ch;
                    //j++;
                    NextCh ();
                     
                         if (Ch=='=' || Ch=='<')    
                            {//zn[j]=Ch;
                             //j++;
                             NextCh();
                            //cout << "Ya tut\n";
                            }
                         
                   }     
                 

                 else if (Ch=='<')
                 {//zn[j]=Ch;
                  //j++;
                  NextCh (); 
                         
                         if (Ch=='=' || Ch=='>')    
                            {//zn[j]=Ch;
                             //j++;
                             NextCh();
                            //cout << "ya tut2\n";
                            }
                  }

                  else if (Ch=='=')
                  {
                  //zn[j]=Ch;
                  //j++;   
                  NextCh();
                  }
                               
     
                  else Error("\nnet znaka");        
                  //cout << "konec sign\n";
                  //cout << "\nZnak: " <<zn;
        
}


//считываем операнд. Может начинаться с буквы и далее число или буква, может с целого.
void Operand()
{ 
     //cout << "Operand na4alo\n";
               if ((Ch>='a') && (Ch<='z') || (Ch>='A') && (Ch<='Z')) //если первый символ
               {mas[i]=Ch;
               
               NextCh ();
                
                     while (((Ch>='a') && (Ch<='z')) || ((Ch>='0') && (Ch<='9')) || ((Ch>='A') && (Ch<='Z')))
                                {i++;
                                 mas[i]=Ch;
                                
                                NextCh();
                                //cout << "ya tut v bukvah\n";
                               
                                }
                }
                else if ((Ch>='0') && (Ch<='9'))// если целое
                {mas[i]=Ch;
                 NextCh ();
                          while ((Ch>='0') && (Ch<='9'))
                          {i++;
                           mas[i]=Ch;
                          NextCh();
                          //cout << "ya tut v 4islah\n";
                          }
                }
                          
                else if (Ch=='+' || Ch=='-') // если целое со знаком
                {mas[i]=Ch;
                 
                          NextCh();
                          if ((Ch>='0') && (Ch<='9'))
                          {i++;
                           mas[i]=Ch;
                          NextCh ();
                          }
                          while ((Ch>='0') && (Ch<='9'))
                          {
                          i++;
                           mas[i]=Ch;
                          NextCh();
                          //cout << "ya tut v 4islah\n";
                          }
                }
                 
                else Error("\ns nepravil'nogo simvola");
                cout << "\nMassiv: " << mas;
            //cout << "Operand konec\n";
                
            
}

void zapusk()   // запускает все дело, но сама она из main ... не стал туда засовывать.
{
Operand();
/*cout << "\nPosition: " << Pos;
for (int i = 0; i<Pos-1; i++)
  {
   tmp[i] = mas[i];
  }
  
Pos++;  */
memcpy(tmp, mas, sizeof(tmp)); 

cout << "\nmassiv2: " << tmp;
Sign();
if (Ch!='.') //топорный вызов операнда если еще не конец строки, хотел сделать это дело в операнде на выходе,
              // типо если конец строки - выйти, если нет - то запустить sign() , но много if надо.
{
Operand();
}
else Error ("\nOperand 2 otsutstvuet");
  
}

int main()
{  
   ResetText();
   zapusk(); //запускаем функцию старта))
   if (Ch!='.') Error("\nojidanie stroki\n");
   else
      cout << "\nVse OK\n " ;
   getch();
 return 0;
}
Добавлено через 8 часов 38 минут 19 секунд
в итоге получилась такая программулина, есть у кого предложения по упрощению?? Ток не надо про повторные проверки в отдельную функцию, лучше чего координальное)
Еще один косяк по + и - в целых, но я эт доделаю...

Код
/*2.	Отношение Операнд знак Операнд, где Операнд - целое или имя  переменной
 (последовательность латинских букв и цифр, начинающаяся не с цифры), знак
  - это знак отношения (>, <, =, <>, >=, <=). Семантическая процедура
   - сгенирировать программу на С++, запрашивающую значения переменных
    (целые числа)  и проверяющую истинность отношения.*/
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>



using namespace std;



char Ch;
int Pos;
int p=0;
int i=0;
int j=0;
int k=0;
//char *mas = new char[i];
//char *tmp = new char[j];
char mas[40];
char tmp[40];
char zn[2];

/*------------Считывание следующего символа---------------*/
void NextCh()
{
   cin>>Ch;
   Pos++;
   while ( Ch == ' ');

}



/*---------Сброс строки---------------*/
void ResetText()
{

   cout << "vvedite stroku\n" ;
   Pos = 0;
   NextCh();

}

/*-------------Копирование массива------------------*/
void mascopy()
{
for (int j = 0; j<i+1; j++)
  {
  tmp[j] = mas[j];
  }         
}


/*------------Вывод ошибки---------------*/
void Error(char *Message)
{  
  // cout << setw(Pos)<< "^\n" ;
   cout <<  "error:\n "  << Message;
}

/*-------------Проверка на принадлежность числу------------*/
void number()
{
  while ((Ch>='0') && (Ch<='9'))
  {
  i++;
  mas[i]=Ch;
  NextCh();
  }
}

/*------------Проверка в < или > на то, не равны ли переменные-------------------*/
void ravno()
{
      int i=0;
      while((int)tmp[i]==(int)mas[i])
              {
              i++;
              }
      if (i<40) cout << "\nVerno! ";
      else  cout << "\nNeverno!";         
}
/*--------------Сравнение операндов-----------------*/
void sravnenie()
{
   
  if (zn[0]=='=')
      // if (mas[0]=='-' && tmp[0]!='-')
      {
      int i=0;
      while((int)tmp[i]==(int)mas[i])
              {
              i++;
              }
      if (i<40) cout << "\nNeverno! ";
      else  cout << "\nVerno!";       
      }

    else if (zn[0]=='<' && zn[1]=='=')
      {
      int i=0;
      while((int)tmp[i]<=(int)mas[i])
              {
              i++;
              
              }
      if (i<40) cout << "\nNeverno! ";
      else  cout << "\nVerno!";       
      }
      
      else if (zn[0]=='>' && zn[1]=='=')
      {
      int i=0;
      int m=0;
      while((int)tmp[i]>=(int)mas[i])
              {
              i++;
              
              }
      if (i<40) cout << "\nNeverno! ";
      else  cout << "\nVerno!";       
      }
      
      else if (zn[0]=='<' && zn[1]=='=')
      {
      int i=0;
      while((int)tmp[i]<=(int)mas[i])
              {
              i++;
              
              }
      if (i<40) cout << "\nNeverno! ";
      else  cout << "\nVerno!";       
      }
      
      else if (zn[0]=='>')
      {
      int i=0;
       while((int)tmp[i]>=(int)mas[i])
              {
              i++;
              
              }
      //cout << "\n I = " << i;        
      if (i>39)
      {
       ravno();
      }
       else  cout << "\nNeverno!";
       } 
      else if (zn[0]=='<')
      {
      int i=0;
      while((int)tmp[i]<=(int)mas[i])
              {
              i++;
              
              }
      //cout << "\n I = " << i;        
      if (i>39)
      {
               ravno();
      /*int i=0;
      while((int)tmp[i]==(int)mas[i])
              {
              i++;
              }
      if (i<40) cout << "\nVerno! ";
      else  cout << "\nNeverno!";*/         
      }
      else  cout << "\nNeverno!"; 
      }
      
}
  
             


/*-------------Проверка знака между операндами----------------*/
void Sign()
{
     //cout << "sign na4alo\n";
                   //int j=0;
                   if (Ch=='>')
                   {zn[k]=Ch;
                    
                    NextCh ();
                     
                         if (Ch=='=')    
                            {        k++;
                                     zn[k]=Ch;
                             //j++;
                             NextCh();
                            //cout << "Ya tut\n";
                            }
                         
                   }     
                 

                 else if (Ch=='<')
                 {zn[k]=Ch;
                  //j++;
                  NextCh (); 
                         
                         if (Ch=='=' || Ch=='>')    
                            {        k++;
                                     zn[k]=Ch;
                             
                             NextCh();
                             
                            //cout << "ya tut2\n";
                            }
                            
                  }

                  else if (Ch=='=')
                  {
                  zn[k]=Ch;
                  //j++;   
                  NextCh();
                  }
                               
     
                  else Error("\nnet znaka");        
                  //cout << "konec sign\n";
                  //cout << "\n k Znak: " << k;
        
}


/*------------Проверка операндов (c буквы (далее символ/буква) или целое число------------------*/
void Operand()
{ 
     //cout << "Operand na4alo\n";
     //cout << "\nPosition: " << i;
               
               i=0;
               i--;
               if ((Ch>='a') && (Ch<='z') || (Ch>='A') && (Ch<='Z')) //если первый символ
               {i++;
               //cout << "\nPosition: " << i;
                mas[i]=Ch;
               
               NextCh ();
                
                     while (((Ch>='a') && (Ch<='z')) || ((Ch>='0') && (Ch<='9')) || ((Ch>='A') && (Ch<='Z')))
                                {i++;
                                 mas[i]=Ch;
                                
                                NextCh();
                                //cout << "ya tut v bukvah\n";
                               
                                }
                }
                else if ((Ch>='0') && (Ch<='9'))// если целое
                {    i++;
                     mas[i]=Ch;
                
                 NextCh ();
                 number();
                          //cout << "ya tut v 4islah\n";
                         
                }
                          
                else if (Ch=='+' || Ch=='-') // если целое со знаком
                {    i++;
                     mas[i]=Ch;
                 
                          NextCh();
                          if ((Ch>='0') && (Ch<='9'))
                          {i++;
                          mas[i]=Ch;
                          NextCh ();
                          number();
                          }
                          //cout << "ya tut v 4islah\n";
                          else Error("Neverno vvedeno 4islo");
                          
                }
                 
                else Error("\ns nepravil'nogo simvola");
                //cout << "\nMassiv: " << mas;
            //cout << "Operand konec\n";
                
            
}

/*------------Общий запуск-----------------*/

void zapusk()   
{
Operand();
mascopy();
//cout << "\nPosition: " << i;

memset (mas, 0, 40);
//cout << "\nMassiv posle o4istki: " << mas;

//Pos++;  
//memcpy(tmp, mas, sizeof(i));

//cout << "\nmassiv2: " << tmp;
Sign();
//cout << "\nZnak:  " << zn;
if (Ch!='.') //топорный вызов операнда если еще не конец строки, хотел сделать это дело в операнде на выходе,
              // типо если конец строки - выйти, если нет - то запустить sign() , но много if надо.
{
Operand();
//cout << "\nPered sravneniem \ntmp:" << tmp << "\nmas:" << mas;
sravnenie();
}
else Error ("\nOperand 2 otsutstvuet");
  
}


/*---------------Мэйн есть мэйн----------------*/
int main()
{  
   ResetText();
   zapusk(); //запускаем функцию старта))
   if (Ch!='.') Error("\nojidanie stroki\n");
   else
       //cout << "\nV konce i = " << i;
      cout << "\nVse OK\n " ;
   getch();
 return 0;
}
 
Текущее время: 07:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru