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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2010, 18:35   #1
"Эльнара"
Пользователь
 
Регистрация: 12.07.2010
Сообщений: 13
По умолчанию Строка

Привет!! помогите пожалуйста ,
Дана строка содержащая произвольный набор символов.Проверить, правильно ли в ней расставлены круглые скобки(т.е. находится ли правее каждой открывающей скобки закрывающая и левее закрывающей-открывающая)
"Эльнара" вне форума Ответить с цитированием
Старый 12.07.2010, 18:51   #2
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Ну вот можно так определять
Код:
Uses CRT;
Var
    x:integer;
    s:string;
    i:integer;
Begin
     readln(s);
     x:=0;
     for i:=1 to length(s) do
     begin
          if Pos('(',s)>Pos(')',s) then
          begin
                write('No!');
                readln;
                exit;
          end;
          if Pos('(',s)<>0 then x:=1;
end;
Write('Yes');
readln;
end.
P.S.Код проверен разными случаями
_-Re@l-_ вне форума Ответить с цитированием
Старый 12.07.2010, 19:54   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код проверен разными случаями
Уверены?

ну-ка, что для строчки:
())(


"классический" алгоритм заключачается в следующем,
счётчик в ноль.
идём по строке, если встретили открывающую скобку, счётчик увеличиваем на один,
если встретили закрывающую, счётчика уменьшаем на единицу и сразу проверяем - если он меньше единицы, то закрывающая БЕЗ открывающей скобки - сразу NO и выход.
Когда строчка закончилась - счётчик должен быть равен нулю, если равен, баланс скобок верный, если счётчик больше нуля - то есть открытые скобки, для который отсутствуют закрывающие.

Программа элементарная, писать нечего!, тем более тут на форуме это было (и даже в более сложных вариантах).

Последний раз редактировалось Serge_Bliznykov; 12.07.2010 в 19:58.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.07.2010, 20:31   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Тогда так:
Код:
Uses CRT;
Var
    x:integer;
    s:string;
    i:integer;
Begin
     readln(s);
     x:=0;
     for i:=1 to length(s) do
     begin
          if Pos(')',s)<>0 then
          begin
                x:=x-1;
                if x<=0 then
                begin
                write('No!');
                readln;
                exit;
          end;      end;
          if Pos('(',s)<>0 then x:=x+1;
end;
Write('Yes');
readln;
end.
_-Re@l-_ вне форума Ответить с цитированием
Старый 12.07.2010, 20:56   #5
ZaRDaK
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 197
По умолчанию

Твоя прога постоянно будет выдавать 'No!'
Скорми ей несколько правильных вариантов и увидишь.
А если в cтроке не будет символа ')', то прога всегда будет выдавть 'Yes!'
Скорми ей строку типа '((((('
Перебирать надо не Pos'ом, а
if S[i] = ')' \ if S[i] = '('
Проверяй перед тем, как постиш.

Последний раз редактировалось ZaRDaK; 12.07.2010 в 22:40.
ZaRDaK вне форума Ответить с цитированием
Старый 12.07.2010, 23:05   #6
dxdy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 78
По умолчанию

На тестах долго не проверял, но алгоритм должен быть верен:
Код:
#include <iostream>
#include <stack>
using namespace std;

bool CheckString(char *str);
bool QCheckString(char *str);

int main(){
	if( QCheckString("()") )
		cout << "Good" << endl;
	else
		cout << "Bad" << endl;
	return 0;
}

//-------------------
bool CheckString(char *str){
	stack<char> Stack;
	while(*str){
		if(*str == '('){
			Stack.push(*str);
		}
		else{
			if(*str == ')'){
				if( Stack.empty() ){
					cout << "Error" << endl; break;
				}
				else{
					Stack.pop();
				}
			}
		}
		str++;
	}

	return Stack.empty();
}

//---------------------------
bool QCheckString(char *str){
	int Stack = 0;
	while(*str){
		if(*str == '('){
			Stack++;
		}
		else{
			if(*str == ')'){
				if( Stack > 0 ){
					Stack--;
				}
				else{
					cout << "Error" << endl; Stack = -1; break;
				}
			}
		}
		str++;
	}

	return Stack == 0;
}
Две функции, только одна функция реализована через стек, которая в больших проектах должна хорошо себя показать, а вторая просто для примера счетчик int-типа. Возможно и другие алгоритмы...
Я не волшебник, я еще только учусь ٩(๏̯͡๏)۶
dxdy вне форума Ответить с цитированием
Старый 13.07.2010, 10:33   #7
"Эльнара"
Пользователь
 
Регистрация: 12.07.2010
Сообщений: 13
По умолчанию

Спасибо большое вам!..)
"Эльнара" вне форума Ответить с цитированием
Старый 13.07.2010, 10:38   #8
"Эльнара"
Пользователь
 
Регистрация: 12.07.2010
Сообщений: 13
По умолчанию

Помогите если знаете !! Даны символы S1,....Sn известно, что символ S1 отличен от пробела и что среди S2 S3 имеется хотя бы один пробел .Рассмотримваються S1.....Sn-символы предшествующие первому пробелу. Преобразовать последовательность следующим образом:
а)удалить из нее все символы ,не являющиеся латинскими буквами
"Эльнара" вне форума Ответить с цитированием
Старый 13.07.2010, 11:27   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Код:
j:=1;
while j<length(s) do
begin
  case s[j] of
 'A'..'Z','a'..'z': j:=j+1;//латинские символы
 ' ': break; // до первого пробела
 else Delete(s,j,1); //все остальное удаляем
end;
Цитата:
Рассмотримваються S1.....Sn-символы предшествующие первому пробелу
Не совсем понятно, что делать с символами после этого пробела
1. оставить на месте (никакой обработки)
2. тоже чистить (зачем тогда это условие)
3. удалить все тогда: ' ': Delete(s,j, length(s));
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 13.07.2010 в 11:34.
evg_m вне форума Ответить с цитированием
Старый 13.07.2010, 19:05   #10
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Проверяй перед тем, как постиш.
1.Почитай отзыв, который я тебе написал. Правда до единого слова.
2.Уровень твоего ума несравнимо мал по сравнению с моим.
3. Если убрать знак раво в цикле, становится норм(поставил случайно)
Код:
Uses CRT;
Var
    x:integer;
    s:string;
    i:integer;
Begin
     readln(s);
     x:=0;
     for i:=1 to length(s) do
     begin
          if Pos(')',s)<>0 then
          begin
                x:=x-1;
                if x<0 then
                begin
                write('No!');
                readln;
                exit;
          end;      end;
          if Pos('(',s)<>0 then x:=x+1;
end;
Write('Yes');
readln;
end.
_-Re@l-_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
строка D_E_N Общие вопросы Delphi 2 03.01.2010 21:44
Строка brutos Общие вопросы Delphi 2 19.05.2009 13:01
Строка Стасссс Помощь студентам 5 21.04.2009 17:34
строка Артэс Общие вопросы C/C++ 4 04.02.2009 21:56
Строка состаяния или загрузачная строка Sergeu Мультимедиа в Delphi 8 27.08.2008 10:32