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



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

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

1

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

31

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

2

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

28 или 29

Решение:


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

За решение на задачата е необходима единствено променливата, в която се записва номера на месеца:

int m;

  1. Първо се въвежда от клавиатурата цялото число m:

cin>>m;

  1. Знаем, че има три възможности за брой на дни в месеца: 31, 30 и броя на дните през февруари. Използването на оператор switch във вида от предната задача не е разумно, защото това предполага да напишем многократно един и същ оператор за отпечатване на 30 или 31. Ето защо ще използваме тази особеност на семантиката на оператора, която изисква програмата да изпълнява всички оператори, записани след съответния case до първото срещане на break. Ще опишем клаузи case за всички месеци с по 30 дни, като ще опишем само един оператор cout<<”30\n” срещу последния case и няма да използваме break преди него. Същото ще направим и с месеците от 31 дни. Ето как ще изглежда оператор switch в този случай:

switch(m)

{

case 1: case 3: case 5: case 7: case 8: case 10: case 12: cout<<”31\n”; break;



case 4: case 6: case 9: case 11: cout<<”30\n”; break;

case 2: cout<<”28 или 29\n”; break;



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

}

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



//month.cpp

#include



void main()

{


int m;

cin>>m;

switch(m)

{

case 1: case 3: case 5: case 7: case 8: case 10: case 12: cout<<”31\n”; break;



case 4: case 6: case 9: case 11: cout<<”30\n”; break;

case 2: cout<<”28 или 29\n”; break;

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

}

}



Допълнителна задача: Да се състави програма MONTH2.CPP, която прочита от клавиатурата цяло число m от 1 до 12 и цяло четирицифрено число gзадаващо съответната година, и извежда на екрана броя на дните в съответния месец.
Задача 2. Лица.

Да се състави програма AREA.CPP, която въвежда от клавиатурата дробно число а и цяло число х, и извежда периметъра на равностранен триъгълник със страна а - ако х=1, лицето на квадрат със страна а - ако х=2 и лицето на кръг с радиус а - ако х=3.



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

3 1


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

9

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

5.2 2

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

27.04


Решение:

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

int x; float a;

  1. Първо се въвеждат двете числа а и х.

cin>>a>>x;

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

switch(x)

{

case 1: cout<<3*a<break;



case 2: cout<break;

case 3: cout<<3.14*a*a<break;

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

}

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



//area.cpp

#include



void main()

{

float a; int x;

cin>>a>>x;

switch(x)

{

case 1: cout<<3*a<break;



case 2: cout<break;

case 3: cout<<3.14*a*a<break;

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

}

}



Задача 3. С думи.

Да се състави програма INWORDS.CPP, която въвежда от клавиатурата цяло число n от 0 до 19 и го извежда на екрана с думи.



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

1

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

едно

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

15


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

петнадесет



Решение:

Известна е зависимостта, по която се образуват имената на целите числа от 13 до 19 – първо се отпечтва думата, съответстваща на цифрата на единиците и след това се отпечатва надставката “надесет”. За разлика от тях числата единадесет и дванадесет се образуват малко по-различно. (вместо еднонадесет – единадесет и вместо двенадесет – дванадесет), което означава, че тези две числа ще се обработват отделно от останалите. Ако числото е едноцифрено, то се отпечатва със съответната дума без надставка. Изключение прави и числото 10, защото неговото наименование е специфично. От казаното до тук става ясно, че ще се наложи да се отделят двете цифри на числото и отпечатването ще се контролира от тяхната стойност.



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

За решението на задачата освен цялото число, което трябва да се отпечата с думи, са необходими и две целочислени променливи - за двете му цифри (ако числото е едноцифрено, цифрата на десетиците е 0).

int x,e,d;

  1. Въвежда се числото от клавиатурата:

cin>>n;

  1. Пресмятат се цифрите на единиците и десетиците на числото:

e=x%10; //цифра на единиците

d=x/10; //цифра на десетиците



  1. Чрез следните проверки се определя какво ще се отпечата на екрана:

if(e==0)

if(d) cout<<”десет\n”;

else cout<<”нула\n”;

else

{

switch(e)

{

case 1: if(d)cout<<”еди”; else cout<<”едно”; break;



case 2: if(d)cout<<”два”; else cout<<”две”; break;

case 3: cout<<”три”; break;

case 4: cout<<”четири”; break;

case 5: cout<<”пет”; break;

case 6: cout<<”шест”; break;

case 7: cout<<”седем”; break;

case 8: cout<<”осем”; break;

case 9: cout<<”девет”; break;

}

if(d)cout<<”надесет\n”;



else cout<<”\n”;

}

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



//inwords.cpp

#include



void main()

{

int x,e,d;



cin>>n;

e=x%10;

d=x/10;

if(e==0)

if(d) cout<<”десет\n”;

else cout<<”нула\n”;



else

{

switch(e)

{

case 1: if(d)cout<<”еди”; else cout<<”едно”; break;



case 2: if(d)cout<<”два”; else cout<<”две”; break;

case 3: cout<<”три”; break;

case 4: cout<<”четири”; break;

case 5: cout<<”пет”; break;

case 6: cout<<”шест”; break;

case 7: cout<<”седем”; break;

case 8: cout<<”осем”; break;

case 9: cout<<”девет”; break;

}

if(d)cout<<”надесет\n”;



else cout<<”\n”;

}

}


Задача 4. Детайли.

В едно предприятие се произвеждат три изделия (I1, I2, I3), като за тях са необходими детайлите D1, D2 в количествата, зададени от таблицата:



D1 D2

I1 2 0

I2 4 2

I3 5 4

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



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

3 18 30


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

3

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

1 12 14

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

6

Решение:

За да може да се произведе дадено изделие, за него трябва да има достатъчно количество и от двата детайла. За всеки от двата детайла ще изчислим b1 и b2, съответно броя на изделията, които могат да се произведат с първия и втория детайл. Броя на произведените изделия се определя от по-малкото от двете числа b1 и b2. В зависимост от това кое изделие е избрано, програмата се разклонява в три посоки. Ето защо е удачно да използваме оператор switch.


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

За решението на задачата е необходима една целочислена променлива, която ще заема стойности от 1 до 3 и ще определя номера на изделието, което ще се изработва. Освен това са необходими и целочислените величини d1 и d2, които съдържат съответно наличното количество детайли от първия и втория вид. Накрая да отбележим, че са ни необходими и двете променливи b1 и b2, които определят от кой детайл колко изделия могат да се произведат.

int i,d1,d2,b1,b2;

  1. Първо трябва да се въведат предвидените от условието данни:

cin>>i>>d1>>d2;

  1. След това в зависимост от избраното изделие, трябва да се изчислят b1 и b2.

switch(i)

{

case 1: b1=d1/2;b2=d1; break;



case 2: b1= d1/4;b2=d2/2; break;

case 3: b1= d1/5;b2=d2/4; break;

}


  1. Накрая ще се изведе по-малкото от числата b1 и b2.

cout<<(b1Ето пълния текст на програмата, решаваща задачата:

//details.cpp

#include



void main()

{

int i,d1,d2,b1,b2;



cin>>i>>d1>>d2;

switch(i)

{

case 1: b1=d1/2;b2=d1; break;

case 2: b1= d1/4;b2=d2/2; break;

case 3: b1= d1/5;b2=d2/4; break;

}

cout<<(b1

}


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

Зад. 1. Да се състави програма INWORDS2.CPP, която въвежда от клавиатурата цяло число от 1 до 99 и го отпечатва словом

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

56


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

петдесет и шест



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

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

1 8 3


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

8 1 3


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

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

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

#include

void main()

{

int d;



cout<<“vavedi den ot sedmicata: “;

cin>>d;


switch (d)

{

case 1: cout<<“ponedelnik\n”; break;



case 2: cout<<“vtornik\n”;

case 3: cout<<“srqda\n”; break;

case 4: cout<<“4etvyrtyk\n”;

case 5: cout<<“petyk\n”;

case 6: cout<<“sybota\n”; break;

case 7: cout<<“nedelq\n”;break;

default: cout<<“ERROR\n”;

}

}



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

d=3;

d=5;


d=1;

d=7;


d=-15

  • Защо при някои от тестовете се извежда повече от един отговор?

  • Коригирайте програмата така, че да работи коректно. Опишете какви са корекциите.

зад. 2. В едно предприятие се произвеждат три изделия (I1, I2, I3), като за тях са необходими детайлите D1, D2 в количествата, зададени от таблицата:





D1

D2

I1

2

0

I2

4

2

I3

5

4

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

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

D1=5349

D2=3815


I=3
D1=4896

D2=123


I=3
зад. 3. Да се състави програма, която въвежда от клавиатурата цяло число а и по избор извежда периметъра на равностранен триъгълник със страна а, лицето на квадрат със страна а или лицето на кръг с радиус а.

  • Тествайте я със следните данни:

a=35897;

i=1;
a=16;

i=1;
a=8971;

i=2;
зад. 4. Да се състави програма, която въвежда от клавиатурата цяло число от 1 до 20 и го извежда на екрана с думи.

Коригирайте програмата така, че да работи и с числа от 0 до 99. Напишете новата програма.


зад. 5. Дадени са целочислените променливи a,b и c. Да се състави програма, която разменя местата на най-голямата и най-малката измежду трите стойности.

Тествайте програмата.




Оператори за цикъл

Оператор за цикъл do-while

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

  1. Пример

Задача: Да се състави програма SUM3.CPP , която въвежда от клавиатурата три цели числа и отпечатва сумата им.

До момента ни е известно едно решение на тази задача – декларираме три променливи, въвеждаме трите числа, събираме ги и отпечатваме резултата. Тъй като в програмирането целта е не просто да напишем програмата, а да намерим оптималния от всички възможни варианти, продължаваме да търсим нови решения.

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

Когато се търси сума на повече от две числа е добре да се подходи по следният начин:



- Декларираме една допълнителна променлива, в която да запишем сумата на трите числа и приемаме, че първоначално тази променлива има стойност 0.

- Последователно въвеждаме всяко едно от трите числа и го добавяме към сумата веднага след въвеждането му.

- Отпечатваме получената сума.

Така описаната програма изглежда по следния начин:

#include

void main()

{

int a, b, c, s=0;

cin>>a;

s+=a;


cin>>b;

s+=b;


cin>>c;

s+=c;


cout<}

Решението е интересно с това, че числата се въвеждат последователно и на всяка стъпка успяваме да определим сумата на въведените до момента числа.



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

Лесно можем да забележим, че всяка една от променливите се използва само в два последователни оператора – при прочитането и при добавянето и към сумата. В останалата част от програмата тези променливи не се използват. В този случай можем да се откажем от променливите b и c и вместо тях отново да използваме а.

#include

void main()

{

int a, b, c, s=0;

cin>>a;

s+=a;


cin>>а;

s+=а;


cin>>а;

s+=а;


cout< }


Трасирайте програмата с използване на клавиш F7 и проследете как се изпълнява програмата. Как се променят стойностите на променливите a и s?

Какво трябва да променим в програмата, ако търсим сумата на 4 числа, 5 числа ... 100 числа?

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

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

cin>>а;

s+=а;


Ако имаме възможност да напишем програмата, така че да укажем на компютъра да повтаря тези два оператора определен брой пъти (примерно докато въведем числото 0), това би улеснило работата ни многократно. Повторението на едни и същи действия в една програма, се нарича цикъл. Едно от най-полезните възможности на компютрите е способността им многократно да изпълняват едни и същи действия, с едни и същи или различни стойности на изразите, които участват в тях. Всеки език за програмиране разполага със средства за задаване на такива повторения, които е прието да се наричат “оператори за цикъл”.

За да можем да организираме един цикъл трябва да можем да си отговорим на два основни въпроса:



- Какво се повтаря? - Това трябва да бъде едно или няколко действия, описани чрез допустими за езика за програмиране оператори. Всяко изпълнение на тези действията е прието да се нарича итерация.

- До кога се повтаря? - Това повтаряне на едни и същи действия не може да се извършва безкрайно, т.е. трябва ни условие (израз), което да може да прекъсне цикъла.

  1. Синтаксис и семантика на оператор do-while

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

Решение:

Очевидно, тук ще се наложи многократно повторение на описаните в решението на предишната задача оператори:

cin>>а;

s+=а;


Освен това в условието на задачата е казано ясно до кога трябва да се извършат тези повторения: докато се въведе числото 0.

Като имаме предвид, че използваните променливи остават същите – програмата, която решава тази задача има следния вид.

//sum.cpp

#include



void main()

{

int a,s=0;



do

{

cin>>а;



s+=а;

}

while(a);

cout<

}


Тук операторът do-while осигурява цикличното повторение на двата оператора

cin>>а;


s+=а;

докато променливата а е различна от 0.

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

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

do оператор while (израз);

оператор – произволен оператор, който е прието да се нарича тяло на цикъла;

израз – условие, което определя до кога се повтаря тялото на цикъла. Тук могат да участват както аритметични, така и логически операции и логически отношения, описани по правилата за логически и аритметични изрази.

Забележка: Тялото на цикъла описва действието, което трябва да се повтаря. Ако се налага да се повтаря повече от едно действие, т. е. се използва повече от един оператор, повтарящите се оператори се обединяват в съставен оператор чрез заграждането им в {}.

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

Операторът do P while (B);, където Р е оператор, а В е израз, се изпълнява по следния начин:

- изпълнява се Р;

- изчислява се стойността на израза В;

- ако стойността на В е различна от нула, т. е. истина, се преминава към изпълнение на P;

- ако стойността на В е нула, се изпълнява следващия оператор в програмата.

Като използваме този оператор за цикъл, да решим следната задача:

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

Решение:

Както вече беше казано, за да успеем да решим задачата, трябва да изясним двата основни момента:



Какво се повтаря? – по аналогия с предишната задача лесно се съобразява, че ще се повтарят две действия: въвеждането на число а и преброяването му. Самото преброяване ще се осъществи, като при прочитане на всяко число увеличаваме с 1 стойността на една цяла променлива br (много важно е да съобразим, че в началото на програмата на тази променлива трябва да се присвои стойност 0). След този анализ става ясно, че тялото на оператора за цикъл се състои от следните два оператора:

cin>>a;


br++;

До кога се повтаря?тук израза, определящ до кога ще се изпълнява програмата, е зададен явно в условието на задачата, т. е. тялото на цикъла ще се повтаря докато въвежданото число е различно от 0. По-точно казано, в качеството на израз можем да използваме самата променлива а, чрез която се въвеждат числа от клавиатурата. Ако тя е ненулева, тялото на цикъла ще продължи да се изпълнява. В момента, в който се въведе 0, програмата ще продължи със следващия оператор, а следвайки условието, той трябва да извежда броя на въведените числа - br.

След тези уточнения, получаваме като решение на задачата следната програма:


//count.cpp

#include



void main()

{

int a, br=0;



do

{

cin>>a;



br++;

}

while (a);

cout<<”br=”<

}
При тестване на програмата се оказва, че броят на числата е с 1 по-голям от действителния, т.е. програмата е преброила и числото 0. Ако решим, че числото 0 не трябва да бъде преброявано, трябва да помислим за промяна в решението, която ще го избегне.



//count1.cpp

#include



void main()

{

int a, br=0;



do

{

cin>>a;



br++;

}

while (a);

cout<<”br=”<

}

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

При използването на оператора за цикъл do-while трябва да спазваме следните основни правила:

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

- когато в тялото на цикъла трябва да са включени няколко оператора, те се заграждат с { }, т.е. използваме съставен оператор;

- управляващото условие трябва да се променя в тялото на цикъла;

- при създаването на програмите трябва да имаме предвид, че тялото на цикъла се изпълнява задължително поне веднъж.


  1. Каталог: 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   ...   4   5   6   7   8   9   10   11   12




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

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