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

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

Lisiy_egik 19-09-2009 17:08 1222613

Помогите чайнику разобраться в азах С++
 
-только в вуз поступил, и начал учиться с 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 1222620

Вот такую вещь мне подсказал мой дядя. только вот и в ней я мало чего понимаю, в силу того. что пока еще не знаю действия "команд" и способа построения программ



# 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 1222647

Цитата:

Цитата Lisiy_egik
1) Создание счетчика с переменной "open" для "(" (изначально переменные = 0) »

Код:

int open = 0;
Цитата:

Цитата Lisiy_egik
Код:

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 1222770

Код:

#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 1222825

pva, Мастер узнаётся по перу. :up:

Lisiy_egik 20-09-2009 22:40 1223554

так) огромное спасибо) завтра посмотрим что получиться)

Delirium 21-09-2009 01:13 1223650

Цитата:

Цитата Drongo
pva, Мастер узнаётся по перу »

Препод в универе прорастет, если ему на первом курсе принесут задачу с таким решением и, особенно, с таким пояснением от pva. :) Супер :)

Drongo 01-10-2009 12:56 1231891

Цитата:

Цитата Lisiy_egik
только в вуз поступил, и начал учиться с 3й недели, сейчас пытаюсь нагнать программу »

Цитата:

Цитата Delirium
Препод в универе прорастет, если ему на первом курсе принесут задачу с таким решением »

Это точно, догнал на третей неделе и перегнал на следующий день. :)


Время: 07:40.

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