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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2012, 07:24   #11
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
программа отработает некорректно: ((())))(
не может быть, на предпоследней скобке C будет равно -1 и выполнится break
и
printf( ( 0 == -1 ? "true" : "false" ) );
rrrFer вне форума Ответить с цитированием
Старый 02.09.2012, 07:31   #12
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
мне еще нужно учитывать и кавычки.
как учитывать? - должны быть описаны какие -то правила
rrrFer вне форума Ответить с цитированием
Старый 02.09.2012, 07:42   #13
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

важно какой смысл придается кавычкам. Можно например запретить вкладывать в каждую пару открытых скобок нечетное количество кавычек, т.е.
("") верно
(""") неверно
для этого достаточно завести булевый флажок и каждый раз при встрече кавычки выполнять fl ^= 1; Если встретишь закрывающую скобку - флажок должны быть равен нулю, если все верно.

Но если предположить что между кавычками располагается строка, которая может содержать скобки - то это не сработает, например ( "()" ) тут все верно, но ошибка возникнет на первой закрывающей скобке.

Можно, например, не учитывать вообще скобки, размещенные между кавычками - большинство компиляторов так и делают, т.е. не проверяют балланс скобок между кавычками. Для этого тебе будет достаточно примерно такого кода:
Код:
while( *s && fl )
    fl ^= (*s == ''');
if( 0 == *s ) .... //скобки и кавычки стоят неверно
вобщем все зависит от того, как ты условия задачи сформулируешь )
rrrFer вне форума Ответить с цитированием
Старый 02.09.2012, 17:12   #14
Cheat
Пользователь
 
Регистрация: 16.08.2011
Сообщений: 27
По умолчанию

Пепел Феникса, точно! Спасибо, работает.
rrrFer, попробую, спасибо а что такое fl ^= ?
то ли я это упустил, то ли нам не рассказывали об этом (именно про "^" ).

Последний раз редактировалось Cheat; 02.09.2012 в 17:17.
Cheat вне форума Ответить с цитированием
Старый 02.09.2012, 17:44   #15
Cheat
Пользователь
 
Регистрация: 16.08.2011
Сообщений: 27
По умолчанию

А если завести массив и рекурсивно записывать в него кол-во кавычек, которые были ДО скобок?
к примеру, в строке ("("")") получится так: 1 кавычка; потом - подсчет кавычек в скобках. если все ОК - смотрим, что у нас идет после закрывающей скобки. если кавычка - смотрим в массиве, сколько кавычек у нас было до вложенных скобок и прибавляем новые кавычки. если число четное - идем дальше. если нет - прерываем.
хотя и тут есть подводные камни - если после скобок идет три пары кавычек, в сумме получится 4, т.е. правильно, однако последовательность неверная. фу, что-то я окончательно запутался..
Cheat вне форума Ответить с цитированием
Старый 02.09.2012, 17:49   #16
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

ты читал что я написал?, внимательно?
Цитата:
вобщем все зависит от того, как ты условия задачи сформулируешь )
формулируй условие, мы подумаем и, быть может, что-нибудь предложим.

Цитата:
завести массив и рекурсивно записывать в него кол-во кавычек, которые были ДО скобок?
Я убежден что независимо от постановки твоей задачи рекурсия или стеки тебе не понадобятся.
Цитата:
rrrFer, попробую, спасибо а что такое fl ^= ?
то ли я это упустил, то ли нам не рассказывали об этом (именно про "^" ).
исключающее ИЛИ:
1^1 = 0
1^0 = 1
0^1 = 1
0^0 = 0

с тем же успехом можешь писать так fl = 0 == fl; или fl = !fl;
rrrFer вне форума Ответить с цитированием
Старый 02.09.2012, 18:41   #17
Cheat
Пользователь
 
Регистрация: 16.08.2011
Сообщений: 27
По умолчанию

Ух ты, круто! Спасибо, буду знать!

По условию задачи вообще нужно проверить баланс скобок (чтобы каждая кавычка или скобка была закрыта), и проверить правильность расстановки кавычек и скобок (чтобы они не пересекались и были закрыты надлежащим образом).
Используются только ', ", (, ).
Cheat вне форума Ответить с цитированием
Старый 02.09.2012, 19:17   #18
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

держи:
Код:
#include <iostream>

int main() {
	int	bracketCounter;
	
	char quote;
	char str[] = "(\'\'()()()(()(()(\"asd((((((((\")))())";
	int i;
	
	bracketCounter = 0;
	quote = 0;

	i = 0;
	while( str[ i ] ) {
		while( str[ i ] && quote && str[ i ] != quote ) ++i;
		i += quote != 0;
		quote = 0;
		
		switch( str[ i ] ) {
		case '(':
			++bracketCounter;
			break;
		case ')':
			--bracketCounter;
			break;
		case '\'':
		case '\"':
			quote = str[ i ];
			break;
		}
		
		if( 0 > bracketCounter ) break;	
		++i;
	}
	std ::cout << ( 0 == bracketCounter && 0 == quote ? "true" : "false" );
	return 0;
}
rrrFer вне форума Ответить с цитированием
Старый 02.09.2012, 20:45   #19
Cheat
Пользователь
 
Регистрация: 16.08.2011
Сообщений: 27
По умолчанию

Большое спасибо!
Cheat вне форума Ответить с цитированием
Старый 02.09.2012, 22:46   #20
Cheat
Пользователь
 
Регистрация: 16.08.2011
Сообщений: 27
По умолчанию

Появилась два дурацких вопроса..

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Код:
		while( str[ i ] && quote && str[ i ] != quote ) ++i;
}
зачем тут два раза повторяется str[ i ]? причем если последнее повтороение убрать, то i++ выполняться не будет, но программа выведет правильный результат.

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Код:
		i += quote != 0;
и второй. я понимаю, что эта строка эквивалентна такой:
i = i +quote != 0;
но я не пойму ее смысл. для меня такая форма записи необычна. зачем в конце "!= 0"?
Cheat вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверить правильность расстановки круглых и квадратных скобок в выражениях tarasman11 Паскаль, Turbo Pascal, PascalABC.NET 13 06.07.2012 11:50
Программа, которая определяет правильность расстановок скобок (, [, {, ), }, ] sidestep Общие вопросы C/C++ 14 04.04.2012 15:36
Проверить на правильность задачу sam5213 Паскаль, Turbo Pascal, PascalABC.NET 0 23.12.2010 18:28
Нужно проверить на правильность программу Killdgedan Помощь студентам 3 26.05.2009 00:45
Проверить равенство числа открывающих и закрывающих круглых скобок 010 Паскаль, Turbo Pascal, PascalABC.NET 6 18.05.2008 00:27