Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > классы


Автор: elenSV 1.5.2009, 18:34
проверьте пожлста
Рассмотреть модификацию магнитофона, который запоминает у себя в памяти все выполняемые пользователем действия. Считается что видиокассета обладает уникальным числовым идентификатором. В качестве тестовой программы рассмотреть задачу выполнения просмотра кассеты на магнитофоне, точный вид которого не определен. Просмотр сосстоит в последовательности след. операций: вставить кассету, перемотать кассету в начало, включить воспроизведение, выполнить останов и извлечь кассету.
Код

#include <iostream>
#include <string>
#include <vector>
using namespace std;
class magnitofon
{
        bool play, rec, kasset, stop;   // Процессы: воспроизведение, запись и наличие кассеты
        int rew;                                                // Процесс перемотки (положительное число - вперёд на заданный интервал, 
                                                                        // отрицательное число - назад на заданный интервал, 0 - бездействие)

        vector<string>  ListDat;                // Запоминает все действия
public:
        magnitofon()                                    // Конструктор
        {
                play = false;
                stop = false;                           // По-умолчанию все процессы выключены
                rec = false;
                rew = 0;
                kasset = false;                         // По-умолчванию кассеты нет
        }

        void m_stop()                                   // Метод останавливает все процессы видеомагнитофона
        {
                play = false;
                rec = false;
                rew = 0;
                ListDat.push_back("m_stop");
        }

        void m_play()                                   // Метод включает воспроизведение кассеты
        {
                m_stop();                                       // Может быть активен только один процесс, поэтому вызывается метод "Stop"
                play = true;
                ListDat.push_back("m_play");
        }

        void m_rew(int interval)                // Метод перематывает кассету в заданном направление
        {
                m_stop();
                rew = interval;                         // Перемотка на заданный интервал
                ListDat.push_back("m_rew");
        }

        void m_rec()                                    // Метод начинает запись
        {
                if (play) rec = true;           // Запись возможна только при включённом процессе play
                ListDat.push_back("m_rec");
        }

        void insert()                                   // Метод вставляет кассету
        {
                m_stop();
                kasset = true;
                ListDat.push_back("insert");
        }

        void get()                                              // Метод достаёт кассету      
        {
                m_stop();
                kasset = false;
                ListDat.push_back("get");
        }

        bool check()                                    // Метод проверяет, есть ли кассета
        {
                return kasset;                          // Возвращает true, если кассета есть, в противном случае false.
        }

        void outListDat()
        {
                vector<string>::iterator it;
                for(it = ListDat.begin(); it != ListDat.end(); ++it)
                        cout<<*it<<endl;
        }
};
int main()
{
        magnitofon mag;
        mag.insert();
        mag.m_play();
        mag.m_rec();
        mag.m_rew(1);
        mag.m_stop();
        mag.get();

        mag.outListDat();

        system("pause");
        return 0;

}



А как это в KDevelop оформить как cpp и h файл - какие директивы подключать
  
и ещё подскажите как это сделать:
Пусть имеется магнитофон с записью операций 
Требуется определить самую часто воспроизводимую кассету
то есть такую для которой операция воспроизведения производилась наиболее часто

Автор: mes 1.5.2009, 18:38
Цитата(elenSV @  1.5.2009,  17:34 Найти цитируемый пост)
и ещё подскажите как это сделать:
Пусть имеется магнитофон с записью операций 
Требуется определить самую часто воспроизводимую кассету
то есть такую для которой операция воспроизведения производилась наиболее часто 

хранить где то кол-во воспроизведений для каждой кассеты (можно кол-во воспроизведений сделать свойством кассеты)
ну а дальше очевидное сравнение.

Добавлено через 6 минут и 24 секунды

Цитата(elenSV @  1.5.2009,  17:34 Найти цитируемый пост)
А как это в KDevelop оформить как cpp и h файл - какие директивы подключать

разбиваешь на три файла main.cpp magnitofon.h magnitofon.cpp
инклудишь в первый и третий  второй файл, и во все те системные файлы которые необходимо в этом файле файле.
в первый переносишь всю процедуру main.
во втором оставляешь весь класс, но без реализаций функций т.ев таком виде :
 
Код

class magnitofon
{
        bool play, rec, kasset, stop;   // Процессы: воспроизведение, запись и наличие кассеты
        int rew;                                                // Процесс перемотки (положительное число - вперёд на заданный интервал, 
                                                                        // отрицательное число - назад на заданный интервал, 0 - бездействие)
        vector<string>  ListDat;                // Запоминает все действия
public:
        magnitofon();                                    // Конструктор   
        void m_stop();
...

ну а в третий выносишь реалицию,  так :
Код



magnitofon::magnitofon()                                    // Конструктор
{
                play = false;
                stop = false;                           // По-умолчанию все процессы выключены
                rec = false;
                rew = 0;
                kasset = false;                         // По-умолчванию кассеты нет
}

void magnitofon::m_stop()                                   // Метод останавливает все процессы видеомагнитофона
{
                play = false;
                rec = false;
                rew = 0;
                ListDat.push_back("m_stop");
}

не забудь перед названием функции указать имя класса в котом они определены (т.е  добавить magnitofon::, см пример в коде)

Добавлено через 7 минут и 1 секунду
ну и дублировать темы правилами форума запрещено smile

Автор: elenSV 1.5.2009, 18:45
 smile 
Я просто не оч понимаю как модифицировать методы и поле kasset так, что бы вставлялась каасета с именем, и при воспроизведении счётчик для вставленной кассеты увеличивался.

Автор: bsa 1.5.2009, 18:45
создай проект c++ hello world и замени файл main.cpp своим.
Как вариант, запусти консоль (терминал) и скомпилируй вручную: g++ -o myprog myprog.cpp, затем останется только запустить ./myprog

Автор: mes 1.5.2009, 18:57
Цитата(elenSV @  1.5.2009,  17:45 Найти цитируемый пост)
Я просто не оч понимаю как модифицировать методы и поле kasset так, что бы вставлялась каасета с именем, и при воспроизведении счётчик для вставленной кассеты увеличивался. 


можно так к примеру :

Код


struct Kassete
{
    int InsertCount;
// ..
};

class Magnitofon
{
    ...
        void insert (Kassete& kassete);
         {
              ++kassete.InsertCount;
             ...
         }
 ...
};
int main (
...
Kassete  kassete[100]; // массив на 100 кассет
Magnitofon magnitofon;
magnitofon.insert(Kassete[11]);  // вставляем кассету условное ид которой =11
..


Автор: zim22 1.5.2009, 19:03
Цитата(mes @  1.5.2009,  18:57 Найти цитируемый пост)
Kassete [100] kassete; // массив на 100 кассет

smile
Код

Kassete kassete[100]; // массив на 100 кассет

Автор: mes 1.5.2009, 19:07
Цитата(zim22 @  1.5.2009,  18:03 Найти цитируемый пост)
    
Kassete kassete[100]; // массив на 100 кассет
 smile  smile 

Автор: elenSV 1.5.2009, 19:11
Я не оч поняла зачем вот это:
Код

int main (
...
Kassete  kassete[100]; // массив на 100 кассет
Magnitofon magnitofon;
magnitofon.insert(Kassete[11]);  // вставляем кассету условное ид которой =11
..

почему в main'e
 smile 
А как определить самую часто воспроизводимую кассету?

Автор: zim22 1.5.2009, 19:22
Цитата(elenSV @  1.5.2009,  19:11 Найти цитируемый пост)
почему в main'e

потому что main выступает в качестве программы-драйвера для тестирования классов Mmagnitofon и Kassette

Добавлено @ 19:23
Цитата(elenSV @  1.5.2009,  19:11 Найти цитируемый пост)
А как определить самую часто воспроизводимую кассету?

отсортировать массив kassette. алгоритм partial_sort из <algorithm> подойдёт

Код

struct Kassete
{
  Kassete() : InsertCount(0),  id(unique_id++){ }
    int InsertCount;
    int id;;
    static int unique_id;
// ..
};
int Kassete::unique_id = 0;

bool cmp_fcn(const Kassete &k1, const Kassete &k2) {
  return k1.InsertCount > k2.InsertCount;
}

int main() {
  ...
  std::partial_sort(kassete, kassete + 1, kassete + 100, cmp_fcn);
  int max_number = kassete[0].InsertCount;
  int id_kassette = kassete[0].id;
  ...
}

Автор: mes 1.5.2009, 19:23
Цитата(elenSV @  1.5.2009,  18:11 Найти цитируемый пост)
почему в main'e

определяй, где тебе удобнее  smile

Цитата(elenSV @  1.5.2009,  18:11 Найти цитируемый пост)
А как определить самую часто воспроизводимую кассету? 

примерно, так определяем самую часто вставляемую кассету :

Код


int max=0;
for (int i=0; i<100; ++i) проходим весь список касет.
   if (kassete[i].InsertCount > kassete[max].InsertCount) max=i;

std::cout << "Больше всех (а именно "<< kassete[max].InsertCount) "раз) была вставлена кассета с id " << max;


для самой воспроизводимой нужно завести еще одно поле, которое будет изменяться в magnitofon::play
(изменять можно на единицу при каждом включении или например по длине времени воспроизведения  - это уж на свой вкус)


P.S. все приведенные коды даны с допущениями. В частности предполагается, что поле InsertCount изначально обнулено.

Добавлено через 6 минут и 30 секунд
Цитата(zim22 @  1.5.2009,  18:22 Найти цитируемый пост)

отсортировать массив kassette. алгоритм partial_sort из <algorithm> подойдёт 

тогда id потеряется, так как в приведенном примере оно основывается на позиции элемента в массиве.
Кстати возможность таких последствий говорит, о том что решение не самое красивое. (но зато отн. легкое )  smile 

Автор: elenSV 1.5.2009, 19:31
то есть здесь кроме этого ничего не надо:
Код

struct Kassete
{
 int InsertCount;
#include <iostream>
#include <string>
#include <vector>
using namespace std;
};
class magnitofon
{
        bool play, rec, kasset, stop;   // Процессы: воспроизведение, запись и наличие кассеты
        int rew;                                                // Процесс перемотки (положительное число - вперёд на заданный интервал, 
                                                                        // отрицательное число - назад на заданный интервал, 0 - бездействие)

        vector<string>  ListDat;                // Запоминает все действия
public:
        magnitofon()                                    // Конструктор
        {
                play = false;
                stop = false;                           // По-умолчанию все процессы выключены
                rec = false;
                rew = 0;
                kasset = false;                         // По-умолчванию кассеты нет
        }
        void m_stop()                                   // Метод останавливает все процессы видеомагнитофона
        {
                play = false;
                rec = false;
                rew = 0;
                ListDat.push_back("m_stop");
        }

        void m_play()                                   // Метод включает воспроизведение кассеты
        {
                m_stop();                                       // Может быть активен только один процесс, поэтому вызывается метод "Stop"
                play = true;
                ListDat.push_back("m_play");
        }

        void m_rew(int interval)                // Метод перематывает кассету в заданном направление
        {
                m_stop();
                rew = interval;                         // Перемотка на заданный интервал
                ListDat.push_back("m_rew");
        }

        void m_rec()                                    // Метод начинает запись
        {
                if (play) rec = true;           // Запись возможна только при включённом процессе play
                ListDat.push_back("m_rec");
        }

        void insert()                                   // Метод вставляет кассету
        {
                m_stop();
                kasset = true;
                   ++kassete.InsertCount;
                ListDat.push_back("insert");
        }

        void get()                                              // Метод достаёт кассету      
        {
                m_stop();
                kasset = false;
                ListDat.push_back("get");
        }

        bool check()                                    // Метод проверяет, есть ли кассета
        {
                return kasset;                          // Возвращает true, если кассета есть, в противном случае false.
        }

        void outListDat()
        {
                vector<string>::iterator it;
                for(it = ListDat.begin(); it != ListDat.end(); ++it)
                        cout<<*it<<endl;
        }
};
int main()
{
        magnitofon mag;
        mag.insert();
        mag.m_play();
        mag.m_rec();
        mag.m_rew(1);
        mag.m_stop();
        mag.get();
        Kassete  kassete[100]; // массив на 100 кассет
        Magnitofon magnitofon;
        magnitofon.insert(Kassete[11]);  // вставляем кассету условное ид которой =11
        mag.outListDat();

        system("pause");
        return 0;
}


али что - я на измене
 smile 

Автор: zim22 1.5.2009, 19:38
Цитата(mes @  1.5.2009,  19:23 Найти цитируемый пост)
тогда id потеряется, так как в приведенном примере оно основывается на позиции элемента в массиве.Кстати возможность таких последствий говорит, о том что решение не самое красивое. (но зато отн. легкое )

я это уже понял и изменил вhttp://forum.vingrad.ru/index.php?showtopic=257715&view=findpost&p=1857950 структуру Kassete smile

Автор: mes 1.5.2009, 19:56
Цитата(elenSV @  1.5.2009,  18:31 Найти цитируемый пост)
то есть здесь кроме этого ничего не надо:

В принципе в магнитофон необходимо добавить только лишь изменение свойств кассеты при каком нужно  действии.
ну и конечно описать саму структуру/класс кассеты и создать их список/массив.



Автор: EvilsInterrupt 2.5.2009, 09:20
Код

        magnitofon()                                    // Конструктор
        {
                play = false;
                stop = false;                           // По-умолчанию все процессы выключены
                rec = false;
                rew = 0;
                kasset = false;                         // По-умолчванию кассеты нет
        }

Я бы переписал на:
Код

        magnitofon():                                    // Конструктор
                play(false),
                stop(false),                           // По-умолчанию все процессы выключены
                rec(false),
                rew(0),
                kasset(false)                         // По-умолчванию кассеты нет
        {
        }

инициализация должна быть в месте иницализации, а в конструкторе после constructor_name(): [section initialiation] {}

Автор: zim22 2.5.2009, 10:07
Цитата(EvilsInterrupt @  2.5.2009,  09:20 Найти цитируемый пост)
инициализация должна быть в месте иницализации, а в конструкторе после constructor_name(): [section initialiation] {}

Хорошо. Допустим, мне нужно проинициализировать массив char значением "hello". 
Как вы перепишете код, чтобы buffer инициализировался в initializer list?

Код

class Foo {
public:
  Foo() {
    strcpy(buffer, "hello");
  }
private:
  char buffer[256];
};


Так не получается:
Код

Foo() :buffer("hello") { } // ошибка компиляции

Автор: mes 2.5.2009, 10:32
Цитата(zim22 @  2.5.2009,  09:07 Найти цитируемый пост)
Хорошо. Допустим, мне нужно проинициализировать массив char значением "hello". 
Как вы перепишете код, чтобы buffer инициализировался в initializer list?

буду использовать std::string или другой подходящий контейнер. smile 


Автор: elenSV 2.5.2009, 10:40
Я что то немного запуталась - а где инициализировать
Код

magnitofon():                                    // Конструктор
                play(false),
                stop(false),                           // По-умолчанию все процессы выключены
                rec(false),
                rew(0),
                kasset(false)                         // По-умолчванию кассеты нет
        {
        }


Код

struct Kassete
{
  Kassete() : InsertCount(0),  id(unique_id++){ }
    int InsertCount;
    int id;;
    static int unique_id;
// ..
};


Код


int main() {
  ...
  std::partial_sort(kassete, kassete + 1, kassete + 100, cmp_fcn);
  int max_number = kassete[0].InsertCount;
  int id_kassette = kassete[0].id;
  ...

}

 smile 

Автор: zim22 2.5.2009, 11:01
Цитата(mes @  2.5.2009,  10:32 Найти цитируемый пост)
буду использовать std::string или другой подходящий контейнер.

допустим, что нельзя использовать string или другие контейнеры  smile 

Я бы в теле конструктора конечно strcpy вызвал, но если нужно в initializer list, то так:
Код

class Foo {  
public:
  Foo() : dummy(init()) { }
private:
  char dummy;  
  char buffer[256];

  char init() {
    strcpy(buffer, "hello");
    return '\0';
  }
};

Автор: mes 2.5.2009, 11:25
Цитата(zim22 @  2.5.2009,  10:01 Найти цитируемый пост)
Я бы в теле конструктора конечно strcpy вызвал, но если нужно в initializer list, то так:

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

Автор: elenSV 2.5.2009, 15:22
ребятушки расскажите пожлста как это работает:
Код

Kassete() : InsertCount(0),  id(unique_id++){ }
    int InsertCount;
    int id;;
[quote]
    static int unique_id;
// ..
};
int Kassete::unique_id = 0;

bool cmp_fcn(const Kassete &k1, const Kassete &k2) {
  return k1.InsertCount > k2.InsertCount;
}

int main() {
  ...
  std::partial_sort(kassete, kassete + 1, kassete + 100, cmp_fcn);
  int max_number = kassete[0].InsertCount;
  int id_kassette = kassete[0].id;  
  ...

  smile 

Автор: zim22 2.5.2009, 15:29
Цитата(elenSV @  2.5.2009,  15:22 Найти цитируемый пост)
ребятушки расскажите пожлста как это работает:

когда создаётся объект класса Kassette ему с помощью статической переменной unique_id присваивается уникальное значение.
оно нужно для того, чтобы после применения алгоритма partial_sort сохранились индексы элементов.
алгоритм partial_sort принимает функцию сравнения  cmp_fcn, с помощью которой происходит сортировка элементов по убыванию.
т.е. на первом месте (нулевой индекс массива) будет элемент с макс.значением поля InsertCount
ну а после сортировки мы получаем max_number(сколько раз вставляли кассету) и id кассеты id_kassette

Автор: EvilsInterrupt 2.5.2009, 20:08
>>Как вы перепишете код, чтобы buffer инициализировался в initializer list?
Если постараться, то шубу в трусы тоже можно заправить, но по мне кроме майки лучше в трусы ничего не заправлять )

Секция инициализация, соглассно книгам и Скоту Майерса, была задумана для инициализации переменных унарных типов, а-ля bool, int, short int, float, etc . А для массива, это уже тело ф-ции(а конструктор тоже функция, только специальная).

Автор: elenSV 3.5.2009, 14:59
Посмотрите пжлста для этой программы:
разработать класс для представления понятия "контроллер видеомагнитофона"(обеспечивает програмное управление видеомагнитофоном, который может осуществлять запись, выполнять воспроизведение кассеты и осуществлть перемотку в указанном направлении):
Код

class magnitofon
{
   bool play, rec, kasset;        // Процессы: воспроизведение, запись и наличие кассеты
   int rew;                // Процесс перемотки (положительное число - вперёд на заданный интервал, 
                             // отрицательное число - назад на заданный интервал, 0 - бездействие)
public:
   magnitofon()           // Конструктор
   {
      play = false;
      stop = false;       // По-умолчанию все процессы выключены
      rec = false;
      rew = 0;
      kasset = false;    // По-умолчванию кассеты нет
   }
 
   void m_stop()       // Метод останавливает все процессы видеомагнитофона
   {
      play = false;
      rec = false;
      rew = 0;
   }
 
   void m_play()       // Метод включает воспроизведение кассеты
   {
      m_stop();        // Может быть активен только один процесс, поэтому вызывается метод "Stop"
      play = true;
   }
 
   void m_rew(int interval)  // Метод перематывает кассету в заданном направление
   {
      m_stop();
      rew = interval;          // Перемотка на заданный интервал
   }
 
   void m_rec()        // Метод начинает запись
   {
      if (play) rec = true;  // Запись возможна только при включённом процессе play
   }
 
   void insert()              // Метод вставляет кассету
  {
      m_stop();
      kasset = true;
  }
 
   void get()                // Метод достаёт кассету      
  {
      m_stop();
      kaseta = false ;
  }
 
   bool check()            // Метод проверяет, есть ли кассета
   {
      return kasset;      // Возвращает true, если кассета есть, в противном случае false.
   }
};

 smile 
А как это в KDevelop оформить как cpp и h файл - какие директивы подключать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)