L и височина h. Известно е, че с една кутия боя могат да се боядисат m квадратни единици площ от стената. Напишете програма



страница1/5
Дата31.12.2017
Размер0.96 Mb.
#38459
ТипЗадача
  1   2   3   4   5


Задача 1: Боя

Налага се да се боядиса провоъгълна стена с дължина l и височина h. Известно е, че с една кутия боя могат да се боядисат m квадратни единици площ от стената. Напишете програма BOJA.CPP, която прочита от клавиатурата дробните числа l, h и m, и извежда на екрана колко кутии боя са необходими за да се боядиса стената.

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

2 4 5


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

2

Решение:



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

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

float l, h, m;

  • за броя кутии с боя обаче ще ни трябва целочислена променлива, защото брой винаги се задава с цяло число:

int b;

  1. Въвеждат се променливите l, h и m:

cin>>l>>h>>m;

  1. Пресмята се лицето на стената. Тук става ясно, че е необходима още една дробна променлива, в която ще се запише стойността на лицето на стената. Да я означим с s. Тя може да се декларира в момента, в който ни потрябва:

float s=l*h;

  1. Пресмята се броя кутии с боя. Най-лесно е просто да разделим лицето на площта, която се боядисва с една кутия боя, но резултатът, получен в този случай няма да е винаги точен. Всъщност, той ще е точен само в случаите когато s се дели на m без остатък, а те явно са много малка част от общия брой случаи. Естествено, ако се получи като резултат дробно число, то задължително трябва да се закръгли към по-голямият брой кутии, защото и за най-малката останала част от стената ще се наложи да се купи още една кутия боя. Закръглянето се извършва със специалната функция ceil, която е описана в специализираната библиотека math.h. В тази библиотека има и други интересни функции, на които ще се спрем по-подробно по-късно.

Задача 2: Обиколка

Да се състави програма OBIKOLKA.CPP, която въвежда дължината a и ширината b на правоъгълник и отпечатва периметъра му P.

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

2 4 5


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

2

Решение:

1. Задава се дъжината а и ширината b на правоъгълника.

2. Пресмята се периметъра P на правоъгълника по формулата P=2*(a+b).

3. Съобщава се P.

Като използваме описаното решение и правилата за писане на програма на езика С++, можем да напишем следната програма:

//obikolka.cpp

# include



void main( )

{

float a,b,P;

cin>>a>>b;

P=2*(a+b);

cout<

}
Задача 3: Склад



За нуждите на един склад трябва да се направи програма SKLAD.CPP за пресмятане на складовите наличности. Програмата трябва да прочита от клавиатурата количеството стока в килограми и грамове, както и продаденото количество, измерено по същия начин и да извежда на екрана оставащото количество стока. Програмата приема като вход четири числа, първото, от които е килограмите на наличното количество, второто е грамовете, третото число е килограмите на продаденото количество, а четвъртото – грамовете на продаденото количество. Програмата отпечатва 2 числа – първото е килограмите на оставащото количество, а второто – грамовете. Складът е толкова голям, че в него не може да се съхраняват повече от 10 тона стока.

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

1000 200 50 700



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

949kg 500g



Решение:

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



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

Тук трябва добре да обмислим какъв ще е типът на променливите, с които ще работим. Както се вижда в условието, най-голямото количество стока, която може да се съхрани в склада е 10 тона, което ако се превърне в грамове е 10 000 000 грама. Това число очевидно не може да се събере нито в тип int, нито в unsigned. Все пак е необходимо да ползваме целочислен тип, тъй като за окончателното преобразуване на грамовете на оставащото количество в килограми ще ни трябва операцията за целочислено деление. Целочислен тип, който може да позволи използването на толкова големи числа е long. Ето защо дефинираме следните величини:

long nk, ng, pk, pg, ok, og;

където nk са наличните килограми, ng – наличните грамове, pk – килограмите на продаденото количество, pg – грамовете на продаденото количество, ok – килограмите на оставащото количество, og- грамовете на оставащото количество.



  • Въвеждаме входните данни:

cin>>nk>>ng>>pk>>pg;

  • Преобразуваме наличното и продаденото количество в грамове:

ng=nk*1000+ng;

pg=pk*1000+pg;



  • Пресмятаме оставащото количество в грамове:

og=ng-pg;

  • Превръщаме оставащото количество в грамове и килиграми:

ok=og/1000;

og=og%1000;



  1. Извеждаме килограмите и грамовете на оставащото количество:

cout<Програмата, решаваща тази задача има следния вид:

//sklad.cpp

#include



void main()

{

long nk, ng, pk, pg, ok, og;

cin>>nk>>ng>>pk>>pg;

ng=nk*1000+ng;

pg=pk*1000+pg;

og=ng-pg;

ok=og/1000;

og=og%1000;

cout<< ok<<” kg “<

}

Задача 4: Самолет

Известно е, че един самолет излита в h часа и m минути, като полетът му продължава m1 минути. Да се състави програма AIR.CPP, която прочита от клавиатурата данните h, m и m1 за полета, и извежда на екрана в часове и минути точното време на кацането му.

Например: самолетът излита в 23 часа и 50 минути, полетът продължава 75 минути, следователно часът на кацане е 1 часа и 5 минути.

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

23 50 75


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

1h 5m


Решение:

Задачата се решава като към минутите на излитане се добавят минутите на продължителността на полета. След това получения резултат се преобразува в часове и минути, като часовете се прибавят към часа на излитане. Остава само да съобразим, че има възможност да се премине в следващото денонощие и тогава часа на кацане ще се получи като вземем остатъка при деление на получения час на 24.



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

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

int h,m,ml;

  1. Въвеждаме входните данни:

cin>>h>>m>>ml;

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

m+=ml;

  1. Преобразуваме получените минути в часове и минути, като часовете прибавяме към часа на излитане, а минутите записваме в променливата m:

h+=m/60;

m%=60;


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

h%=24;

  1. Отпечатваме часа на кацане:

cout<
Задача 5. Уравнение.

Да се състави програма KOREN.СРР , която намира корена на уравнението ax=b, където а и b са дадени числа.

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

2 8


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

4

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

0 5

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

няма решение



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

0 0


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

всяко х е решение



Решение

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

За решението на задачата са необходими трите дробни променливи a,b и x:

float a, b, x;

  1. В началото коефициентите на уравнението трябва да се въведат от клавиатурата.

cin>>a>>b;

  1. Както вече беше обсъдено в темата “Алгоритми”, решението на уравнението зависи от това дали а е 0 или е различно от 0. Така, че на следващата стъпка се налага да се провери дали а=0.

    1. Ако а=0, се проверява дали b=0.

    3.1.1. Ako b=0, на екрана се отпечатва, че всяко х е решение на уравнението.

    3.1.2. Ако b0, на екрана се отпечатва, че уравнението няма решение.



    1. Ако а0, се пресмята x=b/a, след което на екрана се отпечатва неговата стойност.

Това на езика С++ се записва чрез следните оператори:

if(a==0)

if(b==0)

cout<<”всяко х е решение\n”;



else

cout<<”няма решение\n”;



else

{

x=b/a;



cout<

}

Тук веднага след условието на първия оператор if е вложен още един условен оператор. След клаузата му else е използван съставен оператор, тъй като алгоритъмът, описан по-горе предвижда две действия – пресмятане на х и отпечатването му на екрана.



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

#include



void main()

{

float a, b, P;

cin>>a>>b;

if(a==0)

{ if(b==0)

cout<<”всяко х е решение”<
else

cout<<”няма решение”<

}

else

{

x=a/b;


cout<<”x=”<

}

}



Задача 6. Лица

Да се състави програма 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()

{

int x; float a;

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;

}

}





Задача 7: Детайли

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

D1 D2

I1 2 0


I2 4 2

I3 5 4


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

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

1 12 14


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

6

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

3 18 30

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

3

Решение:

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


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

За решението на задачата е необходима една целочислена променлива i, която ще приема стойности от 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?b1:b2<Ето пълния текст на програмата, решаваща задачата:

//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

}

Задача 8: Часовник

Електронен часовник отмерва часове и минути от 00:00 до 23:59. Напишете програма clock, която по две зададени показания на часовника намира колко време след първото показание на циферблата на часовника ще се появи второто показание. На първия ред на стандартния вход се въвежда първото показание на часовника, а на втория ред – второто показание на часовника. Двете показания са различни и се състоят от по четири числа, като първите две показват първото показание на часа, а вторите две - второто. На един ред на стандартния изход програмата трябва да изведе търсеното време във формата на входните данни.

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

23 58


1 2

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

1 4


Решение: За да решим задачата трябва да проверим дали крайното показание на часовника показва по-малък час от началното, към него прибавяме 1440 (1440 минути са 24 часа). Търсеното време в минути получаваме като от крайното показание на часовника извадим началното. Остава резултатът да се изведе във формата на входните данни.

#include



using namespace std;

int main()

{ int a1, a2, b1, b2;

cin >> a1 >> a2;

cin >> b1 >> b2;



int a = a1*60 + a2;

int b = b1*60 + b2;

if (a >= b) b = b + 1440;

int c = b - a;

cout << c/60 << ' ';

cout << c%60 << endl;

return 0;

}

Задача 9: Валидна дата

Една от общоприетите формати за изписване на дата има вида: dd.mm.gggg, където dd е номера на деня, mm е номера на месеца и gggg е годината. За невалидна дата приемаме датата, в която е зададен само грешен номер на ден. Напишете програма VALID, която по зададена дата от 2008 година извежда Yes, ако датата е валидна дата и следващата я дата. Ако зададената дата не е валидна, програмата да извежда No и броя дни в зададения месец.

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

1 2 2008


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

Yes


2.2.2008

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

30 2 2008



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

No

29



Решение:

Трите стойности d, m и g се въвеждат от клавиатура като цели числа. За решението на задачата се използва съответствието между номера и броя на дните в месеца, т.е. броя на дните в месеците с номер 1, 3, 5, 7, 8, 10, 12 е 31, като проверяшаме условието за виведен греяен номер на деня.

Ако е въведен номер по-голям от 31 се смята, че датата е невалидна. В противен случай датата е валидна и трябва да намерим следващата дата, като, проверяваме дали денят е последен в месеца и месеца не е 12, тогава търсеният ден е първи и номера на месеца се увеличава с 1, а ако номера на денят е последен и месецът в 2008г е 12, тогава годината на следващата дата е 2009. Ако номерът на деня не е последен в месеца, извеждаме стойността му, увеличен с 1.

Аналогично и за месеците съответно с номера 4, 6, 9 и 11.

Тъй като става дума за определена година 2008, която е високосна, то въведен грешен номер на деня, когато месеца е 2, е този, който е по-голям от 29.

#include

int main()

{

int d, m, g;



cin>>d>>m>>g;

if(m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12)

{

if(d>31)


cout << “No\n31”<

else{


cout<<”Yes\n”;

if(d==31 && m!=12) cout<<”1.”<

if(d==31 && m==12) cout<<”1.1.2009\n”;

if(d<31) cout<

}}

if(m==4 || m==6 || m==9 || m==11)



{

if(d>30)


cout << “No\n30”<else{


cout<<”Yes\n”;

if(d==30) cout<<”1.”<

if(d<30) cout<

}}

if(m==2)



{

if(d>29)


cout << “No\n29”<else{


cout<<”Yes\n”;

if(d==29) cout<<”1.”<

if(d<29) cout<

}}

return 0;



}

Задача 10: Дата

Младият програмист Росенчо се готвил за есенния турнир по информатика в гр. Шумен и бил освободен от училище. Един ден негов приятел му звъннал по телефона и му съобщил, че една седмица след завръщането му от турнира ще имат контролна. Росенчо започнал да прeсмята на коя дата точно е контролната му и съвсем се объркал. Помогнете му като съставите програма DATA.EXE, която въвежда от стандартния вход дата включваща ден, месец и година, разделени с по един интервал. На един ред на стандартния изход трябва да се изведе датата след седем дни, като деня, месеца и годината са разделени с тирета (-). Не забравяйте, че една година е високосна, ако се дели на 4, но не се дели на 100 или ако се дели на 400!



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

12 11 2006



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

19-11-2006



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

28 02 2004



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

6-3-2004


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

31 12 2006



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

7-1-2007


Решение:

Нека входът се записва в три променливи: d – ден, m – месец, g – година. Прибавяме към d 7 и ако получената стойност е по-голяма от дните в месеца (m), от променливата d изваждаме дните на въведения месец и прибавяме единица към месеца (m). Ако месецът е по-голям от 12, то следващият месец трябва да е януари (т.е. на променливата m присвояваме 1) и годината увеличаваме с единица. Когато въведената дата е през февруари трябва да се прави проверка дали годината е високосна. Както знаем, една година g е високосна, когато се дели на 4 без остатък, като специално правило се прилага, когато последните две цифри на g са нули. Тогава допълнителното условие годината g да е високосна е да се дели на 400 без остатък. Това се изразява чрез следното съставно логическо условие:

(((g%4==0)&&(g%100!=0))||(g%400==0))

Намерените d, m, g извеждаме разделени с тире.


#include

int main()

{

int d,m,g;

cin>>d>>m>>g;

d=d+7;


if ((m==1)||(m==3)||(m==5)||(m==7)

||(m==8)||(m==10)||(m==12))



if (d>31)

{

d=d-31;



m=m+1;

}

if ((m==4)||(m==6)||(m==9)||(m==11))



if (d>30)

{

d=d-30;



m=m+1;

}

if (m==2)



if ((((g%4)==0)&&((g%100)!=0)) ||((g%400)==0))

{

if (d>29)

{

d=d-29;


m=m+1;

}

}



else {

if (d>28)

{

d=d-28;



m=m+1;

}

}


if (m>12)

{

m=1;



g=g+1;

}

cout<

return 0;

}

ІIІ ниво. На този етап учениците са усвоили операторите за цикъл и вече имат възможност да обработват неопределен брой последователно въведени елементи.



Задача 11: Сума

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

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

3 18 30 5 0



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

56

Решение:

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

cin>>а;


s+=а;

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

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

//sum.cpp

#include



void main()

{

int a,s=0;



do

{

cin>>а;



s+=а;

}

while(a);

cout<

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

cin>>а;

s+=а;


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

Задача 12: Брой

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

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

1 12 14 25 3 1 6 7 0



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

8

Решение:

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

- Какво се повтаря? – по аналогия с предходната задача лесно съобразяваме, че ще се повтарят двете действия: въвеждане на числото а и преброяването му. Самото преброяване ще осъществим, като при прочитане на всяко число, увеличаваме с 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 не трябва да бъде преброявано, трябва да помислим за промяна в решението, с която ще избегнем този проблем. Очевидно е, че в случаи, когато въведеното число е 0, брояча не трябва да бъде увеличаван. Ето защо заменяме реда в програмата br++; с реда if (a) br++;.



//count1.cpp

#include



void main()

{

int a, br=0;



do

{

cin>>a;



if(a)br++;

}

while (a);

cout<<”br=”<

}
Задача 13: Да се състави програма MULT.CPP, която чете от клавиатурата цели числа, до въвеждане на числото 1, и отпечатва произведението им.



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

3

-1



9

126


1

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

-3402


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

-13


2

0

1



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

0

Решение:

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

- Какви величини са необходими за работата на програмата?

int a;//тази целочислена променлива ще използваме за последователното въвеждане на всяко едно от числата

long Р=1;//в рази променлива ще натрупваме произведението на числата.

Присвояваме и първоначална стойност 1, за да можем да умножаваме досегашната стойност на Р с поредното въведено число. Променливата е от тип long, защото произведението винаги е много по-голямо от числата, които умножаваме и може бързо да излезе извън границите на тип int.



- Какво се повтаря?

По аналогия с предходните задача лесно се съобразява, че ще се повтарят две действия:

cin>>a;

Р*=а;


- До кога се повтаря?

Тук израза, определящ до кога ще се изпълнява цикъла, е зададен явно в условието на задачата, т. е. тялото на цикъла ще се повтаря, докато въвежданото число е различно от 1. В момента, в който се въведе 1, програмата ще продължи със следващия оператор в програмата. Условието за край на цикъла ще изглежда така:

(а!=1)

- Остава да уточним кой от двата познати ни оператора за цикъл ще използваме?



От условието е ясно, че от клавиатурата задължително трябва да се въведе поне едно число и с него трябва да се умножи произведението Р. При това не се налага допълнителна обработка на първото въведено число. Следователно всяко едно от числата ще се обработва по един и същи начин, т.е. в тялото на цикъла, което задължително трябва да се изпълни поне веднъж. Цикълът, който удовлетворява тези изисквания е do-while.

Да върна ли задачата в цикъл while и в студентското съм направила същия бъркоч?

След тези уточнения можем да напишем решението на задачата (кода на програмата).

//mult.cpp

#include

void main()

{

int a;



long P=1;

do

{

cin>>a;



P*=a;

}

while(a!=1);

cout<

}

Задача 14: Да се състави програма NEGATIV.CPP, която чете от клавиатурата цели числа до въвеждане на отрицателно число и отпечатва броя на въведените четни числа.(Ще приемем, че 0 не е четно число).



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

3

13



24

55

0



46

-8

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

2

Упътване:

- Какви величини са необходими за работата на програмата?

int a; // за последователното въвеждане на всяко едно от числата

int br=0; //за броя на четните числа

- Какво се повтаря?

cin>>a; //въвежда се поредното число



if(a&&a%2==0)br++; //ако въведеното число се дели на 2 без остатък и не е 0, се увелечава броя на четните числа.

Забележете, че в израза не са употребени скоби, тъй като приоритета на операциите определя правилния ред на действията, т. е. първо се извършва проверката дали стойността на а не е 0 и после се проверява дали остатъка при деление на 2 е 0. Операциите за сравнение са с по-голям приоритет от логическите операции.



- До кога се повтаря?

Докато (а>=0).



Задача 15: Нечетни

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

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

1

-3



7

-2

-6



0

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

3

Решение:



  1. Ще определим величините, които участват в програмата:

Необходими са ни две целочислени променливи: едната – int a;, за да записваме в нея текущо въведеното число и друга – за броя на нечетните числа. Да отбележим, че променливата, съдържаща броя на нечетните числа трябва предварително да се нулира: int br=0;

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

  • Какво се повтаря?

Повтарят се две действия: въвеждане на поредното число и проверка дали то е отрицателно. В случай, че числото е отрицателно, брояча се увеличава с 1. Тези действия се записват на С++ по следния начин:

cin>>a;


if(a<0)br++;

  • До кога се повтаря?

В условието на задачата точно е указан признака за повторение: описаните действия се повтарят докато въведеното число а е различно от 0.

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

  2. Тъй като в условието за край на повторенията участва стойността на променливата а, то е добре тя да получи стойност преди проверката на това условие. От друга страна, условието на задачата предполага, че ще трябва да се въведе поне едно число. Ето защо е правилно в случая да използваме операторът do-while.

  3. Накрая програмата трябва да изведе броя на отрицателните числа.

Сега можем да напишем текста на програмата:

//negative.cpp

#include

void main()

{

int a,br=0;



do

{

cin>>а;



if(a<0)br++;

}

while(a);

cout<

}

Задача 16: Сума К



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

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

10

2



4

5

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

3

Решение:


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

    int K; - за първото въведено число

    int a; - за текущото число от последователността

    int br=0; - за броя на въведените числа. Като всеки брояч, и този трябва да се нулира.

    int S=0; - за сумата на числата.

  1. Въвежда се променливата K:

cin>>К;

  1. Организира се цикъл, в който се повтаря:

cin>>a; //прочита се текущото число

br++; //увеличава се броя на въведените числа

S+=a; //добавя се прочетеното число към сумата

докато получената сума не е станала по-голяма или равна на К, т.е. докото S


  1. Извежда се броя на въведените числа:

cout<

    Както и преди, ще използваме цикъл do-while.

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

//sumk.cpp

#include

void main()

{

int a,br=0,k;

cin>>k;

do

{

cin>>а;



br++;

S+=a;


}

while(S cout<

}

Задача 17: Викторина

За училищна викторина трябвало да се съставят отбори от по трима души, но участниците в тях трябвало да се сработват добре, за да има успех всеки отбор. За да се подберат правилно отборите всички участници били анкетирани, като резултатите от анкетата били записани с цели числа [0, 255]. Въпросите от анкетата били зададени така, че от резултата се разбира лесно дали един отбор е добре подбран. А това е така, ако сумата от резултатите на тримата участници в отбора е кратна на 3. Да се състави програма ANKETA.CPP, която чете от клавиатурата последователности от три числа (резултатите на тримата участници в отбора) до въвеждане на три нули и отпечатва след всяка от тях – OK, ако отбора е добре сформиран и Error, ако това не е така. За нулевата тройка не се отпечатва нищо.

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

6 7 8


8 9 3

5 4 12


1 3 5

10 11 4


0 0 0

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

OK

ERROR



OK

OK

ERROR



Решение:

За да определим дали даден отбор е добре сформиран, е необходимо да намерим сумата от точките на трите участника и да проверим дали се дели на три.



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

Тъй като е необходимо на всяка стъпка да обработваме резултатите и на тримата състезатели, ще са ни необходими три целочислени променливи a, b и c за всеки един от състезателите, както и променливата S за сумата от точките на тримата:

int a,b,c, S;

  1. Веднага се организира цикъл do-while, в който на всяка стъпка се въвеждат трите числа a,b и c, пресмята се сумата им S и се проверява дали е кратна на 3. Условието за край може да бъде проверено най-лесно, като се вземе под внимание, че сумата на три цели, положителни числа (каквито са нашите) е 0 тогава и само тогава, когато и трите са 0.

do

{

cin>>а>>b>>c;



S=a+b+c;

if(S%3) cout<<”ERROR\n”;

else cout<<”OK\n”;

}

while (S);

Тези две стъпки всъщност решават задачата.

В този случай общия вид на програмата е следния:

//anketa.cpp

#include



void main()

{

int a,b,c,S;



do

{

cin>>а>>b>>c;



if(S=a+b+c)

if(S%3) cout<<”ERROR\n”;

else cout<<”OK\n”;

}

while (S);

}

Задача 18: Мравка

Миналото лято мравката Здравка попаднала на цяло находище от n трохи. Първата се намирала на 1 см от нейния мравуняк, втората – на 2 см, третата – на 3 см, четвъртата –на 4 см, …, n-тата – на n см. Здравка излизала от мравуняка, вземала по една троха, носела я в мравуняка и след това продължавала по същия начин до събирането на всички трохи. Напишете програма ant, която намира дължината на пътя, който Здравка е изминала, за да прибере всички трохи в мравуняка.

От стандартния вход на един ред се въвежда стойността на n (1 < n < 250). На един ред на стандартния изход програмата трябва да изведе дължината на изминатия от Здравка път в сантиметри.

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

5

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

30

Решение: Изминатият от мравката път е равен на удвоения сбор на естествените числа

от 1 до n.

#include

using namespace std;

int main()

{

int n, s = 0;



cin >> n;

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

s = s + i;

s = 2*s;


cout << s << endl;

return 0;

}

Задача 19: Сума от цифри на число

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

Пример:

Вход:

365


Изход:

14

Задача 20: Намиране на обратното число на дадено



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

Пример:

Вход:

365


Изход:

563


Решение:

За да намерим обърнатото на числото, трябва да намерим поотделно всяка една от цифрите му – цифрата на единиците, на десетиците и на стотиците.



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

  • освен цялото число к, се налага да заделим по едно цяло число за всяка една от цифрите:

int к,e,d,s,ок; //е – цифрата на единиците, d – на десетиците, s – на стотиците, ок - обърнатото на числото к.

  1. Първо трябва да се въведе числото к:

cin>>k;

  1. След това трябва да се изчислят съответните цифри, като използваме целочислените операции за деление по следния начин:

e=k%10;

d=k/10%10;

s=k/100%10;


  1. Когато знаем цифрите на числото, можем да намерим обърнатото му по следната формула:

ок=100*е+10*d+s;

  1. Накрая извеждаме намереното обърнато число.

Задача 21: Сума

Дадено е трицифрено число к. Да се напише програма SUMBACK, която намира огледалното число на к (числото, което се получава при прочитане на к от дясно на ляво) и извежда на екрана сумата на двете числа.

Пример:

Вход:

365


Изход:

938


Решение:

Можем да решим задачата, като е разделим на две под задачи – намиране на цифрите на число и получаване на число от няколко конретни цифри. Крайният резултат на решаваната задача е сумата на двете числа. Намирането на огледалното на даденото става по алгоринъма, описан в предходната задача.

Ето пълния текст на програмата:

//Sumback

#include

using namespace std;

int main()

{

int k,e,d,s,p;

cin>>k;


e=k%10;

d=k/10%10;

s=k/10/10%10;

p=100*e+10*d+s;

cout<
return 0;

}

Задача 22: Щастлива година

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

Пример 1:

Вход:

2005


Изход:

YES


Пример 2:

Вход:

1970


Изход:



Задача 23: Лунни числа



Дадено е четирифицрено число. Да се напише програма MOON, която определя дали числото е лунно и отпечатва “YES”, ако е такова и “NO” в противен случай. Едно число е лунно, ако сумата от цифрите на единиците и хилядните е равна на сумата от цифрите на десетиците и стотиците.

Пример 1:

Вход:

1728


Изход:

YES


Пример 2:

Вход:

2007


Изход:

NO

Задача 24: Сейф



(Национален есенен турнир по информатика, Шумен, 2004 г.)

Програмистът Гошо Тарикатски съхранява сорсовете на своите програми в специален сейф. За да го обезопаси срещу крадци решил да създаде сложно система за отключване. Тя се задействала от два различни пулта, от които се въвеждали две трицифрени числа. След като се въведат числата, се стартира програма, която генерира кода за сейфа по следния начин:

Събира първата цифра на първото число с последната цифра на второто число. Ако резултатът е двуцифрено число, цифрите му се събират. Получената цифра се записва като първа за кода.

Втората цифра се получава, като по същият начин се обработят вторите цифри на двете числа.

След сумирането на последната цифра на първото число и първата цифра на второто по посочената схема, се получава третата цифра на кода.

Гошо е много добър програмист, но е затрупан от поръчки, затова възлага на вас написването на програмата за получаване на кода.

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

Пример:

Вход:

492 851


Изход:

551


Задача 25: Бонбонки

(Национален есенен турнир по информатика, Шумен, 2005 г.)

Умко (нашият познайник от училище “Програмистите на България”) имал странно хоби. Той имал четири кристални купички, в които грижливо събирал шоколадови бонбонки. Странното било това, че той не обичал да си похапва от тях, а само да си ги гледа разпределени по равен брой в своите купички. Във всяка от тях той държал по 10 бонбонки. Това че нашето умно момче не обичало шоколадовите бонбонки съвсем не означавало, че и неговата сестра не обичала да си похапва сладко, сладко от тях. Тя само изчаквала Умко да отиде на училище и с оргомно удоволствие си похапвала. Така всеки ден след като се връщал от училище, той виждал, че любимите му кристални купички вече не са пълни с по 10 бонбонки във всяка и тичал до магазина за да набави неоходимите бонбонки. След известно време Умко сменил тактиката. Вместо всеки ден да ходи до магазина и да си купува бонбонки, просто ги премествал от едната купичка в другата за да станат пак по равен брои в четирите купички. В случаите, когато това не било възможно, Умко все пак тичал до магазина.

Тъй като му омръзнало всеки път да пресмята колко бонбони трябва да размести и да купи, нашият приятел ви моли да напишeте програма BONBONKI, която прочита от клавиатурата последователно броя на бонбонките във всяка една от четирите купички и ако е възможно те да се разпределят по равно, извежда на екрана от коя купичка колко бонбонки се изваждат или добавят. Ако бонбонките се изваждат от купичката, пред броя им се поставя знака “-“, а ако те се добавят – знака “+”. Ако броя на бонбонките в съответната купичка остава непроменен, се извежда числото 0 без знак. Ако не е възможно бонбонките да се разпределят по равно в четирите купички, програмата извежда на екрана само броя на бонбонките, които Умко трябва да купи от магазина, за да поправи разпределението им.

Пример 1:

Вход:

2 3 4 5


Изход:

2

Пример 2:



Вход:

4 9 8 7


Изход:

+3 -2 -1 0



Задача 26: Сума от делителите

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

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

18

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

14

Решение:

Числата, които могат да бъдат делители на n са тези, които принадлежат на интервала [2, n/2]. Това е очевидно, защото ако допуснем, че 2 е най-малкият възможен делител, то най-големият се получава като разделим числото на него.



  1. Необходими са ни две целочислени променливи: едната int n; – за числото и другата long S=0; - за сумата от делителите му. Числото S е от тип long, за да може в него да се запише сумата от делителите на кое да е число от тип int.

  2. Като начало да въведем числото n:

cin>>n;

  1. Обхождат се всички евентуални делители и за всеки от тях се проверява дали наистина дели n. Ако това е така, той се добавя към сумата S:

for(int d=2;d<=n/2;d++)

if(n%d==0)S+=d;

  1. Накрая се извежда S:

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



// div.cpp

#include



void main()

{

int n, S=0;

cin>>n;

for(int d=2;d<=n/2;d++)

if(n%d==0)S+=d;

cout<

}

Задача 27: Прости делители.

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

Пример:

Вход:

24

Изход:

2-3

3-1


Задача 28: Прости множители

Дадени са две цели положителни числа a и b. Разглеждаме целите числа, които са между a и b(включително и a и b). Всяко от тези числа разлагаме на просто множители. Напишете програма PRIME, която въвежда стойностите на a и b (1и извежда общия брой на всичките участващи в разлаганията числа.

Пример:

Вход:

7 10


Изход:

8

Пояснение. Числата от 7 до 10 се разлагат на прости множители така: 7=7,8=2.2.2, 9=3.3,10=2.5. Общия брой на всичките прости множители е 8.



Задача 29: Линийки

Дадени са две еднакви непрозрачни измервателни линийки с дължина L милиметъра, с деления на всеки милиметър. По дължината на всяка линийка са пробити по няколко дупки, като дупките са на еднакви разстояние от долния ръб на линийките. Дупките започват от нулевото деление и след това са разположени така, че разстоянието между всеки две съседни дупки е равно на m милиметра за едната линийка и на n милиметра за другата. Считаме, че дупки са пробити и на крайните (отбелязващи 1 мм.) деления на линийките, ако там се пада да се пробие дупка, съгласно казаното по-горе. Напишете програма LIN, която въвежда от клавиатурата цели положителни числа m, n и l, (m<50,n<50,l<5001) и извежда на екрана броя на дупките на двете линийки, през които може да се гледа, след като двете линийки се поставят точно една над друга.

Задача 30: Библиотека

Първата задача на библиотекарката Книжка Книгова на новото и работно място не била от най–любимите и. Тя трябвало да подреди N книги на шкаф с много рафтове, така че след като някой поиска дадена книга да може да я намира за най – малко време. Ако подреди всичките N книги само на един рафт, времето необходимо за намирането, на коя да е книга ще е N секунди, а ако раздели книгите на K рафта, то времето, необходимо за намирането на книга от кой да е рафт ще е К + P секунди, където P е броя на книгите на съответния рафт (т.е. K секунди, за да намери рафта и още P секунди, за да намери търсената книга). Например, ако има 7 книги, Книжка може да сложи всички книги на един рафт и тогава ще и отнеме 7 секунди за да намери коя да е от тях. Ако тя раздели 7 книги на 2 рафта с по 3 и 4 книги всеки, то ще и отнеме първо 2 секунди за да намери правилния рафт и след това още 3 или 4 секунди за намиране на всяка една от книгите, но след като незнаем коя книга ще търсим общото време за търсене ще бъде 6 секунди. Помогнете на библиотекарката да разбере колко ще е минималното време, необходимо намиране на произволна книга.

Напишете програма MINITIME, която от стандартния вход чете едно цяло число N(1<=N<=107)броя на книгите, които Книжка трябвало да подреди и отпечатва на стандартния изход едно число – минималното време, за което тя ще може да намери коя да е от книгите.

Пример 1:

Вход:

7

Изход:

6

Пример 2:

Вход:

3

Изход:

3

Задача 31: Монети

В една държава разполагат с монети от 2 и 5 пари. Да се състави програма MONETI, която по въведена сума S отпечатва всички възможни комбинации от монети, с които тя може да се представи. Ако тя не може да се представи с тези монети, отпечатва “NO”.
Пример 1:

Вход:

17

Изход:

1.2+3.5

6.2+1.5


Пример 2:

Вход:

3

Изход:

NO

Задача 32: Питагорови тройки

За всеки правоъгълен триъгълник е в сила равенството c2=a2+b2 (Теорема на Питагор), където a и b са катетите, а c е хипотенузата на триъгълника. Да се състави програма PITAGOR, която за дадено естествено число N намира и отпечатва всички тройки естествени числа a, b и c, не по-големи от N, които могат да бъдат страни на правоъгълен триъгълник.

Пример:

Вход:

11

Изход:

3 4 5

6 8 10


Задача 33: Банкноти

Разполагаме с В1 банкноти по 1лв, В2 – по 2лв и В5 – по 5лв. Да се състави програма MONEY, която въвежда от клавиатурата последователно броя на копюрите от всеки вид – B1, B2, B5 и сума Р и извежда на екрана всички възможни начини, по които може да се представи сумата Р лева с възможните банкноти.

Пример:

Вход:

3 5 2 18


Изход:

0 4 2


2 3 2

3 5 1


Задача 34: Разпределение на стаи

Група от N деца отива на почивка. В почивната станция разполагат със стаи с по 3 и 4 легла. Да се състави програма CHILDREN, която въвежда от клавиатурата броя на децата N и отпечатва броя на различните разпределения на децата по стаите. Ако такова разпределение е невъзможно, на екрана се извежда “NO”.

Пример:

Вход:

30

Изход

3

Задача 35: Лунни числа

Да се състaви програма MOON, която прочита две числа а и b(999 и отпечатва всички лунни числа в интервала от а до b. Едно число е лунно, ако сумата от цифрите на единиците и хилядните е равна на сумата от цифрите на десетиците и стотиците. Ако в зададения интервал няма лунни числа програмата трябва да отпечатва NO.

Пример 1:

Вход:

1000 1300



Изход:

1001 1111 1221



Пример 2:

Вход:

1223 1310



Изход:

NO

Задача 36: Автобусни линии



(Национална олимпиада по информатика’2005, Областен кръг, Група E (4–5 клас))

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

Пример:

Вход:

105 200


Изход:

105


106

107


108

109
Задача 37: Състезание1



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

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

4 7 5


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

7

Могат да се съставят множество задачи за определяне на оптимален от фиксиран брой елементи. Ето няколко примера:



Задача 38: Състезание2

В състезание по вдигане на тежести при равни резултати на по-предно място се класира по-лекия състезател. Да се състави програма COMPЕТ2, която прочита от клавиатурата резултатите и теглата на трима състезатели и отпечатва постижението и теглото на златния медалист.

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

180 67


180 66

170 70


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

180 66


Задача 39: Числа

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

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

657




Сподели с приятели:
  1   2   3   4   5




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

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