Informatică, întrebare adresată de cosmaandra2000, 8 ani în urmă

Bac info 2011, Subiectul 3, ex 4​

Anexe:

OmuBacovian: hmmm...., problema nu pare a fi grea, faza e ca trebuie sa explicam eficienta
boiustef: dacă găsim un algoritm eficient, asta va fi şi eficienţa... :)))
OmuBacovian: loool :))))))
cosmaandra2000: E ok si ineficient. La bac scade 1pct din 10. Macar sa am o idee cum se face.
cosmaandra2000: fara explicatie :)) doar programul
boiustef: uaaaaa!11 unde pun eu varianta mea???? cred merită cercetată...
boiustef: Cosmaandra, raportează abuzul la primul răspuns să pot posta varianta mea
OmuBacovian: l-a sters deja, dati un refresh la pagina

Răspunsuri la întrebare

Răspuns de OmuBacovian
1

Răspuns:

Explicație:

Programul urmator pare sa functioneze:

b)

#include <iostream>

#include <fstream>

using namespace std;

ifstream fin("BAC.TXT");

int main()

{

   unsigned long long x;

   unsigned v[10],i,m=0,ct=1,poz,c;

   for(i=0;i<10;i++)

       v[i]=0;

   while(fin>>x)

   {

       c=(x%100)/10;

       v[c]++;

       if(m<v[c])

       {

           m=v[c];

           poz=ct;

       }

       ct++;

   }

   cout<<poz;

   fin.close();

   return 0;

}

a) Am declarat un vector de frecventa in care se retin numarul de aparitii ale cifrelor de pe pozitia zecilor a fiecarui numar . Pe masura ce datele din fisier se citesc, valorile din fisier se actualizeaza , iar de fiecare data cand valoarea maxima din vector se schimba , se retine intr-o variabila numarul de ordine al termenului curent . Aceasta valoare va fi afisata la sfarsitul programului . Programul este eficient atat din punct de vedere al timpului de executare , deoarece algoritmul este liniar , precum si a memoriei utilizate , deoarece nu se folosesc tablouri bidimensionale . In schimb se utilizeaza un vector cu o capacitate relativ mica.


OmuBacovian: ah...nu m-am gândit la asta...editez imediat
SKREFI: si v[10] = {0}; ca sa nu mai folosesti for..............
boiustef: da, sau declarat global....
GabiAlex99: v[10] = {0}; eu stiu ca nu face aceelasi lucru cu for-ul, deoarece oricum sirurile sunt initializate cu 0. Instructiunea v[10]={0} pune doar in primul element 0. Spre ex v[10]={1}, 1 se pune doar in pozitia 0. Incearca sa pui mai multe numere.. v[10]={1,2,3,4} pune in primele 4. Deci v[10] = {0} e diferit de for. (Eu asa stiu)
boiustef: La acest cod:
#include
using namespace std;
short v[10];
int main()
{
short i, a[10]={0};
for (i=0; i<10; ++i)
cout << v[i] << " ";
cout << "\n";
for (i=0; i<10; ++i)
cout << a[i] << " ";
cout << "\n";

short b[10]={1,2,3,4};
for (i=0; i<10; ++i)
cout << b[i] << " ";
cout << "\n";
return 0;
}
se obtine acest rezultat:
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 2 3 4 0 0 0 0 0 0
boiustef: deci:
- fiind declarat global vectorul se iniţializaza cu zerouri;
- fiind declarat local astfel a[10]={0}; se iniţializaza cu zerouri;
- fiind declaear local astfel short b[10]={1,2,3,4}; se iniţialiteată cu valorile indicate primele elemente, iar celelate zerouri
SKREFI: se initializeaza toate elementele, si nu, in c++ nu se initializeaza by default cu 0 numai daca e global
GabiAlex99: Multumesc :). Am stat ceva sa gasesc pana la urma de unde luasem informatia : https://www.youtube.com/watch?v=r7R5OD12M04
( Minutul 48:10 ) Vazusem mai de mult videoclipul si de atunci stiam asta
cosmaandra2000: mulțumesc
OmuBacovian: cu placere!
Răspuns de boiustef
2

Răspuns:

#include <iostream>

#include <fstream>

using namespace std;

ifstream fin("bac.txt");

int czeci[10], nrordine[10], num,i, z,apmax;

int main()

{

   while (fin >> num)

   {

       ++i;

       z=(num%100)/10;

       ++czeci[z];

       nrordine[z]=i;

   }

   for (i=0; i<10; ++i)

       if (czeci[i]>apmax) apmax=czeci[i];

   i=0; while (czeci[i]!=apmax) ++i;

   cout << nrordine[i];

}

Explicație:


boiustef: in vectorul nrordine se memorizează nr. de ordine în şirul din fişier a ultimei apariţii a cifrei zecilor, frecvenţa cărora este memorizată în vectorul czeci, adică cifrele zecilor
boiustef: am avut o plăcere să te ajut, Cosmaandra... succese+sănătate+fericire!
cosmaandra2000: mulțumesc
Alte întrebări interesante