Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   C++ проблема со строками (http://forum.oszone.net/showthread.php?t=228721)

vlad3009 25-02-2012 07:02 1866089

C++ проблема со строками
 
Доброе утро, мне было задано написать программу о том, соответствует ли каждой открывающей скобке, каждая закрывающая, среди символов строки могут встречаться и другие символы... вот он код. Программа не работает при входных данных
ывп()
()вапрвапоаопр()(
()()()()()()()(
Использовать индексацию, как в массиве запрещено, только команды 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;
}


pva 25-02-2012 12:35 1866184

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

ab.random 25-02-2012 13:41 1866216

Может, кривовато (сам новичек), но работает и без индексирования.
Код:

#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;
}


vlad3009 25-02-2012 15:09 1866271

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

ab.random 25-02-2012 18:19 1866386

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

vlad3009 25-02-2012 22:07 1866575

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

ab.random 25-02-2012 23:41 1866631

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

pva 10-03-2012 13:03 1876104

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;
}


ab.random 11-03-2012 10:33 1876670

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


Время: 09:07.

Время: 09:07.
© OSzone.net 2001-