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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.90
anaberne
Сообщений: n/a
#1

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

07.07.2009, 11:08. Просмотров 3757. Ответов 3
Метки нет (Все метки)

нужно реализовать рекурсивный спуск буквально за час, буду оч признателен. Нужно найти ошибку в синтаксисе и помочь с семантикой, либо другой вариант.

Итак, начал с синтаксиса, немного кривовато, но ниче (использую Dev 4.9.9.2) . Ошибка, не проходит 2й раз через Operand, по идее не хватает символа, но чет не соображу где теряется он

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

//using namespace std;

char Ch;
int Pos;

// считываем след. символ.
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";
                   if (Ch=='>')
                   {
                   NextCh ();
                     
                         if (Ch=='=' || Ch=='<')    
                            {
                            NextCh();
                            cout << "Ya tut\n";
                            }
                         
                   }     
                 

                 else if (Ch=='<')
                 {
                  NextCh (); 
                         
                         if (Ch=='=' || Ch=='>')    
                            {
                            NextCh();
                            cout << "ya tut2\n";
                            }
                  }

                  else if (Ch=='=')
                  {
                  NextCh();
                  }
                               
     
                  else Error("net znaka\n");        
                  cout << "konec sign\n";

        
}


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

            cout << "Operand konec\n";
            
}

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

int main()
{  
   ResetText();
   zapusk(); //запускаем функцию старта))
   if (Ch!='\0') Error("ojidanie stroki\n");
   else
      cout<<"Vse OK\n " ;
   getch();
 return 0;
}

хелп)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2009, 11:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рекурсивный спуск (C++):

рекурсивный спуск - C++
Подскажите книгу где описано рекурсивный спуск!

Рекурсивный спуск для грамматики - C++
Добрый день. Необходимо написать нисходящий разбор методом рекурсивного спуска для сложения вещественных чисел. У меня есть код,...

Рекурсивный спуск - Функция не останавливается на "else return" - C++
не могу понять, почему функция не останавливается на &quot;else return *(a+mid);&quot; делал отладку, после этого return'a происходит еще два...

Спуск по треугольной куче с наименьшей суммой - C++
Добрый день, пытаюсь решить задачу по программированию ( задание ниже), как понимаю для решения необходимо знание динамического...

рекурсивный алгоритм - C++
В общем я уже намучился с этим заданием... Дело такое, алгоритм составлен, но не совсем такой, какой нужен #include &lt;iostream&gt; #include...

Рекурсивный алгоритм - C++
Даны натуральные числа &quot;N&quot; и &quot;M&quot; надо решить с помощью с++ не могу переставить с этим кодом с++ #include &lt;stdio.h&gt; #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
anaberne
Сообщений: n/a
08.07.2009, 22:16 #2
Догадка оказалась верной, не считало конец строки, поэтому сделал топорно: ставим точку в конце и все гуд.
пример для ввода: 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;
}
Маня
Сообщений: n/a
09.10.2009, 10:09 #3
Подскажите пожалуйста,как в консоле можно нарисовать дерево с разветвлениями с помощью функции setw(),если дерево реализовываем с помощью рекурсивной фнкции
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
09.10.2009, 15:53 #4
нарисуй чего хочешь увидеть, деревья они, знаешь, разные. баобаб тоже дерево, но на ёлку не похож

Добавлено через 38 минут
сходу что-то вроде получилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iomanip>
#include <iostream>
 
using namespace std;
 
int Asterix(int initValue=8, int basic=32)
{
    cout<<setw(basic/initValue/2+1);
    for (int i=0; i<initValue; i++)
        cout<<"*"<<setw(basic/initValue);
    cout<<endl; cout<<endl;
    if(initValue==1)
        return 1;
    else
        return Asterix(initValue/2, basic);
 
}
 
void main(void)
{
    int n;                  // число элементов
    float summ=0;
    int counter=0;
    cout<<"start:"<<endl; cin>>n;
    
    Asterix(n,4*n);
    
    
    cout<<endl;
    system("pause");
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2009, 15:53
Привет! Вот еще темы с ответами:

рекурсивный алгоритм - C++
задание было такое (я не раз обращался с ним уже): построить алгоритм вычисления значения аргумента exp(x) с точностью до &quot;эпсилон&quot; с...

Рекурсивный парсинг - C++
Есть формат на базе XML. 1. Файл начинается с &lt;?xml version=&quot;...&quot; encoding=&quot;ANSI...&quot;?&gt; 2. Поддерживается единственная кодировка только...

Рекурсивный алгоритм - C++
помогите плиз представить в рекурсивный алгоритм Массив A proverka=1 Цикл для i:=1 до 10 делать: Ввод A Конец цикл ...

Рекурсивный алгоритм - C++
помогите пожалуйста Представить в рекурсивный алгоритм Цикл пока ((proverka=1) и (k&gt;1) ) Если A &gt; A То Начало ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.10.2009, 15:53
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru