Pereiti prie turinio

Rekomenduojami pranešimai

Sveiki,

 

Norėjau paprašyti pagalbos sprendžiant 2015 IT egzamino 2 programavimo uždavinį "Avys".

 

 

http://www.nec.lt/failai/5256_IT-VBE-1_2015.pdf (10 puslapis)

Kaip patys spręstumėte šį uždavinį. Tikriausiai yra protingesnis būdas kaip nuskaityti bei talpinti duomenis. Šiuo atveju aš 2 kartus tai darau. Pirmą kartą darau, kad pasiimti avį pagal kurią lyginsiu(avis viduryje failo, todėl nemoku nuskaityti pirmos), o poto visas kitas.

 

Mano kodas --

 

#include <iostream>

#include <fstream>

#include <iomanip>

using namespace std;

 

const char CDfv[] = "duomenys.txt";

const char CDfr[] = "rezultatai.txt";

 

struct avys{

string pav;

char s;

char s1;

string vardas;

int kiek;

 

};

void skaityti(avys A[], int &n, int & ilgis, int & k);

void skaiciavimai(avys A[], int n, int ilgis, int k);

void rikiuoti(avys A[], int n, int k);

int main()

{

avys A[50];

int n,k,ilgis;

 

skaityti(A,n,ilgis,k);

skaiciavimai(A,n,ilgis,k);

rikiuoti(A,n,k);

 

return 0;

}

 

void skaityti(avys A[], int &n, int & ilgis, int & k)

{

ifstream fd(CDfv);

fd>>n;

fd>>ilgis;

fd>>k;

for(int i = 0; i<k; i++)

{

fd>>A.vardas;

fd.ignore();

for(int j = 0; j<ilgis; j++)

fd>>A[j].s;

}

}

void skaiciavimai(avys A[], int n, int ilgis, int k)

{

ifstream fd(CDfv);

fd>>n;

fd>>ilgis;

fd>>k;

for(int i = 0; i<n-1; i++)

{

A.kiek = 0;

if(i==k-1)

{

fd>>A.vardas;

fd>>A[i+1].vardas;

fd.ignore();

}

 

fd>>A.pav;

fd.ignore();

for(int j = 0; j<ilgis; j++){

fd>>A[j].s1;

if(A[j].s1 == A[j].s)

A.kiek++;

}

}

}

 

void rikiuoti(avys A[], int n, int k)

{

for(int i = 0; i<n; i++)

for(int j = 0; j<n-1; j++)

{

if(A[j].kiek < A[j+1].kiek)

swap(A[j],A[j+1]);

}

}

 

 

 

Ačiū labai už pagalbą.

Redagavo TavoT3vas
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Manau patogiau būtų iš pradžių nusiskaityti visas avis į vieną masyvą (nereikėtų be reikalo 2 kartus skaityti), o tada tiriama avį pasiekti iš duoto tiriamos avies numerio atėmus 1 (nes masyvas numeruojamas nuo 0). Tada galima būtų galima sukti ciklą per visas avis, praleidžiant tiriamąją. pvz jei tiriama avis yra t masyvo pozicijoje, tai iš pradžių prasuki ciklą nuo 0 iki t ir tada nuo t+1 iki galo bei atlieki skaičiavimus.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Manau patogiau būtų iš pradžių nusiskaityti visas avis į vieną masyvą (nereikėtų be reikalo 2 kartus skaityti), o tada tiriama avį pasiekti iš duoto tiriamos avies numerio atėmus 1 (nes masyvas numeruojamas nuo 0). Tada galima būtų galima sukti ciklą per visas avis, praleidžiant tiriamąją. pvz jei tiriama avis yra t masyvo pozicijoje, tai iš pradžių prasuki ciklą nuo 0 iki t ir tada nuo t+1 iki galo bei atlieki skaičiavimus.

 

Sveikas, buvau taip pagalvojęs, bet man paprastesnis pasirodė mano variantas. Ačiū už atsakymą. :)

Redagavo TavoT3vas
Nuoroda į pranešimą
Dalintis kituose puslapiuose
  • po 2 savaičių...

Is pradziu viska isirasau i A[], poto viska perkeliu i B[], isskyrus tiriamaja avi

 

 

 

#include <iostream>
#include <iomanip>
#include <string>
#include <cmath>
#include <fstream>
//--------------------------------------------------------------
const int Cn = 20;
const char IN[] = "duomenu failas";
const char OUT[] = "rezultatu failas";

//--------------------------------------------------------------
using namespace std;
struct Avis{string vardas;
           char kodas[Cn];
           int kof=0;};
void skaitymas(Avis A[], int &n, int &m, int &nr);
void koef(Avis A[], int nr, int n, int m);
void atmetimas(int &k, Avis A[], Avis B[], int n, int nr);
void rikiavimas(Avis B[], int k);
void rasymas(Avis B[],Avis A[], int k, int nr);

//--------------------------------------------------------------
int main()
{
   int n, m, nr, k=0;
   Avis A[Cn], B[Cn];
   skaitymas(A, n, m, nr);
   koef(A,nr,n,m);
   atmetimas(k, A, B, n, nr);
   rikiavimas(B, k);
   rasymas(B, A, k, nr);
   return 0;
}
//--------------------------------------------------------------
void skaitymas(Avis A[], int &n, int &m, int &nr)
{
   ifstream in(IN);
   in>>n>>m>>nr;
   char sim[11];
   in.ignore();
   for(int i=0; i<n; i++)
   {
       in.get(sim, 11);
       A[i].vardas=sim;
       in.ignore();
       for(int j=0; j<m; j++)
       {
           in>>A[i].kodas[j];
       }
       in.ignore();
   }
   in.close();
}
//--------------------------------------------------------------
void koef(Avis A[], int nr, int n, int m)
{
   for(int i=0; i<n; i++)
   {
       for(int j=0; j<m; j++)
       {
           if(A[i].kodas[j]==A[nr-1].kodas[j]) A[i].kof++;
       }

   }
}
//--------------------------------------------------------------
void atmetimas(int &k, Avis A[], Avis B[],int n, int nr)
{
    for(int i=0; i<n; i++)
   {
       if(i!=nr-1) (B[k]=A[i], k++);

   }
}
//--------------------------------------------------------------
void rikiavimas(Avis B[], int k)
{
   int j;
   for(int i=1; i<k; i++)
   {
       j=i;
       while(B[j].kof>B[j-1].kof && j>0)
       {
           Avis temp=B[j-1];
           B[j-1]=B[j];
           B[j]=temp;
           j--;
       }
   }
   for(int i=1; i<k; i++)
   {
       j=i;
       while(B[j].vardas<B[j-1].vardas && B[j].kof==B[j-1].kof && j>0)
       {
           Avis temp=B[j-1];
           B[j-1]=B[j];
           B[j]=temp;
           j--;
       }
   }
}
//--------------------------------------------------------------
void rasymas(Avis B[],Avis A[], int k, int nr)
{
   ofstream out(OUT);
   out<<A[nr].vardas<<endl;
   for(int i=0; i<k; i++)
   {
       out<<B[i].vardas<<" "<<B[i].kof<<endl;
   }
   out.close();
}

Redagavo taskiukas
Nuoroda į pranešimą
Dalintis kituose puslapiuose

#include <fstream>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
//-----------------------------
const char CDfv [] = "D.txt";
const char CRfv [] = "Rez1.txt";
//-----------------------------
int main(){
   vector<char> A {'p','b','z','r','v','k'};
   cout << A[0];
}

Paklausiu čia, kas negerai vektoriuje parašyta, kad klaidą meta man? su masyvu taip nebūna, bet masyvas ne vektorius :)

Redagavo Reserved
Nuoroda į pranešimą
Dalintis kituose puslapiuose

#include <fstream>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
//-----------------------------
const char CDfv [] = "D.txt";
const char CRfv [] = "Rez1.txt";
//-----------------------------
int main(){
   vector<char> A {'p','b','z','r','v','k'};
   cout << A[0];
}

Paklausiu čia, kas negerai vektoriuje parašyta, kad klaidą meta man? su masyvu taip nebūna, bet masyvas ne vektorius :)

 

Blogai konstruoji vektorių. Čia yra pavyzdžių: http://www.cplusplus.com/reference/vector/vector/vector/#example

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...