Войти

Показать полную графическую версию : Помогите чайнику разобраться в азах С++


Lisiy_egik
19-09-2009, 17:08
-только в вуз поступил, и начал учиться с 3й недели, сейчас пытаюсь нагнать программу. в частности и по программированию. Вопрос вот в чем: была как практическая задана задача: "пользователь вводит последовательность символов, содержащую, среди прочих символов, круглые открывающие и закрывающие скобки. Признаком завершения признаком завершения последовательности является символ #. Определить. имеется ли в заданной последовательности баланс открывающихся и закрывающихся скобок. Скобки считаются сбалансированными, если для каждой открывающей скобки есть соответствующая закрывающая скобка, причем в предпоследовательности между этими скобками так же соблюден баланс. Последовательность. не содержащая ни одной скобки. считается так же сбалансированной."
Так как с языком С++ сталкиваюсь впервые)) хотелось бы узнать основные функции и команды вместе с их описанием для Си. то бишь может кто подскажет источник информации. в котором будет описано все "как дураку".
Для приведенной задачи у меня получился примерно такой алгоритм:

1) Создание счетчика с переменной "open" для "(" (изначально переменные = 0)
2) Создание счетчкиа с переменной "close" для ")"
3) Закрузка файла, содержащеко текст, допустим 123.txt
4) Далее сравнение сиволов файла с "(" и ")"
5) Если первая скобка в последовательности символов до символа "#" ")" - выдвать сообщение, что "баланса нет"
6) Если последняя скобка, в последовательности символов до символа "#" "(" аналогичное сообщение об отстутствии баланса и конец программы ( так как ""123 ) 2323(ыв) (0"" несмотря на одинаковое кол-во открывающихся/закр. скобок баланса тут нет )
7) Если 5й и 6й пункт не нашли бисбаланса скобок, то начать сравнение символов начиная с первого и заканчивая символом"#". при этом при обнаружении "(" совершать "open+1" аналогично и для ")" только с close)
8) Как только сравниваемый сивол примит значение "#", сделать сравнение переменных open и close.
9) Если значения переменных равны друг другу. то выдать сообщение об "наличии баланса скобок"
10) Если переменные больше. аналогично и меньше друг друга. то выдать сообщение об "отсутствии баланса"

Среда работы - Microsoft Visual Studio 2008

Буду очень благодарен. если окажете помощь в реализации этой задачи, и ссылками на литературу. в которой как дураку расписано что, как и где нужно напсать. чтоб все написанное заработало. Заранее благодарен)

Lisiy_egik
19-09-2009, 17:20
Вот такую вещь мне подсказал мой дядя. только вот и в ней я мало чего понимаю, в силу того. что пока еще не знаю действия "команд" и способа построения программ



# include <iostream>
# include <cctype>
# include <cmath>
# include <csteng>
using name space sta,

int main () (
int a , и б с ;
char f;
bool begin, eno ;
count << ""Введите строку сиволов для анализа : "" ;
cin >> f ;
//далее проверка на присутствие "")"" в начале строки и ""("" в конце строки, пока не найдется символ ""#""
DO (

Drongo
19-09-2009, 18:05
1) Создание счетчика с переменной "open" для "(" (изначально переменные = 0) »int open = 0;int main () (
int a , и б с ;
char f; »Неполучится, лучше уже так сделать(хотя и не идеально), на скорую руку и не все пункты, но, думаю, база уже есть...

#include <iostream>
#include <cctype>
#include <cmath>
using namespace std;

int main ()
{
int element = 0;
int sizeString = 256;
char string[sizeString]; // массив ввода

cout<<" Введите строку: ";
cin.getline(string, sizeString, '\n'); // функция ввода

while(string[element] != '\0'){ // Пока не конец строки производить проверку, символ за символом
if(string[element] == '('){ // Если найдена открывающая скобка.
open++; // Увеличить счётчик 'open'
}
else if(string[element] == ')'){ // Если найдена закрывающая скобка.
close++; // Увеличить счётчик 'close'
}
element++; // переход к следующему символу.
}
if(open == close){ // Если оба счётчика равны, значит есть открывающая и закрывающая скобка
// Если переменные больше. аналогично и меньше друг друга. то выдать сообщение об "наличии баланса скобок"
}
else if(open != close){
// Если значения переменных не равны друг другу. то выдать сообщение об "отсутствии баланса"
}
cin>>element;
}

pva
19-09-2009, 21:14
#include <iostream>
using namespace std;

int main()
{
int balance = 0;
char ch;

while(balance>=0 && (cin >> ch) && ch!='#')
{
switch(ch) {
case '(' : ++balance; break;
case ')' : --balance; break;
}
}

if (balance==0) cout << "всё зашибись!\n";
else cout << "следи на руками ;)\n";
return balance==0;
}

Принцип работы: представим скобки в виде дерева: открыли скобку - перешли на дочерний уровень, закрыли скобку - ввернулись с дочернего уровня. Нас интересует баланс, то есть чтобы пройдя всё выражение ни разу не выйти за корень и в конце остаться в корне. Обозначим переменной balance глубину дочерней ветки (то есть количество незакрытых скобок).
При чтении с клавиатуры ввод построчно буфферизуется. Поэтому чтобы реально программа остановилась, надо после диеза (#) всё-таки нажать enter.
Для демонстрации того, для чего нужен с++:

template<typename ForwardIterator>
bool is_balanced(ForwardIterator first, ForwardIterator last)
{
int balance = 0;

for(; balance>=0 && first!=last && *first!='#'; ++first)
{
switch(*first) {
case '(' : ++balance; break;
case ')' : --balance; break;
}
}

return balance==0;
}

int main()
{
// можно так: (из строки в памяти, как делали все)
string data1;
getline(cin, data1, char());
cout << is_balanced(data1.begin(), data1.end()) << "\n";

// а можно и так: (сразу из потока)
cout << is_balanced(streambuf_iterator<char>(cin), streambuf_iterator<char>()) << "\n";
}

про итераторы много информации, я читал в хелпе от билдера (bcb4stl.hlp)

Drongo
19-09-2009, 22:55
pva, Мастер узнаётся по перу. :up:

Lisiy_egik
20-09-2009, 22:40
так) огромное спасибо) завтра посмотрим что получиться)

Delirium
21-09-2009, 01:13
pva, Мастер узнаётся по перу »
Препод в универе прорастет, если ему на первом курсе принесут задачу с таким решением и, особенно, с таким пояснением от pva. :) Супер :)

Drongo
01-10-2009, 12:56
только в вуз поступил, и начал учиться с 3й недели, сейчас пытаюсь нагнать программу »
Препод в универе прорастет, если ему на первом курсе принесут задачу с таким решением »Это точно, догнал на третей неделе и перегнал на следующий день. :)




© OSzone.net 2001-2012