Задача за програмиране 10 Програмно осигуряване на съвремените компютри (обобщение) 13 Системи за програмиране 15



страница7/12
Дата21.11.2017
Размер1.86 Mb.
#35102
ТипЗадача
1   2   3   4   5   6   7   8   9   ...   12

float x,y;

  1. Въвеждаме координатите на точката:

cin>>x>>y;

  1. Проверките за това на кой квадрант принадлежи точката ще извършим чрез няколко последователни оператора if, всеки от които проверява дали точката принадлежи на даден квадрант:

if(x>0&&y>0)cout<<”I\n”;

if(x<0&&y>0)cout<<”II\n”;

if(x<0&&y<0)cout<<”III\n”;

if(x>0&&y<0)cout<<”IV\n”;

  1. Накрая е добре да отбележим, че ако оставим програмата така, в случай че се въведе точка, принадлежаща на координатните оси, на екрана нищо няма да се изведе. Вече отбелязахме, че добрия алгоритъм винаги трябва да извежда решение или съобщение, че няма такова. Ето защо ще добавим още два условни оператора, с които ще си осигурим “реакция” на програмата при въвеждане на точка от координатните оси.

if(x==0)cout<<”OY\n”;

if(y==0)cout<<”OX\n”;

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

//kvad.cpp

#include



void main()

{

float x,y;



cin>>x>>y;

if(x>0&&y>0)cout<<”I\n”;

if(x<0&&y>0)cout<<”II\n”;

if(x<0&&y<0)cout<<”III\n”;

if(x>0&&y<0)cout<<”IV\n”;

if(x==0)cout<<”OY\n”;

if(y==0)cout<<”OX\n”;

}

Задача 3. Ограда.

Да се състави програма DOMAIN.CPP, която въвежда от клавиатурата координати на точка в равнината и отпечатва “YES”, ако тя принадлежи на защрихованата област и “NO”в противен случай.

Примерен вход

0.5 0.5



Примерен изход

NO

Примерен вход

1 1

Примерен изход

YES


Решение:

За да определим дали точката се намира в защрихованата област е необходимо да проверим дали тя е извън кръга с радиус 1 и вътре в правоъгълник със страна 2, като и двете фигури имат за център, центъра на координатната система.



  1. Необходими величини:

Двете координати на точката x и y.

float x,y;

  1. Първо въвеждаме от клавиатурата координатите на точката:

cin>>x>>y;

  1. Проверката за принадлежност на областта ще осъществим чрез конюнкция на следните две условия:

  • (x*x+y*y)>=1 –точката не принадлежи на кръга;

  • (fabs(x)<=1)&&(fabs(y)<=1) – точката принадлежи на квадрата.

Проверката ще извършим с оператор if:

if((x*x+y*y)>=1&&(fabs(x)<=1)&&(fabs(y)<=1)) cout<<”YES\n”;

else cout<<”NO\n”;

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

//domain.cpp

#include

#include

void main()

{

float x,y;

cin>>x>>y;

if((x*x+y*y)>=1&&(fabs(x)<=1)&&(fabs(y)<=1)) cout<<”YES\n”;



else cout<<”NO\n”

}


  1. Задачи за упражнение

Зад. 1. Пресметнете:

а)5+6<0?4:2;

б)(4<6)&&(5>7)?5:6;

в)15>3+6?1:0.


Зад. 2. Какъв е резултата от операциите, ако a=3, b=2, c=4:

а) b+3>=a*c-7; г) 7>=16 && 4==4;

б) a==(b=12); д) 7>=16 || 4==4;

в) !(4!=5); е) 15+c !=a*b-c.


Зад. 3. Запишете като изрази условията:

а) x[0,1];

б) x[0,1];

в) x[2,5] или x[-1,1].


Зад. 4. Какво трябва да променим в записа на условният оператор,

if (a>b ) cout<<”max”<
else cout<<”max”<така че вместо по-голямото, програмата да извежда на екрана по-малкото от две реални числа a и b.


Зад. 5. В записите на кои от условните оператори е допусната грешка. Поправете я:

а) if (y) x=y


else x=2*y ;

б) if x x=3*x ;



else cout<в) if (a%b=0) cout<

else cout<г) if (x>y) x=y;

y=y-x;

x=x-y ;


else cout<
Зад. 6. Кой от посочените варианти описва функцията:

а) if(x>2)y=x;else if(x<=3)y=2;else y=x-1;

б) if(x<2)y=x;else if(x>=3)y=2;else y=x-1;

в) if(x<=2)y=x;else if(x<=3)y=2;else y=x-1.

Запишете вярното решение по подходящ начин, като всяко else подредете под if-а, към който се отнася.
Зад. 7. На входа на една дискотека трябвало да се изгради пропусквателна система с компютър, която да определя дали клиентът може да бъде допуснат в заведението. Съставете програма VHOD.EXE, която по въведено четирицифрено число n, годината на раждане на клиента, от клавиатурата извежда съобщение “Yes”, “No” или “Yes, s pridrugitel!”, като знаете, че след 22 часа в дискотеките не се допускат деца под 16 години, а от 16 до 18 годишна възраст - само с придружител.

Зад. 8. Да се състави програма VAL.CPP, която въвежда числата A и B и извежда стойността на C, ако:



Зад. 9. В едно училище започнали да облагородяват двора и решили да поставят беседка, но се оказало, че тя може да бъде или с формата на квадрат със страна а, или кръг с радиус r. Да помогнем на ръководството на училището като съставим програма BESEDKA.CPP, която по въведени дробни положителни числа a и r, определя по-голямата по площ беседка.

Зад. 10. Да се състави програма YEAR.CPP, която след въведена година от клавиатурата, извежда съобщение дали е високосна.

Зад. 11. Да се състави програма ODD.CPP, която за две числа x и y извежда тяхното произведение, ако x е четно и тяхната разлика, ако x е нечетно.

Зад. 12. Да се състави програма TRI.CPP, която извежда на екрана “YES”, ако три реални числа въведени от клавиатурата, могат да бъдат страни на триъгълник и “NO”, в противен случай.

Зад. 13. Една година е щастлива, ако има поне две еднакви цифри в записа си. Да се състави програма HAPPYYEAR.CPP, която прочита от клавиатурата дадена година (цяло четирицифрено число) и отпечатва “YES”, ако тя е щастлива и “NO”, в противен случай.

Зад. 14. Да се състави програма COMPET.CPP, която прочита от клавиатурата целочислените резултати на трима състезатели, участвали в едно лекоатлетическо състезание и отпечатва най-високия резултат.

Зад. 15. Хвърляме зарче и ако ни кажат, че числото, което се е паднало е голямо, дели се на 2, а също и на 3, веднага ще отгатнем, че това е числото 6. Ако направим уговорката, да считаме числата 1, 2 и 3 за малки, а числата 4, 5 и 6 – за големи, всеки без затруднение би могъл да отгатне едно зарче, достатъчно е само да знае за него отговорите на следните три въпроса: “Числото голямо ли е?”, “Числото дели ли се на 2?”, “Числото дели ли се на 3?”. Разбира се, трябва да внимаваме да не би да си имаме работа с някой шегобиец, който би отговорил, че числото е голямо и се дели на 3, но не се дели на 2.

Да се напише отгатваща програма ZAR4E.CPP, която по зададени от нея въпроси и получени от страна на потребителя отговори извежда на екрана намисленото число.



Зад. 16. В една компютърна игра, наречена SeaWar, в даден момент трябва да се реши следния проблем: Зададени са два плавателни съда A(XA,YA) и B(XB,YB). Предполага се, че играчът се намира в центъра на координатната система, но бойната мощ на оръжията му е гарантирана до точно определено разстояние от целта. Налага се да се изведат на екрана координатите на този плавателен съд, който се намира в обхвата на оръжията на играча.

Съставете програма SEAWAR.CPP, която въвежда координатите на плавателните съдове и максималното разстояние, при което оръжията на играча гарантират успех, и извежда на екрана координатите на този от корабите, който може да бъде поразен от тази позиция. Ако някой от корабите не може да бъде поразен, да се отпечата разстоянието, което не достига за това.



Забележка: Могат да бъдат поразени и двата кораба или нито един от тях.

Зад. 17. Даден е квадрат със страна 2, чийто център съвпада с центъра на координатната система. Да се състави програма SQUARE.CPP, която въвежда от клавиатурата координатите х и у на точка в равнината и отпечатва “YES”, ако точката принадлежи на квадрата и “NO” – в противен случай.

Примерен вход:

0 0


Примерен изход:

YES


Примерен вход:

2 1


П
римерен изход:

NO

З
ад. 18.
Даден е квадрат със страна 2, чийто център съвпада с центъра на координатната система и квадрат със страна 4, чийто център също съвпада с центъра на координатната система. Страните на двата квадрата са успоредни на координатните оси както е показано на фиг. 22. Да се състави програма SQUARE2.CPP, която въвежда от клавиатурата координатите х и у на точка в равнината и отпечатва “YES”, ако точката принадлежи на защрихованата област и “NO” – в противен случай.



Примерен вход:

0 0


Примерен изход:

NO

Примерен вход:

2 1

Примерен изход:

YES


Зад. 19. Дадена е квадратна мишена, чийто център съвпада с центъра на координатната система. Да се състави програма TARGET.CPP, която въвежда от клавиатурата координатите на изстрел х и у и отпечатва колко точки получава изстрела, като е известно, че изстрел, попаднал в първия квадрат получава 10 точки, във втория – 5 точки, а в третия – 2 точки. Ако изстрелът е извън мишената, получава 0 точки.

Примерен вход:

0 0


Примерен изход:

10

Примерен вход:

2 1

Примерен изход:

5

Примерен вход:

2 3

Примерен изход:

2

Примерен вход:

4 4

Примерен изход:

0

0


Зад. 20. Дадени са два правоъгълника, долния ляв ъгъл, на които съвпада с началото на координатната система и техните страни a1, b1, a2 и b2. Да се състави програма impl.cpp, която прочита от клавиатурата последователно координатите x,y на точка в равнината и дължините на страните на двата правоъгълника a1, b1, a2 и b2 и отпечатва 0, ако точката принадлежи едновременно на двата правоъгълника, 1 – ако принадлежи само на един от тях и –1- ако не принадлежи на нито един от тях.

Примерен вход:

2 4 5 2 1 1



Примерен изход:

0

Примерен вход:

7 8 10 10 8 8

Примерен изход:

1

Примерен вход:

1 1 1 1 5 5

Примерен изход:

-1

З
ад. 21.
Дадени са два правоъгълника, така както са показани на фиг. 7. Да се състави програма RECTS.CPP, която въвежда координатите на посочените върхове на двата правоъгълника, съответно (x1,y1) и (x2,y2) за единия и (a1,b1) и (a2,b2) за другия и отпечатва лицето на сечението на двата правоъгълника.



Примерен вход:

1 1 5 3 3 2 7 8



Примерен изход:

2

Лабораторен практикум №2



Разклонени алгоритми


  1. Въведете текста на следната програма:

#include

void main()

{int x,y;

cout<<” x=”; cin>>x ;

cout<<” y=”;cin>>y;

if(x==5)


if(y==7) cout<<“sl. 1\n”;

else cout<<“sl. 2\n”;

if(x==5)

{ if(y==7) cout<<“sl. 1\n”;}

else cout<<“sl. 3\n”;

if(x==5)


if(y==7) cout<<“sl. 1\n”;

else cout<<“sl. 2\n”;

else if (y==5) cout<<“sl. 4\n”;

else cout<<“sl. 5\n”;

}
Изпълнете следните задачи:


  • Стартирайте програмата със следните входни данни:

x=5, y=7;

x=5, y=30

x=34, y=1235

x=8, y=7;

x=8, y=8;

и запишете получените резултати.



  • С помощта на прозореца за проследяване на програми проследете как се променят стойностите на величините в програмата в зависимост от изпълняваните оператори.




  1. Да се състави програма, която въвежда от клавиатурата координати на точка в равнината и отпечатва в кой квадрант се намира тя.

  • Стартирайте програмата със следните входни данни:

Абциса: 34,6

Ордината: 53,7


Абциса: 4

Ордината: 3


Абциса: 34456,678

Ордината: 53678,78

и запишете получените резултати.


  • С помощта на прозореца за проследяване на програми проследете как се променят стойностите на величините в програмата в зависимост от изпълняваните оператори.




  1. Да се състави програма, която въвежда от клавиатурата координати на точка в равнината и отпечатва дали тя принадлежи на защрихованата област.

  • Стартирайте програмата със следните входни данни:

Абциса: 1

Ордината: 2,7


Абциса: 5

Ордината: 0


Абциса: 1

Ордината: 0.5

и запишете получените резултати.


  • Коригирайте програмата така, че да прави аналогични проверки и за другите области.

  • Стартирайте новите варианти на програмата за същите входни данни и запишете резултатите.




  1. В една компютърна игра, наречена SeaWar, в даден момент трябва да се реши следния проблем: Зададени са два плавателни съда A(XA,YA) и B(XB,YB). Предполага се, че играчът се намира в центъра на координатната система, но бойната мощ r на оръжията му е гарантирана до точно определено разстояние от целта. Налага се да се отпечатат координатите на този плавателен съд, който се намира в обхвата на оръжията на играча.

Съставете програма SEAWAR.CPP, която въвежда координатите на плавателните съдове и максималното разстояние, при което оръжията на играча гарантират успех, и отпечатва координотите на този от корабите, който може да бъде поразен от тази позиция. Ако някой от корабите не може да бъде поразен, да се отпечата разстоянието, което не достига за това.

  • Стартирайте програмата със следните входни данни:

XA=2 YA=4

XB=2 YB=2

r=4
XA=2 YA=4

XB=2 YB=2

r=14
XA=2 YA=4

XB=2 YB=2

r=2.5
XA=2 YA=4

XB=2 YB=2

r=1


  • С помощта на прозореца за проследяване на програми проследете как се променят стойностите на величините в програмата в зависимост от изпълняваните оператори.




  1. Дадена е квадратна мишена, чийто център също съвпада с центъра на координатната система. Да се състави програма TARGET.CPP, която въвежда от клавиатурата координатите на изстрел х и у и отпечатва колко точки получава изстрела, като е известно, че изстрел, попаднал в първия кръг получава 10 точки, във втория – 5 точки, а в третия – 2 точки. Ако изстрелът е извън мишената, получава 0 точки.

  • Стартирайте програмата със следните входни данни:

0 0

2 1


2 3

4 4


Оператор за избор на вариант

  1. Теоретични бележки

  1. Пример

Ще разгледаме следната задача:

Задача: Да се състави програма DAY.CPP, която въвежда от клавиатурата цяло число от 1 до 7 и отпечатва съответния ден от седмицата, като на 1 съпоставя понеделник, на 2 – вторник и т.н. В случай, че е въведено число различно от описаните, на екрана се извежда “Еrror!”.

Решение:

Единствената величина, която ще използваме при решението на тази задача е целочислената променлива съдържаща номера на деня от седмицата.



int day;

След въвеждане на числото day от клавиатурата, с помощта на няколко последователни условни оператора проверяваме какво число е въведено и извеждаме съответното съобщение:

cin>>day;

if(day==1) cout<<”понеделник\n”;

else

if(day==2) cout<<”вторник\n”;



else

if(day==3) cout<<”сряда\n”;



else

if(day==4) cout<<”четвъртък\n”;



else

if(day==5) cout<<”петък\n”;

else

if(day==6) cout<<”събота\n”;



else

if(day==7) cout<<”неделя\n”;

else cout<<”Error!!!\n”;

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

Прави впечатление, че многократно се повтарят еднотипни езикови конструкции, които проверяват еднотипни условия. В този случай се налага разклоняване на програмата не само в две, а в много посоки. Описаната задача е често явление в програмирането. По една или друга причина често се налага програмата да се разклонява в няколко посоки. Операторите, с които реализирахме решението на задачата могат да се заменят с единствен оператор, наречен оператор за избор на вариант. Повечето езици за програмиране включват такъв оператор. В езика С++ това е оператор switch. Да разгледаме особеностите при използването на оператора.


  1. Синтаксис и семантика на оператор switch

а) Синтаксис на оператора за избор на вариант (правила за запис):

switch (израз)

{

case израз1 : оператор; оператор;… оператор; break;



case израз2 : оператор; оператор;… оператор; break;

...


case израз n : оператор; оператор;… оператор; break;

[default : оператор; оператор;… оператор; break;

}
к
switch (израз)

{case израз1 : оператор; оператор;… оператор; break;



case израз2 : оператор; оператор;… оператор; break;

...


case израз n : оператор; оператор;… оператор; break;

[default : оператор; оператор;… оператор; break;

}
ъдето:

оператор – произволен оператор, допустим за езика

израз – допустим за езика израз, резултата от който задължително не е от реален тип. Нарича се още дискриминанта.

израз1, израз2 ,..., израз nконстантни изрази, задължително с различни стойности. Наричаме ги етикети. Тяхната стойност не зависи от входните данни

Забележка: Операторът break, описан в синтаксиса не е задължителен за използване. Неговото пропускане води до промяна на смисъла на програмата. Ще разгледаме това в следващите примери.

б) Семантика на оператор switch (правила за изпълнение):

- изчислява се стойността на израза(както споменахме по-горе, резултата е константа);

- получената константа се сравнява последователно със стойностите на етикетите(израз1, израз2 ,..., израз n);

- при съвпадение на стойността с някой от етикетите се изпълняват оперторите, записани след клаузата case на съответния вариант, до срещане на оператор break;

- при несъвпадение на стойността с някой от етикетите се изпълняват оперторите, съответстващи на варианта default, до достигане на оператор break. При липса на вариант default не следват никакви действия от оператор switch.

в) Забележки (Правила на използване)

При използването на оператор switch трябва да спазваме няколко основни правила:



  • дискриминантата задължително се загражда в скоби;

  • етикетите задължително са константи;

  • стойностите на етикетите не зависят от входните данни;

  • редицата от оператори, съответстващ на даден етикет може да е празна;

  • варианта default не е задължителен, но добрият стил за програмиране го изисква;

  • обикновенно последният оператор за изпълнение от всеки вариант е оператор break. Той предизвиква прекъсване на изпълнението на оператор switch и предава управлението на първия оператор след него;




  1. Оператор break

Синтаксис(правило за запис):

break;

Семантика(правило за изпълнение):

Прекратява изпълнението на най-вътрешния, съдържащ го оператор switch или оператор за цикъл. Изпълнението на програмата продължава от оператора, следващ прекъснатия.


Имайки предвид казаното можем да решим задачата, като използваме оператор за избор на вариант:

//day.cpp

#include

void main()

{

int day;

cin>>day;

switch (day)

{

case 1 : cout<<”Понеделник\n”; break;



case 2 : cout<<”Вторник\n”; break;

case 3 : cout<<”Сряда\n”; break;

case 4 : cout<<”Четвъртък\n”; break;

case 5 : cout<<”Петък\n”; break;

case 6 : cout<<”Събота\n”; break;

case 7 : cout<<”Неделя\n”; break;

default : cout<<”Error!!!\n”; break;

}

}




  1. Решени задачи

Задача 1. Месеци.

Да се състави програма MONTH.CPP, която прочита от клавиатурата цяло число от 1 до 12 и отпечатва броя на дните в съответния месец.



Каталог: tadmin -> upload -> storage
storage -> Литература на факта. Аналитизъм. Интерпретативни стратегии. Въпроси и задачи
storage -> Лекция №2 Същност на цифровите изображения Въпрос. Основни положения от теория на сигналите
storage -> Лекция 5 система за вторична радиолокация
storage -> Толерантност и етничност в медийния дискурс
storage -> Ethnicity and tolerance in media discourse revisited Desislava St. Cheshmedzhieva-Stoycheva abstract
storage -> Тест №1 Отбележете невярното твърдение за подчертаните думи
storage -> Лекции по Въведение в статистиката
storage -> Търсене на живот във вселената увод
storage -> Еп. Константинови четения – 2010 г някои аспекти на концептуализация на богатството в руски и турски език


Сподели с приятели:
1   2   3   4   5   6   7   8   9   ...   12




©obuch.info 2024
отнасят до администрацията

    Начална страница