Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2009, 11:22   #1
Swool
Пользователь
 
Регистрация: 12.07.2008
Сообщений: 39
По умолчанию Нуждаюсь в критике

Вот, что у меня получилось, нуждаюсь в ваших комментах и доработках(времени еще 2 дня):

Для начала само задание:
Код:
Задание состоит в создании единой инфосистемы, которая должна быть реализована на языке С или ее клонах.

 Обязательно должны быть использованы следущие техники:

•	Создание новых объектов(классов).
•	Перегрезка методов операторов «И» , «ИЛИ» (overload)
•	Производство новых классов из созданных
•	Разделение программы на модули
•	Элементарное ОО „файлование”

Всего классов должно быть создано минимум 5 и высота их производного дерева должны быть минимум 3.

Для получения оценки 3 – 5 должны быть использованы:

•	полиморфизм (overriding членских функций)
•	абстрактные классы
•	дружественные (friend) функции и классы
•	генерированные (обобщенные) типы данных (templates)

Документация задания должна содержать:

•	Поставление задачи
•	Инструкция для пользователя
•	Модель инфосистемы UML (схема классов...)
•	Комментарии важнейших частей программы
Swool вне форума Ответить с цитированием
Старый 13.12.2009, 11:23   #2
Swool
Пользователь
 
Регистрация: 12.07.2008
Сообщений: 39
По умолчанию

САМО РЕШЕНИЕ: ЧАСТЬ 1:
Код:
#include <fstream>
#include<iostream>
#include<string>
using namespace std;

// все марки телефонов
enum make {nokia, sony, siemens, motorolla, htc, lg};

//основной,базовый класс для создания
class Mob{
protected: //protected - переменные доступны только этому и послед.от него классам
	make currentMake; // текущая марка телефона
	string country; // страна производителя
	string officalSite; // сайт
	string model; // моель телефона
	int year; // год выпуска
	int memory; //память телефона
	bool isWifi; // ГПС модуль или wifi

public: // public - переменные доступны всем
	string getMake(){ // получить марку телефона в понятном слове (0 - нокия, 1 - сони итд)
		switch(currentMake){
			case nokia: return "Nokia"; break;
			case sony: return "Sony"; break;
			case siemens: return "Siemens"; break;
			case motorolla: return "Motorolla"; break;
			case htc: return "Htc"; break;
			case lg: return "Lg"; break;
		}
	}
	make getMakeNative(){ // получить марку телефона в понятном виде (цифра от 0 до 5)
		return currentMake;
	}
	string getCountry(){ // получить страну
		return country;
	}
	string getOfficalSite(){ // получить сайт
		return officalSite;
	}
	string getModel(){ // получить модель
		return model;
	}
	int getYear(){ // получить год
		return year;
	}
	int getMemory(){ // получить память
		return memory;
	}
	string getAccessories(){ // получить приспособления в виде слова( 0 - gps, 1 - wifi)
		switch(isWifi){
			case true: return "Wifi"; break;
			case false: return "Gps"; break;
		}
	}
	bool getAccessoriesNative(){ // получить приспособления в виде числа 0 или 1
		return isWifi;
	}
};
 
// класс для телефонов типа нокия
class Nokia : public Mob{
public:
	Nokia(string model, int year, int memory, bool isWifi){ //конструктор,который сохраняет данные и переменные класса Mob
		this->currentMake=nokia;
		this->country="Finland";
		this->officalSite="www.nokia.ee";
		this->model=model;
		this->year=year;
		this->memory=memory;
		this->isWifi=isWifi;
	}
};

class Sony : public Mob{
public:
	Sony(string model, int year, int memory, bool isWifi){
		this->currentMake=sony;
		this->country="Japan";
		this->officalSite="www.sony.ee";
		this->model=model;
		this->year=year;
		this->memory=memory;
		this->isWifi=isWifi;
	}
};

class Siemens : public Mob{
public:
	Siemens(string model, int year, int memory, bool isWifi){
		this->currentMake=siemens;
		this->country="Germany";
		this->officalSite="www.siemens.ee";
		this->model=model;
		this->year=year;
		this->memory=memory;
		this->isWifi=isWifi;
	}
};

class Motorolla : public Mob{
public:
	Motorolla(string model, int year, int memory, bool isWifi){
		this->currentMake=motorolla;
		this->country="Usa";
		this->officalSite="www.motorolla.ee";
		this->model=model;
		this->year=year;
		this->memory=memory;
		this->isWifi=isWifi;
	}
};

class Htc : public Mob{
public:
	Htc(string model, int year, int memory, bool isWifi){
		this->currentMake=htc;
		this->country="Taiwan";
		this->officalSite="www.htc.ee";
		this->model=model;
		this->year=year;
		this->memory=memory;
		this->isWifi=isWifi;
	}
};

class Lg : public Mob{
public:
	Lg(string model, int year, int memory, bool isWifi){
		this->currentMake=lg;
		this->country="Korea";
		this->officalSite="www.lg.ee";
		this->model=model;
		this->year=year;
		this->memory=memory;
		this->isWifi=isWifi;
	}
};
 

class Creator{ // базовый класс для создания объекта
public: 
	virtual Mob* CreateObject(make, string, int, int, bool) = 0; // ìметод создание с описанным входящим в него параметром
};
 
// конкретный создатель :)
class ConcreteCreator : public Creator{
public:
	Mob* CreateObject(make currentMake, string model, int year, int memory, bool isWifi) {
		switch (currentMake) { // в зависимости от марки телефона метод CreateObject инициализирует нужный класс
		case nokia:
			return new Nokia(model, year, memory, isWifi);
			break;
		case sony :
			return new Sony(model, year, memory, isWifi);
			break;
		case siemens:
			return new Siemens(model, year, memory, isWifi);
			break;
		case motorolla:
			return new Motorolla(model, year, memory, isWifi);
			break;
		case htc:
			return new Htc(model, year, memory, isWifi);
			break;
		case lg:
			return new Lg(model, year, memory, isWifi);
			break;
		default:
			cout << "Error: unknown manufacter";
		} 
	}
};
ДАЛЕЕ БУДЕТ ПРОДОЛЖЕНИЕ ПРОГРАММЫ, ПРОСТО БОЛЬШЕ 5000 СИМВОЛОВ НЕЛЬЗЯ

Последний раз редактировалось Swool; 13.12.2009 в 11:34.
Swool вне форума Ответить с цитированием
Старый 13.12.2009, 11:24   #3
Swool
Пользователь
 
Регистрация: 12.07.2008
Сообщений: 39
По умолчанию

САМО РЕШЕНИЕ: ЧАСТЬ 2:
Код:
int main()
{
	make tempMake; // одна из марок телефона
	int itempMake; // марка телефона в виде цифры
	char model[80]; // модель
	int year; // год
	int memory; // память
	int isWifi; // 1 - GPS, 0 - Wifi
	int add; // 1 - добавить в файл, 0 - считать из файла
	
	do {

	printf("0 - load Mobile from file; 1 - add Mobile to file\n");
	scanf("%d",&add);

	if (add){

		printf("Choose Mobile make:\n0 - nokia,\n1 - sony,\n2 - siemens,\n3 - motorolla,\n4 - htc,\n5 - lg\n");
		scanf("%d",&tempMake);
		printf("Define model: ");
		scanf("%s",model);
		printf("Define year: ");
		scanf("%d",&year);
		printf("Define memory (in GB): ");
		scanf("%d",&memory);
		printf("Define Accessories (0 - Gps, 1 - Wifi): ");
		scanf("%d",&isWifi);
	}
	else{
		ifstream Mobs("Mobs.txt"); // читаем файл
		Mobs >> itempMake >> model >> memory >> year; // и все параметры из него
		
		switch(itempMake){ // конвертируем номер в тип марки телефона(make)
			case 0: tempMake=nokia; break;
			case 1: tempMake=sony; break;
			case 2: tempMake=siemens; break;
			case 3: tempMake=motorolla; break;
			case 4: tempMake=htc; break;
			case 5: tempMake=lg; break;
		}
	}

	Creator* tempMob = new ConcreteCreator(); // инициализируем класс Креатор
	Mob* Mob = tempMob->CreateObject(tempMake, model, year, memory, isWifi); // инициализируем классMob, с помощью CreateObject метода (где происходит выбор конкретной марки)

	cout << "\nManufacturer:\t" << Mob->getMake() << endl; // выводим на экран
	cout << "Country:\t" << Mob->getCountry() << endl;
	cout << "Model:\t\t" << Mob->getModel() << endl;
	cout << "Official site:\t" << Mob->getOfficalSite() << endl;
	cout << "Memory:\t\t" << Mob->getMemory() << endl;
	cout << "Year:\t\t" << Mob->getYear() << endl;
	cout << "Accessories:\t" << Mob->getAccessories() << endl;

	if (add){
		ofstream Mobs("Mobs.txt", ios::app); //сохраняем в файл параметры телефона
		Mobs << Mob->getMakeNative() << endl << Mob->getModel() << endl << Mob->getMemory() << endl << Mob->getYear() << endl  << Mob->getAccessoriesNative();
	}
    }
    while(1);
    
	
	system("pause");
	return 0;
}
К ПРОГРАММЕ ИДЕТ В КОМПЛЕКТЕ ТЕКСТОВЫЙ ФАЙЛ: Mobs.txt

Код:
0
xpress_music
80
2009
04
665
8
1998
05
56
67
56
03
5800
8
2009
01
5800
8
2009
1

Последний раз редактировалось Swool; 13.12.2009 в 11:39.
Swool вне форума Ответить с цитированием
Старый 14.12.2009, 09:58   #4
Swool
Пользователь
 
Регистрация: 12.07.2008
Сообщений: 39
По умолчанию

остался ровно 1 день=) завтра несу сдавать так, как есть.
Все работает, но че-то мне всеравно не нравится структура.
Swool вне форума Ответить с цитированием
Старый 14.12.2009, 10:27   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Все работает
Это самое главное. Если все работает и результат верный - то программа может считаться написанной хорошо.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2009, 17:37   #6
Swool
Пользователь
 
Регистрация: 12.07.2008
Сообщений: 39
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это самое главное. Если все работает и результат верный - то программа может считаться написанной хорошо.
но я хочу хотябы 4 получить.... так что хотябы работает не катит.
Swool вне форума Ответить с цитированием
Старый 14.12.2009, 17:46   #7
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

если хочется повыше оценку лучше уж дописать что-то еще из задания, например дружественные функции и перегрузка операторов, как раз 2 зайцев одним выстрелом завалить можно, правда надо придумать еще как тут пригодится перегрузка операторов )
m0nax вне форума Ответить с цитированием
Старый 14.12.2009, 18:20   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Как вариант перегрузку оператора вывода
Код:
class A {
    friend std::ostream& operator<< (std::ostream& out, const A& o);

    int a, b, c;
public:
    A() { a = 10; b = 20; c = 30; }
};

std::ostream& operator<< (std::ostream& out, const A& o) {
    return out << o.a << ' ' << o.b << ' ' << o.c;
}
и перегрузка операторов и ф-ция друг
netrino вне форума Ответить с цитированием
Старый 14.12.2009, 22:03   #9
Swool
Пользователь
 
Регистрация: 12.07.2008
Сообщений: 39
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Как вариант перегрузку оператора вывода
Код:
class A {
    friend std::ostream& operator<< (std::ostream& out, const A& o);

    int a, b, c;
public:
    A() { a = 10; b = 20; c = 30; }
};

std::ostream& operator<< (std::ostream& out, const A& o) {
    return out << o.a << ' ' << o.b << ' ' << o.c;
}
и перегрузка операторов и ф-ция друг
тут пол программы менять придется

П.С. у меня тут мысля появилась, что скажите, если сократить программу? т.е. сейчас у меня написан каждый телефон отдельно, что делает ее грамосткой, впринципе ведь можно сделать общий класс.

Последний раз редактировалось Swool; 14.12.2009 в 22:12.
Swool вне форума Ответить с цитированием
Старый 14.12.2009, 23:25   #10
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ну я не говорю о глобальных изменениях Просто перенесите вот это:
Код:
	cout << "\nManufacturer:\t" << Mob->getMake() << endl; // выводим на экран
	cout << "Country:\t" << Mob->getCountry() << endl;
	cout << "Model:\t\t" << Mob->getModel() << endl;
	cout << "Official site:\t" << Mob->getOfficalSite() << endl;
	cout << "Memory:\t\t" << Mob->getMemory() << endl;
	cout << "Year:\t\t" << Mob->getYear() << endl;
	cout << "Accessories:\t" << Mob->getAccessories() << endl;
в отдельный метод = )
вот так, например:
Код:
ostream& operator<< (ostream& out, Mob* Mob)
{
	out << "\nManufacturer:\t" << Mob->getMake() << endl;
	out << "Country:\t" << Mob->getCountry() << endl;
	out << "Model:\t\t" << Mob->getModel() << endl;
	out << "Official site:\t" << Mob->getOfficalSite() << endl;
	out << "Memory:\t\t" << Mob->getMemory() << endl;
	out << "Year:\t\t" << Mob->getYear() << endl;
	out << "Accessories:\t" << Mob->getAccessories() << endl;

	return out;
}
чтобы потом можно было использовать вот так:
Код:
Mob* mob...
cout << mob;

fstream file("file.txt");
file << mob;
// и т.д.
может не очень красиво используется, зато по заданию да, вы бы предусмотрели условие выхода из программы ) а то бесконечный цикл как-то не очень хорошо смотрится ) хотя это ИМХО, конечно )
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как называется программа "дозвон по модему на указаный номер" hardhawker Софт 3 27.12.2011 14:30
сортировка в С++(нуждаюсь в помощи специалистов) 3s3e3r3e3g3a3 Помощь студентам 2 05.10.2009 22:21
Нуждаюсь в помощи с задачей на Delphi f1n!Sh Помощь студентам 16 04.06.2008 22:14
Нуждаюсь в помощи (Delphi) Nadjuha Помощь студентам 19 30.05.2008 17:04