#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();
}
Задачка С++ (функции)
написать прогу, которая будет выполнять следующее(с помощью функций):
1.1 считывать данные с клавиатуры
1.2 считывать данные из файла
2.1 показывать считанную инфо №1.
2.2 показывать считанную инфо №2.
2.3. показывать считанную инфо №3.
я вроде как всё сделал... только вот я в функциях не очень сильно разбираюсь, болел когда тему проходили... и у меня в итоге программа выполняет только 1 функцию... как сделать чтобы она выполняла те функции которые выбираются?...
Ниже моё творение:[/FONT]
Код:
[FONT="Tahoma"] и еще кое-что: надо сделать чтобы в меню выбиралась опция 1.1; 2.1; и т.д. надеюсь понятно всё написал.. жду ответа поскорее...
заранее благодарен...[/FONT]
Анализ предметной области. Нужны следующие объекты: читальщик из консоли, читальщик из файла, выводильщик на экран, контроллер команд. Ну и можно определить структурку для данных.
Создателем всех объектов будет контроллер. Он же будет и управлять ими.
Читальщики, по хорошему, могут быть наследниками одного общего класса.
Реализация
Код:
#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;
}
#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, как-то разгрузить контроллер...
Код:
#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;
}
#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;
}
Код:
#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;
}
#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 перерос из структуры в класс - на следующих итерациях надо заинкапсулировать его данные. Кроме того, можно предусмотреть возможность подключения произвольного числа читальщиков, предусмотреть реакцию на возникновение аварийных ситуаций и т.д.
Цитата: 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;
}
}
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;
}
}
Тогда иерархию надо поменять:
Код:
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;
}
};
{
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;
}
};
Цитата: 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;
}
};
{
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 в универе учат самостоятельно :)
Цитата: ageron
конечно все красиво но MVC в универе учат самостоятельно
Я тут тренировался использовать шаблоны GRASP и рефакторинг.
Опять же, мне не важно, чему учат в универах. Меня, например, никакому MVC не учили. Тут была моя неудачная попытка опробовать очередную мою безумную задумку проводить тренинги для освоения определенных технологий. Это интереснее, чем давать одни и те же ответы начинающим.
Короче, развлекался я. Не судите строго.