Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2011, 15:36   #1
RAVAL(c)
Пользователь
 
Регистрация: 05.09.2010
Сообщений: 31
Вопрос Рекурсия (C++)

Здравствуйте!
Кто знает как реализовать задачу на рекурсию?

"Написать процедуру, которая по последовательности символов определяет, является ли она логическим выражением. Логические выражения: TRUE/FALSE. Операции: AND/OR/NOT"

Например.
TRUE OR FALSE - является.
FALSE AND TRUE - является.
TRUE TRUE AND - не является.
FALSE NOT AND - не является.
RAVAL(c) вне форума Ответить с цитированием
Старый 26.12.2011, 00:15   #2
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от RAVAL(c) Посмотреть сообщение
FALSE NOT AND - не является.
А
FALSE AND NOT FALSE ?
Vago вне форума Ответить с цитированием
Старый 26.12.2011, 00:34   #3
RAVAL(c)
Пользователь
 
Регистрация: 05.09.2010
Сообщений: 31
По умолчанию

А FALSE AND NOT FALSE - является
RAVAL(c) вне форума Ответить с цитированием
Старый 26.12.2011, 00:37   #4
RAVAL(c)
Пользователь
 
Регистрация: 05.09.2010
Сообщений: 31
По умолчанию

нужно, чтобы было так
<Логическая операция> [действие] <Логическая операция>

под <Логическая операция> понимается только TRUE и FALSE,
а под [действие] AND и OR
также возможно логическое отрицание NOT
RAVAL(c) вне форума Ответить с цитированием
Старый 26.12.2011, 01:18   #5
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Код:
#include <stdio.h>
#include <string.h>
#include <conio.h>


#define MAX_STR_LENGTH 256
enum {
   EXPRESSION = 0 ,
   OPERATION_AND_OR ,
   OPERATION_NOT
} ;



int WhatToken( int token ) {
   switch ( token ) {
      case 0:
      case 1:
         return EXPRESSION ;
         break ;
      case 2:
      case 3:
         return OPERATION_AND_OR ;
         break ;
      case 4:
         return OPERATION_NOT ;
      break ;
   }
}



bool IsCorrectLogicalExpression( char* c, int tokenLast ) { 
 
   int tokenNext ;

   if ( strlen( c ) == 0 ) 
      return ( WhatToken( tokenLast ) == EXPRESSION ) ;

   sscanf( c, "%d", &tokenNext ) ;

   switch ( WhatToken( tokenLast ) ) {
      case EXPRESSION:
         if ( WhatToken( tokenNext ) == OPERATION_AND_OR ) 
            IsCorrectLogicalExpression( c+2, tokenNext ) ;   
         else
            return false ;
         break ;
      case OPERATION_AND_OR:
         if ( WhatToken( tokenNext ) == OPERATION_AND_OR ) 
            return false ;
         else
            IsCorrectLogicalExpression( c+2, tokenNext ) ;
         break ;      
      case OPERATION_NOT:
         if ( WhatToken( tokenNext ) == EXPRESSION ) 
            IsCorrectLogicalExpression( c+2, tokenNext ) ;
         else
            return false ;
      break ;
   }   

}
   

int main() {

   char  cExpr[MAX_STR_LENGTH] ;
   int   i ;

   for ( i = 0; i < MAX_STR_LENGTH; i++ )
      cExpr[i] = '\0' ;
   printf( "Please enter the expression to evaluate: " ) ;
   gets( cExpr ) ;

   if ( !IsCorrectLogicalExpression( cExpr, 3 ) )
      printf( "Not " ) ;
   printf( "correct.\n" ) ;

   return 0 ;

}
Для простоты (главная проблема - рекурсия, я так понимаю?), вводим:
0 - вместо FALSE
1 - вместо TRUE
2 - вместо AND
3 - вместо OR
4 - вместо NOT
Вводим в точности через один пробел (в рекурсивных вызовах забито для простоты c+2 )! То есть, для приведенных примеров:
1 3 0
0 2 1
1 1 2
0 4 2
0 2 4 0

Парсер входной строки, соответствующей условию (соответственно - другие смещения от начала строки при повторном вызове) и перевод на "плюсы" - уж сами, пожалуйста...
Vago вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия McJordan Паскаль, Turbo Pascal, PascalABC.NET 5 18.12.2010 19:46
Рекурсия dusya9992 Паскаль, Turbo Pascal, PascalABC.NET 4 29.08.2010 14:14
рекурсия Lena neznayka Помощь студентам 2 16.06.2010 20:46
Рекурсия Solnze2 Паскаль, Turbo Pascal, PascalABC.NET 0 09.06.2010 09:28
Рекурсия Shadows_Behind Помощь студентам 6 26.05.2010 15:07