C5 Projektowanie algorytmów z wykorzystaniem ptli for Rys. 5.1. Schemat ptli typu for wiczenie 1. for(wi; ww; wz){ instrukcja 1; instrukcja 2;... instrukcja n; gdzie: //wi wyraenie inicjujce, //ww wyraenie warunkowe, //wz wyraenie zmieniajce. Skonstruowa schemat blokowy i opracowa algorytm w postaci listy kroków dla poniszego algorytmu, zapisanego w jzyku Java. Zapisa ten algorytm w kodzie jzyka C++. 1
Algorytm 5.1. public class LiczbyParzyste_for { int r = 0; int a, b; String dolna = JOptionPane.showInputDialog("Podaj doln granic przedziału (a > 0): a = "); a = Integer.parseInt(dolna); int x = a; String gorna = JOptionPane.showInputDialog("Podaj górn granic przedziału (b > a): b = "); b = Integer.parseInt(gorna); System.out.println("Wybrano przedział <"+a+", "+b+">"); System.out.print("W zadanym przedziale wystpuj liczby parzyste: "); for(x = a; x <= b; x++){ r = x % 2; if(r == 0){ System.out.print(x+", "); Przykłady algorytmów iteracyjnych Algorytm Newtona-Raphsona Algorytm 5.2. public class NewtonRaphson { double p = 1; double q = 1; double a, x, eps, delta, pierwiastek; do{ String dane1 = JOptionPane.showInputDialog("Podaj nieujemn liczb podpierwiastkow a = "); a = Double.parseDouble(dane1); if(a<0) System.out.println("Błd danych"); while(a < 0); String dane2 = JOptionPane.showInputDialog("Podaj dokładno oblicze eps="); eps = Double.parseDouble(dane2); System.out.println("Liczba podpierwiastkowa a = " + a); System.out.println("Dokładno oblicze eps = " + eps); 2
while (q < a){ p = p+1; q = p*p; if (q == a){ System.out.println("Pierwiastkiem kwadratowym z a = " + a + " jest " + p); p = p - 1; x = (p + a/p)/2; delta = Math.abs(p - x); while (delta >= eps){ p = x; x = (p + a/p)/2; delta = Math.abs(p - x); System.out.println("Pierwiastek kwadratowy z a przy zadanej dokładnoci oblicze jest równy " + x ); Rys. 5.2. Algorytm Newtona-Raphsona obliczania pierwiastka kwadratowego z liczby a. 3
wiczenie 2. Opracowa algorytm Newtona-Raphsona obliczania pierwiastka kwadratowego z liczby a w postaci listy kroków, wykorzystujc ptle typu for, a nastpnie zaimplementowa ten algorytm w jzyku C++. Liczba doskonała Liczb doskonał jest liczba naturalna, równa sumie wszystkich swoich dzielników, mniejszych od niej samej. Poniej pokazano przykładowy schemat blokowy, rozwizujcy problem identyfikacji liczb doskonałych, oraz jego implementacj w jzyku Java. wiczenie 3. Opracowa algorytm z rysunku 5.3. w postaci listy kroków, wykorzystujc róne typy ptli iteracyjnych, a nastpnie zaimplementowa te algorytmy w jzyku C++. Rys. 5.3. Algorytm identyfikacji liczb doskonałych Algorytm 5.3. public class LiczbaDoskonala { int x = 0; int d; int s = 1; int i = 2; while(x <= 1){ String dane = JOptionPane.showInputDialog("Podaj liczb naturaln x = "); 4
x = Integer.parseInt(dane); if(x <= 0){ System.out.println("Błd danych"); else if(x == 1){ System.out.println("Liczba 1 nie jest liczb doskonał"); while(i < x){ d = x % i; if(d == 0){ s = s + i; i++; i++; System.out.print("Podana liczba x = " + x); if(s == x){ System.out.print(" jest liczb doskonał."); System.out.println(" nie jest liczb doskonał."); wiczenie 4. Opracowa algorytm drukujcy liczby doskonałe z zadanego przedziału <a, b>, wykorzystujc ptle typu for, a nastpnie zaimplementowa ten algorytm w jzyku C++. Algorytm 5.4. public class LiczbyDoskonale { int a, b, d; int s = 1; int i = 2; String dolna = JOptionPane.showInputDialog("Podaj doln granic a = "); a = Integer.parseInt(dolna); String gorna = JOptionPane.showInputDialog("Podaj górn granic b = "); b = Integer.parseInt(gorna); System.out.print("Liczby doskonałe w przedziale <a,b>: "); int x = a; 5
for (x=a; x<=b; x++){ i = 2; s = 1; while(i < x){ d = x % i; if(d == 0){ s = s + i; i++; i++; if(s == x){ System.out.print(x + ", "); wiczenie 5. Opracowa algorytm drukujcy liczby doskonałe, nie wiksze ni dana liczba a, według reguły Euklidesa X = 2 k 1 (2 k 1), k > 1, k N, wykorzystujc róne typy ptli iteracyjnych, a nastpnie zaimplementowa te algorytmy w jzyku C++. Liczba pierwsza Liczb pierwsz jest liczba naturalna, która dzieli si bez reszty tylko przez 1 i przez sam siebie. Poniej pokazano przykładowy schemat blokowy, rozwizujcy problem identyfikacji liczb doskonałych, oraz jego implementacj w jzyku Java. wiczenie 6. Opracowa algorytm z rysunku 5.4. w postaci listy kroków, wykorzystujc róne typy ptli iteracyjnych, a nastpnie zaimplementowa te algorytmy w jzyku C++. Algorytm 5.5. public class LiczbaPierwsza { int x = 0; int i = 2; String dane = JOptionPane.showInputDialog("Podaj liczb naturaln x = "); x = Integer.parseInt(dane); if(x < 0){ System.out.println("BŁD DANYCH!"); 6
System.out.print("Badana liczba x = " + x); if(x ==0 x == 1){ System.out.println(" nie jest liczb pierwsz ani złoon."); else if(x == 2){ System.out.println(" jest liczb pierwsz."); for(;x % i!= 0;i++); if (x == i){ System.out.println(" jest liczb pierwsz."); System.out.println(" nie jest liczb pierwsz."); Rys. 5.4. Algorytm badania czy liczba jest pierwsza, czy złoona. 7
ZADANIE 1. ZADANIA DO SAMODZIELNEGO WYKONANIA Opracowa algorytm drukujcy liczby pierwsze z zadanego przedziału <a, b>, wykorzystujc ptle typu for, a nastpnie zaimplementowa ten algorytm w jzyku C++. ZADANIE 2. Skonstruowa schematy blokowe, opracowa algorytmy w postaci listy kroków oraz kodu w jzyku C++ z wykorzystaniem ptli for, do obliczania: a) Wartoci silnia(n). b) Liczby kombinacji k-elementowych ze zbioru n-elementowego. c) Liczby wariacji k-elementowych ze zbioru n-elementowego bez powtórze i z powtórzeniami. d) Drukowania liczb pierwszych w zadanym przedziale <a, b> e) Drukowania liczb doskonałych w zadanym przedziale <a,b> f) Drukowania liczb trójktnych w zadanym przedziale <a,b> 8