Помогни ни да направим Uroci.net по - богат! Добави урок

Операторите за управление 1 част

C++ » C++
taffch0   трудност:    видян: 13266

В тази и следващата лекции ще разгледаме логическите оператори ако (if), ако-иначе(if-else),ключ (switch) и условния оператор " ?: , ", както и една специфична конструкция на if-else оператора.

1. Оператор if . Той има вида if ( <condition> )  <statement>;, където <statement> се изпълнява, ако условието <condition>  е истина. В противен случай управлението на програмата преминава на реда следващ <statement>;. Например, следният израз проверява дали числото num е четно.

  1. if (num % 2 == 0)
  2.   cout << "The number " << num << " is even." << endl;

Обърнете внимание, че логическото условие е заградено с малки скоби, (num % 2 = 0), и след тях няма точка и запетая! Една от най-неприятните и труднооткриваеми грешки е да сложите точка и запетая след условието, както е направено в кода по-долу. Обърнете внимание, че този код е безсмислен и зебележете, колко трудно се забелязва символа ; след if (num % 2 == 0).

  1. int num = 3;         // !!! ERROR HERE !!!
  2. if (num % 2 == 0);
  3.   cout << "The number " << num << " is even." << endl;

В резултат на тази грешка изходът на екрана е неправилен и е следният:

The number 3 is even.

На следващия ред в правилния пример най-горе се изпълнява само едно твърдение, затова то завършва с точка и запетая. Ако искаме да изпълним няколко твърдения, то ги заграждаме с големи скоби, както това е направено в този пример:

  1. if (choice == `l`)
  2. {
  3.   cout << "The plane is landing. ";
  4.   plane1.land;
  5. }

След голямата скоба накрая на този код няма няма точка и запетая! Причината за това е, че самата скоба служи като разделител.

Операторът if  много прилича на оператора while, но за разлика от него тялото му се изпълнява само веднъж, докато при вторият това изпълнение се повтаря, докато условието стане неистина.

2. Оператор if-else . Той има вида if ( <condition> )  <statement 1>; else  <statement 2>;. Ако условието <condition> е истина се изпълнява <statement 1>, иначе - се изпълнява <statement 2>.  Обърнете внимание, че отново условието е заградено в малки скоби и след тях, както и след else няма точка и запетая. Например, следната конструкция проверява дали числото num е четно или нечетно:

  1. if (num % 2 == 0)
  2.   cout << "The number " << num << " is even.";   // числото е четно
  3. else
  4.   cout << "The number " << num << " is odd.";    // числото е нечетно

В този пример и двете твърдения не бяха заградени с големи скоби, защото са по едно след съответните ключови думиif и else, но в общия случай е необходимо използването на големи скоби, след които не се поставя точка и запетая. Например следните редове коригират датата, в зависимост от месеца и година:

  1. // if it`s Feb 28 and it`s a leap year
  2. if( day == 28 &&
  3.     month == 2 &&
  4.     year%4 == 0 &&
  5.     year % 100 != 0)
  6. {
  7.   day = 29;             // then the next day is the 29th
  8. }
  9. else                    // otherwise,
  10. {
  11.   day = 1;              // next day is March 1st
  12.   month = 3;
  13. }

Не е необходимо твърдението day = 29; да бъде заградено с големи скоби, но лично аз винаги ги слагам, защото с тях кодът е по-прегледен.

Обърнете внимание, че условието след if бе съставено от няколко оператора за сравняване, свързани с логическия оператор и, &&. В това условие може да се сложи какъвто и да е логически израз, съставен от произволно число оператори за сравняване и логически оператори.

3. Включени един в друг оператори if-else (Nested if-else Statements) . Често е необходимо да се вземе поредица от решения, които се записват с поредица от if-else оператори. Най-общият вид на тази конструкция е

  1. if ( <condition 1> )
  2.   <statement1>;
  3. else
  4.   if ( <condition 2> )
  5.     <statement 2>;
  6.   else
  7.     <statement 3>;

Ако първото условие е вярно, то ще се изпълни първото твърдение, иначе програмата ще стигне до проверка на второто условие. Ако то е вярно, ще се изпълни второто твърдение, иначе програмата ще изпълни третото твърдение. Логиката на тези включени един в друг if-else оператори е, че else "принадлежи" към последния if, ако няма големи скоби, които да променят логиката на изпълнение на решенията. Обикновено и отмесването (indentation) на втория (после на третия и т.н.) if-else оператор показва логиката на управлението в програмата, което улеснява разчитането и. Но програмистът не бива да се подвежда по това отмесване, което няма никаква връзка с управлението на програмата, а е направено субективно от друг програмист. Ето един много конфузен пример:

  1. if (age > 2)                  // if greater than 2
  2.   if (age < 18)               // and less than 18
  3.      cout << " Child";       // it`s a child
  4. else
  5.   cout << " Infant";         // ERROR: inappropriate response

По отмесването на else оператора, човек може да се обърка, че ако възрастта не е по-голяма от две, програмата ще отпечата на екрана Infant, но истината е че при (age <= 2) нищо няма да се отпечата на екрана и програмата ще премине на реда след последния ред от този код. Защото else операторът "принадлежи" към последния if оператор. Докато при (age >= 18) програма ще изпише на екрана Infant. Правилно е следното отмесване при записа на тези програмни редове, които са и променени леко - cout << " Adult"; вместо cout << " Infant"; :

  1. if (age > 2)                  // if greater than 2
  2.   if (age < 18)               // and less than 18
  3.      cout << " Child";       // it`s a child
  4.   else
  5.     cout << " Adult";        // it`s an adult

Обърнете внимание на промяната на " Infant" в " Adult", която отразява факта, че ако възрастта е по-голяма от 2 се проверява дали тя е по-малка от 18, и ако не е по-малка от 18 се изписва "възрастен" на екрана.

Както споменахме, скобите могат да променят логиката на взимането на решения. Ето как горния конфузен пример може да се коригира:

  1. if (age > 2)                  // if greater than 2
  2. {                             // а brace is added
  3.   if (age < 18)               // and less than 18
  4.      cout << " Child";       // it`s a child
  5. }                             // а brace is added
  6. else
  7.   cout << " Infant";         // it is OK now!

3. Един пример с оператори за управление. В част 4 на тази поредица бе дадена една елементарна програма с обекти, което управлява продажбата на хот-доци, взаимствана от курса по C++ на Лафоор [1]. Ето едно нейно подобрение, което се постига с използване на гореспоменатите оператори.

  1. // hotdog2.cpp
  2. // hot dog stand inventory database
  3. // uses while loop and if statement
  4. #include <iostream.h>            // for cout, cin, etc.
  5. #include <conio.h>               //for getche()
  6. class HotDogStand                // class specification
  7. {
  8.   private:
  9.     int HotDogsOnHand;           // hot dogs on hand
  10.     int BunsOnHand;              // buns on hand
  11.   public:
  12.     void displayData()           // display hot dogs and buns
  13.     {
  14.       cout << "    Hot dogs = " << HotDogsOnHand;
  15.       cout << "    Buns = " << BunsOnHand;
  16.     }
  17.     void SoldOneDog()            // record sale of one dog
  18.     {
  19.       --HotDogsOnHand;
  20.       --BunsOnHand;
  21.     }
  22.     void initData()              // set initial quantities
  23.     {
  24.       cout << "    Enter hot dogs on hand: ";
  25.       cin >> HotDogsOnHand;
  26.       cout << "   Enter buns on hand: ";
  27.       cin >> BunsOnHand;
  28.     }
  29. }// end of HotDogStand class
  30. /////////////////////////////////////////////////////////////
  31. void main()
  32. {
  33.     char choice = `x`;           // user`s letter choice
  34.     HotDogStand stand1;          // create hot dog stand object
  35.                                  // set initial data
  36.     cout << " Initialize data";
  37.     stand1.initData();
  38.     while(choice != `q`)         // loop until `q` typed
  39.     {
  40.       cout << " Enter s to record sale, q to quit: ";
  41.       cin >> choice;
  42.       if(choice == `s`)         // if user entered `s`
  43.       {                      // then sell a dog
  44.         cout << "Selling a dog";
  45.         stand1.SoldOneDog();
  46.       }
  47.     }  // end while
  48.     // display current data
  49.     cout << " Supplies on hand";
  50.     stand1.displayData();
  51.    // stop the flow on the monitor
  52.    getch();
  53. }  //end main

Ако сравните предишната версия с тази новата, ще забележите че спецификацията на класа HotDogStand е същата, а само е променена главната функция на програмата. Това е една от характеристиките на обектно-ориентираното програмиране -- написаните спецификации на класовете могат да се използват отново в други програми, които са подобрени версии на предишни. Тази ценна възможност на английски се нарича reusability - повторна използваемост.



Коментари (1)

taffch0 на 01.03 2011 в 13:45ч.
Преписването е забранено.

Регистрирайте се, за да добавите коментар


Калдейта ЕООД - © 2003-2010. Всички права запазени.
Препоръчваме: Национален Бизнес | Bomba.bg | IT Новини | Диплома.бг | TRAVEL туризъм | Реферати | AmAm.bg | Иде.ли | Курсови работи | Фото Форум | Spodeli.net | Фото-Култ | Atol.bg | Elmaz.com | MobileBulgaria.com | Казанлък.Com