Печатать книгуПечатать книгу

§ 4. Аператар галінавання

Сайт: Профильное обучение
Курс: Інфарматыка. 10 клас (Павышаны ўзровень)
Книга: § 4. Аператар галінавання
Напечатано:: Гость
Дата: Четверг, 2 Май 2024, 17:51

4.1. Запіс аператара галінавання

 

Для запісу аператара галінавання выкарыстоўваецца каманда if. Фармат каманды:

  if ( <умова> ) {
   каманды 1
 }
 else {
   каманды 2
 }

Аператар галінавання можа быць у поўнай або скарочанай формах. У скарочанай форме адсутнічае блок   else:

 if ( <умова> ) {
  каманды 1
}

Умова ў запісе аператара галінавання можа быць простай і састаўной. Фігурныя дужкі могуць быць прапушчаны, калі ўнутры іх знаходзіцца адна каманда.

Выкарыстанне кіруючых канструкцый у праграме прадугледжвае яе запіс у структураваным выглядзе. Структураванасць праграм дасягаецца за кошт водступаў, якія рэгулююць змяшчэнне ўкладзеных алгарытмічных канструкцый.

Прыклад 4.1. Зададзены лік x. Вызначыць, з’яўляецца ён дадатным ці не. Вывесці адпаведнае паведамленне.

Этапы выканання задання

I. Зыходныя даныя: x (уведзены лік).

II. Вынік: адпаведнае паведамленне.

III. Алгарытм рашэння задачы.

1. Увод зыходных даных.
2. Праверка значэння выразу (x > 0).
3. Вывад выніку.

IV. Апісанне пераменных: x – int.

Можна выконваць наступнае правіла: пры руху курсора ўніз ад «пачатку» структуры да яе «канца» на шляху курсора могуць сустрэцца толькі прабелы. Усё, што знаходзіцца «ўнутры» структуры, змяшчаецца правей.

На практыцы часцей за ўсё карыстаюцца адным з двух правіл расстаноўкі фігурных дужак у кіруючых канструкцыях:

if (умова){

  каманды 1

}

else {

  каманды 2

}

if (умова)

{

  каманды 1

}

else 

{

  каманды 2

}

Прыклад 4.1.

V. Праграмма:

#include <iostream>

 

using namespace std;

 

int main()

{

  int x;

  cout << "vvedite x=";

  cin >> x;

  if (> 0)

    cout << "pologitelnoe" << endl;

  else

    cout << "ne pologitelnoe" << endl;

  return 0;

}

VI. Тэсціраванне. Для x = 5:

Для  x = –1:

VII. Аналіз вынікаў. Для поўнай праверкі праграмы патрабуецца яшчэ праверыць значэнне  x = 0.

4.2. Рашэнне задач з выкарыстаннем аператара галінаваннянием оператора ветвления

 

Прыклад 4.2. Таня і Каця жывуць у розных дамах. Ім стала цікава, хто з іх жыве бліжэй да школы. Яны змясцілі на карце прамавугольную сістэму каардынат так, каб школа мела каардынаты (0, 0). Вядома, што Танін дом мае каардынаты (x1; y1), а Кацін — (x2; y2). Дзяўчынкі ходзяць у школу па прамой і праходзяць розныя адлегласці. Напісаць праграму, якая вызначыць, чый дом знаходзіцца бліжэй да школы.

Этапы выканання задання

 I. Зыходныя даныя: каардынаты дамоў дзяўчынак x1, y1, x2, y2.

II. Вынік: паведамленне пра тое, чый дом бліжэй.

III. Алгарытм рашэння задачы.

1. Увод каардынат дамоў.
2. Вылічэнне адлегласцей r_T  — ад Танінага дома і r_K  —  ад Кацінага дома да школы. Для вылічэння адлегласці выкарыстаем тэарэму Піфагора:

r subscript T space equals square root of x subscript 1 superscript 2 space plus space y subscript 1 superscript 2 end root space     и     r subscript K space equals square root of x subscript 2 superscript 2 space plus space y subscript 2 superscript 2 end root space.

3. Параўнанне адлегласцей і вывад адказу.

IV. Апісанне пераменных: x1, y1, x2, y2, r_T, r_K  —  тып double.

Прыклад 4.3. Праверыць, ці з’яўляецца ўведзены лік трохзначным, і калі так, то вывесці цотныя лічбы гэтага ліку.

Этапы выканання задання

 I. Зыходныя даныя: a (трохзначны лік).

II. Вынік: пераменныя a1, a2, a3 (лічбы ліку) або паведамленні: «не трохзначны», «няма цотных лічбаў»..

III. Алгарытм рашэння задачы.

1. Увод зыходнага ліку. 
2. Праверка ліку. Лік a з’яўляецца трохзначным, калі 99 < a < 1000. 
3. Калі лік трохзначны — вылучаем яго лічбы.

3.1. Для вылучэння першай лічбы a1 знаходзім цэлую частку ад дзялення ліку a на 100. 
3.2. Для вылучэння другой лічбы a2 ліку a знаходзім астачу ад яго дзялення на 100, а затым цэлую частку ад дзялення атрыманай астачы на 10. 
3.3. Апошняя лічба ліку a3 з’яўляецца астачай ад дзялення ліку a на 10. 
3.4. Для праверкі лічбы на цотнасць трэба праверыць, ці роўна нулю астача ад дзялення лічбы на 2. 
3.5. Калі ні адна з лічбаў ліку не з’яўляецца цотнай, то вывесці адпаведнае паведамленне.

4. Вывад выніку.

IV. Апісанне пераменных: a, a1, a2, a3 – int.

Прыклад 4.4. Вылічыць значэнне функцыі для зададзенага x.

f left parenthesis x right parenthesis space equals space open curly brackets table attributes columnalign left end attributes row cell x space long dash space 2 comma space калі space x space less than negative 2 end cell row cell x comma space калі space long dash space 2 space less or equal than space х space less or equal than 2 end cell row cell 2 square root of х space plus space 2 end root comma space калі space х space greater than 2 end cell end table close

Этапы выканання задання

I. Зыходныя даныя: пераменная х (значэнне пераменнай).

II. Вынік: пераменная f (значэнне функцыі).

III. Алгарытм рашэння задачы.

1. Увод зыходных даных. 
2. Праверка значэння x і вылічэнне значэння функцыі ў залежнасці ад значэння аргумента.

2.1. Спачатку праверым праўдзівасць умовы x < –2.  Калія яна праўдзівая, то вылічым значэнне функцыі па формуле  f = x – 2. Інакш (гэта значэнні, для якіх x ≥ –2) праверым наступную ўмову.
2.2. Правяраем умову x ≤ –2. Калі яна правільная, то значэнне функцыі вылічым па формуле f = x3, інакш (застаюцца значэнні, для якіх x > 2) значэнне функцыі вылічваецца па формуле begin mathsize 16px style f space equals space 2 square root of x space plus space 2 end root. end style

3. Вывад выніку.

IV. Апісанне пераменных: x, f — double.

Прыклад 4.5. Вызначыць, ці належыць пункт a(x, у) дадзенай вобласці.

Этапы выканання задання

I.Зыходныя даныя: пераменныя x і y (каардынаты пункта).

II. Вынік: слова «так» або «не» ў залежнасці ад прыналежнасці пункта зафарбаванай вобласці.

III. Алгарытм рашэння задачы.

1. Увод зыходных даных.
2. Вобласць абмежавана трыма прамымі:  y = x , y = –x, y = a. Пункт належыць вобласці, калі адначасова выконваюцца тры ўмовы:  y ≥ x, y ≥ –x, y ≤ a. Каб вызначыць, які са знакаў («≤», «≥») паставіць ва ўраўненне замест знака «=», дастаткова ўзяць адвольны пункт, які належыць вобласці, і паглядзець, як будуць выконвацца ўмовы для гэтага пункта. Напрыклад, пры a = 5 пункт з каардынатамі (1; 3) належыць вобласці і выконваюцца наступныя ўмовы: 3 ≥ 1, 3 ≥ –1 , 3 ≤ 5.

3. Вывад выніку.

IV. Апісанне пераменных: x, y – double.

Прыклад 4.2.

V. Праграма:

#include <iostream>

#include <cmath>

 

using namespace std;

 

int main()

{

  setlocale(0,"");

  double x1, y1, x2, y2;

  cout << "Танін дом" << endl;

  cin >> x1 >> y1;

  cout << "Кацін дом" << endl;

  cin >> x2 >> y2;

  double r_T = sqrt(x1 * x1 + y1 * y1);

  double r_K = sqrt(x2 * x2 + y2 * y2);

  if (r_T < r_K)

    cout << "Танін дом бліжэй" << endl;

  else

    cout << "Кацін дом бліжэй" << endl;

  return 0;

}

VI. Тэсціраванне.

Танін дом — x1 = 2.3, y1 =  4.5, Кацін дом — x2 = −2.1, y2 = 4.9.

Вынік:

Танін дом — x1 = −6.1, y1 = 4.5, Кацін дом — x2 = −1.71, y2 = −3.2.

Вынік:

Прыклад 4.3.

V. Праграма:

#include <iostream>

 

using namespace std;

 

int main()

{

  int a;

  cout << "vvedite a=";

  cin >> a;

  if (> 99 && a < 1000)

  {

    int a1 = a / 100;

    int a2 = a / 10 % 10;

    int a3 = a % 10;

    cout << "chetnye cifry:" << endl;

    if ( a1 % 2 == 0)

      cout << a1 << endl;

    if (a2 % 2 == 0)

      cout << a2 << endl;

    if (a3 % 2 == 0)

      cout << a3 << endl;

    if (a1 % 2 && a2 % 2 && a3 % 2 )

      cout << "net takih" << endl;

  }

  else

    cout<<"chislo ne trehznachoe"<<endl;

  return 0;

}

VI. Тэсціраванне. Вынік для значэння 345:

Іншыя варыянты зыходных даных

VII. Аналіз вынікаў. Для поўнай праверкі праграмы патрабуецца яшчэ праверыць значэнні, у якіх лічбаў менш за тры і якія змяшчаюць 1 цотную лічбу (на розных пазіцыях), дзве цотныя лічбы.

Прыклад 4.4.

V. Праграма:

#include <iostream>

#include <cmath>

 

using namespace std;

 

int main()

{

  double x,f;

  cout << "x = ";

  cin >> x;

  if (< -2)

    f = x - 2;

  else

    if (<= 2)

      f = x * x * x;

    else

      f = 2 * sqrt(+ 2);

  cout << "f = " << f << endl;

  return 0;

}

V. Тэсціраванне:

VI. Аналіз вынікаў. Лік 5 большы, чым 2, таму вылічэнне значэння функцыі адбываецца па формуле f space equals space 2 square root of x plus 2 end root space equals 2 square root of 7. Для ліку 0.3 вылічэнні адбываюцца па формуле f space equals space x to the power of 3 space end exponent equals space left parenthesis negative 0.3 right parenthesis cubed. Поўная праверка праграмы патрабуе ўвесці значэнні, якія належаць кожнаму з названых ва ўмове прамежкаў.

Прыклад 4.5.

V. Праграма:

#include <iostream>

 

using namespace std;

 

int main()

{

  setlocale(0, "");

  double a, x, y;

  cout << "a=";

  cin >> a;

  cout << "x, y" << endl;

  cin >> x >> y;

  if (>= x && y >= -&& y <= a)

    cout << "так" << endl;

  else

    cout << "не" << endl;

  return 0;

}

VI. Тэсціраванне:

VII. Аналіз вынікаў. Поўная праверка праграмы патрабуе ўвесці значэнні, якія належаць кожнай з абласцей, што ўтвараюцца пры перасячэнні прамых.

4.3. Аператар множнага выбару

 

Аператар if дазваляе выбіраць адзін з двух альтэрнатыўных варыянтаў. Калі патрабуецца выбар з трох і больш варыянтаў, то выкарыстанне некалькіх аператараў if можа пагаршаць чытальнасць кода праграмы.

У С++ яшчэ маецца аператар множнага выбару switch, які дазваляе выбраць адзін варыянт з некалькіх у залежнасці ад значэння выразу і забяспечвае множнае разгалінаванне ў праграме. Часта выкарыстанне аператара switch больш эфектыўнае, чым выкарыстанне некалькіх аператараў if. Фармат каманды:

switch ( <пераменная> ) 

{

  case канстанта: {

    каманда(ы)1

    break;

  }

  case канстанта: {

    каманда(ы)2

    break;

  }

...

  default: {

    каманда(ы)n

    break;

  }

}

Пераменная па чарзе параўноўваецца са значэннямі канстант, апісанымі пасля ключавога слова case. Пасля двукроп’я знаходзіцца код, які будзе выкананы ў выпадку, калі пераменная апынулася роўнай бягучаму значэнню. Каманда break неабходна для таго, каб перапыніць выкананне switch і не правяраць пераменную на супадзенне з астатнімі значэннямі.

У блоку default прапісваюцца каманды, якія будуць выконвацца ў тым выпадку, калі ніводнага супадзення пераменнай з пералічанымі значэннямі не было выяўлена. Гэты блок можа быць прапушчаны.

Фігурныя дужкі могуць быць прапушчаны, калі ў блоку выконваецца толькі адна каманда.

Прыклад 4.6. Дадзена значэнне n (1 ≤ n ≤ 7), якое з’яўляецца нумарам дня тыдня. Напісаць праграму, якая вызначыць па значэнні n, выхадны гэты дзень ці рабочы.

Этапы выканання задання

I.  Зыходныя даныя: n (нумар дня тыдня).

II. Вынік: паведамленні — «рабочы», «выхадны» або «памылковы нумар».

III. Алгарытм рашэння задачы.

1. Увод зыходнага ліку.
2. Выбар значэння n з 7 магчымых
:

2.1. Калі значэнні n роўны 1, 2, 3, 4, 5 — выводзіцца паведамленне «рабочы».
2.2. Калі значэнні n роўны 6, 7 — выводзіцца паведамленне «выхадны».
2.3. Для любога іншага ліку — выводзіць паведамленне «памылковы нумар»..

3. Вывад выніку.

VI. Апісанне пераменных: n – int.

Трэба памятаць пра некаторыя асаблівасці аператара switch:

  • switch адрозніваецца ад if тым, што ён можа выконваць толькі аперацыі праверкі строгай роўнасці, у той час як if можа вылічваць лагічныя выразы і адносіны;
  • у адным аператары switch не можа быць двух канстант, якія маюць аднолькавыя значэнні;
  • аператар switch, які ўключае ў сябе іншы аператар switch, можа змяшчаць аднолькавыя канстанты;
  • адно і тое ж дзеянне можа быць выканана для розных значэнняў канстант. Каманды запісваюцца пасля апошняга выбару. Для ўсіх папярэдніх спіс каманд пусты.

case канстанта1:

case канстанта2:{

  каманда(ы)1

  break;

}

З тэхнічнага пункту гледжання аператары break з’яўляюцца неабавязковымі ў аператары switch. Яны выкарыстоўваюцца для заканчэння работы паслядоўнасці каманд, якія належаць да аднаго блока, дзе адбылося супадзенне значэння пераменнай са значэннем канстанты. Калі аператар break адсутнічае, то пасля таго, як было выяўлена супадзенне, будуць выкананы ўсе астатнія каманды для кожнага выбару, апісанага пасля супадзення. Параўнанні не адбываюцца, а каманды выконваюцца паслядоўна

Прыклад 4.6.

V. Праграма:

#include <iostream>

 

using namespace std;

 

int main()

{

  setlocale(0,"");

  int n;

  cout << "Нумар дня n=";

  cin >> n;

  switch (n)

  {

    case 1:

    case 2:

    case 3:

    case 4:

    case 5:

  {

      cout << "рабочы" << endl;

      break;

  }

    case 6:

    case 7:

  {

      cout << "выхадны" << endl;

      break;

  }

    default:

    cout << "памылковы нумар" << endl;

  }

  return 0;

}

VI. Тэсціраванне:

Прыклад работы праграмы, у якой знялі аператар break:

Пытанні к параграфу

1. Што такое аператар галінавання?

2. Чым адрозніваецца поўны запіс аператара галінавання ад скарочанага?

3. Ці можна выкарыстоўваць састаўныя ўмовы ў аператары галінавання?

4. Як запісваецца аператар множнага выбару?

Практыкаванні

   

1. Ці можна змяніць лагічную ўмову ў аператары галінавання ў прыкладзе 4.1 так, каб паведамленні "pologitelnoe" і "ne pologitelnoe" прыйшлося памяняць месцамі? Калі так, то як гэта зрабіць?

2*. Якія змяненні трэба ўнесці ў праграму прыкладу 4.1, каб разглядаліся тры выпадкі: "pologitelnoe", "otricatelnoe", "ravno 0"?

3. Дабаўце ў праграму прыкладу 4.2 праверку карэктнасці зыходных даных: каардынаты дамоў павінны быць такімі, каб адлегласці да школы былі рознымі. Калі адлегласці аднолькавыя, то вывесці паведамленне 'Каардынаты ўведзены няправільна', а калі розныя, то вывесці адказ.

4. Якія змяненні спатрэбіцца ўнесці ў праграму прыкладу 4.2, калі дапусціць, што дзяўчынкі могуць праходзіць аднолькавыя адлегласці? Унясіце змяненні ў праграму і праверце правільнасць яе работы.

5. Як вядома, шмат якія задачы маюць не адзінае рашэнне. Так, Юля знайшла іншы спосаб вылічэння другой лічбы трохзначнага ліку для прыкладу 4.3. Якую з каманд выкарыстоўвала Юля? Растлумачце, што атрымаецца пры выкананні кожнай з прыведзеных каманд.

1. a2 = a %     2. 10 / 10;  a2 = a / 100 % 10;        3. a2 = a % 100 / 10;

6. Пеця вырашыў удасканаліць праграму з прыкладу 4.3 і праверку лічбаў у ліку запісаў наступным чынам:

if ( a1 % 2 == 0)

  cout << a1 << endl;

else    

  if (a2 % 2 == 0)

    cout << a2 << endl;

  else    

    if (a3 % 2 == 0)

      cout << a3 << endl;

    else    

      cout << "net takih" << endl;

Чаму Пецева адзнака была невысокай? Прывядзіце прыклады, для якіх праграма выдае няправільны адказ. Калі такое магчыма, то прывядзіце прыклады, калі праграма выдае правільны адказ.

7. Дадзены натуральны лік. Напішыце праграму, якая праверыць, ці з’яўляецца ён трохзначным і ці кратная 7 сума яго лічбаў.

8. Дадзены натуральны лік. Напішыце праграму, якая праверыць, ці з’яўляецца ён чатырохзначным і ці размешчаны яго лічбы ў парадку спадання.

9. Дадзены натуральны лік. Напішыце праграму, якая праверыць, ці з’яўляецца лік шасцізначным «шчаслівым» (г. зн. сума першых трох лічбаў ліку роўна суме апошніх трох).

10. Запішыце функцыю, значэнне якой вылічваецца з дапамогай прапанаванага фрагмента праграмы:

if (< –3) 

  y = -x;

else

  if (< 0) 

    = 0;

  else

    y = x * x;

11. Напішыце праграму для вылічэння значэння функцый.

1. f space left parenthesis x right parenthesis equals space open curly brackets table attributes columnalign left end attributes row cell x squared comma space калі space – 1 less or equal than space space х space less or equal than space 1 end cell row cell – sin space x space straight у space астатніх space выпадках end cell end table close               2. space f space left parenthesis x right parenthesis equals space open curly brackets table attributes columnalign left end attributes row cell x minus 7 comma space калі space х space less than negative 7 end cell row cell square root of 49 space minus space x squared end root comma space space калі space minus 7 space less or equal than space х space less or equal than 7 end cell row cell negative х space plus space 7 space straight у space астатніх space выпадках end cell end table close

3. f space left parenthesis x right parenthesis equals space open curly brackets table attributes columnalign left end attributes row cell square root of x squared space plus space 9 end root comma space калі space space х space less than negative 3 end cell row cell sin space x comma space space калі space minus 3 space less or equal than space х space less than 0 end cell row cell cos squared space x comma space калі space space х space greater or equal than space 0 end cell end table close                     4. f space left parenthesis x right parenthesis equals space open curly brackets table attributes columnalign left end attributes row cell open vertical bar x close vertical bar comma space калі space х space less than space 0 end cell row cell cos space x comma space калі space 0 space less or equal than space x space less than space pi end cell row cell square root of x space plus space open square brackets x close square brackets end root comma space space калі space pi space less or equal than space х space less than 100 end cell row cell bevelled fraction numerator 1 over denominator sin space x end fraction comma space калі space space х space greater or equal than space 100 end cell end table close

12. Напішыце праграму, якая праверыць, ці належыць пункт А(xу)вобласці.

1.      

2.    

3.      

4.      

5.     

6.      

13. Напішыце праграму, якая вызначыць, ці маецца сярод лікаў a, b, c хоць бы адна пара роўных паміж сабой лікаў. Вызначыце, якія лікі роўныя.

14. Напішыце праграму, якая вызначыць, ці з’яўляецца трохвугольнік са старанамі a, b, c раўнабедраным. Калі так, то праграма павінна вызначыць, якая са старон з’яўляецца асновай, а якія — бакавымі старанамі.

15. Дадзены нумар года. Напішыце праграму, якая вызначыць, ці з’яўляецца ён высакосным (год з’яўляецца высакосным, калі яго нумар дзеліцца на 4, за выключэннем тых, якія дзеляцца на 100 і не дзеляцца на 400).

16. Напішыце праграму, якая знойдзе колькасць пунктаў перасячэння прамой y = kx + b і акружнасці x2 + y2 = r2. Значэнні k, b, r уводзяцца.

17*. Дадзены рэчаісныя лікі x1, y1, x2, y2, x3, y3, якія з’яўляюцца каардынатамі вяршынь трохвугольніка. Напішыце праграму, якая вызначыць, ці ляжыць пачатак каардынат унутры гэтага трохвугольніка.

18. Уводзіцца лік ад 1 да 4, які вызначае пару года. Напішыце праграму, якая выведзе назву гэтай пары года (1 — зіма, 2 — вясна, 3 — лета, 4 — восень). Выкарыстоўваць аператар switch.

19. Дадзены натуральны лік N (N < 20), які вызначае суму грошай у рублях. Напішыце праграму, якая выведзе для гэтага ліку назву: «рубель», «рубля», «рублёў».

20*. Уводзіцца лік ад 1 да 100. Напішыце праграму, якая выведзе назву гэтага ліку (1 — адзін, 2 — два, ..., 100 — сто).