Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Преобразование  (Прочитано 749 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн tro9an

  • Автор темы
  • Любитель
  • *
  • Сообщений: 55
    • Просмотр профиля
Преобразование
« : 11 Марта 2011, 19:28:35 »
// times1.cpp

// программа перевода времени в 24-часовом написании

// в 12-часовое

#include <iostream>

#include <string>

using namespace std;

///////////////////////////////////////////////////////////

class time12

{

  private:

    bool pm;

    int hrs;

    int mins;

  public:

    time12 ( ) : pm ( true ), hrs ( 0 ), mins ( 0 )

      { }

    time12 ( bool ap, int h, int m ) : pm ( ap ), hrs ( h ), mins ( m )

      { }

    void display ( ) const

      {

        cout << hrs << ':';

        if ( mins < 10 )

          cout << '0';

        cout << mins << ' ';

        string am_pm = pm ? "p.m." : "a.m.";

        cout << am_pm;

      }

};

///////////////////////////////////////////////////////////

class time24

{

  private:

    int hours;

    int minutes;

    int seconds;

  public:

    time24 ( ) : hours ( 0 ), minutes ( 0 ), seconds ( 0 )

      { }

    time24 ( int h, int m, int s ) : hours ( h ), minutes ( m ), seconds ( s )

      { }

    void display ( ) const

      {

        if ( hours < 10 ) cout << '0';

        cout << hours << ':';

        if ( minutes < 10 ) cout << '0';

        cout << minutes << ':';

        if ( seconds < 10 ) cout << '0';

        cout << seconds;

      }

    operator time12 ( ) const;

};

///////////////////////////////////////////////////////////

time24::operator time12 ( ) const

{

  int hrs24 = hours;

  bool pm = hours < 12 ? false : true;



  int roundMins = seconds < 30 ? minutes : minutes + 1;

  if ( roundMins == 60 )

  {

    roundMins = 0;

    ++hrs24;

    if ( hrs24 == 12 ||hrs24 == 24 )

      pm = ( pm == true ) ? false : true;

  }

  int hrs12 = ( hrs24 < 13 ) ? hrs24 : hrs24 – 12;

  if ( hrs12 == 0 )

  {

    hrs12 = 12;

    pm = false;

  }

  return time12 ( pm, hrs12, roundMins );

}

///////////////////////////////////////////////////////////

int main ( )

{

  int h, m, s;



  while ( true )

  {

    cout << "Введите время в 24-часовом формате: \n";

    cout << "  Часы (от 0 до 23): "; cin >> h;

    if ( h > 23 )

      return ( 1 );

    cout << "  Минуты: "; cin >> m;

    cout << "  Секунды: "; cin >> s;



    time24 t24 ( h, m, s );

    cout << "Исходное время: ";

    t24.display ( );



    time12 t12 = t24;



    cout << "\nВ 12-часовом формате: ";

    t12.display ( );

    cout << "\n\n";

  }

  return 0;

}




код взят из учебника

В этом коде преобразование ведь только в одну сторону ( time24 в time12), тоесть в чтобы преобразовало в обратную ( time12 в time24 ), надо дописывать?
если да, то за меня дописывать не надо, я сам справлюсь, просто ответе на вопрос выше

Оффлайн ABEgorov

  • Участник
  • *
  • Сообщений: 130
    • Просмотр профиля
Re: Преобразование
« Ответ #1 : 11 Марта 2011, 19:42:10 »
Да "operator time12 ( ) const" объявлен, но не определен. Нужно определить его.

Код конечно - жесть. И кто автор учебника? :-)

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Преобразование
« Ответ #2 : 11 Марта 2011, 19:46:27 »
Да, только в одну.
Перегруженный оператор преобразования только один - time24::operator time12 ( ) const
и поиска "am" или "pm" что-то не наблюдается.

ABEgorov: Оператор определен
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн tro9an

  • Автор темы
  • Любитель
  • *
  • Сообщений: 55
    • Просмотр профиля
Re: Преобразование
« Ответ #3 : 11 Марта 2011, 19:50:02 »

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: Преобразование
« Ответ #4 : 11 Марта 2011, 22:21:49 »
измените название темы на более информативное, иначе тема будет закрыта.
и научитесь таки пользоваться спойлером

Оффлайн ABEgorov

  • Участник
  • *
  • Сообщений: 130
    • Просмотр профиля
Re: Преобразование
« Ответ #5 : 12 Марта 2011, 01:17:07 »
http://c2p.ru/cpp/lafore-r-obektno-orientirovannoe-programmirovanie-v-s.html
Рад, что не учу C++ по этой книге.
1. Точность time12 меньше, чем time24, поэтому при преобразовании time24 к time12 теряются данные, причём неявно;
2.  if ( mins < 10 ) cout << '0'; cout << mins << ' ';
cout << setw(2) << setfill('0') << mins << ' ';
3. bool pm = hours < 12 ? false : true;
bool pm = (hours >= 12);
4. int roundMins = seconds < 30 ? minutes : minutes + 1;
int roundMin = minutes + seconds/30;
5. pm = ( pm == true ) ? false : true;
pm = !pm;
6. if ( hrs12 == 0 )  { hrs12 = 12; pm = false;}
pm = false зачем тут? hrs12 равно 0 только когда hrs24 равно 0, а hrs24 равно 0, только когда hours равно 0. А когда hours равно 0, то pm уже равно false и никак не может быть true.
7. while(true) хороший бесконечный цикл. А что будет если пользователь введёт отрицательное число или вообще "sdfs".
8. Так, как предъидущий цикл бесконечный, то return 0 никогда не будет выполнен.
9. Ну и значения передаваемые в конструктор класса никак не проверяются.

Это вроде всё, что мне не понравилось в этом коде.

 

Страница сгенерирована за 0.066 секунд. Запросов: 25.