2 / 2 / 0
Регистрация: 16.12.2012
Сообщений: 97

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

26.04.2013, 00:28. Показов 2711. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задание:
вырезано

Файл 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 для предметного класса.

0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.04.2013, 00:28
Ответы с готовыми решениями:

Класс для учета стоунов и фунтов
#include &lt;iostream&gt; using namespace std; //Класс class Stownt { private: enum{Lbs_per_stn=14};//число фунтов в струнах ...

Класс: Разработать абстрактный класс класс Point для задания координаты...
Всем привет, помогите пожалуйста решить задачу, я уже всю голову сломал, не знаю как решить... Разработать абстрактный класс класс...

Класс Bill для учета стоимости разговоров
Сделал начало дальше несоображает голова что делать.Вот задание Сделать класс Bill,который есть платежом за розговор.Для представления...

9
 Аватар для lemegeton
4898 / 2692 / 919
Регистрация: 29.11.2010
Сообщений: 5,779
26.04.2013, 13:15
Цитата Сообщение от kukhtikov Посмотреть сообщение
Растолкуйте плиз что надо добавить и переделать..
Судя по заданию.
Надо добавить класс -- список.
Вложить список строений в класс улицу.
0
2 / 2 / 0
Регистрация: 16.12.2012
Сообщений: 97
26.04.2013, 13:31  [ТС]
lemegeton, нет, у меня массив
0
 Аватар для lemegeton
4898 / 2692 / 919
Регистрация: 29.11.2010
Сообщений: 5,779
26.04.2013, 18:41
Цитата Сообщение от 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 << "]}";
}
0
2 / 2 / 0
Регистрация: 16.12.2012
Сообщений: 97
26.04.2013, 18:43  [ТС]
lemegeton, спасибо! Надеюсь, что понял
0
 Аватар для lemegeton
4898 / 2692 / 919
Регистрация: 29.11.2010
Сообщений: 5,779
26.04.2013, 18:44
Всё? Дальше не надо? С операторами самостоятельно? )
0
2 / 2 / 0
Регистрация: 16.12.2012
Сообщений: 97
26.04.2013, 19:11  [ТС]
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 << "]}";
}
0
 Аватар для lemegeton
4898 / 2692 / 919
Регистрация: 29.11.2010
Сообщений: 5,779
26.04.2013, 19:18
Это класс. Он ничего не делает без контекста. Он только что-то хранит. Конкретно -- другие объекты и методы работы с ними.
Переформулируйте, пожалуйста, вопрос.
0
2 / 2 / 0
Регистрация: 16.12.2012
Сообщений: 97
26.04.2013, 19:21  [ТС]
Кликните здесь для просмотра всего текста

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;
}
]

Я не понял, как работает эта функция и почему в методах агрегатах используются циклы
0
 Аватар для lemegeton
4898 / 2692 / 919
Регистрация: 29.11.2010
Сообщений: 5,779
27.04.2013, 00:49
Цитата Сообщение от kukhtikov Посмотреть сообщение
Я не понял, как работает эта функция
Эта функция последовательно копирует символы из второго параметра в переменную, переданную первым параметром.

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

В этих методах агрегируется информация по всем вложенным объектам контейнера. Поэтому и циклы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.04.2013, 00:49
Помогаю со студенческими работами здесь

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...

Создать Класс Coins (монеты). Класс сохраняет массив из 3 монет ...
Помогите написать програмку, где: Нужно создать Класс Coins (монеты). Класс сохраняет массив из 3 монет и общее количество лицевых сторон...

Класс: Создать класс, объектом которого будет являться двумерный массив размерностью n x m.
Нужно создать класс, объектом которого будет являться двумерный массив размерностью n x m. Массив должен размещаться в динамической памяти....

Реализовать класс ModelWindow, добавив поле для курсора, используя для представления поля класс Cursor
Реализовать класс ModelWindow, добавив поле для курсора. Используйте для представления поля класс Cursor. (это под типом класс в классе).

Создать класс Mystring, предназначенный для хранения строки из символов типа char. Класс имеет метод для определения дли
Создать класс Mystring, предназначенный для хранения строки из символов типа char. Класс имеет метод для определения длины строки. Не...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

Новые блоги и статьи
Шаблоны и протоколы для создания устойчивых микросервисов
ArchitectMsa 19.04.2025
Микросервисы — архитектурный подход, разбивающий сложные приложения на небольшие, независимые компоненты. Вместо монолитного гиганта, система превращается в созвездие небольших взаимодействующих. . .
Изменяемые и неизменяемые типы в Python
py-thonny 19.04.2025
Python славится своей гибкостью и интуитивной понятностью, а одна из главных его особенностей — это система типов данных. В этом языке все, включая числа, строки, функции и даже классы, является. . .
Интеграция Hangfire с RabbitMQ в проектах C#.NET
stackOverflow 18.04.2025
Разработка современных . NET-приложений часто требует выполнения задач "за кулисами". Это может быть отправка email-уведомлений, генерация отчётов, обработка загруженных файлов или синхронизация. . .
Построение эффективных запросов в микросервисной архитектуре: Стратегии и практики
ArchitectMsa 18.04.2025
Микросервисная архитектура принесла с собой много преимуществ — возможность независимого масштабирования сервисов, технологическую гибкость и четкое разграничение ответственности. Но как часто бывает. . .
Префабы в Unity: Использование, хранение, управление
GameUnited 18.04.2025
Префабы — один из краеугольных элементов разработки игр в Unity, представляющий собой шаблоны объектов, которые можно многократно использовать в различных сценах. Они позволяют создавать составные. . .
RabbitMQ как шина данных в интеграционных решениях на C# (с MassTransit)
stackOverflow 18.04.2025
Современный бизнес опирается на множество специализированных программных систем, каждая из которых заточена под решение конкретных задач. CRM управляет отношениями с клиентами, ERP контролирует. . .
Типы в TypeScript
run.dev 18.04.2025
TypeScript представляет собой мощное расширение JavaScript, которое добавляет статическую типизацию в этот динамический язык. В JavaScript, где переменная может свободно менять тип в процессе. . .
Погружение в Kafka: Концепции и примеры на C# с ASP.NET Core
stackOverflow 18.04.2025
Apache Kafka изменила подход к обработке данных в распределенных системах. Эта платформа потоковой передачи данных выходит далеко за рамки обычной шины сообщений, предлагая мощные возможности,. . .
Коммуникация в реальном времени с SignalR в C# на примере создания чата
UnmanagedCoder 17.04.2025
Современный веб стремительно эволюционирует от статичных страниц к динамичным приложениям, где пользователи ожидают мгновенной реакции на свои действия. Представим, что вы отправляете сообщение. . .
Реализация CQRS с MediatR на C# .NET
stackOverflow 17.04.2025
Современная разработка программного обеспечения постоянно ищет пути повышения эффективности организации кода. Архитектурные паттерны появляются, эволюционируют, и те, что проявляют свою. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru