Jump to content

Recommended Posts

Posted

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

 

Posted
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

b_350_20_323957_202743_F19A15_111111.png

Posted

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 :D

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?

Posted

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.

b_350_20_323957_202743_F19A15_111111.png

Posted

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.

Posted

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.

b_350_20_323957_202743_F19A15_111111.png

Posted

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
Posted

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

Posted

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. :-

Posted

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
Posted

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)

Posted

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!

Posted

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
Posted
#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;
}
Posted

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;}

Posted

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.

Posted

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)

Posted

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.

Posted

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'.

Posted

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. :)

Posted

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.

  • 1 month later...
Posted

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...

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.