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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Лафоре. Программирование в С++, помогите сделать упражнение 
:(
    Опции темы
Hawaii
  Дата 5.6.2007, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Полное название книги "Объектно-ориентированное программирование в C++", автор Р. Лафоре
У кого есть сделаное упражнение 7 главы 7 этой книги, напишите его, а то я совсем не знаю как его делать. smile  smile  smile 
PM MAIL   Вверх
Greeen
Дата 5.6.2007, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 smile  smile 


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
JackYF
Дата 5.6.2007, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Hawaii @  5.6.2007,  18:18 Найти цитируемый пост)
У кого есть сделаное упражнение 7 главы 7 этой книги, напишите его, а то я совсем не знаю как его делать. smile  smile  smile  


Тебе в раздел Центр Помощи.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
korbian
Дата 6.6.2007, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Насколько я помню, в этой книге есть ответы


--------------------
korbian ©
PM   Вверх
Hawaii
Дата 6.6.2007, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Только на первые 3 упражнения каждой главы
PM MAIL   Вверх
betal
Дата 6.6.2007, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ты бы хоть задание попробывал написать. Ведь не все имеют эту книгу
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
Hawaii
Дата 6.6.2007, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Слово в слово....

Одним из недостатков С++ является отсутствие для бизнес-программ
встроенного типа для денежных значений, такого, как $173 698 001,32.
Такой денежный тип должен иметь возможность для хранения числа с 
фиксированной десятичной точкой точностью около 17 знаков, которого
было бы достаточно для хранения национального долга в долларах и цен-
тах. К счастью, встроенный тип С++ long double имеет точность 19 цифр,
поэтому мы можем использовать его как базисный для класса money, даже 
используя плавающую точку. Однако нам нужно будет добавить возмож- 
ность ввода и вывода денежных значений с предшествующим им знаком 
доллара и разделенными запятыми группы по три числа: так проще читать
большие числа. Первым делом при разработке такого класса напишем ме- 
тод mstold(), который принимает денежную строку, то есть строку, пред- 
ставляющую собой некоторое количество денег типа 

"$1,234,567,890,123.99"

в качестве аргумента и возвращает эквивалентное ее значению число типа 
long double.

Вам нужно будет обработать денежную строку как массив символов и, 
просматривая ее символ за символом, скопировать из нее только цифры 
(0 - 9) и десятичную точку в другую строку. Игнорируется все остальное, 
включая знак доллара и запятые. Затем вы можете использовать биб- 
лиотечную функцию _atold() (заметим, что здесь название функции на- 
чинается с символа подчеркивания - заголовочные файлы STDLIB.H или 
MATH.H) для преобразования новой строки к числу типа long double. Пред- 
полагаем, что денежное значение не может быть отрицательным. Напи- 
шите функцию main() для проверки метода mstold(), которая несколько 
раз получает денежную строку от пользователя и выводит соответству- 
ющее число типа long double.
PM MAIL   Вверх
BigHeart
Дата 7.6.2007, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



то есть тебе нужно во первых написать функцию, которая переводит строки в long double? я правильно понял?
PM MAIL   Вверх
DigitSphinx
Дата 7.6.2007, 03:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

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



Код

#include<conio.h>
#include<stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
long double MyFunc(char * s);
int _tmain(int argc, _TCHAR* argv[])
{
    char s[1024];
    cin.getline(s, 1024, '\n');
    long double ll = MyFunc(s);
    cout << endl << ll << " Dollars";
    _getch();
}
long double MyFunc(char * s)
{
    long double Result = 0.0, e = 1.0;
    int i, j;
    if (s[0] == 36)// '$' = 36
    {
        for (i = 0; i < strlen(s); i++)
            s[i] = s[i + 1];
    }
    char buff[1024];
    memset(buff, 0, 1024);
    for (i = 0, j = 0; i <strlen(s); i++)
        if (s[i] > 47 && s[i] < 58) // Цифра
        {
            buff[j] = s[i];
            j++;
        }
        else if (s[i] == 46 || s[i] == 44)
            continue;
        else
            return 0.0;
    for(i = strlen(buff);i--;) 
        if (buff[i] != 46)
        {
           Result += (buff[i] - 48) * e;
           e *= 10.0;
        }
    Result /= 100;
    return Result;
}

Не пинайте, писал в 4:55 утра (что я только не делаю чтобы не готовится к экзамену по тер.вер.)

Это сообщение отредактировал(а) DigitSphinx - 8.6.2007, 23:53


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
EnergoHokum
Дата 7.6.2007, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

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



Смотри классы iostream, там есть возможность распотрошить строку на предмет отделения цифр от остальных символов и ещё разное интересное. А придумывать что-то мне сейчас лень.
PM MAIL ICQ   Вверх
Damarus
Дата 7.6.2007, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



BigHeartDigitSphinxEnergoHokum, вы читать умеете? Там класс надо написать.
PM MAIL ICQ Jabber   Вверх
betal
Дата 7.6.2007, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(DigitSphinx @  7.6.2007,  03:47 Найти цитируемый пост)
Не пинайте, писал в 4:55 утра (что я только не делаю чтобы не готовится к экзамену по тер.вер.)

 smile а я думал я такой один  smile 
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
EnergoHokum
Дата 7.6.2007, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

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



To Damarus
Читать умею, прямого запрета на использование внутри проектируемого класса сторонних классов не обнаружил.
PM MAIL ICQ   Вверх
DigitSphinx
Дата 7.6.2007, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

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



то 
Damarus
Цитата(Damarus @  7.6.2007,  10:49 Найти цитируемый пост)
BigHeartDigitSphinxEnergoHokum, вы читать умеете? Там класс надо написать.

А в чем проблема ? сядь и напиши Раз такой умный !


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
BigHeart
Дата 7.6.2007, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ну как по мне, если есть готовый набор функций, то оформить их в виде класса не есть особая проблема
PM MAIL   Вверх
zkv
Дата 7.6.2007, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



Цитата(BigHeart @  7.6.2007,  21:31 Найти цитируемый пост)
ну как по мне, если есть готовый набор функций, то оформить их в виде класса не есть особая проблема 

не самый правильный подход  smile 
По вашему выходит назначение классов - упорядочивание функций по группам? Для этого существуют пространства имен.
PM MAIL   Вверх
nerezus
  Дата 7.6.2007, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



BigHeart, зря так думаешь.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
BigHeart
Дата 7.6.2007, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



не правильно поняли. простоDigitSphinxвыложил код,но просто пропустил, что надо было класс писать.

код ведь готовый есть!!! 

теперь его немного переофрмить...

Добавлено через 1 минуту и 21 секунду
чем с начала писать...
PM MAIL   Вверх
Hawaii
Дата 8.6.2007, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня не работает функция _atold(). Все похожие на неё работают. Наверное компилятор тупит.
PM MAIL   Вверх
DigitSphinx
Дата 8.6.2007, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

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



_atold() ?? 
Имеешь ввиду _atodbl()
Если не работает посмотри мой код (последний цикл)
Это и есть что то типа _atoldl()



--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
Hawaii
Дата 8.6.2007, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот чё я написал. Программа работает а _atold() нет... smile 
Код
#include<conio.h>
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<cstring> 
#include<stdlib.h>
#include<math.h>
using namespace std;
int j, ja;
int u = 0;
int p = 0;
class money
  {
  private:
    char monV[100];
    char monX[100];
    long double qwerty;
  public:
     void formating(char s[])
     { 
      for(j=0; j<strlen(s);)
         {
           while (s[j] == '$')
            {
            j++;
            }
          monV[u] = s[j];  
           u++;
           j++;
         }
      monV[u] = '\0';
      for(ja=0; ja<strlen(monV);)
         {
           while (monV[ja] == ',')
            {
            ja++;
            }
          monX[p] = monV[ja];  
           p++;
           ja++;
         }
      monX[p] = '\0';
      long double d = _atold(monX);
      cout << d;
     
     }   

  };
int main()
{
money m1;
char dengi[100];
cout << "Vedi summu v formate $1,234,567,890,123.99 "<< endl;
cin >> dengi;
m1.formating(dengi);
cout << endl;
system("PAUSE");
return 0;
}



Извините за латиницу. Просьба проверить, если не в лом в других компиляторах.
 smile 
PM MAIL   Вверх
DigitSphinx
Дата 8.6.2007, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

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



вот так сойдет ?
Код

#include<conio.h>
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<cstring> 
#include<stdlib.h>
#include<math.h>
using namespace std;
int j, ja;
int u = 0;
int p = 0;
class money
  {
      
  private:
    char monV[100];
    char monX[100];
    long double qwerty;
  public:
      money::money()
      {
          qwerty = 0.0;
      }
     void formating(char s[])
     { 
      for(j=0; j<strlen(s);)
         {
           while (s[j] == '$')
            {
            j++;
            }
          monV[u] = s[j];  
           u++;
           j++;
         }
      monV[u] = '\0';
      for(ja=0; ja<strlen(monV);)
         {
           while (monV[ja] == ',')
            {
            ja++;
            }
          monX[p] = monV[ja];  
           p++;
           ja++;
         }
      monX[p] = '\0';
      long double d = 0.0;
      long double e = 1.0;

      for(int i = strlen(monX);i--;) 
            if (monX[i] != 46)// '.' = 46
            {
               d += (monX[i] - 48) * e;
               e *= 10.0;
            }
      d /= 100;
      cout << d << endl;
      printf("%.2f", d);
     }   
  };
int main()
{
money m1;
char dengi[100];
cout << "Vedi summu v formate $1,234,567,890,123.99 "<< endl;
cin >> dengi;
m1.formating(dengi);
cout << endl;
system("PAUSE");
return 0;
}

на VS2005  smile 

Это сообщение отредактировал(а) DigitSphinx - 8.6.2007, 23:46


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
Hawaii
Дата 8.6.2007, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



он у меня не видит int _tmain(int argc, _TCHAR* argv[]), пишет `_TCHAR' has not been declared 

Это сообщение отредактировал(а) Hawaii - 8.6.2007, 23:45
PM MAIL   Вверх
DigitSphinx
Дата 8.6.2007, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

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



соррррри , я исправил  smile 
теперь на все 100%  smile 

Это сообщение отредактировал(а) DigitSphinx - 8.6.2007, 23:47


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
Damarus
Дата 9.6.2007, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



Код
#include <iostream>
#include <string>
#include <strstream>

class money
{
public:
    money(void) : m_value(0.0)
    {

    }
    money(const std::string& str) : m_value(0.0)
    {
        m_value = mstold(str.c_str());
    }
    money(const char* str) : m_value(0.0)
    {
        m_value = mstold(str);
    }
    money(const long double value) : m_value(value)
    {

    }

public:
    inline operator long double () const
    {
        return m_value;
    }

private:
    long double mstold(const char* str) const
    {
        std::strstream buffer;
        long double value = 0.0;

        while (*str++) if ((*str >= '0' && *str <= '9') || *str == '.') buffer << *str;
        buffer >> value;

        return value;
    }

private:
    long double m_value;
};

int main(int argc, char *argv[])
{
    for (int n = 0; n < 5; n++)
    {
        std::string str;
        std::cout << "Введите строку: ";
        std::cin >> str;
        money m(str);
        std::cout << "Значение long double: " << m << std::endl;
    }
}


ЗЫ. Добавить операторы по необходимости smile 
PM MAIL ICQ Jabber   Вверх
Hawaii
Дата 12.6.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Кто мне может помочь написать код. Нужно перегрузить ПОСТФИКСНЫЕ операции уменьшения и увеличеия значений класса Time. Шаг 1 сек. Много всяких вариантов перепробовал, всегда выходит с ошибками. Когда начинаю подставлять другие аргументы в объект time1, получаются отрицательные минуты, секунды.
Код
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
class Time
   {
   private:
      int hrs, mins, secs;
   public:
      Time() : hrs(0), mins(0), secs(0)
         {  }
                                       
      Time(int h, int m, int s) : hrs(h), mins(m), secs(s)         
         {  }

      void display()              
         { cout << hrs << ":" << mins << ":" << secs; cout << endl; }

      Time operator ++()                
      {                                  
            ++secs;                      
            if(secs > 59)                
             {secs -= 60; ++mins ;}      
            if(mins > 59)                
             {mins -= 60; ++hrs;}        
            if(hrs >= 24)                
             {hrs-=24;}                 
                                         
       return Time (hrs, mins, secs);    
      }                                 
      Time operator --()
      { 
           --secs;
           if(secs <0)
             {secs+=60; --mins ;}
           if(mins <0)
             {mins += 60; --hrs;}
           if(hrs <0)
             {hrs+=24;}
        return Time (hrs, mins, secs);        
      } 
      Time operator ++(int)
      { 
           
        //???????????????????????????????  
        
      }
      Time operator --(int)
      {
           
        //???????????????????????????????
        
      }
   };
////////////////////////////////////////////////////////////////
int main()
   {
   Time time1(23, 59, 59);
   Time time2;
   
   time1++;
   time1.display(); 
   
   time2 = time1++;
   time1.display();
   time2.display();
   
   cout << endl;
   system("PAUSE");
   return 0;
   }




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


Эксперт
***


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

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



Код

#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
class Time
{
private:
    int hrs, mins, secs;
public:
    Time():hrs(0), mins(0), secs(0) {}
    Time(int h, int m, int s):hrs(h), mins(m), secs(s) {}
    Time(const Time& obj):hrs(obj.hrs), mins(obj.mins), secs(obj.secs) {}
    void display()              
    {
        cout << hrs << ":" << mins << ":" << secs << endl; 
    }
    Time& operator ++()                
    {                                  
        ++secs;                      
        if(secs > 59)                
        {
            secs -= 60; 
            ++mins;
        }      
        if(mins > 59)
        {
            mins -= 60; 
            ++hrs;
        }        
        if(hrs >= 24) hrs-=24;
        return *this;
    }                                 
    Time& operator --()
    { 
        --secs;
        if(secs < 0)
        {
            secs+=60;
            --mins;
        }
        if(mins < 0)
        {
            mins += 60; 
            --hrs;
        }
        if(hrs < 0) hrs+=24;
        return *this; 
    } 
    Time operator ++(int)
    {
        Time buf(*this);
        ++*this;
        return buf;        
    }
    Time operator --(int)
    {
        Time buf(*this);
        --*this;
        return buf;
    }
};
////////////////////////////////////////////////////////////////
int main()
{
   Time time1(23, 59, 59);
   Time time2;
   
   time1++;
   time1.display(); 
   
   time2 = time1++;
   time1.display();
   time2.display();
   
   cout << endl;
   system("PAUSE");
   return 0;   
}



--------------------
user posted image  
PM MAIL   Вверх
Hawaii
Дата 12.6.2007, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое спасибо.
PM MAIL   Вверх
Damarus
Дата 12.6.2007, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



Hawaii, может проще хранить время в секундах smile 
PM MAIL ICQ Jabber   Вверх
Xenon
Дата 12.6.2007, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Damarus, ну просто в книге пример такой smile


--------------------
user posted image  
PM MAIL   Вверх
Hawaii
Дата 12.6.2007, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Посидел часок. Сам додумался и решил более простым способом, как мне кажется. 
Код
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
class Time
   {
   private:
      int hrs, mins, secs;
   public:
      Time() : hrs(0), mins(0), secs(0)
         {  }
                                       
      Time(int h, int m, int s) : hrs(h), mins(m), secs(s)         
         {  }

      void display()              
         { cout << hrs << ":" << mins << ":" << secs; cout << endl; }

      Time operator ++()                
      {                                  
            ++secs;                      
            if(secs > 59)                
             {secs -= 60; ++mins ;}      
            if(mins > 59)                
             {mins -= 60; ++hrs;}        
            if(hrs >= 24)                
             {hrs-=24;}                 
                                         
       return Time (hrs, mins, secs);    
      }                                 
      Time operator --()
      { 
           --secs;
           if(secs <0)
             {secs+=60; --mins ;}
           if(mins <0)
             {mins += 60; --hrs;}
           if(hrs <0)
             {hrs+=24;}
        return Time (hrs, mins, secs);        
      } 
      Time operator ++(int)
      { 
        int h = hrs;
        int m = mins;
        int s = secs;
            ++secs;                      
            if(secs > 59)                
             {secs -= 60; ++mins ;}      
            if(mins > 59)                
             {mins -= 60; ++hrs;}        
            if(hrs >= 24)                
             {hrs-=24;} 
        return Time (h, m, s);            
      }
      Time operator --(int)
      {
        int h = hrs;
        int m = mins;
        int s = secs;
           --secs;
           if(secs <0)
             {secs+=60; --mins ;}
           if(mins <0)
             {mins += 60; --hrs;}
           if(hrs <0)
             {hrs+=24;}
        return Time (h, m, s);
      }
   };
////////////////////////////////////////////////////////////////
int main()
   {
   Time time1(0, 0, 0);
   Time time2;
   
   time1++;
   time1.display(); 
   
   time2 = time1++;
   time1.display();
   time2.display();
   
   cout << endl;
   system("PAUSE");
   return 0;
   }



Добавлено через 2 минуты и 12 секунд
Цитата(Xenon @ 12.6.2007,  22:27)
Damarus, ну просто в книге пример такой smile

В какой книге??? smile 
PM MAIL   Вверх
Xenon
Дата 12.6.2007, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Hawaii, У Лафоре такой пример книге, к тому же тема об этой книге smile
А по поводу твоей реализации - префиксный оператор должен возвращать значение по ссылке, то есть самого себя (this), а в отродоксальном каноническом классе постфиксный оператор должен быть реализован через префиксный и должен возвращать объект по значению.


--------------------
user posted image  
PM MAIL   Вверх
NeuZeitgeist
Дата 4.5.2009, 12:11 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Возвращаясь к строкам. У меня вот такое решение этой задачи. Все работает. Только вывод пришлось делать через printf, потому что cout выводит число в экспоненциальной форме. Не нашел, как его заставить выводить число с запятой.
Код

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

using namespace std;
const int M = 30;

class money
{
    private:
        char mon_ch1[M];//деньги-строка
        char mon_ch2[M];//деньги-строка
        double mon_d;//деньги-число
    public:
        double mstold()
        {
            unsigned int i = 0, j = 0;
            cin >> mon_ch1;
            for(i = 0; i < strlen(mon_ch1); i++)
            if((mon_ch1[i] >= '0' && mon_ch1[i] <= '9') || mon_ch1[i] == '.')
            {
                mon_ch2[j] = mon_ch1[i];
                j++;
            }
            mon_ch2[j] = '\0';
            mon_d = strtod(mon_ch2, NULL);
            return mon_d;
        }
};

int main()
{
    money mon;
    double m;
    cout << "Vvedite chislo" << endl;
    m = mon.mstold();
    printf ("\nChislo ravno %.2lf\n", m);
    return 0;
}


PM   Вверх
zim22
Дата 4.5.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(NeuZeitgeist @  4.5.2009,  12:11 Найти цитируемый пост)
Не нашел, как его заставить выводить число с запятой.

Код

cout << fixed << setprecision(5) << m << endl;



--------------------
PM MAIL   Вверх
NeuZeitgeist
Дата 4.5.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ой, спасибо! Теперь будет все как нужно. smile
PM   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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