Классы в С++
"Спрятанные атрибуты"
Когда мы получаем числа, они могут быть НЕПРАВИЛЬНЫМИ для нашей задачи. Пример с линейкой#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(); }
Задача про столы .
Длина комнаты lk метров cmk сантиметров, а размер стола - tl метров tcm сантиметров.
Написать программу, которая
- Вычисляет поместится ли стол в комнату (YES/NO)
- Сколько столов поместится в комнату.
// Начало мантры #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 }
Задача 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; } }

Задачи
Задача 2.
Запустить и проверить эту программу
Задача 3.
Написать программу, которая считает сколько порций мороженного можно купить. Мороженное стоит priceRub рублей и priceKop. У нас есть myRub и mykop копеек.
Задача 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(); // проверить опоздал ли студент. // если опоздал, напечатать :( // если успел - :)= }

Часы показывают время на 24-часовом циферблате с минутами.
Утро - с 6.00 до 12.00, день - с 12.01 до 17.00, вечер - с 17.01 до *22.00, ночь - с 22.01 до 6.00
Написать функции-датчики:
-
int Timec::isMoning();// 1 - если утро, 0 - если нет
-
int Timec::isAftrenoon();// 1 - если день, 0 - если нет
-
int Timec::isEvning();// 1 - если вечер, 0 - если нет
-
int Timec::isNight();// 1 - если ночь, 0 - если нет
-
int Timec::isTimeofDay();// 1 - утро, 2 - день, 3 - вечер, 4 - ночь