Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление части строки... заключенную в скобки. 
:(
    Опции темы
Дэвил
Дата 11.12.2005, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.11.2005

Репутация: нет
Всего: нет



Как удалить часть строки, заключенную в скобки вместе с ними?
Например:
Дано - слова1 (слова2) слова3
Получить - слова1 слова3

Огромная просьба: сделайте пример, так мне намного легче разобрать и понять.
PM MAIL ICQ   Вверх
Fixin
Дата 11.12.2005, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 2
Всего: 18



Счас сделаю.
PM MAIL ICQ   Вверх
Void
Дата 11.12.2005, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Код
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    string s, result;
    getline(cin, s);
    string::const_iterator start = s.begin(), end = s.end();
    int level = 0;
    for (string::const_iterator i = start; i != end; ++i) {
        if (*i == '(') {
            if (!level++)
                result.append(start, i);
        } else if (*i == ')') {
            if (!--level)
                start = i + 1;
        }
    }
    if (!level)
        result.append(start, end);
    cout << result;
}

Обрабатывает вложенные скобки.

Это сообщение отредактировал(а) Void - 11.12.2005, 21:04


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Дэвил
Дата 11.12.2005, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.11.2005

Репутация: нет
Всего: нет



smile
Это, по-моему, немного сложновато для 1-ого курса....
PM MAIL ICQ   Вверх
Fixin
Дата 11.12.2005, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 2
Всего: 18



Цитата(Void @ 11.12.2005, 21:59)
Обрабатывает вложенные скобки.
smile ну да.
Код
"slovo1 (slovo2 (slovo3) slovo4) slovo5"
Если вырезать внешние - внутренние тоже будут обработаны. Но в задании не уточнено: в скобках должно быть 1 слово или может быть несколтко?

PM MAIL ICQ   Вверх
asdf
Дата 11.12.2005, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 27.8.2004
Где: Кишинёвъ

Репутация: нет
Всего: 11



Код

#include <iostream.h>
string foo(string a)
{
    return a.substr(0, a.find('('))+a.substr(a.find(')')+1);
}
int main()
{
    string a="zzzz (xxxxx) ccccccc";
    cout << a << endl << foo(a) ;
    return 0;
}


Это сообщение отредактировал(а) asdf - 11.12.2005, 21:27
--------------------
... 
PM MAIL   Вверх
Fixin
Дата 11.12.2005, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 2
Всего: 18



Цитата
для 1-ого курса....
Надо было уточнять.

Добавлено @ 21:28
Никто про ошибки не помнит... А вдруг нет одной из скобок?
PM MAIL ICQ   Вверх
Void
Дата 11.12.2005, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Дэвил
В чем сложность конкретно?
Добавлено @ 21:33
Цитата(Fixin @ 11.12.2005, 23:27)
Если вырезать внешние - внутренние тоже будут обработаны. Но в задании не уточнено: в скобках должно быть 1 слово или может быть несколтко?

Цитата(Fixin @ 11.12.2005, 23:27)
Никто про ошибки не помнит... А вдруг нет одной из скобок?


Где именно мой код ведет себя не так, как предполагается? smile



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
sergejzr
Дата 11.12.2005, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Этого должно хватить для первого курса smile
Код

#include "stdio.h"
int main()
{
char* str = "слова1 (слова2) слова";
char res[256];
int i;
int len=strlen(str);
int skobka=0;// скобки нет
for(i=0;i<=len;i++)
{
  if(str[i]=='(')
   skobka=1;// нашёл скобку
 
  if(skobka==0)
   res[i]=str[i];

  if(str[i]==')')
   skobka=0;// нашёл закрывающуюся скобку. Сбрасываем счётчик
}
printf("%s\n",res);
return 0;
}



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
asdf
Дата 11.12.2005, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 27.8.2004
Где: Кишинёвъ

Репутация: нет
Всего: 11



исправилъ
Код
#include "stdio.h"    
#include "string.h"
int main()    
{    
char* str = "слова1 (слова2) слова";    
char res[256];    
int i;    
int len=strlen(str);    
int skobka=0;// скобки нет    
int cvo=0;// количество пропущенных символов
for(i=0;i<=len;i++)    
{    
  if(str[i]=='(')    
   skobka=i;// нашёл скобку    
    
  if(skobka==0)    
   res[i-cvo]=str[i];    
  else
    ++cvo;
  if(str[i]==')')    
   skobka=0;// нашёл закрывающуюся скобку. Сбрасываем счётчик    
}
res[len-cvo]='\0';// закрытие строки
printf("%s\n",res);    
return 0;    
}

--------------------
... 
PM MAIL   Вверх
LPBOY
Дата 11.12.2005, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Цитата(Void @ 11.12.2005, 21:29)
Где именно мой код ведет себя не так, как предполагается? smile


"aaa)bbb(ccc)ddd"
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Fixin
Дата 11.12.2005, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 2
Всего: 18



А вот и я:
Код
#include <stdio.h>
#include <conio.h>
#include <string.h>

int FindPos(char* stroka, int len, int* a, int* b, int* pos)
{
    *a = -1;
    *b = -1;
    for (; (*pos) < len; (*pos)++)
    {
        if ((*a == -1)&&(stroka[*pos] == '(')) // нашли положение откр скобки
                *a = *pos;
        if ((*a == -1)&&(stroka[*pos] == ')')) // нашли закр до откр
            return 2;
        if ((*a != -1)&&(stroka[*pos] == ')'))
            {
                *b = *pos; // нашли все
                break;
            }
    }
    if ((*a != -1)&&(*b == -1)) // нашли не все
        return 2;
    if ((*a != -1)&&(*b != -1))
        return 1; // все ок
    return 0; // ничего не нашли
}


void main()
{
    char stroka[] = "slovo1 (a) ) (slovo2 slovo3 slovo4) (slovo5";
    int dlina = strlen(stroka);
    int res, a, b;
    int pos = 0;
    while (res = FindPos(stroka, dlina, &a, &b, &pos)) // цикл поиска
    {
        if (res == 2) // нашли ошибку
        {
            printf("Stroka bez odnoi skobki ('(' ili ')')\n pos = %d\n", pos);
            printf(stroka);
            printf("\n\n");
            pos++;
        }
        if (res == 1) // все ок
        {
            dlina -= (b-a)+1; // b- положение закр скобки а - откр
            for (int i = a; i < dlina; i++)
            {
                stroka[i] = stroka[1+b+i-a]; //перемещаем все что после закр скобки на место откр
            }
            stroka[dlina]=0; // ставим новый конец строки
            pos = 0;
        }
    }
    printf("\n++++++++++++++++++++++\nRes\n");
    printf(stroka);
    printf("\n");
    getch();
}

PM MAIL ICQ   Вверх
Дэвил
Дата 11.12.2005, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.11.2005

Репутация: нет
Всего: нет



Я разобрался с кодом asdf 'а, но, плиз, растолкуйте мне про char* str=... хотябы что это и для чего. smile
PM MAIL ICQ   Вверх
Void
Дата 11.12.2005, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Дэвил
А что вам вообще успели дать-то по программе?
Строки в Си - это последовательность char, заканчивающаяся символом '\0'. Для операций со строками обычно используется тип - указатель на char. str здесь инициализируется указателем на начало строки... Что непонятно?

P. S. C++ style solution update smile
Код
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    string s, result;
    getline(cin, s);
    string::const_iterator first = s.begin(), last, end = s.end();
    int level = 0;
    for (string::const_iterator i = first; i != end; ++i) {
        if (*i == '(') {
            if (!level++)
                last = i;
        } else if (*i == ')' && level > 0) {
            --level;
            if (!level) {
                result.append(first, last);
                first = i + 1;
            }
        }
    }
    result.append(first, end);
    cout << result;
}


Про "aaa(bbb(ccc)ddd" можете не говорить - на мой взгляд, здесь нет ни одной валидной пары скобок smile

Это сообщение отредактировал(а) Void - 11.12.2005, 23:51


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Дэвил
Дата 11.12.2005, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.11.2005

Репутация: нет
Всего: нет



Не понятно почему char* str="....", а не просто char[....]. Что строка это последоватьельность char я знаю, и что "*" обозначает "указатель"
Я может к вечеру и туплю... smile
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.