ldd.man25 Posted December 14, 2014 Report Posted December 14, 2014 Sa trecem la subiect, problema suna in felul urmator: "Cunoscand numarul de locuitori din n orase, se doreste determinarea numarul de orase a caror populatie depaseste o valoare p specificata. La o singura executie a programului, pot fi specificate mai multe valori P pana la introducerea valorii 0, avand semnificatia sfarsit prelucrare." Exemplu date intrare si date de iesire: Date intrare n=4 1500000 750000 2005000 2500000 p=200000 p=1350000 p=3000000 p=0 Date de iesire: 2 3 0 sfarsit prelucrare Cum a rezolvat boss: #include<iostream> using namespace std; int main() {long n,p; int i,j,k=0; cout<<"Introduceti numarul de orase: ";cin>>n; int locuitori[n]; for(i=0;i<n;i++) { cout<<"nnNumarul de locuitori din orasul "<<i+1<<" :";cin>>locuitori[i]; } cin>>p; //citesc P if(p!=0)//verific daca e diferit de 0 do { k++; //cu asta tin evidenta la P-uri, chiar daca nu e necesar. j=0; //cu J contorizez cate orase a gasit cu locuitori mai multi ca P for(i=0;i<n;i++) if(locuitori[i]>p)j++; cin>>p; cout<<"nnPentru P"<<k<<" , s-au gasit "<<j<<" orase."; }while(p!=0); cout<<"nnSfarsit prelucrare."; return 0;} Programul e bun si imi da rezultatul dorit, DAR vreau sa stiu daca e vreun mod de a-l introduce pe P fara sa dea urat pe consola. Adica: http://imgur.com/2YGfpKS Dupa ce il introduc de doua ori, incepe sa se incurce cu cout-ul si nu-mi place. Vreau sa stiu daca se poate sa-l introduc si pe P separat, si dupa sa se afiseze rezultatele. Ma gandeam sa fac un vector pentru P, dar nu stiu care sa fie numarul maxim, deoarece cere sa fie introdus pana cand se da valoarea 0. Dupa m-am gandit sa-l citesc pe P si sa-l afisez de fiecare data intr-un fisier, pana se introduce 0, si dupa sa incep sa citesc fisierul, problema e ca nu stiu cum sa citesc dintr-un fisier .out Complicata treaba. Fara subprograme sau alte minuni. Multumesc anticipat celor care au citit si incearca sa ma ajute <3
JustMagik Posted December 15, 2014 Report Posted December 15, 2014 int p,m,a[100],i; int main() { while(cin>>p) if(p==0) {a[++m]=p; // cand este 0 , acesta va fi ultimul element break;} // iasa din functie else a[++m]=p; // daca este diferit de 0 se adauga in vector for(i=1;i<=m;i++) cout<<a[i]; // il afisezi } Daca vrei sa pui P intr-un vector cam asa arata
ldd.man25 Posted December 15, 2014 Author Report Posted December 15, 2014 Satanate si virtute domnu' Totusi, nu inteleg ce face a[++m] M trebuia declarat 0 la inceput sau ce? Si a e defapt vectorul pentru P, nu? Sunt cam confuz. Poti sa explici mai detaliat te rog? Ce sunt M si A defapt? Si de ce ai luat a[100] la inceput si nu a[3]? Sau a[orice altceva]? EDIT: am inteles acum ce face programelul, problema e ca nu mi se pare corect faza cu a[100] la inceput, daca dau peste 100 de p-uri nu merge. Suna stupid, dar nu e corect. P-ul se introduce pana cand are valoarea 0...Cum l-am facut eu mai sus, este mai putin "estetic", dar corect. Si eu vreau sa arate si FRUMOS si CORECT =]] Multumesc pt ajutor oricum, dar hai sa ne mai gandim Cum mortii lui sa-l introduc pe P intr-un vector, pana cand ia valoarea 0. Maximul vectorului ar trebui sa fie egal cu numarul de introduceri. Mindfuck, alte idei?
JustMagik Posted December 15, 2014 Report Posted December 15, 2014 a[100] este dimensiunea maxima a vectorului a . In problema iti specifica cat de mare este un vector sau o matrice , si modifici in functie de cerintele problemei. Vectorul a memoreaza toate p-urile pana la intalnirea lui 0 , inclusiv 0 , ca sa respecte restul problemei. Daca ai avea 2300 32312 4 434 343 0 123 421 , este necesar ce am spus eu mai sus , adica vectorul sa fie 2300 32312 4 434 343 0 , ca in problema 0 sa fie Sfarsitul problemei. Am facut metoda asta ca sa-ti arat si cum se face cu p-=urile intr-un vector , se poate si fara vector.
ldd.man25 Posted December 15, 2014 Author Report Posted December 15, 2014 Ai citit ce am scris la EDIT? In problema asta nu se specifica maximul pt vectorul P, deoarece se poate rezolva si fara un vector P, dar arata mai "urat". Vreau sa stiu daca putem afla noi maximul exact, pt ca nu este dat de problema. In problema iti specifica cat de mare este un vector sau o matrice , si modifici in functie de cerintele problemei. Mai citeste cerinta care e mai sus, poate ma insel eu totusi.
JustMagik Posted December 15, 2014 Report Posted December 15, 2014 marimea o stabilesti tu , de aia am pus ++m , m initial este 0 , iar el se mareste pe parcurs ce adaugi elemente in vector . La cerinta m-am referit la modul general , cand in probleme iti specifica dimensiunea pentru vector sau matrice sau sir . ex : 0<p<100. in cazul acesta vectorul poate sa fie de max 100 de elemente , daca pui de a[15] de ex si tu ai 99 de elemente e o problema atunci , de aia e bine sa iei cazul in care toate elementele verifica conditiile problemei.
ldd.man25 Posted December 15, 2014 Author Report Posted December 15, 2014 marimea o stabilesti tu , de aia am pus ++m , m initial este 0 , iar el se mareste pe parcurs ce adaugi elemente in vector . La cerinta m-am referit la modul general , cand in probleme iti specifica dimensiunea pentru vector sau matrice sau sir . ex : 0<p<100. in cazul acesta vectorul poate sa fie de max 100 de elemente , daca pui de a[15] de ex si tu ai 99 de elemente e o problema atunci , de aia e bine sa iei cazul in care toate elementele verifica conditiile problemei. Pai asta vreau sa zic, de unde stii ca nu or sa fie mai mult de 100 de elemente? Sau 100 este maximul pentru oricare vector? adica maximul poate sa fie si mai mare de 100?
Moderators Courage Posted December 15, 2014 Moderators Report Posted December 15, 2014 Băieţi, dacă ce aţi făcut voi e acolo e vector, atunci #include <vector> int main ( void ) { std :: vector < int > orase; return 0; } ce este? #include <iostream> #include <algorithm> #include <vector> using namespace std; unsigned int numar_orase ( vector < unsigned int > v, unsigned int populatie ) { unsigned int nr = 0; for ( vector < unsigned int > :: iterator oras = v.begin() ; oras != v.end() ; ++oras ) { if ( *oras < populatie ) return nr; nr++; } return nr; } int main ( void ) { vector < unsigned int > orase; orase.push_back( 100000 ); orase.push_back( 300000 ); orase.push_back( 700000 ); orase.push_back( 5000000 ); vector < unsigned int > populatie; populatie.push_back( 200000 ); populatie.push_back( 400000 ); populatie.push_back( 500000 ); populatie.push_back( 1000000 ); sort ( orase.begin() , orase.end(), greater < unsigned int > ()); for ( vector < unsigned int > :: iterator it = populatie.begin() ; it != populatie.end() ; ++it ) { cout << numar_orase( orase, *it ) << endl; } return 0; } 3 2 2 1
+Raziel Posted December 15, 2014 Report Posted December 15, 2014 Este acelasi lucru, aia este... numai ca tu ai folosit template-ul din STL. Codul lui JustMagik este mai eficient si mai simplu. Intrebarea era daca stii ce-i ala vector.
+Raziel Posted December 15, 2014 Report Posted December 15, 2014 Pai da. De ce sa folosesti <vector> pentru banalitati ? STL-ul se foloseste numai la graba / comoditate. In industrie se foloseste destul de rar STL pentru ca are continut generic care nu exceleaza in performanta.
Moderators Courage Posted December 15, 2014 Moderators Report Posted December 15, 2014 M-am obisnuit cu std vector, si imi e mai la indemana (push_back, size, etc) Am sortat orasele descrescator si am luat fiecare p; daca gaseam un oras cu populatie mai mica decat p returnam direct numarul de orase gasite pana atunci (orasele care vin clar is mai mici si nu mai are rost sa continui)
ldd.man25 Posted December 15, 2014 Author Report Posted December 15, 2014 M-am obisnuit cu std vector, si imi e mai la indemana (push_back, size, etc) Am sortat orasele descrescator si am luat fiecare p; daca gaseam un oras cu populatie mai mica decat p returnam direct numarul de orase gasite pana atunci (orasele care vin clar is mai mici si nu mai are rost sa continui) Baieti, eu apreciez ca v-ati dat interesul si ati rezolvat problema. Pe mine nu ma incanta cu absolut nimic faptul ca am o rezolvare din care nu inteleg nimic. Courage, uite, singurele biblioteci pe care le stiu sunt <iostream> <math.h> <fstream> Si tot ce am facut la clasa pana acum sunt structurile conditionale si repetative (if, while, do while, for, switch), si acum ultima oara vectorii. Stiu cum se initializeaza, cum se citesc si cum se afiseaza, cam atat. Probabil ca exercitiul asta e banal pentru voi, dar din moment ce am intalnit problema asta in carte, inseamna ca trebuie facuta doar cu ce am invatat pana acum. Inca o data, ce vreau eu mai exact: Introduc numarul de orase. Locuitorii fiecarui oras. Toate P-urile. Sa se afiseze rezultatele unul sub celalalt. Nu imi placea ca eu introduceam P-ul, si sub el mi se afisa rezultatul, mai dadeam un P, alt rezultat. Vreau sa introduc P-urile si cand am terminat si am dat 0, sa se afiseze rezultatele. Multumesc!
ldd.man25 Posted December 19, 2014 Author Report Posted December 19, 2014 Am continuat sa lucrez problemele de la capitolul vectori din manual, si am dat de asta: Un cod poate fi format din cel mult 20 de caractere (cifre si litere mari). Sa se formeze un cod nou care sa inceapa cu literele primului cod, urmat de cifrele acestuia. Exemplu: Sugestii pentru un cod format din 7 caractere. cod 17A3R9E cod nou ARE1739 Ce m-am gandit pana acum: #include<iostream> using namespace std; int main() { unsigned i,n; do{cout<<"Introduceti numarul de caractere (max 20): ";cin>>n;if(n>20)cout<<"nnn! EROARE !nMAXIM 20 !n";}while(n>20); char cod[n]; cout<<"nnIntroduceti codul: "; for(i=0;i<n;i++) cin>>cod[i]; return 0;} M-am gandit sa fac un vector pentru acel cod, initializat 'char'. Nu stiu cum sa separ literele de cifre. Vroiam sa fac ceva gen: if(cod este cifra) fa aia; daca e litera, pune acel caracter in alta parte. Nu stiu daca e posibil ce m-am gandit eu, oricum, astept idei.
Moderators Courage Posted December 19, 2014 Moderators Report Posted December 19, 2014 #include <iostream> using namespace std; int main ( void ) { int n, i; char sir[20]; cout << "n="; cin >> n; for (i=0 ; i<n ; i++) { cin >> sir[i]; } for (i=0 ; i < n ; i++) // Afisezi literele mari { if ('A' <= sir[i] && sir[i] <= 'Z') cout << sir[i]; } for (i=0 ; i < n ; i++) // Afisezi cifrele { if ('0' <= sir[i] && sir[i] <= '9') cout << sir[i]; } return 0; }
ldd.man25 Posted December 19, 2014 Author Report Posted December 19, 2014 Deci 'A' este mai mic decat 'B', de exemplu. Nu stiam treaba asta, multumesc!
Moderators Courage Posted December 19, 2014 Moderators Report Posted December 19, 2014 http://www.techonthenet.com/ascii/chart.php
ldd.man25 Posted December 19, 2014 Author Report Posted December 19, 2014 Am mai dat de o problema...daca o mai termin pe asta ma opresc pe ziua de azi. M-au gasit dracii bagand datele de intrare la cate variante am incercat, le stiu deja pe de-asupra, ca numerele alea dupa hatch din Lost Dupa n aruncari cu doua zaruri, se cunoaste numarul de puncte obtinute la fiecare aruncare. Suma punctelor formeaza punctajul aruncarii. Sa se determine numarul de aparitii ale fiecarui punctaj. Exemplu: Sugestii pt 6 aruncari: Date de intrare Date de iesire zar1 zar 2 Punctaj Numar de aparitii 6 4 10 2 5 3 8 2 5 5 7 1 4 3 4 1 2 6 1 3 Faza e ca daca un punctaj se repeta, nu trebuie afisat de doua ori. Nu am reusit nici sa le afisez pe toate si in dreptul lor nr de aparitii... -nu stiu sa verific de cate ori se repeta un punctaj -nu stiu cum sa afisez doar o data, daca punctajul se repeta. #include<iostream> using namespace std; int main() {int n,i,j,k; cout<<"Introduceti numarul de aruncari: ";cin>>n; //introduc nr de aruncari int z1[n],z2[n],punctaj[n],aparitii[n]; for(i=0;i<n;i++) //cu acest for introduc punctajele de pe fiecare zar la fiecare aruncare { cout<<"nn----- Aruncarea nr "<<i+1<<" -----nn"; cout<<"nz1 = ";cin>>z1[i]; cout<<"nz2 = ";cin>>z2[i]; } for(i=0;i<n;i++) { k=1; punctaj[i]=z1[i]+z2[i]; for(j=1;j<n;j++) //aici verific de cate ori se repeta un punctaj { // dar cred ca trebuie ceva gen j=i+1, dar nu stiu cum sa scriu asta punctaj[j]=z1[j]+z2[j]; //ca sa inteleaga si calculatorul, ca nu merge nici j=++i if(punctaj[i]==punctaj[j])k++; } aparitii[i]=k; } cout<<"nn ----- PUNCTAJ ----- ----- NR de APARITII -----nnn"; for(i=0;i<n;i++) {cout<<" "<<punctaj[i]<<" "<<aparitii[i]<<'n'; } return 0;}
ldd.man25 Posted December 19, 2014 Author Report Posted December 19, 2014 Update: Am gasit cum sa afiseze fiecare punctaj cu numarul de aparitii langa. Faza e ca trebuie sa afisez punctajul doar o data, de exemplu daca z1=6 z2=4 z1=5 z2=5 trebuie sa se afiseze doar: punctaj 10 nr de aparitii 2. Cum l-am facut eu se afiseaza punctaj aparitii 10 2 10 2 #include<iostream> using namespace std; int main() {int n,i,j,k; cout<<"Introduceti numarul de aruncari: ";cin>>n; //introduc nr de aruncari int z1[n],z2[n],punctaj[n],aparitii[n]; for(i=0;i<n;i++) //cu acest for introduc punctajele de pe fiecare zar la fiecare aruncare { cout<<"nn----- Aruncarea nr "<<i+1<<" -----nn"; cout<<"nz1 = ";cin>>z1[i]; cout<<"nz2 = ";cin>>z2[i]; } for(i=0;i<n;i++) { k=1; punctaj[i]=z1[i]+z2[i]; for(j=i+1;j<n;j++) //cine se gandea ca merge j=i+1... { // dar cred ca trebuie ceva gen j=i+1, dar nu stiu cum sa scriu asta punctaj[j]=z1[j]+z2[j]; //ca sa inteleaga si calculatorul, ca nu merge nici j=++i if(punctaj[i]==punctaj[j])k++; } aparitii[i]=k; } cout<<"nn ----- PUNCTAJ ----- ----- NR de APARITII -----nnn"; for(i=0;i<n;i++) {cout<<" "<<punctaj[i]<<" "<<aparitii[i]<<'n'; } return 0;} E exact la fel ca primul postat, doar ca la al 3-lea for am schimbat cu j=i+1 si acum merge, dar trebuie reparat sa dea cum am explicat.
ldd.man25 Posted December 21, 2014 Author Report Posted December 21, 2014 Nu poate nimeni sa ma ajute? Mai pe scurt, vreau sa aflu cum pot sa contorizez de cate ori am acelasi numar intr-un vector, si cand il afisez nu vreau sa arat de mai multe ori, numerele care se repeta. De exemplu. v[] = {10,10,10,3,4} vreau sa se afiseze: 10 3 (pt ca s-a repetat de 3 ori) 3 1 (ca a fost doar un 3) 4 1 (pt ca a fost doar un 4)
hiey19 Posted December 21, 2014 Report Posted December 21, 2014 O metoda pe care o poti intelege foarte usor insa are si dezavantaje. Iti creezi un vector nou, contor[], caruia ii dai o dimensiune mai mare decat valoarea maxima din vectorul initial. Parcurgi vectorul tau si faci contor[ v ]++ . Pe exemplul tau: i=1 , face contor[ v[1] ]++ deci contor [10]++ ... vectorul tau contor va arata ceva de genul :{ 0,0,0,0,0,0,0,0,0,1,0,0....} i=2 , face contor[ v[2] ]++ deci contor [10]++ ... vectorul tau contor va arata ceva de genul :{ 0,0,0,0,0,0,0,0,0,2,0,0....} etc.. Cred ca ai inteles idea. Pe pozitia v din vectorul contor vei avea numarul de aparitii a acelui element din vector.
ldd.man25 Posted December 21, 2014 Author Report Posted December 21, 2014 Nu prea am inteles hiey, m-am gandit eu la altceva. for(i=0;i<punctaj.size();i++) { punctaj[i]=z1[i]+z2[i]; k=1; for(j=i+1;j<punctaj.size();j++) { punctaj[j]=z1[j]+z2[j]; if(punctaj[i]==punctaj[j]){punctaj.erase(punctaj.begin()(j-1)+);k++;}//nu iese aici } aparitii.push_back(k); } Cand gasesc alta valoare egala cu puncta, o sterg si contorizez. Nu stiu cum sa o sterg. http://www.cplusplus.com/reference/vector/vector/erase/ Aici ala are myvector.erase(myvector.begin()+5) ca sa stearga valoarea de pe pozitia 6. Si eu vreau sa sterg valoarea de pe pozitia 'j'.
+Raziel Posted December 21, 2014 Report Posted December 21, 2014 Frate codul tau arata ca dracu mort intrat in putrefactie... #include <iostream> using namespace std; int main() { int n, i, j, k; cout << "Introduceti numarul de aruncari: "; cin >> n; // introduc nr de aruncari int z1[n], z2[n], punctaj[n], aparitii[n]; for (i=0; i<n; i++) // cu acest for introduc punctajele de pe fiecare zar la fiecare aruncare { cout << "nn----- Aruncarea nr " << i+1 << " -----nn"; cout << "nz1 = "; cin >> z1[i]; cout << "nz2 = "; cin >> z2[i]; } for (i=0; i<n; i++) { k=1; punctaj[i] = z1[i] + z2[i]; for (j=i+1; j<n; j++) // cine se gandea ca merge j=i+1... // dar cred ca trebuie ceva gen j=i+1, dar nu stiu cum sa scriu asta { punctaj[j] = z1[j] + z2[j]; // ca sa inteleaga si calculatorul, ca nu merge nici j=++i if (punctaj[i] == punctaj[j]) k++; } aparitii[i] = k; } cout << "nn ----- PUNCTAJ ----- ----- NR de APARITII -----nnn"; for (i=0; i<n; i++) { cout << " " << punctaj[i] << " " << aparitii[i] << 'n'; } return 0; } Si acum sa ne gandim.
ldd.man25 Posted December 22, 2014 Author Report Posted December 22, 2014 Spune tu, cum sa afisez elementele unui vector o singura data (fara cele care se repeta). Si sa mai afisez si de cate ori se repeta. Atat mai trebuie sa adaug la codul ala mort, ca sa prinda viata.
Kid Koder Posted February 4, 2015 Report Posted February 4, 2015 Spune tu, cum sa afisez elementele unui vector o singura data (fara cele care se repeta). Si sa mai afisez si de cate ori se repeta. Atat mai trebuie sa adaug la codul ala mort, ca sa prinda viata. Incearca cu vectori de frecventa, in care: vector == 1, daca numarul i exista vector == 0, daca numarul i nu exista La final, te plimbi cu un for prin vector si afisezi pozitiile pe care se gaseste 1. Daca iti iese un program din prima, inseamna ca ceva e gresit...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now