Jump to content

lüxor - High all the time.

Moderators
  • Content Count

    4,073
  • Joined

  • Last visited

  • Days Won

    26

Everything posted by lüxor - High all the time.

  1. ce limbaj folosesti ? (stiu ca am raspuns tarziu, dar totusi e elementar sa precizezi limbajul pentru a primi un raspuns)
  2. citire << varsta..? da-mi pm cu nr tau si iti scriu pe wapp sau prin mesaje
  3. in primul rand e v[index].angajat in al doilea rand cu getline citesti doar stringuri...
  4. cum adica da eroare la doua linie citita ? explica mai bine ce se intampla
  5. da-i edit si pune font normal si culoare normala ca sa pot citi de pe telefon
  6. nu stiu cine e @24Ghz. dar nu asta e rolul folderului c++/c... ce ai postat e doar pt posturi
  7. Medota de a afisa un numar random in C intre MIN si MAX inclusiv: #include <stdio.h> #include <stdlib.h> #include <time.h> #define MIN 5 #define MAX 10 int main() { srand(time(NULL)); int i = 0; while(i++ < 10) { int r = (rand() % (MAX + 1 - MIN)) + MIN; printf("%d\n",r); } return 0; } Medota de a afisa un numar random in C++ intre MIN si MAX inclusiv: #include <iostream> #include <cstdlib> #include <ctime> #define MIN 5 #define MAX 10 int main() { srand(time(NULL)); int i = 0; while(i++ < 10) { std::cout << (rand() % (MAX + 1 - MIN)) + MIN << '\n'; } return 0; } Cum functioneaza : rand() - Genereaza un numar pseudo-random, adica calculatorul nu e in stare sa creeze un numar random insa pe baza unor calcule matematice va reusi sa dea mereu alt rezultat. time(NULL) - functia time returneaza timpul actual inapoi. (okay, practic procedeul este mai complicat... iar explicatia nu are rost in momentul actual). NULL poate fi interpretat ca si 0, el este pointerul ce pointeaza la adresa 0 : (void*)0 - vom vorbi despre astea mai tarziu, momentan sa ramanem la ideea ca time(NULL) - returneaza timpul actual. srand(seed) - Primeste un numar dupa care calculeaza valorile random. prin rand(), seed fiind strict pozitiv. Practic noi facem in felul urmator : setam ca seed timpul actual (mereu va fi un altul, timpul nu sta in loc) iar apoi doar folosim rand() rand() rand() pana nu mai vrem. Insa rand() ne ofera numere imense, iar noi va trebui sa le controlam... cum facem asta ? ei bine avem o metoda matematica interesanta : (rand() % (MAX + 1 - MIN)) + MIN // stabilim ca MIN sa fie 5 si MAX 10, ca de exemplu orice numar primim (sa zicem 9999) daca efecuam operatia acesta se va afla in intervalul nostru, haida sa vedem (9999 % (10+1-5))+5 = (9999 % 6) + 5 = 3 + 5 = 8 // care se afla in interval daca rand() dadea alte valori sa vedem ce iesea : 9998 -> 7 10000 -> 9 10001 -> 10 10002 -> 5 (10002 % 6 este 0, iar 0+5 este 5)
  8. Capat de drum Server cunoscut ca si dr.fioriginal.ro sau pe vremuri drx.devil.ro, a ajuns la final. Toti administratorii au ajuns sa isi preocupe timpul cu alte activitati mai importante in viata lor, este timpul sa ne luam ramas bun. Motivele sunt clare : serverul era construit pentru un numar ridicat de playeri pentru cs 1.6, datorita trecerii timpului acestia au scazut drastic in fiecare luna. Cum toti administratorii am ramas in lipsa de timp nu am reusit sa reformam serverul in felul in care acesta sa mearga si fara jucatori... din pacate staff-ul nostru s-a dorit a fi format din persoane atat active cat si inteligente, de asta poate o parte din ultimele persoane ajunse in staff aveau un deficit clar de inteligenta. Cum am spus, serverul isi va lua acum adio, dupa 4 ani de activitate. 2013-2017 Voi ruga un administrator sa pastreze acest topic chiar si cand categoria nu va mai exista, deoarece vreau sa postez tot in acest topic tot serverul la momentul actual, cu toate parolele si sursele si fisierele. Good News : Dr.FioriGinal.Ro nu moare de tot, ne vom muta pe CS:GO. Aceasta va fi urmatoarea noastra miscare : portarea unui server de CS 1.6 pe CS:GO. ADDONS COMPLET DR.FIORIGINAL.RO: https://github.com/luxxxoor/dr.fioriginal.ro/tree/master/dr
  9. Algoritmul C: Functia va citi din fisier(sau consola) pana cand va gasi un anumit caracter (stabilit de voi). Iar rezultatul va fi salvat intr-un char*. #include <stdlib.h> #include <stdio.h> char* readString(FILE* FilePointer, char EndCharacter) { char *InputString, Character; size_t Lenght = 0, Size = 10; InputString = (char*)realloc(NULL, sizeof(char)*Size); if (!InputString) return NULL; if (FilePointer == stdin) { InputString[Lenght] = fgetc(FilePointer); if (InputString[Lenght] != '\n') Lenght++; } while (EOF != (Character = fgetc(FilePointer)) && Character != EndCharacter) { InputString[Lenght++] = Character; if (Lenght == Size) InputString = (char*)realloc(InputString, sizeof(char)*(Size *= 2)); if (!InputString) return NULL; } InputString[Lenght++] = '\0'; return (char*)realloc(InputString, sizeof(char)*Lenght); } Ok, spre deosebire de ce am facut pana acum asta e super complex, ideea in algoritm e urmatoarea : - initializam un cstring (char*) in care vom salva stringul si un char care va citi din fisier caracter cu caracter + 2 variabile de tip size_t (size_t este defapt unsigned long int, pe scurt este un fel de long int care nu permite valori negative si de dimensiune dubla) - alocam un spatiu dinamic (conform : http://en.cppreference.com/w/c/memory/realloc) realloc(NULL, ceva); este echivalent cu malloc(ceva); De retinut : malloc/calloc/realloc - toate returneaza void*, asa ca trebuie sa convertim in tipul nostru : char*. - la final verificam ca alocarea sa fie efectuata cu succes, altfel returnam NULL. (pointer inaccesibil, practic semnalam ca operatia a esuat). - urmatorul pas este unul particular, in caz ca este introdus stdin ca si pointer de citire si caracterul enter : '\n' a fost introdus, poate aparea un bug, asa ca vom incerca sa-l remediem, mai pe scurt vom citi un caracter din consola iar daca acesta nu este '\n' il vom baga in stringul nostru. - acum vine partea automata, vom citi de la tastatura pana cand gasim caracterul introdus de noi sau pana cand se va termia fisierul (EOF, care inseamna End of file), sau pana cand Size va si egal cu Lenght (adica pana cand numarul caracterelor introduse va fi egal cu numarul de caractere maxim introduse) in acest caz vom realoca pointerul, pentru a primi o dimensiune dubla. La fel, in cazul unui esec al realocarii vom returna NULL. - spre final, pentru ca cstring-urile se termina cu caracterul null vom introduce caracterul '\0' la final. - la final, vom realoca cstringul cu valorea lui Lenght, pentru a avea fix dimensiunea sigurului. Exemplu de apelare a functiei : int main() { FILE* FilePointer = fopen("file.txt", "r"); char* String1 = readString(stdin,'\n'); // citeste din consola pana la primul newline char* String2 = readString(FilePointer , EOF); // citeste din fisierul file.txt pana cand se va termina. // do things free(String1); free(String2); fclose(FilePointer); return 0; } Evindet la final se vor elibera spatiile de memorie consumate.
  10. nu vad scopul pt care as face pe ip/steamid iar pentru cvar sincere scuze... in teste functiona iar dupa am realizat ca nu e chiar asa auto-update... nu stiu daca se merita sincer utf8-exploit nu stiu care e, ori am stiut si nu stiu ori nu am stiut niciodata, oricum pluginul trebuie sa fie o extensie a dproto, nu o inlocuiri a lui (un bonus de protectie, nu o protectie full) greseli sunt, e un plugin vechi la care ma uit urat de fiecare data cand modific ceva in el. daca esti interesat in a dezvolta pluginul cauta-ma cineva sa imi faca merge la astea 2 poaturi, nu merge de pe telefon sa raspund altfel la ambele quote-uri
  11. sa te multumesti cu ce ai nu e mereu ok, mereu trebuie sa cauti automatizare, de ce sa ne chinuim cu chestii deegaba ? ce are 4.1 ? peste tot se pot face chestii.
  12. de ce nu puteam avea si noi mecanisme avansate, care sa faca automat chestiile neimportante si cliseice ? uite un exemplu : cineva face o cerere... la CS, de ce sa nu se puna automat numele topicului asa : [CS] [Cerere Level 1] (spatiu de completat numele lui, sau de ce nu sa se completeze dupa model) alt ex : dau acceptat sau respins, de ce sa nu se schimbe automat numele topicului cand inchid topicul si primul cuvant din ultimul post e respins sau acceptat si sa se mute la categoria lui. cum sa spun altfel... suntem oameni si ne plictisim de chestiile astea inutile... daca se poate mai bine de ce sa nu facem ? sa nu mai zic de faza cu dublu post... de ce sa nu se faca automat cand faci dublu post edit la celalt post ? astea is numa cateva exemple... si recunoasteti ca v-ar face viata mai usoara, ca nu cred ca sunt eu ultimul lenes din comunitate.
  13. acel plugin nu este bun, o sa caut eu luni(sau duminica) unul pe alliedmodders sau daca crezi ca esti mai rapid poti sa-mi trimiti pm cu el.
  14. # Nick: lüxor# Nick nou: VrînceanAlex.lüxor# Motiv: Asa e si pe steam.# Posturi: 3830# Au trecut 3 luni de cand ti-a fost acceptata cererea anterioara?: It's first.# Indeplinesti conditiile?: Yep.
  15. Nume participant: lüxor Pe cine injuri daca nu iei premul dorit : Devil si Faby.
  16. Cmmdc este adesea folosit in multe programe pentru a verifica care divizorul comun a doua sau mai multe numere, adesea cmmdc ne va ajuta sa gasim proprietati pentru numere mari, insa folosindu-ne de acesta putem creste eficienta programului. Algoritmul cmmdc prin scadere : #include <stdio.h> int main() { int a, b; Repeat: printf("Introducet 2 numere mai mari decat 0 : \n"); scanf("%d %d", &a, &b); if (a <= 0 || b <= 0) { printf("Numerele trebuie sa fie mai mari ca 0 ! \n"); goto Repeat; } int aux_a = a, aux_b = b; while (a != b) { if(a > b) { a -= b; } else { b -= a; } } int cmmdc = a; int cmmmc = aux_a * aux_b / cmmdc; printf("C.M.M.D.C. = %d \n", cmmdc); printf("C.M.M.M.C. = %d", cmmmc); return 0; } Algormitmul prin scadere nu este foarte rapid insa este mai usor de scris, mecanismul fiind simplu, scadem din a pe b, atat timp cat a este mai mare ca b, iar daca a este mai mic ca b, il scadem pe b cu a pana cele 2 numere ajung egale. Cmmmc este simplu de calculat, odata ce am calculat cmmdc trebuie doar sa inmultim valorile a si b INITIALE si sa le impartim la cmmdc. Totul se extrage din formula : CMMMC = a * b / CMMDC(a, b). Alogirtmul lui Euclid : #include <stdio.h> int main() { int a, b; Repeat: printf("Introducet 2 numere mai mari decat 0 : \n"); scanf("%d %d", &a, &b); if (a <= 0 || b <= 0) { printf("Numerele trebuie sa fie mai mari ca 0 ! \n"); goto Repeat; } int aux_a = a, aux_b = b; if (a > { int aux = b; b = a; a = b; } int r = b % a; while (r != 0) { b = a; a = r; r = b % a; } int cmmdc = a; int cmmmc = aux_a * aux_b / cmmdc; printf("C.M.M.D.C. = %d \n", cmmdc); printf("C.M.M.M.C. = %d", cmmmc); return 0; } Acest algoritm este mult mai rapid decat cel prin scadere, insa este putin mai greu de inteles. Mecanismul acestui alogoritm se bazeaza pe aflarea restului impartirii lui b la a (b > a), astfel inainte de a intra in while vom crea o variabila r (de la rest) care va fi egala cu restul impartirii lui b la a, atat timp cat r(restul) va fi diferit de 0, b (valoarea mai mare) va primi valoarea lui a(valoarea mai mica), iar a va fi egal cu r (restul). Pe scurt vom tot calcula pana cand restul precedent impartit la restul actual va da 0. Cmmmc va ramane la fel : cmmdc = a * b / cmmdc(a, b )
  17. Incepand de acum am sa prezint anumiti algoritmi elementari, incepem cu algoritmul de aflare al unui numar prim. Exista numeroase metode prin care putem afla daca un numar este prim, asa ca voi prezenta in acest tutorial 2 feluri de algormitmi (unul lent si usor de inteles, si unul foarte rapid dar mai greu de inteles). Pentru incepatori : include<iostream> using namespace std; int main() { int n, div = 0; cout<<"Introduceti n"; cin>>n; for (int i = 1; i <= n; ++i) { if (n % i == 0) div++; } if (div == 2) cout<<"Numarul este prim"; else cout<<"Numarul NU este prim"; return 0; } Explicatie : Un numar prim este un numar natural care are exact doi divizori: numarul 1 si numarul in sine. Cel mai mic numar prim este 2, 2 fiind singurul numar prim par. Toate celelalte numere pare sunt divizibile cu 2. Programul se bazeaza pe faptul ca un numar prim are numai doi divizori: pe el si pe el insusi. Vom vedea cati divizori are numarul, retinand numarul intr-o variabila, notata div. Pentru Avansati : #include<iostream> using namespace std; int main() { int n; cout<<"Introduceti n"; cin>>n; if (n == 2) { cout<<"Numarul este prim"; return 0; // iesim fortat din main(); } else if (n % 2 == 0) { cout<<"Numarul NU este prim"; return 0; // iesim fortat din main(); } for (int div = 3; div * div <= n; div += 2) { if (n % div == 0) { cout<<"Numarul NU este prim"; return 0; // iesim fortat din main(); } } cout<<"Numarul este prim"; return 0; } Explicatie : Dupa introducerea numarului il vom verifica daca acesta este 2, deoarece 2 este singurul numar prim par, iar daca nu vom verifica daca numarul nu este cumva par (dar diferit de 2). Dupa acesta verificare vom crea variabila div initializata cu 3 (1 este divizor comun tuturor, 2 este verificat mai sus) care va creste din 2 in 2 (restul numerelor pare nu pot fi prime) pana cand div la patrat va avea valoarea lui n. Daca numarul se imparte la div, inseamna ca nu este prim si iesim din functie, altfel numarul este prim. Diferente : Primul algoritm are o eficienta de O(n) adica va parcurge N numere ( de la 1 la n, oricare ar fi n introdus de la tastatura). Al doilea algoritm are o eficienta de O(radical(n/2) - 1) adca va parcurge mult mult mult mai putine numere. Ganditiva ca daca introducem un numar marge gen 169 sa-l verificam daca e prim, primul algoritm va verifica pana la nr 169 iar al doilea pana la 13, cu cat sunt mai mari numerele cu atat e mai mare diferenta !.
  18. Pentru cei care vor sa faca un if scurt si simplu pentru doar o instructiune banala si vor sa iroseasca timp (de scriere) si spatiu in cod exista o solutie : Inlane If Else. #include <iostream> int main() { int i; // i va avea o valoare random std::cout << "i este un numar " << i % 2 == 0 ? "par" : "impar"; return 0; } Structura : conditie ? instructiune1 : instructiune2 - conditia reprezinta o iterogatie (spre exemplu i > 2), instructiunea1 este instructiunea ce se va executa daca conditia este adevarata si instructiunea2 se va executa daca conditia este falsa. Exemplu : In loc sa scrii un simplu if : int i = 2; if (i % 2 == 0) std::cout << "Numarul este par"; else std::cout << "Numarul este impar"; Poti scrie mai simplu : std::cout << i % 2 == 0 ? "Numarul este par" : "Numarul este impar" Nu sunt multe de precizat, in principiu asta este tot, insa ajuta foarte mult cateodata (decat un cod incarcat mai bine unul simplu)
  19. Ei bine switch este jucaria noastra cand vrem sa comparam valoarea unei variabile cu a unei constante, iar in loc sa facem foarte multe if-uri putem sa folosim switch. #include <iostream> int main() { int i = 2; switch (i) { case 1: std::cout << "1"; case 2: std::cout << "2"; //executia incepe la acest case case 3: std::cout << "3"; case 4: case 5: std::cout << "45"; break; //executia se termina la primul break case 6: std::cout << "6"; } std::cout << ' '; switch (i) { case 4: std::cout << "a"; default: std::cout << "d"; // deoarece nici un alt case nu este valid cu valoarea din switch // cazul default se va apela } std::cout << ' '; //daca nu punem using namespace std; la inceput, va trebui sa scriem std::cout (cu spatiul de nume in fata) switch (i) { case 4: std::cout << "a"; //nu se va intampla nimic } return 0; } Va printa : 2345 d Cum functioneaza : switch(n) - Cu cuvantul cheie switch vom deschide operatiunea de verificare a valorilor acestuia. n este variabila care este verificata cu un sir de constante. case valoare_constanta: - Folosind case ii propunem switch-ului un nou caz (case se traduce caz), valoare_constanta este o valoare cu care este comparata variabila n. (Atentie, doar valori constante, nu si variabile ! Exemplu 2 este consant, o variabila int cu numele i nu este constanta). Daca n are valoarea constanta a acestui caz, se vor executa toate instructiuniile de la acest case pana la primul break sau cand se iese din switch. Exemplu : case 2: break; - Asemenea ca break-ul din cicluri, ele au rolul de a opri executarea datelor, astfel daca nu se pune break, codul se va efectua de la toate case-urile de la cel care a pornit instructiunea la restul case-urilor. default: - Acesta este un caz special, in sensul in care, daca toate case-urile de mai sus de acesta au esuat acesta se va executa orice ar fi (doar in caz ca nu s-a dat break inainte). Exemplu : int i = 5; switch(i) { case 0 : cout << 0; break; case 1 : cout << 1; break; case 2 : cout << 2; break; default : cout << "alt numar"; } Va printa: alt numar Atentie ! Codul se va executa indiferent de caz. Exemplu int i = 1; switch(i) { case 0 : cout << 0; case 1 : cout << 1; // se va executa acest case case 2 : cout << 2; break; default : cout << "alt numar"; } Va printa: 12 (pana la primul break) Bonus : Anumite compilere suporta siruri de constante, insa acest lucru tine de fiecare compiler ! exemplu : In loc sa scrii : int i = 3; switch(i) { case 1 : case 2 : case 3 : case 4 : case 5 : cout << "Numarul este intre 1 si 5"; break; default : cout << "Numarul NU este intre 1 si 5"; } Poti scrie mai rapid : int i = 3; switch(i) { case 1 ... 5 : cout << "Numarul este intre 1 si 5"; break; default : cout << "Numarul NU este intre 1 si 5"; }
  20. Operatiunea break va face ca atunci cand este folosita sa se iasa din ciclu, indiferent daca conditia ciclului este respectata sau nu, codul de sub break din orice ciclu nu va mai fi executat : #include <iostream> using namespace std; int main () { for (int n=10; n>0; n--) { cout << n << ", "; // printf("%d, ", n); if (n==3) { cout << "numaratoare inversa orpita!"; // printf("numaratoare inversa oprita!"); break; // aici se iese brusc din for. } //cout << "debug"; // puteti sterge primele comentarii ca sa intelegi cum se executa for-ul. } return 0; } Programul printa : 10, 9, 8, 7, 6, 4, numaratoare inversa orpita! break - Se foloseste adesea cand ciclul tau are nevoie de o conditie suplimentara insa care sa execute o parte din cod, de precizat este ca tot ce este deasupra lui break se executa, insa odata break folosit tot ce e in ciclu sub este este ignorat si se iese afara din for. Exemplu usor de indercat : int i = 0; while (cin >> i) // cin >> i = atat timp cat se poate citi i (la fel se face si cu scanf("%d", &i) { if (i == -1) break; cout << "Ai introdus numarul " << i; // la se face si cu printf("Ai introdus numarul %d", i) } Explicatie : programelul va merge doar pana a-ti introdus numarul -1; Operatiunea continue va face ca atunci cand este folosita sa se continue ciclul fara a se executa ce e sub continue, codul de sub continue din orice ciclu nu va mai fi executat insa ciclul va contiua : #include <iostream> using namespace std; int main () { for (int n=10; n>0; n--) { if (n==5) continue; cout << n << ", "; // printf("%d, " n); } return 0; } Programul printa : 10, 9, 8, 7, 6, 4, 3, 2, 1 (Fara 5 !) continue - Se foloseste cand ciclul tau are nevoie sa ignore o serie de instrunctiuni, de precizat este ca tot ce este deasupra lui continue se executa, insa odata continue folosit tot ce e in ciclu sub este este ignorat insa nu se iese afara din ciclu, ci se va trece la urmatoarea tura a ciclului. Exemplu usor de indercat : int i = 0; while (cin >> i) // cin >> i = atat timp cat se poate citi i (la fel se face si cu scanf("%d", &i) { if (i % 2 == 0) continue; if (i == -1) break; cout << "Ai introdus numarul " << i; // la se face si cu printf("Ai introdus numarul %d", i) } Explicatie : programelul va merge doar pana a-ti introdus numarul -1, si va printa doar numerele impare.
×
×
  • Create New...