Jump to content

th3#afk

Administrators
  • Posts

    2,061
  • Joined

  • Last visited

  • Days Won

    128
  • Points

    292,599 [ Donate ]
  • Country

    Romania

Everything posted by th3#afk

  1. Chiar ne am distrat azi ! https://imgur.com/bmP8eIk
  2. This post cannot be displayed because it is in a password protected forum. Enter Password
  3. NU TINE IN VIATA TA OAMENI CARE NU VOR SA RAMANA Ai o inima mare! Permite-le sa plece, sa isi imbratiseze viitorul chiar daca tu nu vei mai fi o parte din viata lor. Permite-le sa fie fericiti fara tine. Permite-le sa gaseasca pe cineva cu o inima mai mare decat a ta... pe cineva care le poate oferi mai multa fericire decat le-ai putut oferi tu vreodata. Asa cum nu poti sterge cu buretele trecutul si cum unele actiuni nu pot fi uitate... nici unii oameni nu pot fi tinuti cu forta langa tine. Poate ca au fost perfecti la un moment dat, intr-o perioada confortabila a vietii tale. Poate ca ei au reusit sa lipeasca bucatile inimii tale frante incat ai putut ca nu mai poti trai fara ei. Poate ca, in mod dramatic, i-ai iubit odata. Insa atunci cand vor pleca iti vei da seama ca, in ciuda faptului ca nu mai sunt langa tine, vei fi in continuare tu. Vei fi intreaga. Nu iti va lipsi nimic. Cicatricile vor fi aproape vindecate. Si te vei intreba: cine ti-a vindecat inima? Oare au fost ei... sau tu ai reusit sa depasesti toate problemele singura? Poate ca nu vei stii niciodata. Insa ce vei stii cu adevarat este cum au reusit sa te schimbe. Amintirile tale cu ei vor alerga prin venele tale pentru totdeauna si iti vor tine companie chiar si in noptile singure. Au lasat o pata permanenta pe inima ta, pe care nu o vei mai putea sterge niciodata. Indiferent de cat de amar a fost sfarsitul sau cat de dureroasa a fost despartirea, au existat multe momente frumoase - momente de care iti vei aminti cu drag in viitorul indepartat. Nu nega acest fapt. In loc sa te intrebi de ce au plecat, probabil ca ar trebui sa te intrebi: de ce nu i-ai putut face sa ramana? Insa nu mai poti schimba trecutul. Insa ceea ce poti schimba este modul in care iti vei imbratisa viitorul fara acesti oameni in viata ta. Ai o inima mare! Permite-le sa plece, sa isi imbratiseze viitorul chiar daca tu nu vei mai fi o parte din viata lor. Permite-le sa fie fericiti fara tine. Permite-le sa gaseasca pe cineva cu o inima mai mare decat a ta... pe cineva care le poate oferi mai multa fericire decat le-ai putut oferi tu vreodata. O data ce vei reusi sa faci asta, iti vei elibera sufletul. Si, in cele din urma, vei putea sa mergi mai departe. Si, la fel ca si ei, vei gasi un loc mai bun si pe cineva care sa te iubeasca mai mult. sursa material: thoughtcatalog
  4. Niciun bărbat nu pleacă pur și simplu, fără motiv, dintr-o relație. Iar motivele pot fi multe, însă majoritatea nu sunt generate de tine. El pleacă, fie pentru că este convins că a găsit ceva mai bun, fie că are în vizor o nouă cucerire și pentru a fi acceptat este nevoie să își facă ordine în viață – cel puțin așa crede el. Cert este că, atunci când pleacă, va arunca toată vina asupra ta, lăsându-te să te cufunzi într-un abis de sentimente de vinovăție. După o vreme, după ce te-a lăsat cu inima sfârtecată de durere, după ce reușești să treci peste această mare suferință, te sună și îți cere să te vezi cu el. Și accepți, pentru că încă mai ai multe întrebări la care nu ai găsit răspunsuri. Gândești că este un prilej bun pentru a clarifica ceea ce a dus la ruptura relației voastre și, de ce să nu recunoaștem, tu încă îl mai iubești. Dar ce s-a întâmplat în tot acest timp? Unde a fost și ce l-a determinat să se întoarcă? Lucrurile sunt mult mai simple decât îți imaginezi. Cea pentru care te-a părăsit s-a dovedit a fi o alegere neinspirată. Cei care înșală, de cele mai multe ori se înșală pe ei înșiși. Să te vezi cu cineva, pe ascuns, doar pentru a consuma niște momente de tandrețe, nu înseamnă că vei ajunge să cunoști persoana cu adevărat. Majoritatea bărbaților care aleg să rămână cu amanta, într-un final, vor ajunge să regrete. Totul pare frumos când aștepți o zi întreagă să te vezi cu cineva cu care schimbi toată ziua mesaje siropoase. Ți se pare că acea persoană te înțelege și că îți oferă ceea ce nu mai poți găsi la nimeni, în niciun loc. Este palpitant, tocmai pentru că ceea ce faci nu este permis. Și mi-aș permite să spun că oamenii care înșală, nu o fac neapărat pentru că le place atât de mult persoana cu care înșală încât nu se pot abține, ci mai degrabă le place să înșele, să se ascundă, să obțină adrenalina aceea care le amplifică simțurile. Nu știu dacă ați observat dar, în general, bărbații care înșală, nu o fac cu femei mai frumoase și mai bune decât cele pe care le înșală. Atunci când un bărbat hotărăște să rămână cu amanta, va avea ocazia să o cunoască cu adevărat. Și ce credeți? Dezamăgire!Credeți că momentele de tandrețe sunt totul într-o relație? Nu, în niciun caz! Astfel, trădătorul, plin de regrete, se întoarce. Cea de-a doua situație este un fel de trădare cu premeditare și presupune mai mult tact. Se întâmplă atunci când bărbatului i se pare că o femeie, pe care o admiră de multă vreme, flirtează cu el. Știind că acea femeie are principii sănătoase și că nu va accepta niciodată să aibă o relație cu un bărbat implicat într-o altă relație, el va miza totul pe o singură carte. Astfel, cu o încredere exagerată de sine, el va da cu piciorul la tot, mizând pe “reușita” lui colosală care stă să vină. După ce scapă de “bagajul” nedorit, după ce se înarmează cu bunătate și răbdare, își pune masca de victimă a unei relații eșuate și atacă. Doar că, surpriză! Femeia aceea nu a fost niciodată interesată de el, ea doar era sociabilă și politicoasă. Tot planul lui măreț de a se repoziționa în societate și de a atinge succesul printr-o singură mișcare “inteligentă”, se năruie. Și cum este normal, se va întoarce de unde a plecat, cu capul plecat, plin de remușcari, promițând marea cu sarea. Acestea au fost doar două exemple, însă sunt multe situații în care el pleacă, convins fiind că va avea ceva mai bun. Astfel de bărbați nu pot iubi cu adevărat o femeie, pentru că se iubesc atât de mult pe ei, încât nu mai rămâne iubire și pentru femeia de lângă ei. Orice femeie preferă să creadă că bărbatul care se întoarce, o face pentru că și-a dat seama că o iubește doar pe ea. Că ea este unică și specială, și percepe această experiență ca o lecție pe care bărbatul a învățat-o. Dar, în realitate, bărbatul se întoarce pentru că în acel moment relația cu ea i se pare cea mai convenabilă. Un bărbat care te iubește nu va pleca niciodată, nici dacă tu i-o ceri. Dacă vrei să scapi de cel care te iubește, va trebui să pleci tu, să fugi sau să greșești iremediabil față de el. Sursa: chrisoliver.ro
  5. This post cannot be displayed because it is in a password protected forum. Enter Password
  6. e curat , multumim !
  7. FIFA 22 Cross-play Test FAQ We’re eager to let our players connect across multiple platforms, and in the near future we’ll be testing Cross-play functionality in Online Seasons and Online Friendlies on the PlayStation 5, Xbox Series X|S, and Stadia versions of EA SPORTS FIFA 22. We’re looking forward to seeing your feedback on Answers HQ and we’ll cover everything you need to know about Cross-play in this article. We’ll let you know when this Cross-play test kicks off on EAFIFADirect as well as in-game. So let’s jump right in. What is this Cross-play test and what modes is it available for? For FIFA 22, Cross-play is the ability to play the game with players from different platforms. Our Cross-play test will be available in Online Seasons and Online Friendlies, meaning that you can choose to play FIFA 22 with a friend on another platform, or climb the Online Seasons Divisions against players potentially playing on other platforms. As mentioned earlier, this Cross-play test will be available to all players on the PlayStation 5, Xbox Series X|S, and Stadia versions of FIFA 22. Why is this Cross-play test only in Online Seasons and Online Friendlies? While we want to enable our players to play with as many friends and others as possible, we limited the test to these two modes with the aim of reducing the chance for introducing new issues into the game. We are confident that the game data and feedback that we get from these two modes will help inform how Cross-play could further be implemented in future titles. How do I enable or disable the Cross-play test? Once this Cross-play test is activated, when you’re in the main menu of FIFA 22, you can find a widget in the bottom right hand corner that can be opened with the corresponding button prompt, as pictured below. From this widget, you can simply follow the button prompt to enable or disable your Cross-play test participation. There’s nothing else that you need to do. In this widget, you can also search for friends regardless of their platform, and you can also block and/or mute someone if desired. You can also control your Cross-play test participation by visiting the Matchmaking Options Settings screen, as pictured below. How do I Cross-play with my friend? In order to Cross-play with a friend in Online Friendlies during this test, first you’ll want to open the widget we mentioned above and add your friend to the in-game friends list. You can search for your friend by their platform or EA username as indicated by the on screen button prompt. Once you have found your friend’s name, select them and choose the option to add them as a friend. Your friend should accept your request in the widget. To play with a friend, you can select their name from your friends list in the widget and follow the button prompts to invite them to a match. You can also simply enter the Online Friendlies mode and select your friend from the list presented on screen to invite them to a match. How do I Cross-play in Online Seasons? Assuming that you have the Cross-play test enabled, you can head into Online Seasons as you normally would, there’s nothing else that needs to be done. As usual, the matchmaking will search for an appropriate opponent, and they may or may not end up being on a different platform than you. Does Cross-play affect FIFA 22 gameplay or matchmaking at all? Our Cross-play test does not have any direct impact on the gameplay of FIFA 22. You can think of this Cross-play test as just another part of the game. When you’re matchmaking in Online Seasons, FIFA 22 will consider players from other platforms as long as you’ve opted in. What else do I need to know about the Cross-play test? When you’re searching for a friend on the main menu widget, you will see a Cross-play platform indicator beside their name. If your friend is on the same platform as you, the indicator will show the platform you’re on. If your friend is on a different platform, a different Indicator will be shown. The same indicators will also display during matches when playing in Online Seasons. —---------------------------- Sursa : https://www.facebook.com/easportsfifa
  8. [EN] - Game State Integration now requires the command-line option "-gamestateintegration" to function. This is because there can be a per-frame performance impact to using game state integration. // [RO] - Pentru a funcționa, Game State Integration necesită acum specificarea comenzii „-gamestateintegration” în opțiunile de lansare. Acest lucru este necesar deoarece integrarea stării jocului poate avea un impact asupra performanței per cadru.
  9. [MISC] – Updated Team Spirit sticker and logo to more closely match their workshop submission. – Adjusted the ‘Glitter’ sticker effect to appear more sparkly in the player’s viewmodel. [STEAM INPUT] – Added support for “-nojoy” command line parameter to fully suppress Steam Input performance overhead. [GAMEPLAY] – Fixed a recently reported smoke bug. Sursa: https://blog.counter-strike.net/
  10. Salut, Astăzi vom discuta despre şiruri de caractere (sau stringuri) în Python. Definiţie Un string reprezintă orice tip de text inclus între ghilimele simple, duble sau triple. De exemplu: s = 'Python' este acelasi lucru cu s = "Python" sau s = """Python""". Între ghilimele simple şi duble nu există nici o diferenţă, însă ghilimelele triple sunt folosite pentru a reprezenta texte care se întind pe mai multe linii. Mai mult, şi ghilimelele triple pot fi simple sau duble, fără nici o diferenţă între acestea. Exemplu: s = """ acest text este scris pe mai multe randuri """ s = ''' Şi textul acesta este scris pe mai multe rânduri ''' Deşi interpretatorului Python nu îi pasă ce tip de ghilimele folosim pentru a defini stringul nostru, suntem obligaţi totuşi să încheiem reprezentarea cu acelaşi tip de ghilimele cu care am început. Prin urmare, nu sunt permise scrieri precum s = 'text". Aşa cum spuneam în lecţia anterioară, calculatorul va reprezenta orice tip de date drept o înşiruire de 0 şi 1. Caracterele sunt mai greu de reprezentat pentru un calculator, aşa că pentru a-şi uşura munca, se foloseşte de un encoding. Un encoding va indica o reprezentare a caracterelor într-un format mai uşor de înţeles pentru calculator. De exemplu, ASCII este un format de encoding mai vechi folosit pentru a reprezenta 256 de caractere (printre care toate cele de pe tastatura voastră). Acest format leagă orice caracter la un număr întreg cuprins între 0 şi 255. Numărul 255 nu este întâmplător, această reprezentare reuşind să reprezinte caractere în 8 biţi (2 ** 8 = 256). ASCII este totuşi un model de reprezentare destul de vechi şi depăşit de multitudinea de caractere disponibile în zilele noastre. Din acest motiv există multe alte sisteme de encoding. În mod implicit, Python va folosi sistemul UTF-8 pentru a reprezenta caracterele sale. Putem accesa reprezentarea unui caracter folosind funcţia ord(caracter), unde caracter trebuie să fie un string de lungime 1. Inversul acestei funcţii este chr(numar), unde numar este un număr întreg, iar rezultatul funcţiei este caracterul reprezentat de acel număr. Această discuţie nu este tocmai inutilă, reprezentarea acestor caractere este folosită pentru a efectua operaţii de comparaţie între stringuri (operaţii de mai mic sau mai mare decât) şi, deşi nu veţi avea nevoie să accesaţi în mod explicit reprezentarea unui string, sunt şanse ca la un moment dat să aveţi nevoie de o schimbare de encoding. Operaţii pe stringuri Un string Python poate fi privit drept o listă de caractere aflate într-o anumită ordine. Astfel, putem selecta un substring al stringului nostru folosind paranteze pătrate []. Dacă vrem să selectăm un singur caracter, este suficient să specificăm în parantezele pătrate poziţia caracterului în string. Dacă vrem să selectăm mai multe caractere consecutive deodată, atunci avem la dispoziţie "notaţia slice". Notaţia slice permite selectarea unor caractere dintr-un interval (selectarea unui substring). Pentru a specifica acest interval, în interiorul parantezelor pătrate scriem poziţiile de început şi de final, despărţite prin semnul :. Dacă poziţia de început este primul caracter al stringului sau poziţia de final este ultimul caracter, atunci putem omite precizarea acelei poziţii. Exemplu: >>> s = 'Python' >>> s[2] 't' >>> s[2:4] 'th' >>> s[:2] 'Py' >>> s[2:] 'thon' >>> s[:] 'Python' Observaţie: numărătoarea poziţiilor (indecşilor) caracterelor din string începe de la 0. Astfel, în exemplele de mai sus, pe prima poziţie se află caracterul P, pe a doua poziţie caracterul y şi aşa mai departe. Atenţie: intervalul descris de notaţia slice este închis la capătul din stânga şi deschis la cel din dreapta. Cu alte cuvinte, elementul de pe poziţia de start a notaţiei va fi inclus în rezultat, iar caracterul indicat de poziţia de final nu va fi inclus. Observăm în exemplul de mai sus, pentru cazul s[2:4] au fost selectate caracterele t aflat pe poziţia 2 şi h aflat pe poziţia 3, dar o aflat pe poziţia 4 nu a fost inclus. Până acum am prezentat o singură operaţie pe stringuri: operaţia de selectare. În continuare vom prezenta alte operaţii utile atunci când avem de-a face cu un astfel de tip de date. Operaţiile aritmetice de adunare şi înmulţire sunt posibile asupra stringurilor, dar au un efect poate neaşteptat. Exemplu: >>> s1 = 'Python' >>> s2 = 'Sarpe' >>> s1 + s2 'PythonSarpe' >>> s1 * 2 'PythonPython' După cum puteţi observa, adunarea a două stringuri rezultă în concatenarea acestora, iar înmulţirea unui string cu un număr natural, va multiplica textul stringului de atâtea ori cât indică numărul ales. Atenţie: pentru adunare, ambele elemente trebuie să fie string, iar pentru înmulţire este necesar un string şi un număr întreg. Pentru a verifica apartenenţa unui substring la un string, putem folosi cuvântul cheie in. >>> s1 = 'Python' >>> 'i' in s1 False >>> 'y' in s1 True Alte câteva metode utile în lucrul cu stringurile sunt: str(n) - realizează convertirea unui obiect care nu este string, într-un string (de exemplu 1 devine "1" min(s), max(s) - returnează litera minimă/maximă din string (atenţie, toate literele mari vor fi considerate "mai mici" decât orice literă mică). s.lower(), s.upper() - returnează o copie a stringului cu toate literele mici sau cu toate literele mari len(s) - returnează un număr corespunzător dimensiunii stringului (numărul de caractere care îl alcătuiesc) s.split(delimitator) - împarte stringul în bucăţi delimitate de parametrul "delimitator". Rezultatul va fi o listă, iar delimitatorul trebuie sa fie string Pentru mai multe detalii despre funcţiile şi metodele suportate de stringuri, consultaţi documentaţia oficială. Formatarea textului O parte importantă în lucrul cu stringurile o reprezintă formatarea acestora. Prin formatare vom intelege posibilitatea de a crea un string în mod dinamic folosind valori păstrate în variabile. Prima şi cea mai simplă metodă de formatare o reprezintă concatenarea stringurilor implicate folosind operaţia de adunare: >>> nume = 'Madalin' >>> ani = 23 >>> 'numele meu este ' + nume + ' si am ' + str(ani) + ' ani' 'numele meu este Madalin si am 23 ani' Observaţi convertirea variabilei ani folosind funcţia str(). Fără această convertire, am primi eroare deoarece nu putem adăuga un string şi un număr. O altă metodă de formatare o reprezintă folosirea caracterului %: >>> nume = 'Madalin' >>> ani = 23 >>> 'numele meu este %s si am %d ani' % (nume, ani) 'numele meu este Madalin si am 23 ani' %s indică faptul că pe acea pozitie se asteaptă un element de tip string, iar %d indică prezenţa unui element de tip întreg. Sunt mai multe tipuri de astfel de simboluri specifice diferitelor tipuri de date, dar nu vom intra în detalii aici. Observaţi totuşi absenţa funcţiei de convertire a variabilei ani. Din moment ce am specificat deja în interiorul formatării că ne aşteptăm la un număr pentru poziţia aceea, Python va realiza singur conversia. Totuşi ordinea parametrilor din paranteză contează. A treia metodă de formatare a stringurilor este metoda format(). >>> nume = 'Madalin' >>> ani = 23 >>> 'numele meu este {} si am {} ani'.format(nume, ani) 'numele meu este Madalin si am 23 ani' Observăm că nu a fost nevoie de convertirea variabilei ani şi nici de specificarea unui tip de date pentru poziţiile în care vor urma să fie introduse valorile variabilelor noastre. Cu toate acestea, ordinea parametrilor încă este importantă ceea ce nu mereu ne convine. Din fericire, acoladele pot conţine informaţii despre parametrii. Astfel, dacă punem un număr în interiorul acoladelor, atunci Python va asocia acel număr cu poziţia parametrilor din metoda format (atenţie totuşi, numărătoarea începe de la 0 şi se poate continua până la numărul parametrilor - 1). >>> 'numele meu este {1} si am {0} ani'.format(ani, nume) 'numele meu este Madalin si am 23 ani' Mai mult, această metodă ne permite refolosirea parametrilor prin repetarea unui index (numărul parametrului) Deja avem mai multă flexibilitate, dar încă nu e suficient. Ordinea parametrilor este încă importantă. Pentru a rezolva şi acest ultim inconvenient, putem scrie în locul numerelor dintre acolade, denumiri pentru variabilele care vor fi înlocuite (denumirile acestea pot fi diferite de numele variabilelor). În acest mod, poziţia parametrilor nu va mai conta pentru că vor fi identificaţi prin acea denumire. La fel ca în cazul indecşilor, şi această metodă ne permite să repetăm un anumit parametru prin reutilizarea numelui său în string. >>> 'numele meu este {nume} si am {varsta} ani'.format(nume=nume, varsta=ani) 'numele meu este Madalin si am 23 ani' Ultima metodă de formatare (da, încă mai sunt) a fost adaugată în Python 3.6 şi presupune adaugarea caracterului f înaintea şirului nostru de caractere, iar între acolade, vom trece numele variabilelor pe care vrem să le includem în formatare (de această dată, numele variabilelor din acolade trebuie să coincidă cu cel din declarare). >>> nume = 'Madalin' >>> ani = 23 >>> f'numele meu este {nume} si am {ani} ani' 'numele meu este Madalin si am 23 ani' Această metodă este interesantă deoarece tot ce este în interiorul acelor acolade, va fi interpretat de Python. Astfel, putem avea expresii (operaţii aritmetice, apeluri de funcţii etc) direct în interiorul formatării. Exemplu: >>> nume = 'Madalin' >>> ani = 23 >>> f'numele meu este {nume.upper()} si am {ani+2} ani' 'numele meu este MADALIN si am 25 ani' Atât pentru astăzi, sper că am fost suficient de clar. Mai sunt enorm de multe lucruri de spus despre stringuri, însă cel mai bine se învaţă prin practică. Dacă aveţi orice fel de întrebare, nu ezitaţi să scrieţi în comentarii, dacă nu, pe data viitoare. Sursa: madalinfasie.ro
  11. Chaos theory nu a fost in 2007? ma refer la film !
  12. dar ce inseamna ost gaming?
  13. Salut, Acum că am trecut de partea introductivă, suntem pregătiţi să ne aruncăm în specificaţiile limbajului. Astfel, următoarele câteva lecţii vor fi dedicate variabilelor şi tipurilor de date în Python. Pe scurt, o variabilă este o zonă rezervată de memorie în interiorul căreia putem păstra informaţii. Mai mult, în funcţie de tipul informaţiei pe care o păstrează, o variabilă poate fi de mai multe tipuri. Tipul unei variabile se mai numeşte şi tip de date. Teorie: După cum ştim, un calculator "gândeşte" numai în valori de 1 şi 0. Prin urmare, orice valoare ne-am dori să păstrăm în memorie, va avea o reprezentare în baza 2. De exemplu, să presupunem că pentru a reprezenta un număr întreg, este nevoie de 4 bytes, echivalent cu 4 * 8 = 32 de biţi (un bit este un număr 1 sau 0). Fiecare modalitate de a combina cele 32 de numere 1 sau 0 va reprezenta un număr întreg unic. Având presupunerile anterioare, putem deduce faptul că 4 bytes pot reprezenta 2^32 = 4294967296 (2 la puterea 32) numere întregi distincte (jumătate fiind negative, iar jumătate pozitive). Din acest motiv apar şi acele limitări pentru câte numere pot fi reprezentate cu un anumit tip de date. Pur şi simplu nu sunt suficienţi biţi. Unde vreau să ajung cu asta? Nicăieri. Mi se pare doar util şi interesant să ştiţi ce se întâmplă în spatele codului pe care îl scriem. Revenind la discuţia noastră, în Python crearea unei variabile se realizează atunci când îi atribuim pentru prima dată o valoare. Tipul de date asociat acesteia va fi determinat de interpretator în momentul rulării. Acest lucru ne permite să reutilizăm numele unei variabile care a fost deja declarată cu un anumit tip de date şi să îi atribuim un cu totul alt tip. Pentru a crea o variabilă, folosim sintaxa: nume_variabila = valoare. Exemplu: x = 4 Atenţie! Numele unei variabile nu va avea niciodată ghilimele în jurul său, ghilimelele vor indica un alt tip de date numit string. Vom discuta despre şiruri de caractere (stringuri) în lecţia următoare. Pentru a verifica tipul unei variabile putem folosi functia type(nume_variabila), unde nume_variabila este numele variabilei al cărei tip vrem să îl aflăm. Tipurile de date standard in Python sunt: Numeric String (şir de caractere) Listă Tuplă Dictionar Set Astăzi vom discuta despre tipurile de date numerice. În mod evident, ele vor reprezenta valori numerice. Python 3 ne oferă suport pentru 3 tipuri de numere: int (numere întregi), float (numere reale, cu virgulă) şi complex (numere complexe). Mai mult, Python ne permite să schimbăm tipul de date oricând ne dorim. Tot ce trebuie să facem este să apelăm una dintre funcţiile built-in (preinstalate) cu numele specific tipului de date dorit. Exemplu: >>> x = 2.0 >>> type(x) <class 'float'> >>> x = int(x) >>> type(x) <class 'int'> Mai sus am creat o variabilă numită x cu valoarea 2.0. Am folosit apoi funcţia type() pentru a afla tipul de date. Apoi folosim funcţia int() pentru a converti valoarea de tip float a variabilei noastre într-una de tip int (număr întreg). Astfel am realizat conversia de la un număr float la un int. În mod similar, folosim funcţia float() pentru a converti un număr într-unul de tip float şi complex() pentru complex. Mai mult, convertirea tipului de date poate fi facută şi de la tipuri nenumerice precum un string (care contine touşi reprezentarea unui numar) folosind aceleaşi metode (mai multe despre asta în lecţia despre şiruri de caractere). Câteva funcţii şi operaţii built-in utile atunci când lucrăm cu numere sunt: 2 + 2 # suma a două numere 2 - 2 # diferenţa a două numere 2 * 3 # produsul a două numere 4 / 2 # împărţirea a două numere (returnează float, cu virgulă) 4 // 2 # împărţirea a două numere (returnează int, câtul obţinut în urma împărţirii cu rest) 4 % 2 # restul împărţirii celor două numere 2 ** 4 # ridicare la putere (2 la puterea 4) pow(2, 4) # ridicare la putere (identic cu metoda anterioară) min(2, 4) # minimul celor două numere max(2, 4) # maximul celor două numere abs(x) # valoarea numărului în modul round(x) # valoarea rotunjită a numărului Şi multe altele. Pentru a avea acces la şi mai multe funcţii şi constante matematice, avem la dispoziţie modulul math. Vom discuta însă despre module şi despre cum le putem folosi într-o lecţie viitoare. Cam atât pentru moment, sper că am fost suficient de clar. Dacă aveti orice fel de intrebare, puteţi să îmi scrieţi în comentarii, altfel pe data viitoare. Articol preluat de pe madalinfasie.ro
  14. Sintaxă şi convenţii | Partea 2 Salut, Astăzi vom evita, din nou, programarea efectivă (scuze) şi ne vom arunca o privire peste sintaxa generală a limbajului şi ce convenţii sunt folosite în comunitatea de dezvoltatori pentru a facilita dezvoltarea şi menţinerea aplicaţiilor. Vom începe cu prezentarea principalelor convenţii de scriere. Convenţiile de scriere nu sunt obligatorii, iar fiecare este liber să îşi creeze propriul set de convenţii de scriere a codului astfel încât dezvoltarea unui proiect să fie cât mai uşoară pentru el. Totuşi, atunci când suntem nevoiţi să lucrăm în echipă, o convenţie comună de scriere este cea mai indicată (gândiţi-vă numai ce ar însemna ca într-o echipă de 10 oameni, fiecare să îşi folosească propria convenţie de denumire a variabilelor sau de indentare). Dacă echipa în care lucraţi are deja o convenţie, atunci urmaţi-o pe aceea, altfel, dezvoltatorii Python au creat un set de indicaţii special gândite pentru a dezvolta cod cât mai "curat". Acest set de convenţii poartă numele de PEP8 şi îl puteţi găsi în documentaţia oficială. Câteva exemple de convenţii prezente în acest standard sunt: Denumirea claselor începe cu literă mare, iar toţi ceilalţi indentificatori (variabile, funcţii etc) vor fi scrişi cu literă mică; Dacă numele unei variabile (sau funcţii) conţine mai multe cuvinte, acestea vor fi separate printr-un underscore "_"; Dacă numele unei clase conţine mai multe cuvinte, acestea vor urma stilul CamelCase (cuvintele se vor scrie legat, prima literă a fiecăruia va fi o literă mare); Dacă numele unei funcţii sau metode începe cu underscore, atunci ea va fi considerată privată; Dacă numele unei funcţii sau metode începe şi se termină cu două underscore (ex: __init__), atunci va fi considerată funcţie specială a limbajului; Indentarea va fi alcătuită din patru spaţii; etc. Pentru a afla mai multe, puteţi accesa link-ul de mai sus, sau puteţi folosi un editor sau IDE care oferă suport pentru PEP8 şi astfel puteţi învăţa acest standard prin practică. Perfect, acum să trecem la sintaxă. Vom analiza următorul bloc de cod: variabila_mea = 5 if variabila_mea < 10: print('Numarul este mai mic decât 10') print('Alta linie') else: print('Numărul este mai mare decât 10') Nu vă faceţi griji pentru ce înseamnă codul de mai sus, singurul său scop este să ne demonstreze sintaxa Python. Dacă vreţi totuşi să vedeţi rezultatul, salvaţi acest cod într-un fişier cu extensia .py şi rulaţi-l din IDE sau din linia de comanda prin: python nume_fisier.py (pentru Windows) sau python3 nume_fisier.py (pentru Ubuntu). Rezultatul rulării va fi: Numarul este mai mic decât 10 Alta linie Prima observaţie o reprezintă absenţa caracterului ";" la finalul liniilor, aşa cum putem observa în multe alte limbaje de programare. O altă observaţie vizează blocurile de cod. După cum vedeţi, începerea unui bloc de cod este definită prin caracterul ":", însă nu există nici un caracter special pentru a indica finalul acelui bloc. Aici intervine indentarea. Cele două instrucţiuni din interiorul primei ramuri a if-ului, sunt rulate împreună, pentru că se află pe acelaşi nivel de indentare (acelaşi număr de spaţii). Mai mult, instrucţiunea else este pe acelaşi nivel de indentare cu if deoarece ele fac parte din aceeaşi instrucţiune de bază if-else (pe care o vom discuta în detaliu într-o lecţie viitoare). Indicaţie: nu este obligatoriu să folosim patru spaţii, atât timp cât folosim acelaşi număr de spaţii în întreg blocul de cod (ideal ar fi totuşi să se folosească acelaşi număr de spaţii în tot programul). Alegerea celor patru spaţii este susţinută însă de majoritatea comunităţii de dezvoltatori Python şi este specificată şi în standardul PEP8. Singurul lucru pe care va trebui să îl aveţi în vedere este faptul că Python face diferenţa dintre spaţii şi tab-uri. Dacă le folosiţi pe amândouă într-un program, chiar dacă acestea au acelaşi nivel de indentare, Python va returna o eroare şi vă va obliga să alegeţi una dintre cele două metode de indentare. Această problemă este comună atunci când copiem cod dintr-un IDE în altul, sau când nu există un standard stabilit într-o echipă. Un alt aspect important legat de sintaxă îl reprezintă faptul că Python este un limbaj case-sensitive. Prin urmare variabilele Abc şi abc sunt văzute drept două denumiri diferite. În încheiere, aş vrea să mai prezint modul prin care putem comenta liniile de cod în Python. Un comentariu este o linie pe care interpretatorul o va ignora. Comentariile sunt foarte utile pentru a explica anumite secţiuni de cod sau pentru a "păstra o bucată de cod pentru mai târziu" (lucru care, deşi pare tentant, trebuie evitat). Pentru a comenta o linie, folosim caracterul #. Exemplu: # Acesta este un comentariu # Un comentariu va fi întotdeauna ignorat print('Exemplu 1') # Comentariile pot fi puse şi pe aceeaşi linie cu instrucţiunile de cod, dar instrucţiunile de cod nu pot fi puse după comentarii După cum putem observa, această metodă nu ne permite să comentăm pe mai multe linii, decât dacă punem # în faţa fiecărei linii. În mod normal, Python nu ne oferă în mod explicit o metodă de a comenta mai multe linii deodată, însă, putem trece peste acest lucru, folosind stringuri (şiruri de caractere). Aşa cum vom vedea atunci când vom discuta despre stringuri, în Python este posibil să scriem un string pe mai multe linii folosind ghilimelele triple. Ştiind acest lucru, putem adăuga comentarii pe mai multe linii astfel: """ Acest comentariu poate fi scris pe mai multe linii. Dar nu vă lăsaţi păcăliţi. Este de fapt, un string. """ print('Exemplu 2') Dacă rulăm acest cod vom observa că doar textul din interiorul funcţiei print va fi afişat. Este important să reţineţi faptul că acest "comentariu" este de fapt un string, doar că nefiind asociat niciunei variabile, va fi ignorat de către interpretator. Acest comportament poate fi replicat pentru orice tip de date, astfel că dacă scriem un număr fără să-i asociem nici o variabilă şi el va fi ignorat. Stringul se întâmplă să fie mult mai util pentru a comunica detalii despre codul nostru decât un număr oarecare. Atât pentru astăzi. Dacă aveţi orice fel de întrebare, nu ezitaţi să o spuneţi. Dacă nu, pe data viitoare. Articol preluat de pe madalinfasie.ro
  15. Salut, De astazi vom începe o serie de tutoriale cu scopul de a învăţa limbajul de programare Python. Această serie îşi propune să fie suficient de uşor de urmărit indiferent dacă aveţi experienţă în programare sau nu. Ce este Python? Să începem prin a prezenta limbajul. Python este un limbaj de programare interpretat, interactiv şi orientat pe obiecte, gândit să fie uşor de citit şi de înteles. A fi un limbaj interpretat înseamnă că programul nostru nu va fi compilat, iar apoi rulat, ci va fi interpretat (şi implicit rulat) în mod direct, linie cu linie. Drept urmare a acestei caracteristici, apare posibilitatea de a interacţiona cu programul nostru în timpul rulării (deci interactiv). Pe lângă paradigma programării orientată pe obiecte, Python suportă şi programarea funcţională, programarea procedurală şi cea structurată. De ce Python? Este un limbaj foarte uşor de citit şi învăţat. Uşurinţa sa este dată atât de accentul pus pe cuvinte, în locul simbolurilor, cât şi posibilitatea de a lega mai multe instrucţiuni într-o singură linie de cod, permiţând citirea liniei în limbaj natural Portabil - nu depinde de platforma pe care a fost dezvoltat Scalabil - datorită sintaxei, este mult mai uşor să întreţinem un program de dimensiuni mari în Python, decât unul în C, Bash, Java etc Poate fi utilizat în multe domenii - inteligenţă artificială, analize de date, cercetare, automatizare, aplicaţii web etc Câteva companii mari care folosesc Python în momentul scrierii acestui articol sunt: Google, Dropbox, Instagram, Yahoo Maps etc Cum îl instalăm? Înainte de a instala Python, va trebui să discutăm un pic despre ce versiune să alegem. După cum probabil ştiţi, Python are în prezent două versiuni active Python 2 şi Python 3. Interesant este că aceste două versiuni nu sunt compatibile între ele (nu fără câteva modificări de cod şi schimbări de librării). Nu voi discuta despre diferenţele celor două versiuni prea mult, însă ceea ce trebuie să ştiţi este că Python 3 conţine mult mai multe funcţionalităţi noi decât contracandidatul său, iar suportul oficial pentru Python 2 va fi întrerupt în 2020. Având toate acestea în vedere, vom alege să folosim pe tot parcursul seriei acesteia, versiunea Python 3 Instalarea limbajului este destul de simplă, pentru cei ce folosesc Ubuntu, Python este deja instalat, va trebui doar să mai instalaţi câteva utilitare precum managerul de pachete pip, editorul standard IDLE şi câteva pachete specifice dezvoltării. sudo apt-get update sudo apt-get install python3-pip idle3 sudo apt-get install build-essential libssl-dev libffi-dev python-dev Pentru cei care au Windows, mergeţi pe pagina oficială Python www.python.org, secţiunea downloads şi descărcaţi executabilul pentru ultima versiune oficială de Python (adică nu descărcaţi versiunea beta). Rulaţi executabilul, şi urmaţi paşii instalării. Aveţi grijă totuşi să selectaţi opţiunea de adăugare a executabilului Python în variabila PATH. Această opţiune vă va permite să rulaţi python din lina de comanda fără a specifica întreaga cale către executabil. Pentru dezvoltarea efectivă, puteţi folosi absolut orice editor de text sau IDE doriţi. Câteva astfel de utilitare pot fi: Sublime text, Visual Studio Code, PyCharm etc. Pe parcursul acestui tutorial, eu voi folosi IDLE. Voi puteţi folosi orice editor sau IDE doriţi. Nu va afecta cu nimic parcurgerea lecţiilor ce vor urma. Hello World! Deschidem editorul ales şi scriem: print("Hello World!") Salvăm într-un fişier cu extensia .py şi rulăm programul. Pentru rulare, în cazul în care folosiţi un IDE care permite rularea programului din interfaţă, atunci folosiţi acea funcţie (în IDLE se rulează apăsând tasta F5). Dacă nu folosiţi un astfel de tool, atunci din lina de comanda, mergem în calea în care am salvat programul folosind comanda cd cale_catre_fisier şi rulăm programul folosind comanda python nume_fisier.py (pentru Windows) şi python3 nume_fisier.py (pentru Ubuntu). Motivul pentru această distincţie este că, în Ubuntu, avem ambele versiuni de Python instalate. De aceea, pentru a se face distincţia între acestea, este nevoie să fie rulată comanda python3. În urma rulării se va afişa pe ecran (sau în consolă) textul Hello world! Atât pentru astăzi, sper că am fost suficient de clar. Pentru orice fel de întrebări, puteţi să îmi scrieţi în comentarii. Pe data viitoare. Sursa : madalinfasie.ro
  16. [ANTWERP 2022 CS:GO MAJOR CHAMPIONSHIP] – The “Antwerp 2022 Viewer Pass” and the “Antwerp 2022 Viewer Pass + 3 Souvenir Tokens” are now available for purchase. 50% of the proceeds go to the players, teams, and organizations taking part in the PGL Antwerp 2022 CS:GO Major Championship. – With a Viewer Pass, you’ll get: — An upgradable Antwerp 2022 Event Coin. — Access to the Antwerp Pick’Em Challenge. — Unlimited team graffiti for the duration of the event. — Steam.tv team flair. — Access to Antwerp 2022 Souvenir Packages. – Team stickers and Player Autograph stickers are available for purchase. [MAPS] Climb – Fixed reduced buyzone in T spawn Ember – Geyser at Construction now pushes the player upwards with less force – Fixed bug with crates and geysers giving the player insanely high velocity (sorry lacyyy and mantra) – Fixed finishing warmup inside the elevator stopping the player from jumping – Fixed a plethora of minor bugs (thanks Joaokaka1998)
  17. Poate e dur, poate credeti ca-s nebun, ca stilul asta de viata nu e ala bun, dar nu eu l-am ales, el m-a ales pe mine si acum stii bine, doar asta-mi curge-n vine.

  18. This post cannot be displayed because it is in a password protected forum. Enter Password
  19. Moştenirea | Partea 5 Salut, În lecţiile anterioare ne-am familiarizat cu programarea orientată pe obiecte, însă dacă stăm să analizăm un pic cele prezentate, această paradigmă nu pare să ofere atât de multe pe cât ne asteptam. Ba mai rău, prin introducerea claselor şi a obiectelor, parcă mai mult ne complicăm munca. Nu vă panicaţi totuşi, POO încă merită. De fapt, abia de astăzi vom începe discuţia despre principiile de bază ale acestei paredigme. Sunt aceste principii care oferă versatilitatea şi popularitatea acestei paradigme. Principiile (conceptele) sunt: moştenirea polimorfismul încapsularea abstractizarea Mai mult, toate aceste patru concepte gravitează în jurul unui singur scop: reutilizarea codului. Astăzi vom începe cu moştenirea. Să revenim la exemplul cu Bobiţă şi Pluto din lecţiile anterioare. Aşa cum ştim deja, amandoi sunt câini (obiecte ale clasei Caine), dar ce facem dacă ni se alătură un alt tip de animal, pisica Snowy? Simplu, facem o nouă clasă Pisica. Observăm imediat că atât câinii cât şi pisicile au foarte multe lucruri în comun, însă valorile sau implementările acestora diferă. De exemplu, ambele animale au o înălţime, o culoare a blănii, un mod de comunicare (lătrat sau mieunat) etc. De asemenea, există şi lucruri caracteristice fiecărui animal în parte, precum posibilitatea ca un câine să se joace "adu băţul". Încă din primul articol al acestei serii, ştim că dacă avem două obiecte asemănătoare, vom căuta să le grupăm într-o clasă pentru a ne fi mai uşor să creăm alte astfel de obiecte pe viitor. Astfel, apare întrebarea: oare nu putem să grupăm şi două clase asemănătoare într-o clasă mai generală? Ei bine, ba da, atât câinii cât şi pisicile sunt nişte animale, deci le putem include într-o clasă numită Animal. Prin urmare, în noua clasă Animal vom avea toate metodele şi câmpurile comune pentru toţi câinii şi toate pisicile (blană, lungime coadă, mod de comunicare), iar în clasele Caine, respectiv Pisica vom avea metodele şi câmpurile specifice celor două animale (adus băţul, făcut la litieră), ceilalţi membri fiind accesibili prin clasa Animal. Cum clasele Caine şi Pisica au la bază o altă clasă şi adaugă doar funcţionalităţile specifice lor, putem spune că acestea două extind clasa Animal. Acest proces de extindere a unei clase poartă numele de moştenire. Formal, moştenirea este procesul prin care o clasă dobândeşte metodele şi câmpurile altei clase. Importanţa moştenirii este dată de faptul că aceasta ne permite să refolosim codul deja existent şi ne creează o structură ierarhică a claselor proiectului nostru. O clasă care extinde o altă clasă se numeşte subclasă (sau clasă copil), iar clasa care este extinsă se numeşte superclasă (sau clasă părinte). Ok, haideţi să vedem şi un exemplu: public class Animal{ public String blana; public int lungimeCoada; public Animal(){ this.blana = "Galbena"; this.lungimeCoada = 10; } public Animal(String blana, int lungimeCoada){ this.blana = blana; this.lungimeCoada = lungimeCoada; } public void showAnimal(){ // Afişăm detaliile despre animal System.out.println("Culoare blana " + blana + " lungime coada " + lungimeCoada); }}public class Caine extends Animal{ String nume; String sunetScos; public Caine(String nume){ this.nume = nume; this.sunetScos = "Ham!"; } public void latra(){ System.out.println("Latra!" + sunetScos); }}public class ClasaPrincipala{ public static void main(String[] args){ Caine bobita = new Caine("Bobita"); bobita.showAnimal(); bobita.latra(); }} Trebuie remarcat cuvântul cheie extends. Prin intermediul acestui cuvânt se realizează moştenirea. Rezultatul codului de mai sus va fi: Culoare blana Galbena lungime coada 10 Latra!Ham! Observăm că deşi obiectul bobita este de tip Caine, acesta poate accesa metoda showAnimal() din clasa pe care o extinde (Animal). Mai mult, dacă ne uităm mai atent, obiectul bobita foloseşte constructorul fără nici un parametru al clasei Animal, deşi există doi constructori implementaţi. Pentru a controla alegerea acestui constructor, putem folosi cuvântul cheie super. Astfel, dacă în exemplul anterior facem urmatoarele modificări: //În constructorul clasei Caine public Caine(String nume){ super("Neagra", 7); // neapărat pe prima poziţie this.nume = nume; this.sunetScos = "Ham!"; } atunci rezultatul rulării va fi Culoare blana Neagra lungime coada 7 Latra!Ham! Atentie: dacă vrem să apelăm constructorul clasei părinte folosind super, atunci acesta trebuie să fie prima instrucţiune din constructorul clasei copil. O altă utilizare a acestui cuvânt cheie este asemănătoare cu cea a cuvântului this, cu diferenţa că de data aceasta, super se va referi la obiectul clasei părinte în loc de cel al clasei curente. De exemplu: // În clasa Caine adăugăm urmatoarea metodă public void afiseazaMaiMulte(){ super.showAnimal(); //apelăm metoda din clasa părine System.out.println("Am apelat metoda showAnimal() din clasa Caine"); } //..... //În clasa principală, în metoda main, la final adăugăm bobita.afiseazaMaiMulte(); Dupa ce rulăm, se va afişa: Culoare blana Galbena lungime coada 10 Latra!Ham! Culoare blana Galbena lungime coada 10 Am apelat metoda showAnimal() din clasa Caine Mai mult, asemeni cuvântului cheie this, cuvântul super poate fi folosit şi pentru a accesa membrii ai clasei părinte atunci când în clasa copil există deja un membru cu aceeaşi denumire, dar implementare/valoare diferită. Ok, să spunem că ne-am convins că moştenirea este o chestie foarte bună. Întrebarea este acum, de unde ştim când să o folosim? Ei bine, relaţia de moştenire este o relaţie de tipul IS-A (ESTE-UN/O). În exemplul nostru, câinele este un animal, pisica este un animal. De fiecare dată când putem lega două clase printr-o relaţie de tipul acesta, putem spune că avem de-a face cu o moştenire. Un alt tip de relaţie este HAS-A (ARE-UN/O). Acest tip de relaţie apare în cazuri de genul: public class Animal{} public class Viteza{} public class Caine extends Animal{ private Viteza viteza; //restul codului } În acest caz, câinele este un animal şi are o viteză. Acest tip de relaţie ne permite să refolosim codul din clasa Viteza. Atentie: în Java este permisă doar moştenirea simplă (i.e. o clasă poate să extindă doar o singură altă clasă). În C++ sau Python de exemplu, o clasă poate extinde mai multe clase. O consecinţă interesantă a moştenirii este posibilitatea de a declara un obiect de tipul superclasei, iar atunci când îl instanţiem, să-i pasăm referinţa către un obiect de tipul subclasei. Adică: Animal bobita = new Caine("Bobita"); Această linie de cod va crea un nou obiect Caine. Diferenţa este că, în cazul acesta, nu vom mai putea accesa metodele din subclasa Caine. Spre exemplu, având în vedere codul de la începutul acestui articol: public class ClasaPrincipala{ public static void main(String[] args){ Animal bobita = new Caine("Bobita"); bobita.showAnimal(); // această linie va rula cu succes bobita.latra(); // va returna eroare } } Cam atât despre primul dintre cei patru fantastici ai programării orientate pe obiecte. Data viitoare vom discuta despre polimorfism. Sper că am fost suficient de clar, dacă aveţi orice fel de întrebare, nu ezitaţi să scrieţi în comentarii, dacă nu, pe data viitoare.
  20. Constructori, constante şi "this" | Partea 4 Salut, Astăzi vom vedea adevărata importanţă a constructorilor, vom afla cum putem declara constante şi vom încerca să înţelegem ce înseamnă this. Începem cu ce este mai uşor, anume constantele . Pentru a declara o constantă tot ce trebuie să facem este să specificăm cuvântul cheie final. Prin convenţie, toate constantele se scriu cu litere mari, iar dacă denumirea este formată din mai multe cuvinte, acestea se separa folosind caracterul underscore (_) . De exemplu: public final String NUME; public final String NUME_VARIABILA; Bun, acum să trecem la lucruri cu adevărat serioase. Aşa cum stiţi deja, un constructor este o metodă specială care se apelează de fiecare dată când este creat un obiect nou. Chiar dacă nu specificăm explicit un constructor, Java va construi obiectul folosind constructorul implicit (fără signatură, fără corp). Să vedem câteva exemple de constructori: public class Caine{ String nume; int inaltime; public Caine(){ nume = "Bobita"; inaltime = 15; } public Caine(String numeCaine){ nume = numeCaine; inaltime = 20; } public Caine(String numeCaine, int inaltimeCaine){ nume = numeCaine; inaltime = inaltimeCaine; } public void afiseazaInformatii(){ System.out.println("Cainele " + nume + " are inaltimea " + inaltime + "."); } } public class ClasaPrincipala{ public static void main(String[] args){ Caine bobita = new Caine(); Caine pluto = new Caine("Pluto"); Caine zorro = new Caine("Zorro", 25); bobita.afiseazaInformatii(); // Afişează: Cainele Bobita are inaltimea 15. pluto.afiseazaInformatii(); // Afişează: Cainele Pluto are inaltimea 20. zorro.afiseazaInformatii(); // Afişează: Cainele Zorro are inaltimea 25. } } Observăm că deşi toate au acelaşi nume, Java reuşeşte să îşi dea seama despre ce constructor este vorba în funcţie de numărul de parametri pe care îl oferim. Bineînţeles, dacă scriem, de exemplu: Caine fuls = new Caine("Fuls", 60, 32); // sau Caine patrocle = new Caine("Patrocle", "30 centimetri"); vom primi o eroare în ambele cazuri deoarece nu am definit nici un constructor care să aibă trei parametri sau vreun constructor care să primească ambii parametri de tip String. Atenţie: am spus mai sus că dacă nu specificăm nici un constructor pentru o clasă, atunci va fi folosit constructorul implicit: public Caine(){ } Cu toate acestea, dacă avem de exemplu, doar constructorul public Caine(String numeCaine){ nume = numeCaine; inaltime = 20;} iar constructorul fără nici un parametru nu este specificat, atunci, dacă încercăm să instanţiem un nou obiect astfel: Caine bobita = new Caine(); se va returna o eroare întrucât nu există nici un constructor fără nici un parametru. Altfel spus, constructorul implicit este folosit numai în cazul în care nici un alt constructor nu este definit. Ok, a mai rămas doar să discutăm despre this. Formal, acest cuvânt ţine locul obiectului creat folosind clasa în care se află acesta. De exemplu: public class Caine{ String nume; int inaltime; public Caine(String nume, int inaltime){ this.nume = nume; this.inaltime = inaltime; } } Dacă instanţiem un obiect folosind acest constructor, vom obtine acelaşi rezultat ca în exemplul de mai sus (un obiect câine cu numele şi înălţimea specificate ca parametri). Diferenţa este că, de această dată, parametrii au aceeaşi denumire cu cea a câmpurilor. Astfel, pentru a diferenţia între variabilele locale (parametri) şi câmpurile clasei, vom accesa câmpurile din interiorul unui obiect, la fel cum am face într-o altă clasă. Bineînţeles, obiectul respectiv trebuie să fie o instanţă a clasei în care ne aflăm (pentru că vrem să modificăm câmpurile sale). Acest obiect care reprezintă clasa în care ne aflăm este denumit this şi este disponibil în mod implicit în fiecare clasă pe care o creăm. Aceasta este cea mai răspândită şi uşor de înţeles utilizare a cuvântului cheie this. Avantajul unei astfel de scrieri este că, pe de o parte, delimitarea dintre câmpuri şi variabilele locale este bine reprezentată, iar pe de cealaltă parte, parametrii având aceeaşi denumire cu atributele clasei, fac citirea şi înţelegerea codului mult mai uşoară. Totuşi aceste motive poate pot parea nesimnificative sau nu suficiente pentru a vă convinge de importanţa acestui cuvânt cheie. Din acest motiv, voi prezenta încă două exmple în care utilizarea obiectului this este cu adevărat folositoare. Prima astfel de utilizare este atunci când ne dorim să apelăm un constructor din interiorul altui constructor. De exemplu: public class Caine{ String nume; int inaltime; public Caine(){ this("Bobita", 15); // se va apela constructorul cu doi parametri definit mai jos } public Caine(String numeCaine, int inaltimeCaine){ nume = numeCaine; inaltime = inaltimeCaine; } } public class ClasaPrincipala{ public static void main(String[] args){ Caine bobita = new Caine(); bobita.afiseazaInformatii(); // Afişează: Cainele Bobita are inaltimea 15. } } Cea de-a doua utilizare este atunci când ne dorim să pasăm obiectul clasei în care ne aflăm într-o metodă a unui alt obiect. De exemplu: public class Caine{ private String nume; private Animal animal = new Animal(); public Caine(){ this.nume = "Bobita"; } public String returneazaNume(){ return animal.getNumeCaine(this); } public String getNume(){ return this.nume; } } public class Animal{ public String getNumeCaine(Caine caine){ return caine.getNume(); } } public class ClasaPrincipala{ public static void main(String[] args){ Caine bobita = new Caine(); System.out.println(bobita.returneazaNume()); // Afişează: Bobita } } Acest exemplu este un pic mai încurcat, dar nu imposibil de înţeles. În clasa Animal avem o singură metodă care primeste drept parametru un obiect de tip Caine şi returnează numele câinelui folosind metoda getName() prezenta în clasa Caine. În clasa Caine, instanţiem un nou obiect de tip Animal. Apoi, tot în aceasta, definim o metodă returneazaNume() care va returna rezultatul metodei getNumeCaine() din clasa Animal. Totuşi, această metodă primea ca parametru un obiect de tip Caine. Ca să satisfacem această cerinţă, vom pasa cuvântul cheie this care ţine locul unui obiect de tipul clasei în care ne aflăm. În final obţinem numele câinelui nostru. Cam atât pentru astăzi, sper că am fost suficient de clar, dacă aveţi orice fel de întrebări, nu ezitaţi să le scrieţi în comentarii, dacă nu, pe data viitoare. Sursa: madalinfasie.ro
×
×
  • Create New...