Автор Тема: Информатика - программирование (С++)  (Прочитано 4498 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Fylhtq1997

  • Ветеран
  • *****
  • Сообщений: 588
  • ЮТШ ЛЭТИ
    • Просмотр профиля
    • E-mail
Здравствуйте.

Задача 1. Brackets
Дана последовательсть символов. Требуется определить, является ли ее скобочная подпоследовательность «правильной»?
Осуществите чтение из двух файлов: types.txt, string.txt. Вывод сделайте на экран.
В первой строке файла types.txt дано количество видов скобок k, не превосходящее 128. В последующих k строках даны через пробел пары символов. В каждой паре первый символ соответствует открывающейся скобке данного типа, а второй символ — закрывающейся. Гарантируется, что все символы различны. В strings.txt дана строка размером до 107  символов. Если ее скобочная подпоследовательность, соответствующая данным видам скобок, является правильной, то выведите ”YES”. В противном случае выведите ”NO”.

Задача 2. DataBase
Ваша заключается в том, чтобы сконструировать простенькую базу данных, содержащую  информацию о студентах. У каждого студента есть следующие атрибуты:
1)   имя
2)   номер группы
3)   список оценок за последнюю сессию
База данных должна отвечать на запросы вида «найти студентов, имеющих данный номер группы», «найти студента, имеющего данное имя». Так же она должна уметь выводить их в отсортированном виде: по имени, по номеру группы, по среднему баллу как в порядке возрастания, так и в порядке убывания. Список студентов следует читать из файла. Работу со студентами проводите в интерактивном режиме, т.е. через консоль.

В зарание благодарю.
"Лучше понять немного, чем неверно"
"Успех - это умение двигаться от неудачи к неудаче, не теряя оптимизма"

Оффлайн devnull

  • Ветеран
  • *****
  • Сообщений: 745
    • Просмотр профиля
Re: Информатика - программирование (С++)
« Ответ #1 : 28 Январь 2012, 06:40:40 »
1. Заведите стек для хранения информации о скобках. Когда читаете входную строку и встречаете открывающую скобку, то помещаете ее на вершину стека. Когда встречаете закрывающую скобку, то выталкиваете последнюю открывающую скобку с вершины стека. Если стек пуст или скобка на вершине стека не является парной с данной закрывающей, то скобочная последовательность нарушена. Скобочная последовательность правильная тогда и только тогда, когда в конце строки стек окажется пуст.

2. Очень много вариантов решения. Что именно у вас вызывает проблемы в этой задаче?

Оффлайн zer0

  • Ветеран
  • *****
  • Сообщений: 688
    • Просмотр профиля
    • E-mail
Re: Информатика - программирование (С++)
« Ответ #2 : 28 Январь 2012, 14:25:31 »
У меня впечатление, что автор темы - ученик матшколы или маткласса.
И туда проникла зараза халявы...

Оффлайн Fylhtq1997

  • Ветеран
  • *****
  • Сообщений: 588
  • ЮТШ ЛЭТИ
    • Просмотр профиля
    • E-mail
Re: Информатика - программирование (С++)
« Ответ #3 : 28 Январь 2012, 16:57:02 »
У меня впечатление, что автор темы - ученик матшколы или маткласса.
И туда проникла зараза халявы...
Вы ошибаетесь, я ученик 8 класса обыкновенной школы, но посещаю кружок математики в институте ЛЭТИ. Этот сайт мне очень помог в решении математических задач, поэтому я обратился за помощью в программировании. Большое спасибо всем участникам сайта за помощь.
"Лучше понять немного, чем неверно"
"Успех - это умение двигаться от неудачи к неудаче, не теряя оптимизма"

Оффлайн CD_Eater

  • Эксперт
  • ******
  • Сообщений: 1906
    • Просмотр профиля
Re: Информатика - программирование (С++)
« Ответ #4 : 28 Январь 2012, 17:59:50 »
когда дают условие задачки и просят написать решение - это именно поиск халявы
чтобы не было иллюзии поиска халявы, начните решать задачку сами и укажите, в каком месте у вас что-то не получилось

Оффлайн Fylhtq1997

  • Ветеран
  • *****
  • Сообщений: 588
  • ЮТШ ЛЭТИ
    • Просмотр профиля
    • E-mail
Re: Информатика - программирование (С++)
« Ответ #5 : 28 Январь 2012, 18:11:08 »
С смог написать программу для проверки таких скобок () {} [] ,а учитель говорит нужно сделать программу для скобок задаваемых любыми знаками например:
скобки ab а-открывающаяся, а b соответственно закрывающаяся пары скобок даны в отдельном файле, но не знаю как читать в вектор а учитель сказал что надо их использовать.
"Лучше понять немного, чем неверно"
"Успех - это умение двигаться от неудачи к неудаче, не теряя оптимизма"

Оффлайн CD_Eater

  • Эксперт
  • ******
  • Сообщений: 1906
    • Просмотр профиля
Re: Информатика - программирование (С++)
« Ответ #6 : 28 Январь 2012, 18:19:33 »
в чём сложность?
1) считать символы, обозначающие скобки, в отдельный массив
2) определить поиском по этому массиву, является ли символ скобкой, определить парную для неё скобку

Оффлайн Fylhtq1997

  • Ветеран
  • *****
  • Сообщений: 588
  • ЮТШ ЛЭТИ
    • Просмотр профиля
    • E-mail
Re: Информатика - программирование (С++)
« Ответ #7 : 28 Январь 2012, 18:26:26 »
в чём сложность?
1) считать символы, обозначающие скобки, в отдельный массив
2) определить поиском по этому массиву, является ли символ скобкой, определить парную для неё скобку
Подскажите как сделать не массив, а вектор и как с ним работать. Учитель сказал надо использовать векторы.
"Лучше понять немного, чем неверно"
"Успех - это умение двигаться от неудачи к неудаче, не теряя оптимизма"

Оффлайн zer0

  • Ветеран
  • *****
  • Сообщений: 688
    • Просмотр профиля
    • E-mail
Re: Информатика - программирование (С++)
« Ответ #8 : 28 Январь 2012, 22:02:23 »
И что - учитель сказал, что надо использовать вектор, а сам не дал примера его использования?

Оффлайн devnull

  • Ветеран
  • *****
  • Сообщений: 745
    • Просмотр профиля
Re: Информатика - программирование (С++)
« Ответ #9 : 29 Январь 2012, 02:14:57 »

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main(void)
{
        ifstream file("braket.txt"); // Файл с данными о скобках
        int k;
        file >> k;  // Считываем число пар скобок
        vector<char> bra;  // Вектор для открывающих скобок
        vector<char> ket;  // Вектор для закрывающих скобок
        for (int i = 0; i < k; i++) {
                char c;
                file >> c;        // Считали один символ (это будет открывающая скобка)
                bra.push_back(c); // и записали его в конец вектора bra.
                file >> c;        // Считали один символ (это будет закрывающая скобка)
                ket.push_back(c); // и записали его в конец вектора ket.
        }
        file.close();
        // Теперь, например, bra[3] будет содержать открывающую скобку из четвертой пары,
        // а ket[3] - соответствующую закрывающую скобку. Пара четвертая, а не третья,
        // так как нумерация начинается с нуля.

        .............

        return 0;
}
« Последнее редактирование: 29 Январь 2012, 03:13:31 от devnull »

Оффлайн Fylhtq1997

  • Ветеран
  • *****
  • Сообщений: 588
  • ЮТШ ЛЭТИ
    • Просмотр профиля
    • E-mail
Re: Информатика - программирование (С++)
« Ответ #10 : 30 Январь 2012, 00:07:50 »
И что - учитель сказал, что надо использовать вектор, а сам не дал примера его использования?
Учитель сказал поискать в интернете, но я не смог найти.

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main(void)
{
        ifstream file("braket.txt"); // Файл с данными о скобках
        int k;
        file >> k;  // Считываем число пар скобок
        vector<char> bra;  // Вектор для открывающих скобок
        vector<char> ket;  // Вектор для закрывающих скобок
        for (int i = 0; i < k; i++) {
                char c;
                file >> c;        // Считали один символ (это будет открывающая скобка)
                bra.push_back(c); // и записали его в конец вектора bra.
                file >> c;        // Считали один символ (это будет закрывающая скобка)
                ket.push_back(c); // и записали его в конец вектора ket.
        }
        file.close();
        // Теперь, например, bra[3] будет содержать открывающую скобку из четвертой пары,
        // а ket[3] - соответствующую закрывающую скобку. Пара четвертая, а не третья,
        // так как нумерация начинается с нуля.

        .............

        return 0;
}

Большое спасибо  за  помощь я во всём разобрался.
"Лучше понять немного, чем неверно"
"Успех - это умение двигаться от неудачи к неудаче, не теряя оптимизма"

Оффлайн Fylhtq1997

  • Ветеран
  • *****
  • Сообщений: 588
  • ЮТШ ЛЭТИ
    • Просмотр профиля
    • E-mail
Re: Информатика - программирование (С++)
« Ответ #11 : 30 Январь 2012, 00:14:56 »
Здравствуйте.
2. Очень много вариантов решения. Что именно у вас вызывает проблемы в этой задаче?
У меня вызывают проблемы с классами. Это тоже учитель попросил использовать. Учитель прислал мне как он говорит "Грязный код". И предложил его дополнить.
А также база данных может быть своя.
P.S. Можете ли Вы посоветовать литературу по изучению С++.
Спасибо.
"Лучше понять немного, чем неверно"
"Успех - это умение двигаться от неудачи к неудаче, не теряя оптимизма"

Оффлайн Fylhtq1997

  • Ветеран
  • *****
  • Сообщений: 588
  • ЮТШ ЛЭТИ
    • Просмотр профиля
    • E-mail
Re: Информатика - программирование (С++)
« Ответ #12 : 01 Февраль 2012, 17:24:42 »
Помогите пожалуйста найти ошибку в программе.

#include <iostream>         
#include <fstream>         
#include <vector>   
#include <conio.h>

using namespace std;       

vector<char> bra; 
vector<char> ket;
int k;

char para(char a){
     for(int l = 0; l < k ; l++){
         if(a==bra[l]){
            return ket[l];       
         }
         if(a==ket[l]){
            return bra[l];
         }                                                   
     }
}   


int main(){
    ifstream fin("types.txt");
    ifstream fin2("strings.txt");
    fin >> k; 
    char c;
    for(int i = 0; i < k; i++) {
            fin >> c;       
            bra.push_back(c);
            fin >> c;
            fin >> c;       
            ket.push_back(c);
    }                 
    string s;
    while (!fin2.eof()){           
        c = fin2.get();
        s.push_back(c);
    }
    vector<char> stack;
    for(int j = 0; j < s.size(); ++j){   
        for(int i = 0; i < k ; i++){
            if(bra==s[j]){
               stack.push_back(s[j]);
            } 
            if(ket==s[j]){
              if((stack.size()-1)==0){
                  cout << "NO";
                  getch();
                  return 0;
              }
               if(para(stack[stack.size()-1])==s[j]){
                  stack.pop_back();
               }
            }
        }
    }
    if((stack.size()-1)==0){
       cout << "YES";
    }                                                         
    cin.get();
    getch();
    return 0;
}
"Лучше понять немного, чем неверно"
"Успех - это умение двигаться от неудачи к неудаче, не теряя оптимизма"

Оффлайн Harry

  • Старожил
  • ****
  • Сообщений: 441
    • Просмотр профиля
Re: Информатика - программирование (С++)
« Ответ #13 : 01 Февраль 2012, 18:50:48 »
Помогите пожалуйста найти ошибку в программе.

    for(int i = 0; i < k; i++) {
            fin >> c;       
            bra.push_back(c);
            fin >> c;
            fin >> c;       
            ket.push_back(c);
    }                 

Как минимум, тут - в bra будет заноситься открывающая скобка, а в ket  - пробел...

И - со стеком так, как у вас, не работают... У него есть свой джентльменский набор - pop(), push(), top(), empty()...

Оффлайн Fylhtq1997

  • Ветеран
  • *****
  • Сообщений: 588
  • ЮТШ ЛЭТИ
    • Просмотр профиля
    • E-mail
Re: Информатика - программирование (С++)
« Ответ #14 : 01 Февраль 2012, 19:18:46 »
Скобки будут даны так : ( ) { } [ ]
Как минимум, тут - в bra будет заноситься открывающая скобка, а в ket  - пробел...
И - со стеком так, как у вас, не работают... У него есть свой джентльменский набор - pop(), push(), top(), empty()...
Я не понял почему стек не работает поясните пожалуйста.
« Последнее редактирование: 01 Февраль 2012, 20:12:57 от Fylhtq1997 »
"Лучше понять немного, чем неверно"
"Успех - это умение двигаться от неудачи к неудаче, не теряя оптимизма"