Pereiti prie turinio

C++ teksto atrinkimo algoritmas


Rekomenduojami pranešimai

Sveiki, taigi kažkaip užkliuvau su paprastučiu algoritmu ir niekaip neišeina jo teisingai padaryti, pervargau gal :D

Ko man reikia, tai algoritmo parašyto C++ kalba, kuris iš klasės atrinktų string tipo elementus, tikrina ar jie nesikartoja ir nesikartojančius deda į masyvą. Tada reiktų to masyvo atspausdinimo, kad neliktų jokių tarpų.

 

Tarkime, turime klasės masyve tokius string tipo elementus:

A
D
A
A
B
C
B
A

Man reikia, kad jis atrinktų juos ir spausdintų:

A
D
B
C

Tikiuosi aišku, būčiau labai dėkingas už pagalbą :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

bool arYraMasyve(string masvyas[], string kuriPatikrinti) {
     for(int i=0;i<(sizeof(masyvas)/sizeof(masyvas[0]));i++) {
             if(masyvas[i].compare(kuriPatikrinti) == 0) {
                     return true;
             }
      return false;
}

int main() {
    if !(arYraMasyve(string_kuri_patikrinti_ar_yra) {
         idetiMasyvan(string_kuri_patikrinti_ar_yra);
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Hmm, kažkodėl ne visai man čia gaunasi. Rašau:

bool arYraMasyve(Birža B[], string APav[], int indeksas) {
     for(int i=0; i<indeksas; i++) {
             if(B[i].ImtiPav().compare(APav[i]) == 0) {
                     return true;
             }
      return false;
  }
}

Birža B[] yra klasė iš kurios turiu atrinkti elementus. B.ImtiPav() tai metodas, kuris grąžina pavadinimą iš klasės. String APav[] yra masyvas į kurį noriu sudėti atrinktus elementus. Tai greičiausiai blogai rašau šią funkciją, nes niekada nesu naudojas nieko panašiai, net neįsivaizduoju kaip turėtų užsirašyti. (Ką tik pradėjau C++)

 

B[] randasi stringai A, A, B, C, D, A. APav[] turi būti atrinkti į A, B, C, D.

 

Main'e rašau:

for (int i=0; i<indeksas; i++)
   if (arYraMasyve(B, APav, indeksas)) 
         B[i].ImtiPav() = APav[i];

   for (int i=0; i<indeksas; i++)
	cout << APav[i] << endl;

Nuoroda į pranešimą
Dalintis kituose puslapiuose

          B[i].ImtiPav() = APav[i];

 

Tau metodas grąžina reikšmę o ne priskire ją. Arba kreipkis tiesiai į parametrą ir priskirk ar pasidaryk dar vieną metodą kuris pirskirtų.

Ups, sumaišiau vietom truputį, turėjo būti

 APav[i] = B[i].ImtiPav();

Hmm, į ekraną vis tiek išveda tik 8 tuščias vietas (indeksas = 8), tai matyt priskyrimas vis tiek blogas, kaip reiktų užrašyti? Reikės gal ryte grįžti, nelabai jau galvojasi man :D

Jeigu kas netingi, tai gal iš vis galėtų užrašyt pilną programą pagal idėją išdėstytą žėmiau? Duočiau riebų pliusą.

Esmė:

Turime klasėje išsaugotus string elementus, tarkime raides: A, A, B, C, C, B, D, kurios yra masyve. Tada norime išrinkti šias raides į kitą string masyvą, kad jis būtų: A, B, C, D ir kad galiausiai main funkcijoje spausdintų šias raides be jokių tarpų.

Redagavo AurimasK
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Hmm, kažkodėl ne visai man čia gaunasi. Rašau:

bool arYraMasyve(Birža B[], string APav[], int indeksas) {
     for(int i=0; i<indeksas; i++) {
             if(B[i].ImtiPav().compare(APav[i]) == 0) {
                     return true;
             }
      return false;
  }
}

Birža B[] yra klasė iš kurios turiu atrinkti elementus. B.ImtiPav() tai metodas, kuris grąžina pavadinimą iš klasės. String APav[] yra masyvas į kurį noriu sudėti atrinktus elementus. Tai greičiausiai blogai rašau šią funkciją, nes niekada nesu naudojas nieko panašiai, net neįsivaizduoju kaip turėtų užsirašyti. (Ką tik pradėjau C++)

 

B[] randasi stringai A, A, B, C, D, A. APav[] turi būti atrinkti į A, B, C, D.

 

Main'e rašau:

for (int i=0; i<indeksas; i++)
   if (arYraMasyve(B, APav, indeksas)) 
         B[i].ImtiPav() = APav[i];

   for (int i=0; i<indeksas; i++)
	cout << APav[i] << endl;

Na, čia akivaizdžiai nesupranti, kam skirtos funkcijos. Nereikia nieko perrašinėti, vardai gali būti bet kokie – funkciją gali iškviesti su bet kokiais to tipo objektais, daug kartų su skirtingais netgi.

 

arYraMasyve(B[i].ImtiPav(), APav)

Ir viskas... Aišku, to perrašymo, kad ciklas eitų iki indekso gali ir prireikti – nežinau, kaip tiksliai, ar bus žinomas masyvo dydis? Juk argumente neaprašomas, o masyvai lyg argumentais perduodami kaip paprasti pointeriai... Bet kokiu atveju, su indeksu patikimiau.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na, čia akivaizdžiai nesupranti, kam skirtos funkcijos. Nereikia nieko perrašinėti, vardai gali būti bet kokie – funkciją gali iškviesti su bet kokiais to tipo objektais, daug kartų su skirtingais netgi.

 

arYraMasyve(B[i].ImtiPav(), APav)

Ir viskas... Aišku, to perrašymo, kad ciklas eitų iki indekso gali ir prireikti – nežinau, kaip tiksliai, ar bus žinomas masyvo dydis? Juk argumente neaprašomas, o masyvai lyg argumentais perduodami kaip paprasti pointeriai... Bet kokiu atveju, su indeksu patikimiau.

Na aišku, dėkui tada :) Masyvo dydis nėra žinomas, bet aš su while ciklu bei indeksu jį sužinau paprastai skaitymo metu. Dėkui visiems.

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