MathType

Курс по Java /задачи/

В настоящата страница ще се добавят задачи за самостоятелни упражнения върху материала по "Основи на програмирането с Java". Всяка задача с четен номер ще бъде решена. Тъй като курсът е базиран на уеб технологиите, решенията на задачите ще бъдат оформени като фрагменти от JSP страница и техният изход ще бъде HTML код. Общите части на JSP страницата, като например HTML head частта, на много места ще бъдат изпуснати от съображения за краткост.

I. Цикли

Задача 1. Да се напише програма с цикъл for, която извежда числата от 1 до 10 включително.

Задача 2. Да се напише програма с цикъл for, която извежда числата от 3 до 27 включително.

Решениe (JSP фрагмент):

<%
 for (int c=3; c<=27; c++) {
  out.println("<p>"+c+"</p>");
 }
%>

Задача 3. Да се напише програма с цикъл for, която извежда четните числа в интервала от 4 до 20 включително.

Задача 4. Да се напише програма с цикъл for, която извежда числата от 1 до 10 включително, но в обратен ред.

Решениe (JSP фрагмент):

<%
 for (int c=10; c>=1; c--) {
  out.println("<p>"+c+"</p>");
 }
%>

Задача 5. Да се напише програма с цикъл for, която извежда само четните числа от 50 до 8 в обратен ред.

Задача 6. Да се напише програма с цикъл for, която извежда всички числа от 3 до 300 включително, които се делят на 3.

Решениe (JSP фрагмент):

<%
 for (int c=3; c<=300; c=c+3) {
  out.println("<p>"+c+"</p>");
 }
%>

Задача 7. Да се изпълни задача 1, като този път вместо for се използва while.

Задача 8. Да се изпълни задача 2, като този път вместо for се използва while.

Решениe (JSP фрагмент):

<%
 int c = 3; 
 while (c<=27) {
  out.println("<p>"+c+"</p>");
  c++;
 }

%>

Задача 9. Да се изпълни задача 1, като този път вместо for се използва do ... while.

Задача 10. Да се изпълни задача 2, като този път вместо for се използва do ... while.

Решениe (JSP фрагмент):

<%
 int c = 3; 
 do {
  out.println("<p>"+c+"</p>");
  c++;
 } while (c<=27);
%>

Задача 11. Перфектен квадрат е такова цяло число, което може да се представи като произведение на две други равни цели числа. Така например, числото 25 е перфектен квадрат, тъй като 25 = 5 * 5. Числото 8 не е перфектен квадрат, тъй като не може да се представи като произведение на две равни цели числа.

Като се използва do..while цикъл, да се намерят всички числа от 1 до 700, които са перфектни квадрати.

Съвет: Организирайте do..while цикъла така, че той да започне от 1 и да пресмята 1x1, 2x2, 3x3 и т.н. Резултатите от тези умножения са единствените възможни перфектни квадрати. Когато резултатите от умножението надвишат числото 700, задачата е изпълнена.

Задача 12. Последователността от числа 1 1 2 3 5 8 13 21 34 и т.н. се нарича "Числа на Фибоначи". В нея, първите две числа са единици, а всяко следващо е равно на сумата от предните две. Като се използва while или do..while цикъл, да се изчислят и изведат всички числа на Фибоначи, които са по-малки от 300.

Съвет: Опитайте да реализирате програмата по следния алгоритъм:

  1. На първата променлива се присвоява стойност 1;
  2. На втората променлива се присвоява стойност 1;
  3. Отпечатват се стойностите на първата и втората променлива;
  4. На третата променлива се присвоява стойността, равна на сумата от променливи едно и две;
  5. Проверява се стойността на третата променлива. Ако тя е над 300, алгоритъмът приключва;
  6. Отпечатва се третата променлива;
  7. На първата променлива се присвоява стойността на втората променлива;
  8. На втората променлива се присвоява стойността на третата променлива;
  9. На третата променлива се присвоява стойността, равна на сумата от променливи едно и две;
  10. Алгоритъмът се връща на стъпка 5.

Решение (JSP фрагмент):

<%
 int a = 1;
 int b = 1; 
 out.print("<p>"+a+"</p><p>"+b+"</p>");  //Отпечатва 1 1 частта от посл. на Фибоначи.
 int c = a + b; 
 while (c<=300) {
  out.println("<p>"+c+"</p>"); 
  a = b; 
  b = c;
  c = a + b;
 }
%>

Задача 13a. Преработете примера в задача 12, така че максималната стойност, при която цикълът приключва, да бъде поставена в предварително дефинирана променлива f. Забележете, че стъпки 4 и 9 на алгоритъма (c = a+b) се повтарят. Отговорете на въпроса дали е възможно да се елиминира една от двете без да се наруши изискването, последната изведена стойност да не надвишава стойността, зададена в f. За целта изпробвайте да пренапишеше задачата като do..while цикъл и изпробвайте специалния случай f=1;

Задача 13b. Пренапишете задача 8 и задача 10 като този път максималната стойност (27) бъде поставена в предварително дефинирана променлива f. Коректно ли работят двата алгоритъма (какво е последното изведено число), когато зададете f = 3.

Задача 14* Реализирайте алгоритъма от задача 12 с помощта на for цикъл.

Решение (JSP фрагмент):

<%
 out.print("<p>1</p><p>1</p>"); //Отпечатва 1 1 частта на посл. на Фибоначи
 int a, b, c; 
 for (a=b=1; (c=a+b) <300; a=b,b=c)  {
  out.print("<p>"+c+"</p>");
 }
%>

Начинът, по който е реализирана задачата използва една особеност на Java, а именно, че всяко присвояване на стойност на променлива всъщност се интерпретира и като израз, който е равен на присвоената стойност. Така a = 3 (инструкция за присвояване) има стойност 3 като израз.

Това позволява да съкратим инструкциите a = 1 и b = 1 като напишем a=b=1. Инструкцията a=b=1 се изпълнява от Java по следния начин "Задай стойност 1 на b. Интерпретирай b=1 като израз със стойност 1, която се присвоява на променливата a".

По същия начин (c=a+b) е и инструкция за присвояване и израз, който има стойност, равна на новата стойност на c. Именно тази нова стойност сравняваме срещу 300, за да преценим дали цикълът да спре.

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

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

Така например, ние можем вместо a=b=1 да запишем a=1, b=1. Използвахме същата възможност, за да запишем две инструкции (a=b и b=c) за изпълнение след края на всяка итерация.

Задача 15. Да се реализира Алгоритъмът на Евклид за намиране на най-големия общ делител на две цели числа.

Най-големият общ делител на две цели числа е най-голямото цяло число, което дели точно и двете. Така например най-големият общ делител на 8 и 12 е числото 4.

Алгоритъмът протича както следва:

  1. На първата променлива се присвоява стойността на първото число.
  2. На втората променлива се присвоява стойността на второто число.
  3. На третата променлива се присвоява остатъкът от целочисленото деление на първото на второто число.
  4. Ако стойността на третата променлива е 0, най-големият общ делител е във втората променлива и алгоритъмът приключва.
  5. На първата променлива се присвоява стойността на втората променлива.
  6. На втората променлива се присвоява стойността на третата променлива.
  7. Алгоритъмът се връща към стъпка 3.

ПРИМЕР:

Първа променливаВтора променливаТрета променлива
31353390981
39098121
812118
21183
1830

Алгоритъмът на Евклид е много прост, но много важен както за математиката, така и за теоретичната информатика, поради което е първият алгоритъм, разгледан от Доналд Кнут в неговия енциклопедичен труд, посветен на компютърните алгоритми - "Изкуството на компютърното програмиране".

II. Вложени цикли

Задача 15. Отпечатайте таблицата за умножение до 16x25. Оформете резултатите като показаната по-долу HTML таблица:

МножимоМножителПроизведение
111
122
.........

Задача 16a. Напишете програмен код, който отпечатва всички цели числа, които делят точно дадено число. Нека програмата вземе избраното число от специално инициализирана променлива с име n.

Решение (JSP фрагмент):

<table border="1">
<%
 int n = 50;        //Избраното от нас число, поставено в променлива с име n.
 out.println("<tr><th>Делители на числото "+n+"</th></tr>");
 for (int i=1; i<=n; i++) {
  if (n%i==0) {  // Ако остатъкът при деление на n на i е нула, това значи, че i дели точно n.
   out.println("<tr><td>"+i+"</td></tr>");  //извеждане на числото - делител
  } 
 }
%>
</table>

Задача 16б. Примерът от зад. 16а отпечатва 1 и самото число като делители. Така например, при n=5, резултатът ще бъде 1 и 5. Преработете го така, че тези числа да не се отпечатват като делители. В контекста на дадения пример, резултатът при n=5 след промените трябва да бъде празна таблица, тъй като 5 се дели точно само на 1 и на себе си.

Задача 16в. Напишете програма, която извежда в таблица всички прости числа между 1 и 1250.

СЪВЕТ: Едно число е просто, ако се дели само на единица и на себе си. Използвайте кода от примери 16a и 16б и съставете програма, която "обхожда" всички числа от 2 до 1250. За всяко от "обходените числа", програмата трябва да намери всички възможни делители. Ако такива са само 1 и самото число, то обхожданото в момента число е просто.

Work in progress beyond this point 17. Намерете всички двойки цели числа от 1 до 50, които са решения на системата от уравнения x+5y+z=7 и x

III. Масиви

Няма коментари:

Публикуване на коментар