Показать полную графическую версию : C++ проблема со строками
vlad3009
25-02-2012, 07:02
Доброе утро, мне было задано написать программу о том, соответствует ли каждой открывающей скобке, каждая закрывающая, среди символов строки могут встречаться и другие символы... вот он код. Программа не работает при входных данных
ывп()
()вапрвапоаопр()(
()()()()()()()(
Использовать индексацию, как в массиве запрещено, только команды 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;
}
vlad3009
1. чтение из потока указателя на память - это игра в русскую рулетку (стрельба себе в голову из револьвера)
2. почему бы на самом деле не почитать про класс string и не использовать его вместо chrstr? достаточно загуглить "c++ string"
3. про запрет использовать индексирование ты имхо загнул
ab.random
25-02-2012, 13:41
Может, кривовато (сам новичек), но работает и без индексирования.
#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
ab.random, Не, не совсем все работает, также как и у меня есть косяки, я свои отыскать не могу, за идею спасибо, чуток лучше моей работает)
pva, Препод сказал, надо без индексации... Вот так... Ошибки не нашли?
ab.random
25-02-2012, 18:19
vlad3009, а в чем именно косяки? Дай или полное условие, или приведи примеры. Разберемся.
vlad3009
25-02-2012, 22:07
ab.random, ()()()()()()()(
ывпвыап()()()()()()
()ывпвапвкп(вапвапр)(вап(ывапывп)апв)
примеры такие))
ab.random
25-02-2012, 23:41
vlad3009, во вложении 4 скрина с работой программы с вашими примерами. По-моему, всё правильно делает. Или я условие неправильно понял.
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
pva, at() - это метод, не индексация. Но если и так нельзя, тогда можно воспользоваться итераторами string::iterator. Тогда точно никак не придраться, а код будет почти таким же.
Но у Вас красивее решение.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.