6. Условни оператори  II

 
Алтернатива съм за  министър.
в. Стандарт, 11.08.2002 :--)
 
Оператор switch.
    Операторът замества редица от оператори if/else. Например:
int digit;
...
     if (digit == 1) digit_name = "one";
else if (digit == 2) digit_name = "two";
...
else if (digit == 9) digit_name = "nine";
else                 digit_name = "";
може да се запише алтернативно по следния начин:
int digit;
...
switch (digit)
{ case 1: digit_name = "one"; break;
  case 2: digit_name = "two"; break;
  ...
  case 9: digit_name = "nine"; break;
  default: digit_name = "";
}
В този случай не трябва да се изпуска оператора break. Ако той липсва и стойността на променливата  от switch стане равна на стойността в някой case , тогава се изпълняват операторите на този case и всички  case след него.


Вложени условни оператори.
** Задача за определяне на годишен данък в САЩ.
Ако сте несемеен
Ако облагаемата сума е над но не повече от данъкът е върху сумата над
0 21400 15% 0
21450 51900 3217.50 + 28% 21450
51900 - 11743.50 + 31% 51900
 
Ако сте семеен
Ако облагаемата сума е над но не повече от данъкът е върху сумата над
0 35800 15% 0
35800 51900 5370.00 + 28% 35800
86500 - 19566.00 + 31% 86500

// tax.cpp
#include <iostream>
#include <string>
using namespace std;

int main()
{  double income;
   double tax;
   cout << "Please enter your income: ";
   cin >> income;
   cout << "Please enter s for single, m for married: ";
   string marital_status;
   cin >> marital_status;

   if (marital_status == "s")
   {  if (income <= 21450)
            tax = 0.15 * income;
      else if (income <= 51900)
            tax =  3217.5 + 0.28 * (income - 21450);
      else  tax = 11743.5 + 0.31 * (income - 51900);
   }
   else
   {  if (income <= 35800)
            tax = 0.15 * income;
      else if (income <= 86500)
            tax =  5370 + 0.28 * (income - 35800);
      else  tax = 19566 + 0.31 * (income - 86500);
   }
   cout << "The tax is $" << tax << "\n";
   return 0;
}
 
 

Please enter your income: 30000
Please enter s for single, m for married: m
The tax is $4500

Операторът  if (income <= 21450) е вложен в оператора
if (marital_status == "s").

** Програма за пресмятане на годишен данък общ доход у нас.

Таблица за годишно облагане на доходите по чл.35 от Закона за облагане доходите на физическите лица за 2002 г.

Ако облагаемата сума е над но не повече от данъкът е върху сумата над
 0 1320  0  -
1320 1680  18%  1320
1680 4800  64.80 + 24%  1680
4800 12000 813.60 + 28% 4800
12000 - 2829.60 + 29% 12000
// tax_bul.cpp
#include <iostream>
using namespace std;

int main()
{  double income;
   double tax;
   cout << "Please enter your income: ";
   cin >> income;
   do
   {     if (income <= 1320)
                    tax = 0;
    else if (income <= 1680)
                    tax =          0.18*(income- 1320);
    else if (income <= 4800)
                    tax =  64.80 + 0.24*(income- 1680);
    else if (income <=12000)
                    tax = 813.60 + 0.28*(income- 4800);
    else            tax =2829.60 + 0.29*(income-12000);
    cout << "The tax is " << tax << "\n";
    cout << "Please enter your income: ";
    cin >> income;
   }
   while (income > 0);
   return 0;
}

Please enter your income: 10000
The tax is 2269.6
Please enter your income: 3652.50
The tax is 538.2
Please enter your income: 0

В тази програма е използван оператор за цикъл do/while (който ще се изучава по-нататък), за да може с едно пускане на програмата да се пресмята данъка многократно, за различни доходи. Програмата прекратява работата си, когато въведем доход 0.



Логически операции.
** Логически константи - възможни са само две стойности:
истина да true 1 изпълнено вярно удовлетворено
лъжа не false 0 нарушено невярно неудовлетворено

** Основни логически операции:

и конюнкция and && бинарна операция
или дизюнкция or || бинарна операция
не отрицание not ! унарна операция

** Таблици за стойността на логическите операции:

 A  B  A and B
 false  false  false
 false  true  false
 true  false  false
 true  true  true
 
 A  B  A or B
 false  false  false
 false  true  true
 true  false  true
 true  true  true
 
 A  not A
 false  true
 true  false
 
** Проверка за краен срок на определена задача.
// hwdue1.cpp
#include <iostream>
using namespace std;
#include "ccc_time.cpp"

int main()
{  cout << "Enter the time that the homework is due";
   cout << " (hours minutes): ";
   int hours;
   int minutes;
   cin >> hours >> minutes;
   Time homework_due(hours, minutes, 0);
   Time now;
   if (now.get_hours() < homework_due.get_hours() or
      (now.get_hours() == homework_due.get_hours()
   and now.get_minutes() <= homework_due.get_minutes()))
      cout << "Still time to finish the homework.\n";
   else
      cout << "The homework is already past due.\n";
   return 0;
}

Enter the time that the homework is due (hours minutes): 10 20
Still time to finish the homework.

** Отложени пресмятания
 - За логическата операция and: ако първият аргумент е false и стойността на операцията е false, независимо от стойността на втория аргумент.
 - За логическата операция or:  ако първият аргумент е true и стойността на операцията е true, независимо от стойността на втория аргумент.
    Пример.
double area;
cin >> area;
if (cin.fail() or area < 0) cout << "Input error";
    При проверката на въведено число и грешка във входния поток не се проверява условието area < 0.



Закони на де Морган  [Аугуст де Морган (1806-1871)].
-- отрицание на конюнкция:
not (A and B) дава същия резултат както
(not A) or (not B)
-- отрицание на дизюнкция:
not (A or B)  дава същия резултат както
(not A) and (not B)
    Да изразим условието, че даден адрес е  извън континенталната част на САЩ, т.е. друга държава или щатите Аляска и Хавай.
not (country == "USA" and state != "AK" and state != "HI")
    Преобразуваме част от израза:
state != "AK" and state != "HI"
като
not (state == "AK") and not (state == "HI")
и като (Де Морган):
not (state == "AK" or state == "HI")
    Преобразуваме целия израз като:
not (country == "USA" and not (state == "AK" or state == "HI"))
и като (Де Морган):
not (country == "USA") or (state == "AK" or state == "HI")
и окончателно:
country != "USA" or state == "AK" or state == "HI"


Булеви променливи.
    За да се определи дали една пратка ще бъде изпратена със самолет или с камион, може да се използва следната конструкция:
bool ship_by_air = false;
if (country != "USA") ship_by_air = true;
else if (state=="AK" or state=="HI") ship_by_air = true;
if (ship_by_air) shipping_charge = 20;
else shipping_charge = 10;
    Тип данни bool - булев или логически тип, съдържа две константи - true и false. Стойност на булева променлива е едната от тези две стойности.