Логические задачи и головоломки
26 Май 2012, 15:43:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости:
 
   Начало   Правила Помощь Поиск Войти Регистрация Чат  
Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Информатика - программирование (С++)  (Прочитано 762 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Fylhtq1997
Ветеран
*****
Offline Offline

Сообщений: 533


ЮТШ ЛЭТИ


Просмотр профиля Email
« : 28 Январь 2012, 01:47:14 »

Здравствуйте.

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

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

В зарание благодарю.
Записан

"Лучше понять немного, чем неверно"
"Успех - это умение двигаться от неудачи к неудаче, не теряя оптимизма"
devnull
Старожил
****
Offline Offline

Сообщений: 455


Просмотр профиля
« Ответ #1 : 28 Январь 2012, 05:40:40 »

1. Заведите стек для хранения информации о скобках. Когда читаете входную строку и встречаете открывающую скобку, то помещаете ее на вершину стека. Когда встречаете закрывающую скобку, то выталкиваете последнюю открывающую скобку с вершины стека. Если стек пуст или скобка на вершине стека не является парной с данной закрывающей, то скобочная последовательность нарушена. Скобочная последовательность правильная тогда и только тогда, когда в конце строки стек окажется пуст.

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

Сообщений: 441


Просмотр профиля Email
« Ответ #2 : 28 Январь 2012, 13:25:31 »

У меня впечатление, что автор темы - ученик матшколы или маткласса.
И туда проникла зараза халявы...
Записан
Fylhtq1997
Ветеран
*****
Offline Offline

Сообщений: 533


ЮТШ ЛЭТИ


Просмотр профиля Email
« Ответ #3 : 28 Январь 2012, 15:57:02 »

У меня впечатление, что автор темы - ученик матшколы или маткласса.
И туда проникла зараза халявы...
Вы ошибаетесь, я ученик 8 класса обыкновенной школы, но посещаю кружок математики в институте ЛЭТИ. Этот сайт мне очень помог в решении математических задач, поэтому я обратился за помощью в программировании. Большое спасибо всем участникам сайта за помощь.
Записан

"Лучше понять немного, чем неверно"
"Успех - это умение двигаться от неудачи к неудаче, не теряя оптимизма"
CD_Eater
Эксперт
******
Offline Offline

Сообщений: 1487


Просмотр профиля
« Ответ #4 : 28 Январь 2012, 16:59:50 »

когда дают условие задачки и просят написать решение - это именно поиск халявы
чтобы не было иллюзии поиска халявы, начните решать задачку сами и укажите, в каком месте у вас что-то не получилось
Записан
Fylhtq1997
Ветеран
*****
Offline Offline

Сообщений: 533


ЮТШ ЛЭТИ


Просмотр профиля Email
« Ответ #5 : 28 Январь 2012, 17:11:08 »

С смог написать программу для проверки таких скобок () {} [] ,а учитель говорит нужно сделать программу для скобок задаваемых любыми знаками например:
скобки ab а-открывающаяся, а b соответственно закрывающаяся пары скобок даны в отдельном файле, но не знаю как читать в вектор а учитель сказал что надо их использовать.
Записан

"Лучше понять немного, чем неверно"
"Успех - это умение двигаться от неудачи к неудаче, не теряя оптимизма"
CD_Eater
Эксперт
******
Offline Offline

Сообщений: 1487


Просмотр профиля
« Ответ #6 : 28 Январь 2012, 17:19:33 »

в чём сложность?
1) считать символы, обозначающие скобки, в отдельный массив
2) определить поиском по этому массиву, является ли символ скобкой, определить парную для неё скобку
Записан
Fylhtq1997
Ветеран
*****
Offline Offline

Сообщений: 533


ЮТШ ЛЭТИ


Просмотр профиля Email
« Ответ #7 : 28 Январь 2012, 17:26:26 »

в чём сложность?
1) считать символы, обозначающие скобки, в отдельный массив
2) определить поиском по этому массиву, является ли символ скобкой, определить парную для неё скобку
Подскажите как сделать не массив, а вектор и как с ним работать. Учитель сказал надо использовать векторы.
Записан

"Лучше понять немного, чем неверно"
"Успех - это умение двигаться от неудачи к неудаче, не теряя оптимизма"
zer0
Старожил
****
Offline Offline

Сообщений: 441


Просмотр профиля Email
« Ответ #8 : 28 Январь 2012, 21:02:23 »

И что - учитель сказал, что надо использовать вектор, а сам не дал примера его использования?
Записан
devnull
Старожил
****
Offline Offline

Сообщений: 455


Просмотр профиля
« Ответ #9 : 29 Январь 2012, 01: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, 02:13:31 от devnull » Записан
Fylhtq1997
Ветеран
*****
Offline Offline

Сообщений: 533


ЮТШ ЛЭТИ


Просмотр профиля Email
« Ответ #10 : 29 Январь 2012, 23: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
Ветеран
*****
Offline Offline

Сообщений: 533


ЮТШ ЛЭТИ


Просмотр профиля Email
« Ответ #11 : 29 Январь 2012, 23:14:56 »

Здравствуйте.
2. Очень много вариантов решения. Что именно у вас вызывает проблемы в этой задаче?
У меня вызывают проблемы с классами. Это тоже учитель попросил использовать. Учитель прислал мне как он говорит "Грязный код". И предложил его дополнить.
А также база данных может быть своя.
P.S. Можете ли Вы посоветовать литературу по изучению С++.
Спасибо.
Записан

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

Сообщений: 533


ЮТШ ЛЭТИ


Просмотр профиля Email
« Ответ #12 : 01 Февраль 2012, 16: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
Постоялец
***
Offline Offline

Сообщений: 194



Просмотр профиля
« Ответ #13 : 01 Февраль 2012, 17: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
Ветеран
*****
Offline Offline

Сообщений: 533


ЮТШ ЛЭТИ


Просмотр профиля Email
« Ответ #14 : 01 Февраль 2012, 18:18:46 »

Скобки будут даны так : ( ) { } [ ]
Как минимум, тут - в bra будет заноситься открывающая скобка, а в ket  - пробел...
И - со стеком так, как у вас, не работают... У него есть свой джентльменский набор - pop(), push(), top(), empty()...
Я не понял почему стек не работает поясните пожалуйста.
« Последнее редактирование: 01 Февраль 2012, 19:12:57 от Fylhtq1997 » Записан

"Лучше понять немного, чем неверно"
"Успех - это умение двигаться от неудачи к неудаче, не теряя оптимизма"
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  

Powered by SMF 1.1.11 | SMF © 2006-2009, Simple Machines LLC | Sitemap