Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - C++ проблема со строками

Ответить
Настройки темы
C/C++ - C++ проблема со строками

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброе утро, мне было задано написать программу о том, соответствует ли каждой открывающей скобке, каждая закрывающая, среди символов строки могут встречаться и другие символы... вот он код. Программа не работает при входных данных
ывп()
()вапрвапоаопр()(
()()()()()()()(
Использовать индексацию, как в массиве запрещено, только команды string
в чем проблема? помогите исправить, спасибо большое
Код: Выделить весь код
#include "cstring"
#include "fstream"
 
int main(){
        std::ifstream fin("in.txt", std::ios::in);
        std::ofstream fout("out.txt", std::ios::out);
 
        char str[255];
        char* itr;
 
        fin >> str;
 
        if (strchr(str, ')') == str){
                fout << "Error";
                return 0;
        }
 
 
        for (char* char1 = str; char1; char1 = strchr(char1, '(')){
                
                if (strchr(char1, ')') > char1)
                {
 
                        *strchr(char1, ')') = ' ';
 
                        *char1 = ' ';
                        continue;
                }
        }
 
        if (strchr(str, ')')){
                fout << "Error";
                return 0;
        }
                
 
        fout << "Will be OK";
 
        return 0;
}

Отправлено: 07:02, 25-02-2012

 
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


vlad3009
1. чтение из потока указателя на память - это игра в русскую рулетку (стрельба себе в голову из револьвера)
2. почему бы на самом деле не почитать про класс string и не использовать его вместо chrstr? достаточно загуглить "c++ string"
3. про запрет использовать индексирование ты имхо загнул
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:35, 25-02-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для ab.random

Новый участник


Сообщения: 29
Благодарности: 1

Профиль | Отправить PM | Цитировать


Может, кривовато (сам новичек), но работает и без индексирования.
Код: Выделить весь код
#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[]){
    string str;
    int skob=0;    // счетчик скобок
    cout << "Введите строку" << endl;
    getline(cin, str); // строка читается до нажатия Enter
                    // либо ввести cin >> str; если надо до любого разделителя
    
    // Ищем первую скобку
    for (string::size_type is=0; is != str.size(); ++is){
    // Если первая - закрывающаяся - выходим из программы
        if (str.at(is)==')'){
           cout << "Начинается с закрывающейся скобки!" << endl;
           system("PAUSE");
           return EXIT_SUCCESS;
           }
    // если открывающаяся - всё норм, заканчиваем цикл и продолжаем
        if (str.at(is)=='(')
           break;
        }
               
    /*Перебираем все символы строки без использования индексирования.
     *Если встретили (, то увеличиваем счетчик; если ) - уменьшаем.
     *В остальных случаях ничего не делаем.
     */
    for (string::size_type is=0; is != str.size(); ++is){
        if (str.at(is)=='(')
           ++skob;
        if (str.at(is)==')')
           --skob;
    }
    // если скобки не парные - счетчик отличен от нуля
    if (skob)
       cout << "Напарные скобки" << endl;
    else
        cout << "Скобки соответствуют друг другу" << endl;
        
    system("PAUSE");
    return EXIT_SUCCESS;
}

Последний раз редактировалось ab.random, 25-02-2012 в 14:10.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:41, 25-02-2012 | #3


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


ab.random, Не, не совсем все работает, также как и у меня есть косяки, я свои отыскать не могу, за идею спасибо, чуток лучше моей работает)
pva, Препод сказал, надо без индексации... Вот так... Ошибки не нашли?

Отправлено: 15:09, 25-02-2012 | #4


Аватара для ab.random

Новый участник


Сообщения: 29
Благодарности: 1

Профиль | Отправить PM | Цитировать


vlad3009, а в чем именно косяки? Дай или полное условие, или приведи примеры. Разберемся.

Отправлено: 18:19, 25-02-2012 | #5


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


ab.random, ()()()()()()()(
ывпвыап()()()()()()
()ывпвапвкп(вапвапр)(вап(ывапывп)апв)
примеры такие))

Отправлено: 22:07, 25-02-2012 | #6


Аватара для ab.random

Новый участник


Сообщения: 29
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: png 01.png
(10.5 Kb, 5 просмотров)
Тип файла: png 02.png
(12.1 Kb, 6 просмотров)
Тип файла: png 03.png
(12.4 Kb, 5 просмотров)
Тип файла: png 04.png
(12.1 Kb, 3 просмотров)

vlad3009, во вложении 4 скрина с работой программы с вашими примерами. По-моему, всё правильно делает. Или я условие неправильно понял.

Отправлено: 23:41, 25-02-2012 | #7

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


vlad3009, мне интересно было бы увидеть твой пересказ на русском языке (т.е. ещё не программу) того, как бы ты хотел проверить балансировку скобок. А то я не понимаю, что ты хочешь закодировать, а своё навязывать не хотел бы.
ab.random, если придираться, то string::at() - это тоже индексация, но с проверкой на вхождение индекса в диапазон. Как я понял, ты хочешь посчитать разницу между количеством открывающихся и закрывающихся скобок. Вот как это можно сделать ещё:
Код: Выделить весь код
#include <algorithm>
#include <string>
using namespace std;
...
string line;
getline(cin, line);
if (line.rfind(')', line.find('('))==string::npos) {
  if (count(line.begin(), line.end(), '(') == count(line.begin(), line.end(), ')')) {
    cout << "скобки совпадают" << endl;
  } else {
    cout << "скобки не совпадают" << endl;
  }
} else {
  cout << "начинается с закрывающей скобки" << endl;
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:03, 10-03-2012 | #8


Аватара для ab.random

Новый участник


Сообщения: 29
Благодарности: 1

Профиль | Отправить PM | Цитировать


pva, at() - это метод, не индексация. Но если и так нельзя, тогда можно воспользоваться итераторами string::iterator. Тогда точно никак не придраться, а код будет почти таким же.
Но у Вас красивее решение.

Отправлено: 10:33, 11-03-2012 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - C++ проблема со строками

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBA - Работа со строками zena Программирование и базы данных 5 21-02-2011 09:03
StringRegExp - как получить содержимое между 2-мя строками evg64 AutoIt 2 05-12-2009 01:19
C/C++ - [решено] Работа с строками crashtuak Программирование и базы данных 16 26-03-2009 01:21
CMD/BAT - [решено] Работа со строками в cmd-файлах melato Скриптовые языки администрирования Windows 3 30-01-2007 08:52
Помогите разобратся со строками в С++ Guest Программирование и базы данных 12 22-05-2004 04:49




 
Переход