Форум программистов, компьютерный форум 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++ битовые поля!! добрый вечер! имеется класс представления битовых полей: #ifndef HTBITFIELDS #define HTBITFIELDS #include <iostream> using namespace std; #include "Cmystring.h" http://www.cyberforum.ru/cpp-beginners/thread43226.html
C++ Текущие дату в int
Необходимо получит текщие год, месяц, число и перевести их в int каждый. Получит, то получаю, а как перевести? #include <time.h> #include <iostream> using namespace std; void main() { char* s = (char*)malloc(100);
Убрать ненужное C++
Программисты!Подскажите пожалуйста, как убрать в консоли, в Visual Studio 2005, в конце программы фразу "Для продолжения нажмите любую клавишу",которая вылазит после нажатия клавиши ENTER,я пробывал вконце прописать cin.get(); , эта фраза исчезает при выводе, но при нажатии на энтер, всё равно появляется. Не скажите как избавится от этой фразы. Зараннее благодарю.
C++ бинарный поиск http://www.cyberforum.ru/cpp-beginners/thread43198.html
Задали реализовать бинарный поиск в упорядоченном массиве.Уже пол дня творю,3 листа исписал и ничего не получается. Вот пример поиска который нам показали //Метод Выбора for(i=0;i<n-1;i++) { min=i; for(j=i+1;j<n;j++) { if(a<a)min=j;
C++ Borland C++ 3.11 Помогите пожалуйста используя Borland C++ 3.11 Вот задание в формате doc: http://********.net/download/5471.5da3b4a2850227f9306fd415c/Praktska_Ci.do_.html подробнее

Показать сообщение отдельно
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;
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru