Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Star wars, care e ordinea?

Upgrade stocare! Pot clona SS...

Oferta de locuinte a scazut in Ro...

amortizoare pentru alt model
 Ulei ungere lant /ulei amestec Hu...

Vreau sa incep sa joc tenis de camp

titanic 1:200 libertatea

Upgrade ram Asus Rog Zephyrus G16...
 Terminator End of war 2023

Senzor de prezența/mișc...

Filmare camera video sau smartphone

Rog confirmare/infirmare solutie ...
 Cablu fan controller - placa de b...

Un sfat, va rog, ce senzori sa fo...

Rezerva succesorala, donatie scut...

Prima History
 

For loop - putina intelegere

* - - - - 1 votes
  • Please log in to reply
11 replies to this topic

#1
Pieptoasa

Pieptoasa

    38G

  • Grup: Senior Members
  • Posts: 3,327
  • Înscris: 31.07.2011
Buna,
Sper sa postez unde trebuie si sper sa obtin ceea ce urmaresc si m-ar ajuta putin in procesul de intelegere. Se dau 2 exemple :
1 ceea ce nu prea inteleg care/cum se face legatura intre variabila i si ceea ce se printeaza. Acel "Java is fun" e atribuit de fapt variabilei i? Deci ceea ce printreaza are legatura implicit cu ce se intampla in for?
2 variabila i e ceva temporar util doar in for loop?


int n = 5;
// for loop
for (int i = 1; i <= n; ++i) {
	 System.out.println("Java is fun");
}


int n = 5;
// for loop
for (int i = 1; i <= n; ++i) {
	 System.out.println(i);
}


3 iar ca intrebare suplimentara : care e de fapt diferenta intre a avea System.out.println inafara buclei for si .. in interior (acele acolade)

4 care e diferenta intre algoritmul clasei main si al claselor adiacente?
Multumesc f mult.

Edited by Pieptoasa, 29 December 2021 - 13:30.


#2
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,076
  • Înscris: 10.08.2005
In primul caz iteratorul n-are legatura cu ce se printeaza, asta in contrast cu cel de al doilea caz, unde iteratorul este elementul printat.

Tot ce este intre acolade este rulat de cate ori este indeplinita conditia, in exemplul tau: " i <= n "

Edited by MarianG, 29 December 2021 - 13:34.


#3
Flat

Flat

    Bugetar Esențial

  • Grup: Senior Members
  • Posts: 32,875
  • Înscris: 23.06.2006
dacă e în buclă face de atâtea ori cât trece prin buclă, deci printează de 5 ori ceva... ori java is fun, ori 12345
daca e în afara buclei face doar o dată, logic

#4
bai3tzash

bai3tzash

    Membru

  • Grup: Senior Members
  • Posts: 6,034
  • Înscris: 01.08.2006
Cat ma mai duce capul din algoritmica din liceu:
- in primul caz, se printeaza Java is fun pentru fiecare i mai mic sau egal cu n. Adica de 5 ori, caci n = 5.
- in al doilea caz, tot asa, se trece cu i de la 1 la 5, dar printeaza ce contine variabila i, adica pe rand 1, 2, 3, 4, 5.

Pe romaneste: prinul caz: se da n = 5. Pentru i de la 1 la 5, (adica i ia pe rand valoarea 1,2,3,4,5) printeaza Java is fun.
Al doilea caz: Pentru i de la 1 la 5, (adica i ia pe rand valoarea 1,2,3,4,5) printeaza valoarea lui i (adica 1,2,3,4,5).

Ce e dupa for (int i = 1; i <= n; ++i), intre acolade, se face de fiecare daca atata timp cat i e mai mic sau egal cu n.

Edited by bai3tzash, 29 December 2021 - 13:37.


#5
Pieptoasa

Pieptoasa

    38G

  • Grup: Senior Members
  • Posts: 3,327
  • Înscris: 31.07.2011
Deci legatura intre iterator si ceea ce printeaza e data de acel n =5; i<=n pana la urma..
Am intalnit cazuri si in afara acoladei si se printeaza.. asta imi era nelamurirea.

#6
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,076
  • Înscris: 10.08.2005

Quote

variabila i e ceva temporar util doar in for loop?
in codul prezentat de tine, da, i este o variabila care isi serveste scopul doar in interiorul acoladelor.

View PostPieptoasa, on 29 decembrie 2021 - 13:36, said:

Deci legatura intre iterator si ceea ce printeaza e data de acel n =5; i<=n pana la urma..
Am intalnit cazuri si in afara acoladei si se printeaza.. asta imi era nelamurirea.
acel n o sa dicteze de cate ori se repeta codul dintre acolade

View PostPieptoasa, on 29 decembrie 2021 - 13:36, said:

Am intalnit cazuri si in afara acoladei si se printeaza.. asta imi era nelamurirea.
Se poate si fara acolade, dar se va repeta doar prima linie;

for (int i = 1; i <= n; ++i)
		 System.out.println("This is repeating");
		 System.out.println("This is not);


Edited by MarianG, 29 December 2021 - 13:44.


#7
Mosotti

Mosotti

    Geniu umil

  • Grup: Senior Members
  • Posts: 33,290
  • Înscris: 21.04.2004
1. Instructiunea for executa un bloc de cod de atitea ori cit conditia din a doua expresie este true. Formatul este

for (expresie1; expresie2; expresie3)

expresie1 se excuta o singura data la inceput
expresie2 e conditia de iesire din bucla
expresie3 se executa dupa fiecare bloc executat

In cazul tau, daca ai

int n = 5;
// for loop
for (int i = 1; i <= n; ++i) {
		 System.out.println("Java is fun");
}

- prima data se va executa o singura data i = 1;
- apoi va verifica daca i este mai mic decit n care este 5, daca da executa System.out
- apoi se executa ++i, care e practic i = i + 1

Acuma daca nu ai decit o instructiune in bloc, poti sa  nu pui acolade. Nu recomand, dar poti scrie

int n = 5;
// for loop
for (int i = 1; i <= n; ++i)
		 System.out.println("Java is fun");


sau chiar

int n = 5;
// for loop
for (int i = 1; i <= n; ++i) System.out.println("Java is fun");


In felul acesta faci codul din ce in ce mai nasol de citit si pe toti care vin dupa tine sa te injure de mama & shit.

2. Daca varianbila i este definita in for, atunci e variabila locala pentru for si daca vrei s-o folosesti dupa o sa primesti eroare de compilare. Dar daca vrei sa o poti folosi mai departe o poti defini inainte

int n = 5;
int i;
for (i = 1; i <= n; ++i) {
System.out.println("Java is fun");
}
System.out.println(i);


Daca rulezi codul de mai sus la sfirsit o sa tipareasca 6, adica a executat for de 5 ori, a incrementat i la 6 si a iesit pentru ca conditia este sa fie <= 5.

Si acuma niste chestii amuzante care fac Java sa nu mai fie fun deloc. Nici una din expresiile din for nu este obligatorie. De exemplu codul urmator face acelasi lucru cu codul de mai sus

int n = 5;
int i = 1;
for (; i <= n; ++i) {
	 System.out.println("Java is fun");
}
System.out.println(i);


Sau putem scrie:

int n = 5;
int i = 1;
for (; i <= n;) {
	 System.out.println("Java is fun");
}


si o sa ruleze la infinit.

Sau putem scrie

for (; ;) {
	 System.out.println("Java is fun");
}


si iar ruleaza la infinit. Fun as fuck Posted Image

4. Clasa "main" e punctul de intrare in aplicatie prin functia main.

public static void main(String[] args)

In parametrul args iti vin parametri pe care ii dai din linie de comanda sau prin setare in IDE

#8
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 29,852
  • Înscris: 24.02.2007
Rulezi codul pas cu pas (linie cu linie) in debugger si inspectezi fiecare variabila (iti arata debuggerul valoarea in fiecare moment).

#9
maccip

maccip

    45 ani

  • Grup: Senior Members
  • Posts: 32,304
  • Înscris: 06.01.2007

View PostPieptoasa, on 29 decembrie 2021 - 13:26, said:

1 ceea ce nu prea inteleg care/cum se face legatura intre variabila i si ceea ce se printeaza. Acel "Java is fun" e atribuit de fapt variabilei i? Deci ceea ce printreaza are legatura implicit cu ce se intampla in for?
Ceea ce se printeaza, nu are legatura cu variabila i, in cazul tau. Daca printai "Java " + i + " is fun", ar fi avut legatura, deoarece i-ul aparea in textul printat, cumva. Sper sa fie corecta sintactic expresia, eu nu stiu Java.
Doar ca, tu printezi intr-o bucla for care se deruleaza de n ori ( in timpul in care i-ul ia valori de la 1 la n). Asadar, vei printa mesajul "Java is fun" de n ori. Mesajul in sine neavand legatura directa cu variabila i. For-ul e ala cu legatura directa, nu blocul { } pe care-l gestioneaza.

View PostPieptoasa, on 29 decembrie 2021 - 13:26, said:

2 variabila i e ceva temporar util doar in for loop?
Strict in cazul Java, nu stiu exact, dar trebuie sa gandesti in termeni de componente ale sintaxei. In cazul tau, declaratia "int i" se afla pusa in cadrul instructiunii for, nu in interiorul blocului pe care-l patroneaza {}. Depinde de specificatiile limbajului daca sau nu  aceasta variabila e sau nu vizibila in afara blocului { }. Conceptul de declaratie insa e distinct fata de cel de bucla for. Limbajele gasesc shortcuturi sa le combine, in cazul tau ai si o declaratie si o bucla for, iar modul exact depinde de specificatiile Java pe care nu le cunosc.
Dar poti testa si te invit la chestia asta. E modul prin care vezi singura. Judecand dupa modul in care pui intrebarea, cred ca nu realizezi ca poti vedea singura chestia asta.
Daca e variabila locala in cadrul buclei (La C# asa e) , atunci nu va putea fi referentiata in afara "cadrului" in care e definita. Compilatorul iti va da eroare.
Daca e variabila locala vizibila si in afara buclei (C++ asa are, cred), atunci variabila in afara buclei va avea valoarea cu care a iesit din bucla, in cazul tau n+1, adica 6.
E chestie de sintaxa a limbajului, nu prea te ajuta sa stii, daca esti interesata mai degraba de ce vrei sa exprimi prin acea sintaxa decat sintaxa insasi.
Unele limbaje nici macar nu permit combinatia respectiva si te obliga sa declari intai si apoi sa folosesti. Mi se pare ca C-ul asa este.
Adica trebuie sa faci
int i;
for(i=0;...)
{ }

Chestii de sintaxa. Daca se compileaza inseamna ca sintaxa e buna, daca nu insamna ca compilatorul nu pricepe. Nu e important insa din perspectiva ta ca decat strict in ideea de a satisface capriciile compilatorului, limbajului.
E un mod de a vedea lucrurile.

View PostPieptoasa, on 29 decembrie 2021 - 13:26, said:

3 iar ca intrebare suplimentara : care e de fapt diferenta intre a avea System.out.println inafara buclei for si .. in interior (acele acolade)
Interiorul acestei acolade e ca un loc vrajit. Tot ce se afla acolo, se executa de atatea ori de cate vrea for-ul.
La fiecare executie se schimba (in cazul tau) i-ul accordingly.
In printare tu nu folosesti i-ul, dar el ia valori succesive de la 1 pana la n. Inainte de a iesi de tot din bucla for, i-ul va lua valoarea n+1 si va fi comparat i<=n.
Ar trebui totusi sa printezi si i-ul in cadrul buclei sa vezi exact ce se intampla.
In afara buclei, functie de specificatiile limbajului, acel i poa sa nu existe deloc, sau daca exista, va avea valoarea n+1.
Daca printezi in afara buclei, te vei afla in cazul tau in locul vrajit de blocul care contine totul, in cazul tau functia Main() probabil.
Ca atare, se va executa o singura data.
Poti avea bucla for in bucla for, caz in care vrajile se suprapun. De exemplu cudul urmator:
for(int i=0;i<5, i++)
for(int j=0; j<6; j++)
	 Printblabla (" Sunt frumoasa! ");

va printa " Sunt frumoasa! " de 5*6=30 de ori.

View PostPieptoasa, on 29 decembrie 2021 - 13:26, said:

4 care e diferenta intre algoritmul clasei main si al claselor adiacente?
Intrebarea nu cred ca e pusa corect. Cred ca te intereseaza mai degraba ce semnificatie deosebita are clasa Main fata de celelalte.
Si, sa dea naibii ca nici aici nu-ti pot raspunde strict la textul intrebarii, chiar reformulata de catre mine, pentru ca nu stiu Java.
Ce stiu insa e ca, un program executabil, are o multime de functii, in cazul limbajelor orientate pe obiecte cum e Java, aceste functii sunt incapsulate in clase. Si compilatorul trebuie sa stie care-i functia pe care vrei tu sa inceapa executia.
In C# spre exemplu, nu are importanta ce nume are clasa, atata timp cat exista una si numai una functie Main().
Chestia e ca, compilatorul trebuie sa stie de unde vrei tu sa incepi executia unui program. Si in mod conventional, functia respectiva trebuie sa se cheme Main(), asa-i la multe limbaje, nu numai la Java.
Insa clasa din care face parte, nu-i musai sa se cheme Main, cel putin nu la C#, C++ si tind sa cred ca nici la Java.
Daca scii o librarie de programe, un DLL, de exemplu, nu mai ai nevoie de un Main(), pentru ca nu poti lansa direct un DLL in executie. DLL-ul e folosit de alte EXE-uri, iar acestea isi aleg ca dintr-un bufet suedez ceea ce vor ele sa consume din acest DLL. Mainul poa sa nu existe in acest caz. Nici compilatorul nu-l cere.
Main de fapt nu e o caracteristica a limbajului in sine ci o conventie intre programator si compilator prin care programatorul instruieste compilatorul sa produca cod pentru procesor incepand de la acel punct, de la intrarea in Main.
Daca e sa vorbim in continuare in termeni de vraja locului, ei bine, blocul din interiorul Main() e locul care prinde sigur sansa de a fi executat si va fi executat o singura data, in ordinea instructiunilor tot ce se afla inauntru(daca n-ai alte vraji care sa anuleze, sa iasa din Main, sa te bage in bucle for(;Posted Image, etc..
Celelalte functii, cu alt nume, prin dreptul de executie doar daca sunt apelate direct sau indirect din Main().
Si tot apropo de vraji si de minuni, pe mine ma minuneaza ca pe tine te preocupa atatea lucruri. Poate ca nu sunt cel mai in masura sa-ti raspund, dat fiind faptul ca, repet din nou, nu stiu Java, insa am vrut sa particip si eu la acest concurs, cu baietii. Sper sa-ti fi fost de ajutor!
Posted Image

#10
Pieptoasa

Pieptoasa

    38G

  • Grup: Senior Members
  • Posts: 3,327
  • Înscris: 31.07.2011
Multumesc foarte mult pentru efortul depus si explicatiile amanuntite.
Sunt curioasa de aceste amanunte pentru a nu-mi fi greu mai acolo - se zice ca totul trebuie inteles temeinic la momentul actiunii.
Am inteles toate exemplele date si-mi sunt utile..

Quote

Intrebarea nu cred ca e pusa corect. Cred ca te intereseaza mai degraba ce semnificatie deosebita are clasa Main fata de celelalte.
Ma interesa initial si daca exista posibilitatea de a avea metoda nested (sau functie in alte limbaje cred) cu posibilitatea de a contribui la cea principala (main) ori ba.

Quote

Si tot apropo de vraji si de minuni, pe mine ma minuneaza ca pe tine te preocupa atatea lucruri.
De ce? poate imi poti da solutia salvatoare pentru a intelege mai usor sau mai bine toate notiunile acestea introductive - sau pentru a fi si mai interesant, imi poti spune cat de util imi e pe viitor ca acum sa intru in asemenea detalii si sa nu le iau de'a..gata.

Quote

Rulezi codul pas cu pas (linie cu linie) in debugger si inspectezi fiecare variabila (iti arata debuggerul valoarea in fiecare moment).
Da.. am incercat dar nu in toate cazurile imi ofera solutiile/raspunsurile la care m-as fi asteptat/mi s-ar fi parut logice mie.
Spre exemplu : vreau sa impart nr. 283746 in doua.. sa le fac reverse si apoi sa le compar. Poate exista functionalitate de split , pt. comparatie == dar la reverse.. Deci succesiunea asta de operatii si care sunt ele efectiv as vrea sa stiu cum le pot deduce mai usor din..cerintele problemei.
ceva de genul..
split 283 746
reversed 382 647
compare 382 == 647
print (compare)


Edited by Pieptoasa, 29 December 2021 - 19:43.


#11
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,076
  • Înscris: 10.08.2005
reverse, in java
https://www.javatpoi...-string-in-java

#12
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,076
  • Înscris: 10.08.2005
https://forum.softpe.../#entry28636865
va rog, o problema un topic

Anunturi

Chirurgia cranio-cerebrală minim invazivă Chirurgia cranio-cerebrală minim invazivă

Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne.

Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate