Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Задачка С++ (функции)

42K
02 апреля 2009 года
KPEMATOPP
3 / / 02.12.2008
[FONT="Tahoma"]Училка задала лабу... задание такого:
написать прогу, которая будет выполнять следующее(с помощью функций):
1.1 считывать данные с клавиатуры
1.2 считывать данные из файла
2.1 показывать считанную инфо №1.
2.2 показывать считанную инфо №2.
2.3. показывать считанную инфо №3.


я вроде как всё сделал... только вот я в функциях не очень сильно разбираюсь, болел когда тему проходили... и у меня в итоге программа выполняет только 1 функцию... как сделать чтобы она выполняла те функции которые выбираются?...
Ниже моё творение:[/FONT]
Код:
#include <fstream.h>
#include <conio.h>
int a,b,c,x;
ifstream f;
void mht()
{
    cout<<"4acToTa:";cin>>a;
   cout<<endl<<"RAM:";cin>>b;
   cout<<endl<<"HDD:";cin>>c;
}
void mhf()
{
    f.open("data.in");
   f>>a>>b>>c;
}
main()
{
cout<<"----------Menu----------"<<endl;
cout<<"1. BBog gaHHbIx c KJIaBbI"<<endl;
cout<<"2. BBog gaHHbIx u3 'data.in'"<<endl;
cout<<"3. noKa3 4aCToTbI"<<endl;
cout<<"4. noKa3 RAM"<<endl;
cout<<"5. noKa3 HDD"<<endl;
cin>>x;
switch(x)
{
case 1: mht();break;
case 2: mhf();break;
case 3: cout<<a;    break;
case 4: cout<<b;    break;
case 5: cout<<c;    break;
}
getch();
}



[FONT="Tahoma"] и еще кое-что: надо сделать чтобы в меню выбиралась опция 1.1; 2.1; и т.д. надеюсь понятно всё написал.. жду ответа поскорее...
заранее благодарен...[/FONT]
87
02 апреля 2009 года
Kogrom
2.7K / / 02.02.2008
Пародия на определенные принципы программирования:

Анализ предметной области. Нужны следующие объекты: читальщик из консоли, читальщик из файла, выводильщик на экран, контроллер команд. Ну и можно определить структурку для данных.

Создателем всех объектов будет контроллер. Он же будет и управлять ими.

Читальщики, по хорошему, могут быть наследниками одного общего класса.

Реализация
Код:
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

struct CompData
{
    int frequency;
    int RAM;
    int HDD;
    CompData():frequency(0), RAM(0), HDD(0){}
};

class KeyBoardReader
{
public:
    CompData GetData() // для читаемости кода пойдем на возврат класса
    {
        CompData cd;
        cin >> cd.frequency >> cd.RAM >> cd.HDD;
        return cd;
    }
    int GetInt()
    {
        int n;
        cin >> n;
        return n;
    }
};

class FileReader
{
    ifstream file_;
public:
    FileReader(const string &fileName):file_(fileName.c_str()){}
    CompData GetData() // для читаемости кода пойдем на возврат класса
    {
        CompData cd;
        file_ >> cd.frequency >> cd.RAM >> cd.HDD;
        return cd;
    }
};

class Writer
{
public:
    static void OutData(const string &str, int data)
    {
        cout << str << ": " << data << endl;
    }
    static void OutCommand(int command, const string &str)
    {
        cout << command << ": " <<str << endl;
    }
};

class Controller
{
    KeyBoardReader kbReader_;
    FileReader fReader_;
    CompData data_;
    enum COICES {GET_KEYBOARD = 1, GET_FILE, OUT_FREQ, OUT_RAM, OUT_HDD};
public:
    void GetDataFromKeyBoard()
    {
        data_ = kbReader_.GetData();
    }
    void GetDataFromFile()
    {
        data_ = fReader_.GetData();
    }
    void OutFrequency()
    {
        Writer::OutData("Frequency", data_.frequency);
    }
    void OutRAM()
    {
        Writer::OutData("RAM", data_.RAM);
    }
    void OutHDD()
    {
        Writer::OutData("HDD", data_.HDD);
    }
    bool Do(int choice)
    {
        switch (choice)
        {
        case GET_KEYBOARD:
            GetDataFromKeyBoard();
            return true;
        case GET_FILE:
            GetDataFromFile();
            return true;
        case OUT_FREQ:
            OutFrequency();
            return true;
        case OUT_RAM:
            OutRAM();
            return true;
        case OUT_HDD:
            OutHDD();
            return true;
        default: return false;
        }
        return false;
    }
    bool ReadCommand()
    {
        return Do(kbReader_.GetInt());
    }
    Controller():fReader_("comp.txt")
    {
        Writer::OutCommand(GET_KEYBOARD, "Input from Keyboard");
        Writer::OutCommand(GET_FILE, "Input from File");
        Writer::OutCommand(OUT_FREQ, "Print Frequency");
        Writer::OutCommand(OUT_RAM, "Print RAM");
        Writer::OutCommand(OUT_HDD, "Print HDD");
    }
}


int main()
{
    Controller myController;
    while (myController.ReadCommand()){}
    return 0;
}

Рабочая версия в первом приближении сделана... теперь осталось ввести наследование для читальщиков, возможно, убрать switch, как-то разгрузить контроллер...
87
02 апреля 2009 года
Kogrom
2.7K / / 02.02.2008
Итерация 2. Теперь пародия на так называемый "рефакторинг". Вводим иерархию читальщиков, избавляемся от switch:

Код:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

struct CompData
{
    enum {FREQ, RAM, HDD, SIZE};
    vector<int> data;
    CompData():data(SIZE, 0){}
};

struct IReader
{
    virtual void GetData(CompData &cd) = 0;
};

class KeyBoardReader: public IReader
{
public:
    virtual void GetData(CompData &cd)
    {
        for (int i = 0; i < CompData::SIZE; ++i)
            cin >> cd.data;
    }
    static int GetInt()
    {
        int n;
        cin >> n;
        return n;
    }
};

class FileReader: public IReader
{
    ifstream file_;
public:
    FileReader(const char* fileName):file_(fileName){}
    virtual void GetData(CompData &cd)
    {
        for (int i = 0; i < CompData::SIZE; ++i)
            file_ >> cd.data;
    }
};

class Writer
{
public:
    static void OutData(const string &str, int data)
    {
        cout << str << ": " << data << endl;
    }
    static void OutCommand(int command, const string &str)
    {
        cout << command << ": " <<str << endl;
    }
    static void OutText(const string &str)
    {
        cout << str << endl;
    }
};

class Controller
{
    vector<IReader*> reader_;
    CompData data_;
public:
    enum CHOICES {GET_KEYBOARD = 1, GET_FILE, OUT_FREQ, OUT_RAM, OUT_HDD};
    static const string NAMES[CompData::SIZE];
    Controller():reader_(2)
    {
        reader_[0] = new KeyBoardReader();
        reader_[1] = new FileReader("comp.txt");
        MenuMessage();
    }
    ~Controller()
    {
        for (size_t i = 0; i < reader_.size(); ++i)
            delete reader_;
    }
    bool GetData(int choice)
    {
        if ((choice < GET_KEYBOARD) || (choice > GET_FILE))return false;

        InputMessage();
        reader_[choice - GET_KEYBOARD]->GetData(data_);
        MenuMessage();
        return true;
    }
    bool Print(int choice)
    {
        if ((choice < OUT_FREQ) || (choice > OUT_HDD))return false;
        Writer::OutData(NAMES[choice - OUT_FREQ], data_.data[choice - OUT_FREQ]);
        return true;
    }
    bool ReadCommand()
    {
        int choice = KeyBoardReader::GetInt();
        return GetData(choice) || Print(choice);
    }
    void MenuMessage()
    {
        Writer::OutCommand(GET_KEYBOARD, "Input from Keyboard");
        Writer::OutCommand(GET_FILE, "Input from File");
        Writer::OutCommand(OUT_FREQ, "Print Frequency");
        Writer::OutCommand(OUT_RAM, "Print RAM");
        Writer::OutCommand(OUT_HDD, "Print HDD");
    }
    void InputMessage()
    {
        string str = "Input a " + NAMES[0];
        for (int i = 1; i < CompData::SIZE; ++i)
            str += " and a " + NAMES;
        Writer::OutText(str);
    }
};

const string Controller::NAMES[CompData::SIZE] = {"Frequency", "RAM", "HDD"};

int main()
{
    Controller myController;
    while (myController.ReadCommand()){}
    return 0;
}
87
03 апреля 2009 года
Kogrom
2.7K / / 02.02.2008
Итерация 3. Убираем лишние зависимости классов. Для проверки делаем невидимым класс CompData для других маленьких классов. Включаем информацию о числе и типе параметров в один класс, чтобы уменьшить дублирование. Для проверки включим дополнительный параметр.

Код:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

struct IReader
{
    virtual void GetData(vector<int> &data) = 0;
    virtual ~IReader(){}
};

class KeyBoardReader: public IReader
{
public:
    virtual void GetData(vector<int> &data)
    {
        for (size_t i = 0; i < data.size(); ++i)
            cin >> data;
    }
    static int GetInt()
    {
        int n;
        cin >> n;
        return n;
    }
};

class FileReader: public IReader
{
    ifstream file_;
public:
    FileReader(const char* fileName):file_(fileName){}
    virtual void GetData(vector<int> &data)
    {
        for (size_t i = 0; i < data.size(); ++i)
            file_ >> data;
    }
};

class Writer
{
public:
    static void OutData(const string &str, int data)
    {
        cout << str << ": " << data << endl;
    }
    static void OutCommand(int command, const string &str)
    {
        cout << command << ": " <<str << endl;
    }
    static void OutText(const string &str)
    {
        cout << str << endl;
    }
};

class CompData
{
    enum {FREQ, RAM, HDD, POWER};
public:
    enum {START_PARAM = FREQ, END_PARAM = POWER, SIZE};
    vector<int> data;
    CompData():data(SIZE, 0){}
    static const string NAMES[CompData::SIZE];
};
const string CompData::NAMES[CompData::SIZE] = {"Frequency", "RAM", "HDD", "Power"};

class Controller
{
    vector<IReader*> reader_;
    CompData data_;
public:
    enum CHOICES {GET_KEYBOARD = 1, GET_FILE, OUT};
    Controller():reader_(2)
    {
        reader_[0] = new KeyBoardReader();
        reader_[1] = new FileReader("comp.txt");
        MenuMessage();
    }
    ~Controller()
    {
        for (size_t i = 0; i < reader_.size(); ++i)
            delete reader_;
    }
    bool GetData(int choice)
    {
        if ((choice < GET_KEYBOARD) || (choice > GET_FILE))return false;

        InputMessage();
        reader_[choice - GET_KEYBOARD]->GetData(data_.data);
        MenuMessage();
        return true;
    }
    bool Print(int choice)
    {
        const int MIN_COMMAND = OUT + CompData::START_PARAM;
        const int MAX_COMMAND = OUT + CompData::END_PARAM;
        if ((choice < MIN_COMMAND) || (choice > MAX_COMMAND))return false;
        Writer::OutData(CompData::NAMES[choice - MIN_COMMAND], data_.data[choice - MIN_COMMAND]);
        return true;
    }
    bool ReadCommand()
    {
        int choice = KeyBoardReader::GetInt();
        return GetData(choice) || Print(choice);
    }
    void MenuMessage()
    {
        Writer::OutCommand(GET_KEYBOARD, "Input from Keyboard");
        Writer::OutCommand(GET_FILE, "Input from File");
        for(int i = 0; i < CompData::SIZE; ++i)
        {
            string str = "Print " + CompData::NAMES;
            Writer::OutCommand(OUT + i, str);
        }
    }
    void InputMessage()
    {
        string str = "Input a " + CompData::NAMES[0];
        for (int i = 1; i < CompData::SIZE; ++i)
            str += " and a " + CompData::NAMES;
        Writer::OutText(str);
    }
};


int main()
{
    Controller myController;
    while (myController.ReadCommand()){}
    return 0;
}

Теперь CompData перерос из структуры в класс - на следующих итерациях надо заинкапсулировать его данные. Кроме того, можно предусмотреть возможность подключения произвольного числа читальщиков, предусмотреть реакцию на возникновение аварийных ситуаций и т.д.
87
03 апреля 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: KPEMATOPP
как сделать чтобы она выполняла те функции которые выбираются?...


Да. Что-то я увлекся. Автору надо просто сделать цикл типа:

Код:
int x = 1;
while((x > 0) && (x < 6))
{
    cin >> x;
    switch(x)
    {
        case 1: mht(); break;
        case 2: mhf(); break;
        case 3: cout << a; break;
        case 4: cout << b; break;
        case 5: cout << c; break;
    }
}
87
03 апреля 2009 года
Kogrom
2.7K / / 02.02.2008
Небольшое ответвление от основного потока итераций. Возможно, потребуется ввести управление от произвольного читальщика: от читальщика из файла, или от читальщика из строки и т.д.

Тогда иерархию надо поменять:

Код:
struct IReader
{
    virtual int GetInt() = 0;
    virtual void GetData(vector<int> &data)
    {
        for (size_t i = 0; i < data.size(); ++i)
            data = GetInt();
    }
    virtual ~IReader(){}
};

class KeyBoardReader: public IReader
{
public:
    virtual int GetInt()
    {
        int n;
        cin >> n;
        return n;
    }
};

class FileReader: public IReader
{
    ifstream file_;
public:
    FileReader(const char* fileName):file_(fileName){}
    virtual int GetInt()
    {
        int n;
        file_ >> n;
        return n;
    }
};
23K
21 апреля 2009 года
ageron
17 / / 10.02.2007
Цитата: Kogrom
Небольшое ответвление от основного потока итераций. Возможно, потребуется ввести управление от произвольного читальщика: от читальщика из файла, или от читальщика из строки и т.д.

Тогда иерархию надо поменять:

Код:
struct IReader
{
    virtual int GetInt() = 0;
    virtual void GetData(vector<int> &data)
    {
        for (size_t i = 0; i < data.size(); ++i)
            data = GetInt();
    }
    virtual ~IReader(){}
};

class KeyBoardReader: public IReader
{
public:
    virtual int GetInt()
    {
        int n;
        cin >> n;
        return n;
    }
};

class FileReader: public IReader
{
    ifstream file_;
public:
    FileReader(const char* fileName):file_(fileName){}
    virtual int GetInt()
    {
        int n;
        file_ >> n;
        return n;
    }
};


конечно все красиво но MVC в универе учат самостоятельно :)

87
21 апреля 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: ageron
конечно все красиво но MVC в универе учат самостоятельно


Я тут тренировался использовать шаблоны GRASP и рефакторинг.

Опять же, мне не важно, чему учат в универах. Меня, например, никакому MVC не учили. Тут была моя неудачная попытка опробовать очередную мою безумную задумку проводить тренинги для освоения определенных технологий. Это интереснее, чем давать одни и те же ответы начинающим.

Короче, развлекался я. Не судите строго.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог