Форум программистов, компьютерный форум CyberForum.ru

Класс домов и класс улиц для учета поступлений квартплаты. Массив - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
kukhtikov
2 / 2 / 0
Регистрация: 16.12.2012
Сообщений: 97
26.04.2013, 00:28     Класс домов и класс улиц для учета поступлений квартплаты. Массив #1
Задание:
вырезано

Файл StdAfx.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
#pragma once
 
#include "targetver.h"
 
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <string>
#include <iomanip>
#include <iostream>
using namespace std;


Файл Home.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#pragma once
class Home
{
    int iHome;
    int MenCount;
    int EtagCount;
    int NumbApartament;
public:
    Home();
    Home(int iH, int EtgC,int MenC, int NumbA); //Создание дома со всеми параметрами
    ~Home();
    int get_iHome();                         //Получить числовой номер дома
    int get_EtagCount();                     //Получить количество этажей в доме
    int get_MenCount();                      //Получить количество жителей дома
    int get_NumbApartament();                //Получить количество квартир в доме
    void set_iHome(int iH);                  //Установить числовой номер дома
    void set_EtagCount(int EtgC);            //Установить количество этажей в доме
    void set_MenCount(int MenC);             //Установить количество жителей в доме
    void set_NumbApartament(int NumbA);      //Установить количество квартир в доме
    friend ostream &operator<<(ostream &output, Home &H);
    Home operator+(Home &); //
};


Файл Home.cpp
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include "StdAfx.h"
#include "Home.h"
 
 
Home::Home() //Создание дома без параметров
{
    iHome=EtagCount=MenCount=NumbApartament=0;
}
 
Home::Home(int iH, int EtgC,int MenC, int NumbA) //Создание дома со всеми параметрами
{
    this->iHome=iH;
    this->EtagCount=EtgC;
    this->MenCount=MenC;
    this->NumbApartament=NumbA;
}
 
Home::~Home() //Снос дома
{
}
 
void Home::set_iHome(int iH) {this->iHome=iH;} //Получаем числовой номер дома
void Home::set_EtagCount(int EtgC) {this->EtagCount=EtgC;} //Получаем количество этажей в доме
void Home::set_MenCount(int MenC) {this->MenCount=MenC;} //Получаем число жителей в доме
void Home::set_NumbApartament(int NumbA) {this->NumbApartament=NumbA;} //Получаем количество квартир в доме
 
int Home::get_iHome() {return iHome;} //Устанавливаем числовой номер дома
int Home::get_EtagCount() {return EtagCount;} //Устанавливаем количество этажей в доме
int Home::get_MenCount() {return MenCount;} //Устанавливаем количество жителей в доме
int Home::get_NumbApartament() {return NumbApartament;} //Устанавливаем количество квартир в доме
ostream &operator<<(ostream &output, Home &H) //перегрузка оператора вЫвода <<
{
    return output;
}


Файл Street.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once
class Street
{
    string Name_Street; //Символьное название улицы
    int Homes_num; //Число домов на улице
    int NumberStreet; //Номер улицы
    int ChisloPeople; //Количество людей, проживающих на улице
public:
    Street();
    Street(string NameS, int NumH, int NumS, int ChP);
    ~Street();
    string GetNameStreet();
    int GetHomesNum();
    int GetNumbStreet();
    int GetChisloPeople();
    void SetNameStreet(string NameStr);
    void SetHomeNum(int NumH);
    void SetNumbStreet(int NumSt);
    void SetChisloPeople(int ChP);
    friend ostream &operator<<(ostream &output, Street &Str);
};


Файл Street.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "StdAfx.h"
#include "Street.h"
 
 
Street::Street(void)
{
}
Street::Street(string NameS, int NumH, int NumS, int ChP)
{
    Name_Street=NameS;
    this->Homes_num=NumH;
    this->NumberStreet=NumS;
    this->ChisloPeople=ChP;
}
Street::~Street(void)
{
}
void Street::SetNameStreet(string NameStr) {Name_Street=NameStr;}
void Street::SetHomeNum(int NumH) {Homes_num=NumH;}
void Street::SetNumbStreet(int NumSt) {NumberStreet=NumSt;}
void Street::SetChisloPeople(int ChP) {ChisloPeople=ChP;}
string Street::GetNameStreet() {return Name_Street;}
int Street::GetHomesNum() {return Homes_num;}
int Street::GetNumbStreet() {return NumberStreet;}
int Street::GetChisloPeople() {return ChisloPeople;}
ostream &operator<<(ostream &output,  Street &Str)
{
    return output;
}


Основная проблема - это массив. Растолкуйте плиз что надо добавить и переделать..

Добавлено через 1 час 30 минут
Задание:
Кликните здесь для просмотра всего текста

Вариант выбирается следующим образом: получить оста-ток от деления № студента по списку в электронном универси-тете на число вариантов, если остаток равен нулю, то берется последний вариант, если остаток не равен нулю, то это есть номер варианта.
Первым шагом в выполнении ДЗ должно быть осмысление поставленной задачи, и, в частности, выделение новых типов объектов, для которых нужно разработать обоб-щенные описания объектов в виде классов на языке СИ++. Нужно определить свойства объектов каждого класса и его поведение. Другими словами, необходимо первоначально выделить основные данные для объектов класса и перечень методов/функций, которые эти данные изменяют. На первом этапе это делается на абстрактном уровне.
Для начала проектирования является важным определение, так называемой, пред-метной области. Под предметной областью понимается совокупность понятий, объектов реального мира, их свойств, а также что с этими объектами можно делать в программе и делается в жизни. Для одной и той же системы классов может быть выделено много раз-личных предметных областей, которые, в конечном счете, зависят от решаемой (постав-ленной) задачи автоматизации. Поэтому первым шагом нужно задать одну или несколь-ко предметных областей, для которых будет разрабатываться система классов.
Пример. Будем рассматривать для пояснения пример разработки системы классов улиц и классов домов, которые могут располагаться на конкретных улицах. Возможны следующие задачи, для которых разрабатывается такая система классов: контролирова-ние оплаты жителями коммунальных услуг, проведение выборов, ремонт строений на улице и самой улицы, ведение паспортного учета жителей (или прописки), оценка числа жителей на улице для планирования социальных услуг, построение карт города с ули-цами (детализация по домам), оценка движения автомобилей по улице и т.д. Из этого перечня задач видно, что от выбора конкретной задачи существенно зависят свойства будущих объектов и набор операций (методов), которые над этими объектами преду-сматриваются. Определим, для примера, предметную область так: учет числа жителей на улице и оценка необходимости ремонта строений улицы.
Далее для каждого объекта предметной области, на содержательном уровне, нужно более детально задать перечень свойств (данных) и возможных операций над этими свойствами.
Пример. Например, свойства для дома: номер дома, этажность дома, число жите-лей в доме, признак ремонта, тип строения и т.д. Операции для дома: установка числа жителей, изменение типа дома, установка или сброс признака необходимости ремонта дома. Для улицы можно выделить свойства: название улицы, тип улицы, число домов на улице, число жителей, признаки ремонта улицы и т.д.
Далее целесообразно проанализировать предметную область и поставленную зада-чу и определить необходимость дополнительных классов для реализации. Эти классы могут быть технологическими (вспомогательными) и содержательными. Технологиче-ские классы могут быть выделены, например, для реализации контейнеров элементных объектов (списки, массивы, множества и т.д.) и для выполнения других функций реше-ния задачи. Эти классы не имеют явных аналогов в предметной области и выделяются на основе опыта программиста. Дополнительные содержательные классы могут потре-боваться для комплексного решения задачи. Например, Для нашего случая это могут быть: класс городов (при построении карт), класс планов ремонта улиц (в ремонтной задаче), классы бюджетов оплаты жилья (для контроля оплаты квартир) и т.д.
Более важным является определение перечня возможных операций над объектами. Не всегда удается сразу определить его полностью: он наращивается и видоизменяется в процессе проектирования и реализации программной системы.
Пример. Предположим тема задания следующая - разработать систему классов для описания объектов строений/домов улиц (элементные объекты) и объектов типа улица, содержащих в себе элементные объекты (дома). Улица - это контейнерный объект. Зада-чи, для которых разрабатывается система классов, заданы выше. Для домов целесообраз-но выделить свойства создания дома (построение), удаления дома (снос дома), изменения свойств дома (установка признаков необходимости ремонта, числа жителей и т.д.). Для улиц возможные операции: добавление и удаление домов, переименование улицы, по-верка признака ремонта улицы и домов на улице. Предположим, что нужно предусмот-реть операции для контейнерного объекта: добавления строений, переименования улиц, сноса строений, печати списка домов, добавления строений и т.д. Более детально это расшифровано ниже, включая и раскрытие понятий предметной области:
1. В нашем случае, на первом этапе мы должны выделить следующие понятия: дома/строения и улицы, как упорядоченной совокупности домов.
2. Понятие дома - объекта, возможно, будет обладать следующими свойствами: номер дома, этажность дома, число жителей дома, расположение на левой или правой стороне улицы, название дома, характеристика строения и т.д.
3. Понятие улицы – объекта, возможно, будет содержать следующие свойства: название улицы, перечень домов улицы, число проживающих на улице, число домов, район расположения, город улицы и т.д.
4. Поведение дома – набор методов, возможно, будет содержать следующие дей-ствия: создание дома, разрушение дома, чтение параметров, изменение номера дома и название, установка число проживающих, изменение этажности – пере-стройка дома, распечатка дома и т.д.
5. Поведение улицы – набор методов, возможно, будет содержать следующие дей-ствия: создание улицы, удаление улицы, добавление дома на улицу, удаление дома с улицы, новая нумерация домов на улице, распечатка домов улицы, из-менение названия улицы, чтение параметров улицы, объединение двух улиц, деление улиц на две и т.д.
6. Уже сейчас, можно придумать название для классов этих объектов: дом Home, а улица – Street. Так как это описание классов на языке программирования, то мы должны давать названия латиницей. Лучше эти названия дать осмысленно.
7. В качестве технологических классов можно выделить классы: список (List).


Пример. В нашем случае материальный объект – дом/строение. Контейнерный объ-ект улица, как совокупность домов. На первом этапе необходимо очень внимательно на понятийном уровне продумать смысл каждого свойства и каждого действия над выде-ленными типами объектов. Ниже приведены некоторые свойства классов с описание содержания:
1. Номер дома порядковый – целочисленная переменная (int HomeNumber), а операции по изменению номера дома и чтению этих параметров (SetHome-Number и GetHomeNumber) и т.д. Придуманные обозначения желательно по-местить в таблицу, в которой будут перечислены все понятия их свойства и ме-тоды работы с данными объекта, их названия и типы.
2. Номер дома символьный – символьная переменная (char *Home_Number), по-требуется, так как дома часто имеют различные индексы в номере (Например: “Дом 5а-стр.2”).
3. Название улицы – символьный массив (char NameStreet[30]) или указатель на имя (char * pNameStreet). Для добавления дома на улицу придумаем метод (AddHome), а для удаления дома с улицы (DeleteHome). И т.д. Придуманные обозначения желательно поместить в таблицу, в которой будут перечислены понятия/методы, их названия и типы.
Реализация контейнерных классов

В каждом задании на ДЗ требуется создать минимум один контейнерный класс. Контейнерные классы – это такие классы, на основе которых создаются объекты, вклю-чающие в себя другие объекты (отношение накопления). Контейнерные классы могут быть упорядоченными (массивы и списки) и неупорядоченными (множества). Для реа-лизации контейнерных классов студенты могут выбрать один из подходов:
• Использование стандартных (библиотечных) классов типа список или массив, а соб-ственный контейнерный класс наследовать от них.
• Создание собственных списков в контейнерном классе задания (например, в классе улиц) и реализация в них всех операций над списками. Менее универсальный вари-ант.
• Создание собственных отдельных классов типа список и массив, с дальнейшим наследованием контейнерных классов задания от них. Более универсальный вари-ант.

Некоторые особенности выполнения ДЗ

При выполнении задания должны быть учтены следующие требования. В этом разделе даются также методические указания для реализации задания.

1. Для классов объектов явно определяются и разрабатываются: конструкторы (не ме-нее двух для каждого класса) и деструкторы (для каждого класса);
Пример. Конструкторы могут с первоначальным заданием параметров или нет, напри-мер, с заданием названия улицы и т.д.

2. В каждом классе помимо конструкторов и деструкторов должны быть определены не менее четырех методов (функций членов класса) и не менее четырех свойств (дан-ных класса);
Пример. Методы для улиц могут быть такими: добавление дома, удаление дома, распе-чатки домов улицы, нумерация домов, сложение улиц, деление улиц и т.д. Например, деление улицы на две может интерпретироваться так: первые N домов переносятся на "улицу Горького", а остальные на "Тверскую". Т.е., другими словами, из одного объекта мы получаем два других объекта с определенными свойствами. Разрабатывая такую опе-рацию нужно продумать вопросы: где создаются новые объекты, как они заполняться, уничтожается ли исходный объект и т.д.

3. Один из разрабатываемых классов должен быть контейнерного типа (массив, спи-сок, множество и т.д.), в нем должны быть определены операции добавления, удале-ния и распечатки из контейнера.
Пример. В контейнерном классе улица предусматриваются операции добавления домов, их удаления, печати всех домов улицы и т.д.

4. В одном классе по выбору, в зависимости от варианта, определяется как минимум одна перегружаемая операция (обязательная операция, обозначенная знаком "+" ).
Пример. В нашем случае лучше определить операцию сложения двух улиц или опера-цию добавления дома на улицу. В первом случае это может выглядеть так:
Оператор присваивания -Street3 = Street1+ Street2;
а во втором просто выражение присваивания – Street1+Home1;.

5. Должен быть разработан, описан в отчете и представлен демонстрационный (тесто-вый) пример, иллюстрирующий работу всех составляющих разработанной системы классов (свойств и методов/функций членов), который является основой для сдачи домашнего задания;

Пример. В демонстрационном примере должны быть показано использование всех клас-сов, на основе определения объектов и работу всех методов этих классов. Например, для классов улиц: создание улиц статическое и динамическое через операцию new, уничто-жение улиц через операцию delete, добавление домов на улицу, их удаление, распечатку домов, слияние улиц и т.д.

6. Описания классов должны быть вынесены в отдельные файлы (*.h). При этом необ-ходимо исключить повторное включение описаний в исходный текст.
Пример. Например, с помощью переменных этапа компиляции (define __STREET_H):
#if !defined( __STREET_H )
…… Основной текст файла
#endif //

7. Обязательным является перегрузка операции вывода (<<) в стандартный поток COUT для предметного класса.

Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2013, 00:28     Класс домов и класс улиц для учета поступлений квартплаты. Массив
Посмотрите здесь:

Реализуйте класс для хранения ФИО и номера телефона человека, класс для хранения даты рождения человека, а также класс для хранения ФИО и почтового ад C++
C++ Создать Класс Coins (монеты). Класс сохраняет массив из 3 монет ...
C++ помогите сделать класс Bill для учета стоимости разговоров
C++ С++ класс (создайте класс с именем Complex для выполнения в арифмитических операий с комплексными числами))
Реализовать класс Triangle (задание 25), опираясь на класс Angle из задания 26 для представления углов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
26.04.2013, 13:15     Класс домов и класс улиц для учета поступлений квартплаты. Массив #2
Цитата Сообщение от kukhtikov Посмотреть сообщение
Растолкуйте плиз что надо добавить и переделать..
Судя по заданию.
Надо добавить класс -- список.
Вложить список строений в класс улицу.
kukhtikov
2 / 2 / 0
Регистрация: 16.12.2012
Сообщений: 97
26.04.2013, 13:31  [ТС]     Класс домов и класс улиц для учета поступлений квартплаты. Массив #3
lemegeton, нет, у меня массив
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
26.04.2013, 18:41     Класс домов и класс улиц для учета поступлений квартплаты. Массив #4
Цитата Сообщение от kukhtikov Посмотреть сообщение
7. В качестве технологических классов можно выделить классы: список (List).
Не то задание выложил?
Какие еще отличия?

Добавлено через 2 часа 36 минут
Вы печально забили отвечать на мой вопрос, но не постеснялись написать в личку.

Ну, разделять классы на заголовок и тело вы умеете сами, поэтому я этого делать не буду. Мне лень.

Именовать методы, классы и свойства как в методичке мне тоже лень, да и никто на это смотреть не будет.

Давайте есть слона по-частям.

Первый класс, сущность "здание" у вас есть. Я взял на себя смелость его немного переписать "под себя", чтобы проще было. Вывод тоже заточен "под меня", можете исправить как вам нравится.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Building {
 public:
  Building() : number() {}
  Building(int number, int numberOfApartments, int numberOfResidents,
    int numberOfStoreys) : number(number),
    numberOfApartments(numberOfApartments),
    numberOfResidents(numberOfResidents),
    numberOfStoreys(numberOfStoreys) {}
  virtual ~Building() {}
  
  int getNumber() const { return number; }
  int getNumberOfApartments() const { return numberOfApartments; }
  int getNumberOfResidents() const { return numberOfResidents; }
  int getNumberOfStoreys() const { return numberOfStoreys; }
  
  void setNumber(int number) {
    this->number = number;
  }
  void setNumberOfApartments(int numberOfApartments) {
    this->numberOfApartments = numberOfApartments;
  }
  void setNumberOfResidents(int numberOfResidents) {
    this->numberOfResidents = numberOfResidents;
  }
  void setNumberOfStoreys(int numberOfStoreys) {
    this->numberOfStoreys = numberOfStoreys;
  }
 private:
  int number;
  int numberOfApartments;
  int numberOfResidents;
  int numberOfStoreys;
};
 
std::ostream &operator<<(std::ostream &stream, const Building &building) {
  return stream << "Building{" <<
    "number=" << building.getNumber() << "," <<
    "numberOfApartments=" << building.getNumberOfApartments() << "," <<
    "numberOfResidents=" << building.getNumberOfResidents() << "," <<
    "numberOfStoreys=" << building.getNumberOfStoreys() << "}";
}


Едем дальше по методичке.
Цитата Сообщение от kukhtikov Посмотреть сообщение
В каждом задании на ДЗ требуется создать минимум один контейнерный класс.
Требуется создать контейнерный класс. Ок. Сделаем контейнерный класс зданий.
Если вам нужен более "навороченый" контейнер, позволяющий хранить что угодно, можно взять стандартный std::vector или любой понравившийся велосипед с форума.

Значит сущность на основе массива, хранящая здания (и только здания).
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class BuildingList {
 public:
  BuildingList() : capacity(10), size(0), data(new Building[capacity]) {}
  BuildingList(const BuildingList &other) : capacity(0), size(0), data(0) {
    copyFrom(other);
  }
  virtual ~BuildingList() { delete [] data; }
  BuildingList &operator=(const BuildingList &other) {
    return copyFrom(other);
  }
  BuildingList &copyFrom(const BuildingList &other) {
    if (this != &other) {
      delete [] data;
      size = other.getSize();
      capacity = other.getCapacity();
      data = new Building[size];
      for (unsigned int i = 0; i < size; ++i) {
        data[i] = other.data[i];
      }
    }
    return *this;
  }
  void insert(unsigned int position, const Building &building) {
    checkCapacity();
    for (Building *i = data + size; i != data + position; --i) {
      *i = *(i - 1);
    }
    data[position] = building;
    ++size;
  }
  void remove(unsigned int position) {
    for (Building *i = data + position; i != data + size - 1; ++i) {
      *i = *(i + 1);
    }
    --size;
  }
  Building &operator[](unsigned int position) {
    return data[position];
  }
  const Building &operator[](unsigned int position) const {
    return data[position];
  }
  unsigned int getSize() const { return size; }
  unsigned int getCapacity() const { return capacity; }
 private:
  void checkCapacity() {
    if (size >= capacity - 1) {
      capacity += 10;
      Building *newData = new Building[capacity];
      for (unsigned int i = 0; i < size; ++i) {
        newData[i] = data[i];
      }
      delete [] data;
      data = newData;
    }
  }
  unsigned int capacity;
  unsigned int size;
  Building *data;
};


Добавлено через 3 минуты
Теперь самая мякота. Композитный класс улицы, включающий в себя сущность-список домов. Тоже сразу со вспомогательной функцией и оператором вывода на экран.

В общем-то обычный класс, у которого есть объект buildings, класса, описанного выше. Методы "контейнера" класс улицы подменяет своими, осмысленными.

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// вспомогательная функция для копирования строки,
// чтобы не включать громоздкий cstring
char *strcpy(char *destination, const char *source) {
  char *result = destination;
  do {
    *destination++ = *source++;
  } while (*source);  
  return result;
}
 
class Street {
 public:
  Street() {
    name[0] = '\0';
  }
  Street(const char *name) {
    strcpy(this->name, name);
  }
  virtual ~Street() {}
  const char *getName() const { return name; }
  void setName(const char *name) { strcpy(this->name, name); }
 
  // методы, связанные со зданиями:
  unsigned int getNumberOfBuildings() const { return buildings.getSize(); }
  Building &getBuilding(unsigned int position) {
    return buildings[position];
  }
  const Building &getBuilding(unsigned int position) const {
    return buildings[position];
  }
  void addBuilding(const Building &building) {
    buildings.insert(buildings.getSize(), building);
  }
  void addBuilding(unsigned int position, const Building &building) {
    buildings.insert(position, building);
  }
 
  // методы-аггрегаты для вычисляемых свойств класса
  unsigned int getNumberOfResidents() const {
    unsigned int result = 0;
    for (unsigned int i = 0; i < getNumberOfBuildings(); ++i) {
      result += getBuilding(i).getNumberOfResidents();
    }
    return result;
  }
  unsigned int getNumberOfApartments() const {
    unsigned int result = 0;
    for (unsigned int i = 0; i < getNumberOfBuildings(); ++i) {
      result += getBuilding(i).getNumberOfApartments();
    }
    return result;
  }
 private:
  char name[30];
  BuildingList buildings;
};
 
std::ostream &operator<<(std::ostream &stream, const Street &street) {
  stream << "Street{" <<
    "name='" << street.getName() << "'," <<
    "numberOfApartments=" << street.getNumberOfApartments() << "," <<
    "numberOfResidents=" << street.getNumberOfResidents() << "," <<
    "numberOfNuildings=" << street.getNumberOfBuildings() << "," <<
    "buildings=[";
  if (street.getNumberOfBuildings() > 0) {
    for (unsigned int i = 0; i < street.getNumberOfBuildings(); ++i) {
      stream << std::endl << " " << street.getBuilding(i);
      if (i + 1 < street.getNumberOfBuildings()) {
        stream << ",";
      }
    }
  }
  return stream << "]}";
}
kukhtikov
2 / 2 / 0
Регистрация: 16.12.2012
Сообщений: 97
26.04.2013, 18:43  [ТС]     Класс домов и класс улиц для учета поступлений квартплаты. Массив #5
lemegeton, спасибо! Надеюсь, что понял
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
26.04.2013, 18:44     Класс домов и класс улиц для учета поступлений квартплаты. Массив #6
Всё? Дальше не надо? С операторами самостоятельно? )
kukhtikov
2 / 2 / 0
Регистрация: 16.12.2012
Сообщений: 97
26.04.2013, 19:11  [ТС]     Класс домов и класс улиц для учета поступлений квартплаты. Массив #7
lemegeton, если будут проблемы, то обращусь.
И можете объяснить, как работает этот класс?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// вспомогательная функция для копирования строки,
// чтобы не включать громоздкий cstring
char *strcpy(char *destination, const char *source) {
  char *result = destination;
  do {
    *destination++ = *source++;
  } while (*source);  
  return result;
}
 
class Street {
 public:
  Street() {
    name[0] = '\0';
  }
  Street(const char *name) {
    strcpy(this->name, name);
  }
  virtual ~Street() {}
  const char *getName() const { return name; }
  void setName(const char *name) { strcpy(this->name, name); }
 
  // методы, связанные со зданиями:
  unsigned int getNumberOfBuildings() const { return buildings.getSize(); }
  Building &getBuilding(unsigned int position) {
    return buildings[position];
  }
  const Building &getBuilding(unsigned int position) const {
    return buildings[position];
  }
  void addBuilding(const Building &building) {
    buildings.insert(buildings.getSize(), building);
  }
  void addBuilding(unsigned int position, const Building &building) {
    buildings.insert(position, building);
  }
 
  // методы-аггрегаты для вычисляемых свойств класса
  unsigned int getNumberOfResidents() const {
    unsigned int result = 0;
    for (unsigned int i = 0; i < getNumberOfBuildings(); ++i) {
      result += getBuilding(i).getNumberOfResidents();
    }
    return result;
  }
  unsigned int getNumberOfApartments() const {
    unsigned int result = 0;
    for (unsigned int i = 0; i < getNumberOfBuildings(); ++i) {
      result += getBuilding(i).getNumberOfApartments();
    }
    return result;
  }
 private:
  char name[30];
  BuildingList buildings;
};
 
std::ostream &operator<<(std::ostream &stream, const Street &street) {
  stream << "Street{" <<
    "name='" << street.getName() << "'," <<
    "numberOfApartments=" << street.getNumberOfApartments() << "," <<
    "numberOfResidents=" << street.getNumberOfResidents() << "," <<
    "numberOfNuildings=" << street.getNumberOfBuildings() << "," <<
    "buildings=[";
  if (street.getNumberOfBuildings() > 0) {
    for (unsigned int i = 0; i < street.getNumberOfBuildings(); ++i) {
      stream << std::endl << " " << street.getBuilding(i);
      if (i + 1 < street.getNumberOfBuildings()) {
        stream << ",";
      }
    }
  }
  return stream << "]}";
}
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
26.04.2013, 19:18     Класс домов и класс улиц для учета поступлений квартплаты. Массив #8
Это класс. Он ничего не делает без контекста. Он только что-то хранит. Конкретно -- другие объекты и методы работы с ними.
Переформулируйте, пожалуйста, вопрос.
kukhtikov
2 / 2 / 0
Регистрация: 16.12.2012
Сообщений: 97
26.04.2013, 19:21  [ТС]     Класс домов и класс улиц для учета поступлений квартплаты. Массив #9
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
// вспомогательная функция для копирования строки,
// чтобы не включать громоздкий cstring
char *strcpy(char *destination, const char *source) {
  char *result = destination;
  do {
    *destination++ = *source++;
  } while (*source);  
  return result;
}
]

Я не понял, как работает эта функция и почему в методах агрегатах используются циклы
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2013, 00:49     Класс домов и класс улиц для учета поступлений квартплаты. Массив
Еще ссылки по теме:

Написать класс по строительству домов. Написать программу, демонстрирующую работу с классом. C++
Класс, для полей которого нужно использовать класс C++
Как создать шаблонный класс-массив для хранения объектов? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
27.04.2013, 00:49     Класс домов и класс улиц для учета поступлений квартплаты. Массив #10
Цитата Сообщение от kukhtikov Посмотреть сообщение
Я не понял, как работает эта функция
Эта функция последовательно копирует символы из второго параметра в переменную, переданную первым параметром.

Цитата Сообщение от kukhtikov Посмотреть сообщение
почему в методах агрегатах используются циклы

В этих методах агрегируется информация по всем вложенным объектам контейнера. Поэтому и циклы.
Yandex
Объявления
27.04.2013, 00:49     Класс домов и класс улиц для учета поступлений квартплаты. Массив
Ответ Создать тему
Опции темы

Текущее время: 00:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru