Раздел «Язык Си».ClassManyHite:

Классы в С++

"Спрятанные атрибуты"

Когда мы получаем числа, они могут быть НЕПРАВИЛЬНЫМИ для нашей задачи. Пример с линейкой

#include <iostream>
#include <cstdlib>
using namespace std;
class Lin{
// Эта ЗАКРЫТАЯ область
  int metr; //
  int cm;  //
 
 public:
// Это ОТКРЫТАЯ область

// функция получает размер с клавиатуры
 void getLin();
// сложение
 Lin add(Lin b);
 void print(); 
// Если  a>b, верне 1, иначе 0 
 int isLess(Lin b);
// Если равны 1, иначе 0
 int isEq(Lin b);
// Если наше число больше 1, если равны 0, если меньше -1
 int cmp(Lin b);
};

void Lin::print(){
    cout<<metr<<"m "<<cm<<"cm "<<endl;
};

void Lin::getLin(){
      int m; 
      int c;
      cin>>m>>c;
  //   cout<<"get:"<<m<<' '<<c<<endl;
 //    cout<<"cm:"<<cm<<endl;
     metr = m + c / 100;
//     cout<<"metr:"<<metr<<endl;
     cm = c % 100;
//     cout<<"cm ="<<cm<<endl;
};

Lin Lin::add(Lin b){
    Lin tmp;
    tmp.cm = cm + b.cm;
    cout<<"tmp.cm ="<<tmp.cm<<endl;
    tmp.metr = metr + b.metr + tmp.cm / 100;
   tmp.cm = tmp.cm % 100; cout<<"tmp.metr:"<<tmp.metr<<endl;
    return tmp;
};

int Lin::isLess(Lin b){
    int tmpcm;
    int tmpcmb;
    tmpcm = metr * 100 + cm;
    cout<<"tmpcm ="<<tmpcm<<endl;
    tmpcmb = b.metr * 100 + b.cm;
    cout<<"tmpcmb ="<<tmpcmb<<endl;
    if (tmpcm > tmpcmb)
      return 1;
    else 
      return 0;  
};
int Lin::cmp(Lin b){
    int tmpcm;
    int tmpcmb;
    tmpcm = metr * 100 + cm;
    cout<<"tmpcm ="<<tmpcm<<endl;
    tmpcmb = b.metr * 100 + b.cm;
    cout<<"tmpcmb ="<<tmpcmb<<endl;
    if (tmpcm > tmpcmb)
      return 1;
    if (tmpcm == tmpcmb) 
      return 0; 
    if (tmpcm < tmpcmb)
      return -1;   
};
int Lin::isEq(Lin b){
  int tmpcm;
    int tmpcmb;
    tmpcm = metr * 100 + cm;
    cout<<"tmpcm ="<<tmpcm<<endl;
    tmpcmb = b.metr * 100 + b.cm;
    cout<<"tmpcmb ="<<tmpcmb<<endl;
    if (tmpcm == tmpcmb)
      return 1;
    else 
      return 0;  
};

int main(){
  Lin a,b,c;
// a.metr XXXXXX  
  a.getLin();
  a.print();
  b.getLin();
  c.getLin();
  b.print();
  int chek;
  chek = a.isLess(b);
  cout<<"chek:"<<chek<<endl;
  chek = a.isEq(c);
  cout<<"chek:"<<chek<<endl;
  chek = a.cmp(b);
  cout<<"chek:"<<chek<<endl;
//  c=a.add(b);
//  c.print();
}

REFACTOR Задача про столы .

Длина комнаты lk метров cmk сантиметров, а размер стола - tl метров tcm сантиметров.

Написать программу, которая

  1. Вычисляет поместится ли стол в комнату (YES/NO)
  2. Сколько столов поместится в комнату.

Если мы считаем деньги, то помним, что рублей может быть много, а копеек не больше 99.

Чтобы никто не мог присвоить неправильные числа, нужно "спрятать" рубли и копейки.

// Начало мантры
#include <iostream>
#include <cstdlib>
using namespace std;
// Конец мантры

class Rus{
 // Эта ЗАКРЫТАЯ область
  int R; // рубли
  int kop; // копейки


public:
// Это ОТКРЫТАЯ область

// функция получает деньги с клавиатуры
  void getMoney();
// Функция складывает деньги
  Rus add(Rus money);
// Функция считает сколько осталось после траты money
  Rus minus(Rus money);
// печать
  void print();

};

void Rus::print(){
   cout<<R<<" руб. "<<kop<<" коп."<<endl;
};

// Функция получения денег.
// сразу получим деньги с клавиатуры
// она посчитает правильно

void Rus::getMoney(){
// getMoney() "ВИДИТ" R и kop
// МОЖЕТ их изменять
       cin>>R>>kop; 
// Проверим, а если копеек больше 99?!!
     if(kop>99){
      R += kop /100;
      kop = kop % 100;
     }
       
};

// Функция вернет деньги (Rus). 
// Rus::add() - полное имя функции
// Rus money - функция получит тоже деньги
// чтобы складывать 
Rus Rus::add(Rus money){
      Rus tmp; // место для подсчета денег
      
// Считаем все в копейках:
   tmp.kop = (R *100 + kop); // наши деньги
// Добавили money 
   tmp.kop = tmp.kop + money.R * 100 + money.kop;
// Считаем рубли
   tmp.R = tmp.kop / 100;
// обычные копейки
   tmp.kop = tmp.kop % 100;  

// Возвращаем посчитанные деньги
   return tmp;
};
// Вычитание
Rus Rus::minus(Rus money){
     Rus tmp;

// Здесь нужно написать про вычитание
    return tmp;
 
};

int main(){

  Rus dengi;
  Rus dengiP;
  Rus dengiM;
  Rus new_dengi;
  int rub, kops;
//ТАК ТЕПЕРЬ НЕЛЬЗЯ!!!:
//   cin>>dengi.R; // получили рубли  
//   cin>>dengi.kop; // получили копейки


// А так можно.   
   dengi.getMoney();
   dengi.print(); // напечатали для проверки


// Дописать программу и получить dengiP и dengiM
 
}

REFACTOR Задача 1.

Допишите эту программу. Получите dengiP и dengiM. Сложите dengi и dengiP, напечатайте результат. Вычислите на сколько больше dengi чем dengiM, напечатайте результат.

Функции-датчики.

Задача

Мороженное стоит priceRub рублей и priceKop. У нас есть myRub и mykop копеек.

Написать программу, чтобы проверить хватит ли денег на мороженное.

Рубли и копейки мы спрятали, и теперь нельзя просто так проверить хватит денег или нет. Напишем специальную функцию-датчик, которая умеет сравнивать деньги. Она вернет 1, если денег хватает и 0, если не хватает.

// Начало мантры
#include <iostream>
#include <cstdlib>
using namespace std;
// Конец мантры

class Rus{
 // Эта ЗАКРЫТАЯ область
  int R; // рубли
  int kop; // копейки


public:
// Это ОТКРЫТАЯ область


// функция получает деньги с клавиатуры
  void getMoney();
// Функция складывает деньги
  Rus add(Rus money);
// Функция считает сколько осталось после траты money
  Rus minus(Rus money);

// Функция - датчик. Если денег хватит, возвращает 1,
// если денег не хватает, возвращает 0
int isEnoughMoney(Rus price);

// печать
  void print();

};

//
int Rus:: isEnoughMoney(Rus price){
// все переводим в копейки
    int pricekop = price.R*100+ price.kop;
    int mykop = R*100+kop;
    if(mykop < pricekop)
       return 0;
    else 
      return 1;
};
// печать
void Rus::print(){
   cout<<R<<" руб. "<<kop<<" коп."<<endl;
};

// Функция получения денег.
// сразу получим деньги с клавиатуры
// она посчитает правильно

void Rus::getMoney(){
// getMoney() "ВИДИТ" R и kop
// МОЖЕТ их изменять
       cin>>R>>kop; 
// Проверим, а если копеек больше 99?!!
     if(kop>99){
      R += kop /100;
      kop = kop % 100;
     }
       
};

// Функция вернет деньги (Rus). 
// Rus::add() - полное имя функции
// Rus money - функция получит тоже деньги
// чтобы складывать 
Rus Rus::add(Rus money){
      Rus tmp; // место для подсчета денег
      
// Считаем все в копейках:
   tmp.kop = (R *100 + kop); // наши деньги
// Добавили money 
   tmp.kop = tmp.kop + money.R * 100 + money.kop;
// Считаем рубли
   tmp.R = tmp.kop / 100;
// обычные копейки
   tmp.kop = tmp.kop % 100;  

// Возвращаем посчитанные деньги
   return tmp;
};
// Вычитание
Rus Rus::minus(Rus money){
     Rus tmp;

// Здесь нужно написать про вычитание
    return tmp;
 
};

int main(){

  Rus dengi;
  Rus price;
  
//ТАК ТЕПЕРЬ НЕЛЬЗЯ!!!:
//   cin>>dengi.R; // получили рубли  
//   cin>>dengi.kop; // получили копейки


// А так можно.   
   dengi.getMoney();

// И так можно.   
   price.getMoney();

// проверяем хватает ли денег
  if(dengi.isEnoughMoney(price) == 1){
     cout<<"YES"<<endl;
  }else{
      cout<<"NO"<<endl;
  }
 
}

REFACTORREFACTOR Задачи

REFACTOR Задача 2.

Запустить и проверить эту программу

REFACTOR Задача 3.

Написать программу, которая считает сколько порций мороженного можно купить. Мороженное стоит priceRub рублей и priceKop. У нас есть myRub и mykop копеек.

REFACTOR Задача 3.

Часы показывают время на 24-часовом циферблате с минутами.

Занятия начинаются в h часов и min. Студент пришел в myh часов и mymin минут.

Написать функцию-датчик, которая говорит опоздал студент на занятия или нет

// Начало мантры
#include <iostream>
#include <cstdlib>
using namespace std;
// Конец мантры

class Timec{
 // Эта ЗАКРЫТАЯ область
  int h; // часы
  int min; // минуты


public:
// Это ОТКРЫТАЯ область


// функция получает время с клавиатуры
  void getTime();

// Функция - датчик. Если студент пришел вовремя, возвращает 1,
// если опоздал, возвращает 0
int isLate(Time mytime);

// печать
  void print();

};

//
int Timec:: isLate(Time mytime){
// здесь написать код,
// чтобы узнать опоздал или нет


};

// печать
void Timec::print(){
   cout<<h<<":"<<min<<endl;
};

// Функция получения времени.
// сразу получим время с клавиатуры
// она должна посчитать правильно

void Timec::getTime(){
// Здесь написать код
// чтобы функция получила время правильно
       
};

int main(){

  Timec lesson;
  Timec mytime;
  
//ТАК ТЕПЕРЬ НЕЛЬЗЯ!!!:
//   cin>>lesson.h;  
//   cin>>lesson.min; 


// А так можно.   
   lesson.getTime();

// И так можно.   
   mytime.getTime();

// проверить опоздал ли студент.
// если опоздал, напечатать :(
// если успел - :)=
 
}
REFACTOR Задача 4.

Часы показывают время на 24-часовом циферблате с минутами.

Утро - с 6.00 до 12.00, день - с 12.01 до 17.00, вечер - с 17.01 до *22.00, ночь - с 22.01 до 6.00

Написать функции-датчики:

  1. int Timec::isMoning();// 1 - если утро, 0 - если нет
  2. int Timec::isAftrenoon();// 1 - если день, 0 - если нет
  3. int Timec::isEvning();// 1 - если вечер, 0 - если нет

  4. int Timec::isNight();// 1 - если ночь, 0 - если нет
  5. int Timec::isTimeofDay();// 1 - утро, 2 -  день, 3 -  вечер, 4 - ночь

-- TatyanaOvsyannikova2011 - 24 Sep 2015