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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2009, 21:10   #1
Stiffler
Пользователь
 
Регистрация: 20.07.2009
Сообщений: 15
По умолчанию Ошибка в задаче!!!

Всем доброго времени суток!!!Мне нужна помощь с нижеприведенной программой!!!Нужно в введенной строчке найти скобки( ), все что внутри удалить, но их самих не трогать.Проблема в том,что нужно дописать куда то штуку, которая бы проверяла,что скобка "(" находится раньше ")", иначе вывести сообщение об ошибке введения.Помогите дописать!Заранее спасибо!

Код:
#pragma hdrstop
//---------------------------------------------------------------------------
#include <conio.h>      //?????????? ??????????? ??????? getch()
#include <iostream.h> //?????????? ??? cin ? cout
#include <malloc.h>    //?????????? ??? ????????????? ????????? ??????
#include <fstream.h>   //?????????? ??? ?????/?????? ? ????
#include <windows.h> //?????????? ???????????? ? ??????? RUS
#include <math.h>       //?????????? ?????????????? ???????
#include <ctype.h>      // ?????????? ???????? ?????????????? ????????
#include <stdlib.h>      // ?????????? ????????? ??????????? ???????
#include <string.h>      // ?????????? ??????? ?????? ?? ????????
//
char bufRus[256];
//---------------------------------------------------------------------------
char* RUS(const char*text) //??????? ????????? ???????? ?????
{
CharToOem(text,bufRus);
return bufRus;
}
//---------------------------------------------------------------------------
//????? ????? ???????? ??????? ? ?????? ????????????
//****************************************************

//****************************************************
#pragma argsused
int main(int argc, char* argv[])
{
char strl[99]; int N, k=0,c=0,a=0,b=0,d=0;
char str2[99] = "";
cout<< RUS("Vvedite stroky") << '\n';
gets(strl);
k=strlen(strl);
char* pStr;
char* pStr1;
int i=0;
 for (int i=0;i<=k;i++)
if (strl[i]=='(')
c++;
 for (int i=0;i<=k;i++)
if (strl[i]==')')
a++;
if ((c==a) && (c==1) && (a==1))
{
for (int i=0;i<=k;i++)
if (strl[i]!='(')
{str2[b]=strl[i];b++;}
else
{str2[b]='(';b++;break;}
for (int i=b;i<=k;i++)
if (strl[i]==')')
{d=i; break;}
for (int i=d;i<=k;i++)
if (strl[i]!='(')
{str2[b]=strl[i];b++;}
}
else
cout<<RUS("\n HET CKO6OK!!!");
cout<<RUS("\n")<<str2;
getch();
return 0;
}

Последний раз редактировалось Stilet; 08.12.2009 в 08:54.
Stiffler вне форума Ответить с цитированием
Старый 07.12.2009, 21:40   #2
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
Вопрос какова расстановка скобок?

А скобки как расставлены? Такое возможно: ((abc)cde) ???
Alex_FF вне форума Ответить с цитированием
Старый 07.12.2009, 21:56   #3
Stiffler
Пользователь
 
Регистрация: 20.07.2009
Сообщений: 15
По умолчанию

Alex_FF, не.там только одна "(" и одна ")".Дальше он будет писать,что скобок больше,чем нужно(ну типа того)
Stiffler вне форума Ответить с цитированием
Старый 07.12.2009, 22:58   #4
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию Решение

Приведу решение задачи методом конечного автомата.
Программа имеет два состояния: "основное" и "внутри скобок".

Писал на Borland C++ Builder 2009.

Код:
#include <iostream.h>

using namespace std;

int main()
{
	char strIn[100];
	char strOut[100];
	bool inBrackets; // состояние. true - когда мы находимся в скобках
	bool flag; // сигнализирует о том, что скобки вообще были
	int i, j;
	cout << "Vvedite stroky" << endl;
	gets(strIn);
	inBrackets = false;
	flag = false;
	j = 0;
	for (i = 0; i < strlen(strIn); i++)
	{
		if (inBrackets && strIn[i] != ')') continue;
		if (strIn[i] == '(')
		{
			flag = true; // были скобочки)
			inBrackets = true; // и мы сейчас в скобочках)))))
			strOut[j] = strIn[i]; // заносим нашу скобочку в выходную строку
			j++;
		} else
			if (strIn[i] == ')')
			{
				if (!inBrackets) // если не было открывающей скобки
				{
					cout << "A gde ( ???" << endl;
					system("pause");
					return 0;
				}
				inBrackets = false; // вышли из скобок
				strOut[j] = strIn[i]; // не забыли нашу ')'
				j++;
			} else // вне скобок
				{
					strOut[j] = strIn[i];
					j++;
				}
	}
	cout << endl;
	if (inBrackets)  // текст закночился, а мы все в скобках? значит не было ')'
	{
		cout << "Nety vot takoi skobochki: )" << endl;
		system("pause");
		return 0;
	}
	if (!flag) // скобок вообще не видели???
	{
		cout << "Ne bilo tyt nikakih skobok" << endl;
		system("pause");
		return 0;
	}
	for (i = 0; i < j; i++)
		cout << strOut[i];
	cout << endl;
	system("pause");
	return 0;
}
P.S. У меня работает нормально и с русским, и с английским текстом.

Последний раз редактировалось Alex_FF; 07.12.2009 в 23:04.
Alex_FF вне форума Ответить с цитированием
Старый 07.12.2009, 23:21   #5
Stiffler
Пользователь
 
Регистрация: 20.07.2009
Сообщений: 15
По умолчанию

Alex_FF спасибо конечно за труд, но слишком твой алгоритм сложный.посмотри на мой алгоритм.там ничего такого.только циклы и условия )))
Stiffler вне форума Ответить с цитированием
Старый 08.12.2009, 00:00   #6
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

вот:

Код:
#pragma hdrstop
//---------------------------------------------------------------------------
#include <conio.h> //?????????? ??????????? ??????? getch()
#include <iostream.h> //?????????? ??? cin ? cout
#include <malloc.h> //?????????? ??? ????????????? ????????? ??????
#include <fstream.h> //?????????? ??? ?????/?????? ? ????
#include <windows.h> //?????????? ???????????? ? ??????? RUS
#include <math.h> //?????????? ?????????????? ???????
#include <ctype.h> // ?????????? ???????? ?????????????? ????????
#include <stdlib.h> // ?????????? ????????? ??????????? ???????
#include <string.h> // ?????????? ??????? ?????? ?? ????????
//
char bufRus[256];
//---------------------------------------------------------------------------
char* RUS(const char*text) //??????? ????????? ???????? ?????
{
CharToOem(text,bufRus);
return bufRus;
}
//---------------------------------------------------------------------------
//????? ????? ???????? ??????? ? ?????? ????????????
//*********************************** *****************

//*********************************** *****************
#pragma argsused
int main(int argc, char* argv[])
{
int openBracket, closeBracket; // индексы скобок '(' и ')' соответственно
char strl[99]; int N, k=0,c=0,a=0,b=0,d=0;
char str2[99] = "";
cout<< RUS("Vvedite stroky") << '\n';
gets(strl);
k=strlen(strl);
char* pStr;
char* pStr1;
int i=0;
for (int i=0;i<=k;i++)
if (strl[i]=='('){
c++;
openBracket = i; // запоминаем позицию скобки '('
}
for (int i=0;i<=k;i++)
if (strl[i]==')'){
a++;
closeBracket = i; // запоминаем позицию скобки ')'
}
if (openBracket > closeBracket) {   // проверяем
	cout << "Oshibka pri vvode" << endl;
	system("pause");
	return 0;
}

if ((c==a) && (c==1) && (a==1))
{
for (int i=0;i<=k;i++)
if (strl[i]!='(')
{str2[b]=strl[i];b++;}
else
{str2[b]='(';b++;break;}
for (int i=b;i<=k;i++)
if (strl[i]==')')
{d=i; break;}
for (int i=d;i<=k;i++)
if (strl[i]!='(')
{str2[b]=strl[i];b++;}
}
else
cout<<RUS("\n HET CKO6OK!!!");
cout<<RUS("\n")<<str2;
getch();
return 0;
}

Вообще это конечным автоматом решается: проще алгоритм и понятнее. А главное универсальный метод.
Alex_FF вне форума Ответить с цитированием
Старый 08.12.2009, 19:49   #7
Stiffler
Пользователь
 
Регистрация: 20.07.2009
Сообщений: 15
По умолчанию

Alex_FF Спасибо огромное!!!!!!!!! RESPECT!!!!
Stiffler вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по задаче VadEr Помощь студентам 3 10.05.2009 11:11
ошибка в задаче с матрицей Валюшка Помощь студентам 2 08.02.2009 16:54
Вопрос по задаче file Паскаль, Turbo Pascal, PascalABC.NET 20 03.06.2008 17:37
Вопрос по задаче Freeman12 Помощь студентам 5 26.05.2008 17:40