Transcript while

Java – Instructiuni (ciclul si altul

Cicluri

  

while do while for Salturi

 

break continue

Ciclul while

while - 1

    se utilizeaza atunci cand nu stim de cate ori avem de repetat corpul ( instructiune ) si repetarea trebuie sa continue cat timp conditie este

true

; toate variabilele din conditie de evaluarea conditiei; trebuie sa fie declarate inainte este posibil ca instructiune

false

sa nu se ruleze (daca conditie la prima evaluare a ei).

este iata cateva probleme:

int x; while (x) {…} // eroare, x trebuie sa fie boolean while (x=1) {…}// eroare, lui x I se atribuie 1 while (true) {…} // merge, ciclu while infinit

while – aplicatie 1/1

Cunoscându-se valoarea depunerii iniţiale şi rata anuală se cere să se determine numărul de luni necesar pentru a cumula în cont o sumă impusă de bani. Dobânda se calculează lunar şi se cumulează (se adună) cu valoarea din cont.

Datele (sau spaţiul datelor, atributele, caracteristicle)

Este reprezentat prin mulţimea variabilelor foloşite pentru stocarea şi soluţionarea cerinţei impuse.

while – aplicatie 1/2

Codul (sau spaţiul transformărilor, actiunile, functiile, procedurile, metodele)

Este dat de mulţimea operaţiunilor efectuate asupra spaţiului de date pentru găsirea soluţiei. Datele de intrare se modifică ca urmare a citirii valorilor corespunzătoare de la tastatură.

Calculul dobânzii pe lună:

dobânda pe lună = dobandaan / 100. / 12.

Se împarte cu 100 deoarece dobânda pe an se dă în procente şi cu 12 deoarece anul are 12 luni. Dacă suma existentă în cont se înmulţeşte cu această valoare se obţine câştigul lunar pe suma totală din cont.

Cumularea lunară a dobânzii:

cont = cont + cont * dobânda pe lună Valoarea nouă a contului va fi cea veche la care se mai adaugă câştigul ca urmăre a dobânzii lunare.

Actualizarea lunii

luni = luni + 1 Variabila se actualizrează prin creştere cu o unitate până când scopul nu s-a atins. Atingerea scopului duce la afişarea valorii acestei variabile şi la terminarea aplicaţiei

while – aplicatie 1/3 (pseudocod)

Citeşte scop Citeşte depunere Citeşte dobandaan in % // iniţializări cont = depunere; luni = 0; // actualizarea contului pe luna // pana cand scopul este atins Repetă cât timp (cont <= scop) { dobandalunara = cont * dobandaan / 100 / 12; //calcul dobanda lunara cont = cont + dobandalunara; //cumulare dabanda lunara luni = luni + 1; //crestere luna } //afisare rezultat(e) Afisare luni

while – aplicatie 1/4 (cod Java)

import java.util.*; public class Dobanda { public static void main(String[] args) { // citirea datelor de intrare Scanner in = new Scanner(System.in); System.out.print("De ce suma ai nevoie? "); double scop = in.nextDouble(); System.out.print("Care e suma initiala? "); double depunere = in.nextDouble(); System.out.print("Dobanda anuala %: "); double dobandaan = in.nextDouble(); // initializare double cont = depunere; int luni = 0; // actualizarea contului pe luna // pana cand scopul este atins while (cont <= scop) { // dobanda pe luna se calculeaza din cont double dobandalunara = cont * dobandaan / 100 / 12; cont += dobandalunara; luni++; } // afisarea rezultatului System.out.println("Ajungi la suma dorita in " + luni + " luni."); } }

while – aplicatie 2/1

Să se calculeze şi să se afişeze media aritmetică a unei clase formate din 5 elevi. Media fiecărui elev este un număr întreg care se citeşte de la tastatură.

Datele (sau spaţiul datelor, atributele, caracteristicle)

while – aplicatie 2/2

Codul (sau spaţiul transformărilor, actiunile, functiile, procedurile, metodele) Suma mediilor individuale

total = total + notaElev Suma mediilor individuale presupune o adunare repetată ce se termină atunci când s-au prelucrat toti elevii. Această sumă se realizează pe măsură ce se citeşte câte o medie de elev. Valoarea nouă a totalului este cea anterioară (veche) la care se adună ultima medie citită.

Media aritmetica

mediaClasa = total / 5.

Este data de suma mediilor clasei impartita la cate medii am citi, in cazul notru 5;

while – aplicatie 2/3 (pseudocod)

//initializari total = 0; contorElev = 1; //totalul mediilor individuale Repetă cât timp (contorElev <= 5) { Citeste notaElev total = total + notaElev //insumeaza media individuala citita contorElev = contorElev +1 //creste contor elev } //calcul medie clasa mediaClasa = total / 5.

//afisare rezultat Afisare mediaClasa

while – aplicatie 2/4 (cod Java)

import javax.swing.JOptionPane; public class Media { public static void main(String[] args) { int total; int contorElev; int notaElev; double mediaClasa; String sirNota; } //initializari total = 0; contorElev = 1; //totalul mediilor individuale while (contorElev <= 5) { sirNota = JOptionPane.showInputDialog("Nota pentru elev " + contorElev); notaElev = Integer.parseInt(sirNota); // sunt scrieri alternative ale instructiunilor total = total + notaElev; //total+=notaElev; contorElev= contorElev +1; //++contorElev; } //calcul medie clasa mediaClasa = total / 5.; //afisare rezultat JOptionPane.showMessageDialog(null, "Media clasei este: " + mediaClasa); }

do while

do while – aplicatie 1

import java.util.Scanner; Acesta este o implementare folosind ciclul

do while

1 de la ciclul

while

a aplicaţiei . La fiecare reluare a ciclului utilizatorul se afiseaza cati bani are in cont si este intrebat daca doreste sa mai continue ciclul.

public class DobandaV1 { public static void main(String[] args) { // citirea datelor de intrare double scop, depunere, cont, dobandaan, dobandalunara; int luni; String raspuns; Scanner in = new Scanner(System.in); System.out.print("De ce suma ai nevoie? "); scop = in.nextDouble(); System.out.print("Care e suma initiala? "); depunere = in.nextDouble(); System.out.print("Dobanda anuala %: "); dobandaan = in.nextDouble(); // initializarei cont = depunere; luni = 0; } // actualizarea contului pe luna // pana cand scopul este atins do { // dobanda pe luna se calculeaza din cont dobandalunara = cont * dobandaan / 100 / 12; cont += dobandalunara; luni++; System.out.println("Dupa " + luni + " luni ai acumulat " + cont + " RON"); System.out.print("Iti ajunge suma acumulata? (D/N): "); raspuns = in.next(); } while (raspuns.equals("D")) ; }

while - 1

    se utilizeaza atunci cand nu stim de cate ori avem de repetat corpul ( instructiune ) si repetarea trebuie sa continue cat timp conditie este

true

; toate variabilele din conditie de evaluarea conditiei; trebuie sa fie declarate inainte este posibil ca instructiune

false

sa nu se ruleze (daca conditie la prima evaluare a ei).

este iata cateva probleme:

int x; while (x) {…} // eroare, x trebuie sa fie boolean while (x=1) {…}// eroare, lui x I se atribuie 1 while (true) {…} // merge, ciclu while infinit

for

for – aplicatie 1 / 1

Să se scrie o aplicaţie pentru calcului lui n! = 1*2*3* ... *n, cu 1! = 1.

import java.util.*; public class factorial { public static void main(String[] args) { Scanner in = new Scanner(System.in); } } System.out.print("n: "); int n = in.nextInt(); long fact = 1;

for(int i = 1; i<=n ; ++i) fact=fact*i; //sau fact*=i;

Rezultate: n: 5 5! = 120 n: 555 555! = 0 System.out.println(n+"! = "+fact); Aceste rezultat este gresit motiv pentru care reimplementam codul Java folosind clase speciale Java ce stiu lucra cu numere intregi foarte mari (peste pribilitatea de reprezentarea a primitivelor intregi)

break si continue

 break si continue permit oprirea executiei ciclului ( break ) sau doar a iteratiei curente ( continue );  la iesire din ciclu;  tipic, undeva in corpul ciclului, se face un test care obliga instructiunile pot si etichetate, situatie in care ciclurile sunt imbricate (altfel nu este nevoie de etichete); etichetele trebuie sa fie scrise in cicluri, altfel codul nu se compileaza; numele etichetei trebuie sa respecte regulile de scriere a unui nume de variabila Java.

Aplicatii – 1/1

Scrieti codul Java pentru algoritmul de aflare a solutiei unei ecuatii cu metoda injumatatirii intervalului avand descrierea metodei si pseudocodul.

Desriere

Daca f este continua si este negativa pentru x = a si pozitiva pentru x = b, exista cel putin o slutie reala intre a si b. Calculam pe f ((a +b)/2), valoarea finctiei la mijlocul intervalului a< x < b si avem variantele: 1. f ((a + b)/2) = 0, cand (a + b)/2 este radacina; 2. f ((a + b)/2) <0, cand redacina este in intervalul dintre (a + b)/2 si b; 3. f ((a + b)/2) > 0, cand radacina este in intervalul dintre a si (a + b)/2.

Pseudocod var a,b,eps:real while abs(b-a) < eps x:=(a+b)/2 if (f(x) ==0) print “Rad. este:”,x stop endif if sgn(f(a))*sgn(f(x)) >0 a=x else b=x endif endwhile print “Rad. Aprox este:”,x

Aplicatii – 1/2

f(x)=4sin(x)-x+1, x in [-3,3]

public class Injumatarire { static double a, b, x, eps; public static double f(double x) { return 4. * Math.sin(x) - x + 1.; } public static void main(String[] args) { a = -3.; b = 3.; eps = 1.e-07; while (Math.abs(b - a) > eps) { x = (a + b) / 2.; if (f(x) == 0) { System.out.println("Radacina este: " + x); System.exit(0); } if (Math.signum(f(a)) * Math.signum(f(x)) > 0) a = x; else b = x; } System.out.println("Radacina aprox. (cu Inj): " + x); } }

Aplicatii – 2/1

Scrieti codul Java pentru algoritmul de aflare a solutiei unei ecuatii cu metoda Newton-Raphson avand descrierea metodei si pseudocodul.

Pseudocod Desriere

Determinarea radacinii reale a ecuatiei f(x)=0 se face plecand de la un singur punct, apropiat de radacina.

Idea metodei consta in aproximarea lui f intr-un punct dat printr-o linie. Apoi, se afla solutia ecuatiei asociate liniei. Procesul se continua pana cand modificarile in solutia aproximativa incep sa devine nesemnificative (mici).

var x0,x,eps: real max_iter, n: integer read x0,max_iter, eps n=0 x=x0 do aux:=f(x0)/f’(x0) x:=x-aux n:=n+1 while abs(aux) > eps & n<=max_iter print “Rad. aprox:”,x if abs(aux) >= eps print “Precizia nu s-a atins in”, n, “iteratii” endif

Aplicatii – 2/2

f(x)=4sin(x)-x+1, x0=3

public class NewtonRaphson { static double x, eps; static int max_iter, n; public static double f(double x) { return 4. * Math.sin(x) - x + 1.; } public static double fderivat(double x) { final double h = 0.001; return (f(x + h) - f(x)) / h; } public static void main(String[] args) { double aux; x = 3.; max_iter = 200; eps = 1.e-7; do { aux = f(x) / fderivat(x); x -= aux; ++n; } while ((Math.abs(aux) > eps) && (n <= max_iter)); System.out.println("Radacina aprox. (cu N-R): " + x); if (Math.abs(aux) >= eps) { System.out.println("Precizia nu e a fot atinsa in " + n + " iteratii"); } } }

Aplicatii 3/1

Scrieti codul Java pentru calcul integralelor definite cu metoda Simpson avand descrierea metodei si pseudocodul.

x

2

i

Desriere

Aproximarea functiei de integrat se face pe subintervale folosind parabole. Parabola ( y=ax2+bx+c Aproximarea lui f pe 2 intervale adiacente in 3 puncte (x i-1 ) se determina prin 3 puncte. ,f(x i-1 )), (x necesita n puncte (numarul de subintervale e par iar cel de puncte impar, trebuie determinati coeficientii a,b,c). [a,b] se imparte in 2n parti fiecare de lungime (b-a)/(2n). x primets valorile x

x

2

i

  0 2

f

, x (

x

1 ) … ,x

dx

 2n-1

h

3 

f

,x (

x

2n 2

i

) si avem  4

f

i ( ,f(x

x

2

i

i  1 )) si(x ) 

a b

f f

( ( i+1

x x

2

i

)  ,f(x

dx

2 )   i+1

n i

 1  0 ))

x

2  

x i

 2

i

2

f

(

x

)

dx

Pseudocod var a,b,h,s,x:real i,n:integer h:=(b-a)/2/n s:=(f(b)+f(a))/2 x:=a for i:=1 to n-1 x:=x+h s:=s+2*f(x) x:=x+h s:=s+f(x) endfor x:=x+h s:=s+2*f(x) s:=2*h*s/3; print “Integrala (cu S): “, s

Aplicatii 3/2

} public class Simpson { public static double a, b, h, s, x; public static int i, n; public static double f(double x) { return Math.sqrt(1 - x * x); } public static void main(String[] args) { a = 0; b = 0.5; n = 100; 1 /  0 2

a=0, b=0.5, n=100

h = (b - a) / 2. / n; s = (f(b) + f(a)) / 2.; x = a; for (i = 1; i < n; ++i) { x += h; s += 2 * f(x); x += h; s += f(x); } x += h; s += 2. * f(x); s *= 2 * h / 3.; System.out.println("Valoarea integralei(cu S): " + s); 1 

x

2

dx

}

Bibliografie

  http://www.east.utcluj.ro/mb/mep/antal/downloads.html

IDE (JDeveloper), JDK and JRE, JDeveloper labs.

> Java: course, http://docs.oracle.com/cd/E18941_01/tutorials/jdtut_11r2_50/jdtut_11r2 _50.html

> Getting Started With the JDeveloper IDE