Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / 3_кол / Лекції / лекция_C++ (10)_у.doc
Скачиваний:
11
Добавлен:
30.05.2020
Размер:
147.97 Кб
Скачать

Лекція 10. Основні оператори мови Сі++

План:

  1. Базові конструкції структурного програмування

  2. Оператор «виразу»

  3. Складені оператори

  4. Оператори вибору

  5. Оператори циклів

  6. Оператори переходу

  7. Приклади вирішення завдань з використанням основних операторів Сі++

Базові конструкції структурного програмування

У теорії програмування доведено, що програму для вирішення завдання будь-якої складності можна скласти лише з трьох структур: лінійною, такою, що розгалужується і циклічною. Ці структури називаються базовими конструкціями структурного програмування.

Лінійною називається конструкція, що є послідовним з'єднанням два або більш за операторів.

Галуження – задає виконання одне з двох операторів, залежно від виконання якого або умови.

Цикл – задає багатократне виконання оператора.

Лінійна

Галуження

Цикл

Метою використання базових конструкцій є здобуття програми простої структури. Таку програму легко читати, відлагоджувати і при необхідності вносити до неї зміни. Структурне програмування також називають програмуванням без goto, оскільки часте використання операторів переходу утрудняє розуміння логіки роботи програми. Але інколи зустрічаються ситуації, в яких вживання операторів переходу, навпаки, спрощує структуру програми.

Оператори управління роботою програми називають конструкціями програми, що управляють. До них відносять:

  • складені оператори;

  • оператори вибору;

  • оператори циклів;

  • оператори переходу.

Оператор «виразу»

Будь-який вираз, що закінчується крапкою з комою, розглядається як оператор, виконання якого полягає в обчисленні цього виразу. Частним випадком виразу є порожній оператор ;.

Приклади:

i++;

a+=2;

x=a+b;

Складені оператори

До складених операторів відносять власне складені операторів і блоки. У обох випадках це послідовність операторів, ув'язнений у фігурні дужки. Блок відрізняється від складеного оператора наявністю визначень в телі блоку. Наприклад:

{

n++; це складений оператор

summa+=n;

}

{

int n=0;

n++; це блок

summa+=n;

}

Оператори вибору

Оператори вибору - це умовний оператор і перемикач.

1. Умовний оператор має повну і скорочену форму.

If (вираз-умова ) оператор; //скорочена форма

В якості виразу-умови можуть використовувати арифметичний вираз, відношення і логічний вираз. Якщо значення виразу-умови відмінне від нуля (тобто істинно), то виконується оператор. Наприклад:

if (x<y&&x<z) min=x;

if (вираз-умова) оператор1; //повна форма

else оператор2;

Якщо значення виразу-умови відмінне від нуля, то виконується оператор1, при нульовому значенні виразу-умови виконується оператор2.Наприклад:

if (d>=0)

{

x1=(-b-sqrt(d))/(2*a);

x2=(-b+sqrt(d))/(2*a);

cout<< “\nx1=”<<x1<<“x2=”<<x2;

}

else cout<<“\nРішення немає”;

2.Перемикач визначає множинний вибір.

switch (вираз)

{

case константа1 : оператор1 ;

case константа2 : оператор2 ;

. . . . . . . . . . .

[default: оператори;]

}

При виконанні оператора switch, обчислюється вираження, записане після switch, воно має бути цілочисельним. Набутого значення послідовно порівнюється з константами, які записані слідом за case. При першому ж збігу виконуються оператори помічені даною міткою. Якщо виконані оператори не містять оператора переходу, то далі виконуються оператори всіх наступних варіантів, поки не з'явиться оператор переходу або не закінчиться перемикач. Якщо значення вираження, записаного після switch не збіглося ні з однією константою, то виконуються оператори, які слідують за міткою default. Мітка default може бути відсутньою.

Приклад:

#include <iostream.h>

void main()

{

int i;

cout<<"\nEnter the number";

cin>>i;

switch(i)

{

case 1:cout<<"\nthe number is one";

case 2:cout<<"\n2*2="<<i*i;

case 3: cout<<"\n3*3="<<i*i;break;

case 4: cout<<"\n"<<i<<" is very beautiful!";

default:cout<<"\nThe end of work";

}

}

Результати роботи програми:

  1. При введенні 1 буде виведено:

The number is one

2*2=1

3*3=1

  1. При введенні 2 буде виведено:

2*2=4

3*3=4

  1. При введенні 3 буде виведено:

3*3=9

  1. При введенні 4 буде виведено:

4 is very beautiful!

  1. При введенні всіх останніх чисел буде виведено:

The end of work

Оператори циклів

Розрізняють:

    1. ітераційні цикли;

    2. арифметичні цикли.

Група дій, що повторюються в циклі, називається його тілом. Однократне виконання циклу називається його кроком.

У ітераційних циклах відома умова виконання циклу.

  1. Цикл з передумовою:

while (вираз-умова)

оператор;

Як <вираз-умова> найчастіше використовується відношення або логічне вираження. Якщо воно достеменне, тобто не рівне 0, то тіло циклу виконується до тих пір, поки вираз-умова не стане помилковою.

Приклад

while (а!=0)

{

cin>>a;

s+=a;

}

  1. Цикл з після умовою:

do

оператор

while (вираз-умова);

Тіло циклу виконується до тих пір, поки вираз-умова достеменна.

Приклад:

do

{

cin>>a;

s+=a;

}

while(а!=0);

  1. Цикл з параметром:

for (вираз _1; вираз-умова; вираз _3)

оператор;

вираз_1 і вираз_3 можуть складатися з декількох виразів, розділених комами. Вираз_1 - задає початкові умови для циклу (ініціалізація). Вираз-умова> визначає умову виконання циклу, якщо воно не дорівнює 0, цикл виконується, а потім обчислюється значення выразу_3. Вираз_3 - задає зміну параметра циклу або інших змінних (корекція). Цикл продовжується до тих пір, поки вираз-умова не дорівнюватиме 0. Будь-який вираз може бути відсутнім, але що розділяють їх « ; » мають бути обов'язково.

Приклади використання циклу з параметром.

  1. Зменшення параметра:

for ( n=10; n>0; n--)

{ оператор};

  1. Зміна кроку коректування:

for ( n=2; n>60; n+=13)

{ оператор };

  1. Можливість перевіряти умову відмінне від умови, яка накладається на число ітерацій:

for ( num=1;num*num*num<216; num++)

{ оператор };

  1. Корекція може здійснюватися не лише за допомогою складання або віднімання:

for ( d=100.0; d<150.0;d*=1.1)

{ <тіло циклу>};

for (x=1;y<=75;y=5*(x++)+10)

{ оператор };

  1. Можна використовувати декілька виразів, що ініціалізували або коректували:

for (x=1, y=0; x<10;x++;y+=x);

Оператори переходу

Оператори переходу виконують безумовну передачу управління.

  1. break - оператор переривання циклу.

{

< оператори>

if (<вираз_условие>) break;

<оператори>

}

Т. е. оператора break доцільно використовувати, коли умову продовження ітерацій треба перевіряти в середині циклу.

Приклад:

// шукає суму чисел що вводяться з клавіатури до тих пір, поки не буде введено 100 чисел або 0

for(s=0, i=1; i<100;i++)

{

cin>>x;

if( x==0) break; // якщо ввели 0, то підсумовування закінчується

s+=x;

}

  1. continue - перехід до наступної ітерації циклу. Він використовується, коли тіло циклу містить галуження.

Приклад:

//шукає кількість і суму позитивних чисел

for( k=0,s=0,x=1;x!=0;)

{

cin>>x;

if (x<=0) continue;

k++;s+=x;

}

  1. Оператор goto

Оператор goto має формат: goto мітка;

У телі тієї ж функції має бути присутньою конструкція: метка:оператор;

Мітка – це звичайний ідентифікатор, зоною видимості якого є функція. Оператор goto передає управління операторові, що стоїть після мітки. Використання оператора goto виправдане, якщо необхідно виконати перехід з декількох вкладених циклів або перемикачів вниз по тексту програми або перейти в одне місце функції після виконання різних дій.

Вживання goto порушує принципи структурне і модульне програмування, по яких всі блоки, з яких складається програма, повинні мати лише один вхід і лише один вихід.

Не можна передавати управління всередину операторів if, switch і циклів. Не можна переходити всередину блоків, що містять ініціалізацію, на операторів, які стоять після ініціалізації. Приклад:

int до;

goto m;

. . .

{

int a=3,b=4;

k=a+b;

m: int c=k+1;

. . .

}

В даному прикладі при переході на мітку m не виконуватиметься ініціалізація змінних а, b і до.

  1. Оператор return – оператор повернення з функції. Він завжди завершує виконання функції і передає управління в точку її виклику. Вигляд оператора:

return [вираження];

Приклади вирішення завдань з використанням основних операторів Си++

«Початкуючі програмісти, особливо студенти, часто пишуть програми так: отримавши завдання, тут же сідають за комп'ютер і починають кодувати ті фрагменти алгоритму, які їм удається придумати відразу. Змінним дають перші імена типа х, що попалися, і в. Коли комп'ютер зависає, робиться перерва, після якої все написане стирається, і все повторюється заново. Періодично висловлюються сумніву в правильності роботи компілятора, комп'ютера і операційної системи. Коли програма доходить до стадії виконання, в неї вводяться довільні значення, після чого екран стає об'єктом пильного здивованого вивчення. «Працює» така програма зазвичай лише в дбайливих руках господаря на одному наборі даних, а внесення до неї змін може привести автора до втрати віри в себе і ненависті до процесу програмування.

Ваше завдання полягає в тому, аби навчитися личити до програмування професійно. Врешті-решт, професіонал відрізняється тим, що може досить точний оцінити, скільки часу у нього займе написання програми, яка працюватиме в повній відповідності з поставленим завданням. Окрім «розуму, смаку і терпіння», для цього потрібний досвід, а також знання основних принципів, вироблених програмістами протягом більш, ніж півстоліття розвитку цієї дисципліни. Навіть до написання найпростіших програм потрібно личити послідовно, дотримуючи певну дисципліну.» (Павлівська Т. А., стр.109)

Вирішення завдань по програмуванню передбачає ряд етапів:

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

  2. Розробка алгоритму. Визначаються дії, виконуючи які можна буде від вихідних даних придти до необхідного результату.

  3. Запис програми на деякій мові програмування. На цьому етапі кожному кроку алгоритму ставиться у відповідність конструкція вибраної алгоритмічної мови.

  4. Виконання програми (вихідний модуль ->компилятор ->объектный модуль -> компонувальник -> виконуваний модуль)

  5. Тестування і відладка програми. При виконанні програми можуть виникнути помилки 3 типів:

    1. синтаксичні – виправляються на етапі компіляції;

    2. помилки виконання програми (ділення на 0, логарифм від негативного числа і т. п.) – виправляються при виконанні програми;

    3. семантичні (логічні) помилки – з'являються із-за завдання, що неправильно зрозуміло, неправильно складеного алгоритму.

Аби усунути ці помилки програма має бути виконана на деякому наборі тестів. Мета процесу тестування – визначення наявності помилки, знаходження місця помилки, її причини і відповідні зміни програми – виправлення. Тест – це набір вихідних даних, для яких заздалегідь відомий результат. Тест виявив помилку вважається успішним. Відладка програми закінчується, коли достатня кількість тестів виконалася неуспіх, тобто програма на них видала правильні результати.

Для визначення достатньої кількості тестів існує два підходи. При першому підході програма розглядається як «чорний ящик», в який передають вихідні дані і отримують результати. Пристрій самого ящика невідомий. При цьому підході, аби здійснити повне тестування, треба перевірити програму на всіх вхідних даних, що практично неможливе. Тому вводять спеціальні критерії, які повинні показати, яка кінцева безліч тестів є достатньою для програми. При першому підході найчастіше використовуються наступні критерії:

  1. тестування класів вхідних даних, тобто набір тестів повинен містити по одному представникові кожного класу даних:

    X

    0

    1

    0

    1

    -1

    1

    -1

    Y

    0

    1

    1

    0

    1

    -1

    -1

  2. тестування класів вихідних даних, набір тестів повинен містити дані достатні для здобуття по одному представникові з кожного класу вихідних даних.

При другому підході програма розглядається як «білий ящик», для якого повністю відомий пристрій. Повне тестування при цьому підході закінчується після перевірки всіх доріг, ведучих від початку програми до її кінця. Проте і при такому підході повне тестування програми неможливе, оскільки доріг в програмі з циклами безконечна безліч. При такому підході використовуються наступні критерії:

  1. Тестування команд. Набор тестів повинен забезпечувати проходження кожної команди не менше одного разу.

  2. Тестування гілок. Набор тестів в сукупності повинен забезпечувати проходження кожної гілки не менше одного разу. Це найпоширеніший критерій в практиці програмування.

Програмування галужень

Завдання №1. Визначити, чи попаде крапка з координатами (х, в ) в заштриховану область.

-1

Вихідні дані: х,у

Результат: так чи ні

Математична модель:

Ok=I || II || III || VI, де I, II, III, IV – умови попадання крапки в заштриховану область для кожного квадранта.

Квадрант I: Область формується прямими 0Х і 0У, прямою, що проходить через крапки (0,1) і(1,0) і прямою, що проходить через крапки (0,3) і (2,0).

Необхідно визначити рівняння прямих у=ax+b. Вирішуємо дві системи рівнянь:

  1. 1=a*0+b;

0=a*1+b;

  1. 2=a*0+b;

0=a*3+b;

З цих систем отримуємо наступні рівняння прямих:

y=-1x+1;

y=-2/3x+1;

Тоді умова попадання крапки в I квадрант виглядатиме таким чином:

y>=-x+1&&y<=-2/3x+2&&y>=0&&x>=0.

Квадранти II і III: Область формується прямими 0Х і 0У і двома колами, описуваними формулами x2+y2=1, x2+y2=9.

Тоді умова попадання крапки в II і III квадранти виглядатиме таким чином:

x2+y2>=1&& x2+y2<=9&&&&x<=0.

Квадрант IV:

Область формується двома прямокутниками. Крапка може потрапляти або в перший прямокутник, або в другий.

Умова попадання крапки в IV квадрант виглядатиме таким чином:

(x>=0&&x<=1&&y<=-1&&y>=-3)|| (x>=1&&x<=3&&y<=0&&y>=-3) .

Програма:

#include <iostream.h>

#include <math.h>

void main()

{

float x,y;

cout<<"\nEnter x,y";

cin>>x>>y;

bool Ok=(y>=-x+1&&y<=2/3*x+2&&x>=0&&y>=0)||

(pow(x,2)+pow(у,2)>=1&&pow(x,2)+pow(у,2)<=9&&x<=0)||

(x>=0&&x<=1&&y<=-1&&y>=-3)||(x>=1&&x<=2&&y<=0&&y>=-3);

cout<<"\n"<<Ok;

}

Тести:

Квадрант

Вихідні дані (X,Y)

Результат (Ok)

I

0.2,0.2

0

I

0.7,0.5

1

II

-0.5, 0.5

0

II

-2,0

1

III

-0.5,-0,5

0

III

-2,-1

1

IV

0,5,-0.5

0

IV

1.5, -1

1

Центр системи координат

0,0

0

Програмування арифметичних циклів.

Для арифметичного циклу заздалегідь відомо скільки разів виконується тіло циклу.

Завдання №2

Дана послідовність цілих чисел з n елементів. Знайти середнє арифметичне цій послідовності.

#include <iostream.h>

#include <math.h>

void main()

{

int а,n,i,k=0;

double s=0;

cout<<"\nEnter n";

cin>>n;

for(i=1;i<=n;i++)

{

cout<<"\nEnter а";

cin>>a;

s+=a;k++;

}

s=s/k;

cout<<"\nSr. arifm="<<s<<"\n";

}

Тести

N

5

A

1,2,3,4,5,3

S

3

Завдання №3

S=1+2+3+4+. . . +N

#include <iostream.h>

#include <math.h>

void main()

{

int n,i,s=0;

cout<<"\nEnter n";

cin>>n;

if(n<=0) {cout<<”\nN<=0”;return;}

for(i=1;i<=n;i++) s+=i;

cout<<"\nS="<<s<<"\n";

}

Тести

n

S

n=-1

N<=0

n=0

N<=0

n=5

S=15

Завдання №4

S=15-17+19-21+ . . ., всього n доданків.

#include <iostream.h>

#include <math.h>

void main()

{

int n,i,s=0,a=15;

cout<<"\nEnter n";

cin>>n;

if(n<=0) {cout<<”\nN<=0”;return;}

for(i=1;i<=n;i++)

{

if(i%2==1) s+=a;

else s-=a;

a+=2;

}

cout<<"\nS="<<s<<"\n";

}

Тести

n

S

n=-1

N<=0

n=0

N<=0

n=3

S=17

Ітераційні цикли

Для ітераційного циклу відома умова виконання циклу.

Завдання №5

Дана послідовність цілих чисел, за якою слідує 0. Знайти мінімальний елемент цієї послідовності.

#include <iostream.h>

#include <math.h>

void main()

{

int а,min;

cout<<"\nEnter а";

cin>>a;

min=a;

while(а!=0) //for(;а!=0;)

{

cout<<"\nEnter а";

cin>>a;

if (а!=0&&a<min) min=a;

}

cout<<"\nmin="<<min<<"\n";

}

Тести:

а

2

55

-3

-10

0

min

-10

а

12

55

4

27

0

min

4

а

-6

-43

-15

-10

0

min

-10

Завдання №6: Знайти суму чисел Фібоначчі, менших заданого числа Q.

#include<iostream.h>

void main()

{

int a=1,b=1,s=2,Q,c;

cout<<"\nEnter Q";

cin>>Q;

if(Q<=0) cout<<"Error in Q";

else

if(Q==1) cout<<"\nS=1";

else

{

c=a+b;

while(c<Q) //for(;з!=0;)

{

s+=c;

a=b;

b=c;

c=a+b;

}

cout<<"\nS="<<s<<"\n";

}

}

Тести:

Q

S

-1

Error in Q

0

Error in Q

1

1

2

2

10

20

Тести:

Q

-1

Error in Q

0

Error in Q

1

2

2

2 3

10

2 3 5 7 11

Вкладені цикли

Завдання №7: Надрукувати N простих чисел.

#include<iostream.h>

void main()

{

int a=1,n,d;

cout<<"\nEnter N";

cin>>n;

for(int i=0;i<n;) // зовнішній цикл

{

a++;d=1;

do // внутрішній цикл

{

d++;

}

while(a%d!=0);//конец внутрішнього циклу

if(a==d){

cout<<a<<" ";

i++;}

}//кінець зовнішнього циклу

}

Література:

Основна

  1. П. Франка. C++. Учебный курс. 2003 год., 528 стр.

  2. С. В. Глушаков, А. В. Коваль, С. В. Смирнов. Язык программирования C++. Учебный курс. 2002 год., 505 стр.

  3. Х. Дейтл, П. Дейтл. Как программировать С++. 2001 год., 1006 стр.

  4. С.Х. Дьюхэрст. Скользкие места С++. Как избежать проблем при проектировании и компиляции ваших программ. 2006 год., 265 стр.

  5. М. Динман. С++. Освой на примерах. 2006 год. 384стр.

  6. Лаптев и др. С++. Объектно-ориентированное программирование. Задачи и упражнения. 2007 год. 288 стр.

  7. Дж. Либерти. Освой самостоятельно C++. 3-изд. 2009 год. 820 стр.

  8. Стенли Б. Липпман, Жози Лажойе. С++ для начинающих. 2001 год.

Допоміжна

  1. Керниган Б.В., Ричи Д.М. Язык программирования Си. 3-е изд. иправл. 2003 год.

  2. Герб Каммер. Новые сложные задачи на С++. 2005 год.

  3. К. Поляков. Прграммирование на языке СИ. 2002 год.

  4. Страуструп. Дизайн и эволюция С++. Книга написана создателем языка С++. 2006 год.

14

Соседние файлы в папке Лекції