Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс Bill 
:(
    Опции темы
шарлотта
Дата 2.5.2017, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Здравствуйте!
Требуется реализовать класс Bill. Класс должен включать поля: фамилия, номер телефона, тариф за минуту, скидка, время начала разговора, время окончания разговора, сумма к оплате. Для представления времени используется класс Time. Реализовать методы извлечения и изменения полей.
Класс Time: 3 конструктора инициализации: числами, строкой("23:59:59"), секундами. Реализовать методы: вычисление разницы между 2 моментами времени в секундах, сложение времени и заданного количества секунд, вычитание из времени заданного количества секунд, сравнение моментов времени, перевод в секунды, перевод в минуты.
Код

#ifndef TIME_H
#define TIME_H

#include "string.h"

#include <stdlib.h>
#include <iostream>

class Time
{
    int hour;
    int min;
    int sec; 
public:
    Time(int hour, int min, int sec);
    //Time(char *time);
    Time(int sec);
    ~Time();
    Time operator-(const Time &time);
    Time operator+(int sec);
    Time operator-(int sec);
    bool operator==(const Time &time);
    int TranslateSec() const;
    int TranslateMin() const;
    friend std::ostream& operator <<(std:: ostream &out, const Time &time);
    friend std::istream& operator >>(std:: istream &in, Time &time);
    friend void Bill::ChangeTimeBeg(int p_hour, int p_min, int p_sec);
};

#endif


Код

#include "Time.h"

Time::Time(int hour, int min, int sec):
    hour(hour), min(min), sec(sec)
    {}

Time::Time(char *time){
}

Time::Time(int sec):
    hour(sec / 3600), min((sec % 3600) / 60), sec((sec % 3600) % 60)
    {}

Time::~Time() {}

Time Time::operator-(const Time &time) {
    int val = TranslateSec() - time.TranslateSec();
    Time res(val / 3600, (val % 3600) / 60, (val % 3600) % 60);
    return res;
}

Time Time::operator+(int sec) {
    int val = TranslateSec() + sec;
    Time res(val / 3600, (val % 3600) / 60, (val % 3600) % 60);
    return res;
}

Time Time::operator-(int sec) {
    int val = TranslateSec() - sec;
    Time res(val / 3600, (val % 3600) / 60, (val % 3600) % 60);
    return res;
}

bool Time::operator==(const Time &time) {
    if (TranslateSec() == time.TranslateSec()) {
        return true;
    } else {
        return false;
    }
}

int Time::TranslateSec() const {
    return 3600 * hour + 60 * min + sec;
}

int Time::TranslateMin() const {
    return (TranslateSec() / 60 + 1);
}

std::ostream& operator <<(std::ostream &out, const Time &time) {
    out << time.hour << " " << time.min << " " << time.sec << std::endl;
    return out;
}

std::istream& operator >>(std::istream &in, Time &time) {
    in >> time.hour >> time.min >> time.sec;
    return in;
}


Код

#ifndef BILL_H
#define BILL_H

#include <iostream>

#include "Time.h"

class Bill
{
    char *surname;
    int phone_num[11];
    double rate_min;
    int discount;
    Time time_beg;
    Time time_end;
    double sum_pay;
public:
    Bill(char *surname, int p_phone_num, double rate_min, int discount, int hour_beg, int min_beg, int sec_beg,
           int hour_end, int min_end, int sec_end, double sum_pay);
    ~Bill();
    friend std::ostream& operator <<(std:: ostream &out, const Bill &bill);
    friend std::istream& operator >>(std:: istream &in, Bill &bill);
    char *GetSurname();
    void ChangeSurname(char *p_surname);
    int *GetPhoneNum();
    void ChangePhoneNum(int p_phone_num);
    double GetRateMin();
    void ChangeRateMin(double p_rate_min);
    int GetDiscount();
    Time GetTimeBeg();
    void ChangeTimeBeg(int p_hour, int p_min, int p_sec);
    Time GetTimeEnd();
    void CountSum();
    double toString();
    
};

#endif


Код

#include "Bill.h"

Bill::Bill(char *surname, int p_phone_num, double rate_min, int discount, int hour_beg, int min_beg, int sec_beg,
           int hour_end, int min_end, int sec_end,  double sum_pay) :
    surname(surname), rate_min(rate_min), time_beg(hour_beg, min_beg, sec_beg),
    time_end(hour_end, min_end, sec_end), discount(discount), sum_pay(sum_pay){
    for (int i = 0; i < 11; i++) {
        phone_num[i] = p_phone_num;
    }
}

Bill::~Bill() {}

std::ostream& operator <<(std::ostream &out, const Bill &bill) {
    out << bill.surname << std::endl;
    out << bill.phone_num << std::endl;
    out << bill.rate_min << std::endl;
    out << bill.discount << std::endl;
    out << bill.time_beg << std::endl;
    out << bill.time_end << std::endl;
    out << bill.sum_pay << std::endl;
    return out;
}

std::istream& operator >>(std::istream &in, Bill &bill) {
    in >> bill.surname >> (*bill.phone_num) >> bill.rate_min >> bill.discount >> bill.time_beg >> bill.time_end >> bill.sum_pay;
    return in;
}
char *Bill::GetSurname() {
    return surname;
}

void Bill::ChangeSurname(char *p_surname) {
    surname = p_surname;
}

int *Bill::GetPhoneNum() {
    return phone_num;
}

void Bill::ChangePhoneNum(int p_phone_num) {
    for (int i = 0; i < 11; i++) {
        phone_num[i] = p_phone_num;
    }
}

double Bill::GetRateMin() {
    return rate_min;
}

void Bill::ChangeRateMin(double p_rate_min) {
    rate_min = p_rate_min;
}

Time Bill::GetTimeBeg() {
    return time_beg;
}

void Bill::ChangeTimeBeg(int p_hour, int p_min, int p_sec) {
    time_beg.hour = p_hour;
    time_beg.min = p_min;
    time_beg.sec = p_sec;
}

Time Bill::GetTimeEnd() {
    return time_end;
}

void Bill::CountSum() {
    sum_pay = rate_min * (time_end - time_beg).TranslateMin() - discount;
}

double Bill::toString() {
    return sum_pay;


Возникла проблема, как реализовать метод изменения начала и окончания времени разговора, ведь он является объектом другого класса. Как дружественную функцию не удается создать.
Также затрудняюсь с тем, как реализовать конструктор инициализации, принимающий строку.
В main возникает ошибка при создании объекта Bill bill1(0); пишет, что error C2664: Bill::Bill(const Bill &): невозможно преобразовать параметр 1 из 'int' в 'const Bill &'.
Буду очень благодарна за помощь!

Это сообщение отредактировал(а) шарлотта - 2.5.2017, 23:04
PM MAIL   Вверх
awesome
Дата 3.5.2017, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Цитата(шарлотта @  2.5.2017,  21:14 Найти цитируемый пост)
Возникла проблема, как реализовать метод изменения начала и окончания времени разговора, ведь он является объектом другого класса.

Реализовать методы для изменения времени у класса Time: 

Код

void Time::setSec(int sec);
void Time::setMin(int min);
void Time::setHour(int hour);



Цитата(шарлотта @  2.5.2017,  21:14 Найти цитируемый пост)
Также затрудняюсь с тем, как реализовать конструктор инициализации, принимающий строку.

Код

Bill::Bill(const std::string& str); 

И используйте std::string вместо char*.


Цитата(шарлотта @  2.5.2017,  21:14 Найти цитируемый пост)
В main возникает ошибка при создании объекта Bill bill1(0); пишет, что error C2664: Bill::Bill(const Bill &): невозможно преобразовать параметр 1 из 'int' в 'const Bill &'.

У вас нет конструктора для класса Bill, принимающего int в аргументе.


Это сообщение отредактировал(а) awesome - 3.5.2017, 11:18
PM MAIL   Вверх
шарлотта
Дата 3.5.2017, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Большое спасибо!
Только все равно не очень понимаю, как реализовать преобразование const std::string& str в числа.

PM MAIL   Вверх
awesome
Дата 3.5.2017, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Цитата(шарлотта @  3.5.2017,  12:17 Найти цитируемый пост)
Только все равно не очень понимаю, как реализовать преобразование const std::string& str в числа.


Код

void f(const std::string& str)
{
    std::stringstream ss(str);
    int a, b, c;
    char delim = ':';

    ss >> a  >> delim >> b >> delim >> c;
}

PM MAIL   Вверх
шарлотта
Дата 3.5.2017, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Должно быть, я что-то не так делаю, но он считывает только первую цифру
Код

Time time1("");
    std::cout << "Input time1:" << std::endl;
    std::cin >> time1;
    std::cout << "You input time1:" << std::endl;
    std::cout << time1 << std::endl;

И второй объект не дает ввести.
PM MAIL   Вверх
awesome
Дата 3.5.2017, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Код

Time::Time(const std::string& str)
{
std::stringstream ss(str);
char delim = ':';

ss >> hour  >> delim >> min >> delim >> sec;
}

Time time1("12:34:56");



PM MAIL   Вверх
шарлотта
Дата 3.5.2017, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Если задать так: Time time1("12:34:56"); то все работает нормально, но при вводе с клавиатуры вводит только первое число.


PM MAIL   Вверх
awesome
Дата 3.5.2017, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Цитата(шарлотта @  3.5.2017,  16:32 Найти цитируемый пост)
Если задать так: Time time1("12:34:56"); то все работает нормально, но при вводе с клавиатуры вводит только первое число.


Код

Time::Time(const std::string& str)
{
std::stringstream ss(str);
char delim = ':';
ss >> hour  >> delim >> min >> delim >> sec;
}

std::string str;
std::getline(std::cin, str);
Time time1(str);

PM MAIL   Вверх
шарлотта
Дата 3.5.2017, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Большое Вам спасибо!
PM MAIL   Вверх
шарлотта
Дата 3.5.2017, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Возникла проблема с изменением номера телефона int *phone_num;
Код

int *Bill::GetPhoneNum() {
    return phone_num;
}

void Bill::SetPhoneNum(int *p_phone_num) {
    for (int i = 0; i < 11; i++) {
        phone_num[i] = p_phone_num[i];
    }
}


Код

    std::cout << "You set phone_num:" << std::endl;
    int *p_phone_num = new int[11];
    for (int i = 0; i < 11; i++) {
        std::cin >> p_phone_num[i];
    }
    bill1.SetPhoneNum(p_phone_num);
    std::cout << "You input phone_num:" << std::endl;
    std::cout << bill1.GetPhoneNum() << std::endl;

Как я понимаю, выдает адрес. Но не знаю, как исправить ошибку.

Это сообщение отредактировал(а) шарлотта - 3.5.2017, 17:55
PM MAIL   Вверх
awesome
Дата 4.5.2017, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Цитата(шарлотта @  3.5.2017,  17:54 Найти цитируемый пост)
Как я понимаю, выдает адрес. Но не знаю, как исправить ошибку.

Сделайте phone_num std::string и работайте со строкой. А вообще стоит почитать хоть немного учебник.
PM MAIL   Вверх
шарлотта
Дата 4.5.2017, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Спасибо, удалось исправить!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2636 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.