Láncolt listában névelő számolás

Láncolt listában névelő számolás
2007-01-08T18:00:39+01:00
2007-01-10T04:48:24+01:00
2022-11-02T20:46:03+01:00
Laca85
Hali!
Még elég kezdő vagyok és lenne egy nagy problémám Láncolt listával kapcsolatban!Volt egy vizsga feladat,aminek az egyik feladatát nem tudom megoldani.A feladat:Szöveges fájlból lánc készítése.Egy lánszemben egy sor.
Amit nem tudok:A szövegben a névelők megszámolása.
Már sokféleképp próbáltam pl.:beolvasni egy tömbbe a szavakat.De sajnos nem jött be
Ha valaki tud akkor legyen szíves és segítsen.
Itt a forráskód(persze a számoló fv nélkül):

#include<iostream.h> #include<stdlib.h> #include<fstream.h> #define MAX 66 class elem { friend class lista; private: elem *elozo,*kovetkezo; char sor[MAX];//ez tarolja a sorokat public: ~elem(){};//destruktor elem(){elozo=kovetkezo=NULL;}; }; class lista { private: elem *elso,*utolso; public: lista(char *fnev); ~lista(); int beolvas(char *fnev); void kiir(); int szamol(); int sorok(); }; //KONSTRUKTOR lista::lista(char *fnev) { ifstream be(fnev,ios::nocreate); elso=utolso=NULL; be.close(); } //DESTRUKTOR lista::~lista() { elem *p=elso; while(p) { elso=elso->kovetkezo; delete p; p=elso; } } //LANCEPITES JOBBROL int lista::beolvas(char *fnev) { ifstream x; x.open(fnev);//filemegnyitas elem *s; int seged=1; if(x.fail()) { cerr<<"Hiba a file megnyitasakor\n\n\a"; system("pause"); exit(1); } while(!x.eof()) { s=new elem; if(!s) { cerr<<"Keves a dinamikus memoria!!\n\n\a"; seged=0; x.close(); system("pause"); return seged; } x.getline(s->sor,sizeof(s->sor)); //lancepites if(elso==NULL) elso=utolso=s; else { elso->elozo=s; s->kovetkezo=elso; elso=s; } } x.close(); return seged; } //LISTA KIIRATAS BALROL (AHOL " "JEL VAN , OTT " " -T IR!) void lista::kiir() { elem *s=elso; char c; int i; while(s) { for(i=0;s->sor[i]!='\0';i++) { c=s->sor[i];//karakterenkent olvasom be a szoveget lancelemenkent if(c==' ') { cout<<" "; } else { cout<<c; } } cout<<endl; s=s->kovetkezo;//kovetkezo lancszem } } //SOROK SZAMA int lista::sorok() { elem *s=elso; int d=0; while(s) { ++d; s=s->kovetkezo; } return d; } int lista::szamol() { int d=0; return d; } void main() { lista *p; int vizsgal; p=new lista("A_hagyomany.txt"); vizsgal=p->beolvas("A_hagyomany.txt"); if(vizsgal==0) cout<<endl<<"A lancepites sikertelen!!\n"; p->kiir(); cout<<endl<<endl<<"A szoveg "<<p->sorok()<<" sorbol all.\n"; cout<<endl; int r=p->szamol(); cout<<endl<<endl<<"A szovegben a nevelok szama:"<<r<<endl; system("pause"); delete p; }

(Nem tudom illik-e így egész forrást beküldeni)
Mutasd a teljes hozzászólást!
de mintha lett volna egy strtok c. fv


Ott az előző hsz-em alján a link hozzá

strtok
Mutasd a teljes hozzászólást!

  • ha jól vettem ki, nem tudod szétbontani a sorokat szavakra!
    A c++ -hoz nem naon értek de csináltam c-ben egy eljárást, ami segíthet neked:

    Docler.com
    Mutasd a teljes hozzászólást!
  • Már sokféleképp próbáltam pl.:beolvasni egy tömbbe a szavakat.De sajnos nem jött be


    Na! Itt vannak a szavak. Próbáld ki! Minden szót új sorba ír ki. Remélem a megfelelő beépítést már meg tudod csinálni...

    ... while (!std::cin.eof()) { std::string s; std::cin >> s; std::cout << s << std::endl; } ...
    Mutasd a teljes hozzászólást!
  • Nekde valamiféle split függvény kell:
    pl itt egy

    esetleg:

    void Tokenize(const string& str, vector<string>& tokens, const string& delimiters = " ") { // Skip delimiters at beginning. string::size_type lastPos = str.find_first_not_of(delimiters, 0); // Find first "non-delimiter". string::size_type pos = str.find_first_of(delimiters, lastPos); while (string::npos != pos || string::npos != lastPos) { // Found a token, add it to the vector. tokens.push_back(str.substr(lastPos, pos - lastPos)); // Skip delimiters. Note the "not_of" lastPos = str.find_first_not_of(delimiters, pos); // Find next "non-delimiter" pos = str.find_first_of(delimiters, lastPos); } } //használat: #include <string> #include <algorithm> #include <vector> using namespace std; int main() { vector<string> tokens; string str("Split me up! Word1 Word2 Word3."); Tokenize(str, tokens); copy(tokens.begin(), tokens.end(), ostream_iterator<string>(cout, ", ")); }

    vagy strtok -al is lehet
    PL

    vagy Így


    A lényeg hogy megadott határoló szerint (pl szóköz) bontod a sztringet szavakra, aztán már tömbbejárás, és keresheted ami kell

    Mégtöbb lehetőség
    Mutasd a teljes hozzászólást!
  • Az stdio.h sscanf függvény segítségével könnyen szétbonthatsz egy stringet szavakra.

    Valahogy így:


    ... sscanf(str,"%s%s%s%s%s%s%s%s%s%s%s",Szo1,Szo2,Szo3,Szo4,Szo5,...); ...

    Ha egy teljes sort már be tudsz olvasni egy fájlból, akkor nem lehet túl sok gondod. Ahány %s-t beírsz, annyi stringet kell utána írnod.

    példa:

    sscanf("ABC DEF GHI","%s%s%s",sa,sb,sc);

    Akkor ez kerül a változókba:

    sa="ABC"
    sb="DEF"
    sc="GHI"

    Szerintem műxik.
    Mutasd a teljes hozzászólást!
  • Régen C-ztem, de mintha lett volna egy strtok c. fv., ami egy string felbontására volt alkalmas, úgy, hogy több határoló-karaktert is fel lehetett sorolni benne (pl. " ,.;")...
    Mutasd a teljes hozzászólást!
  • de mintha lett volna egy strtok c. fv


    Ott az előző hsz-em alján a link hozzá

    strtok
    Mutasd a teljes hozzászólást!
  • Bocsi hogy ilyen sokára írok,de vizsgám volt.
    A link amit adtál tényleg pont jó nekem.
    Már meg is írtam a progit:

    int lista::szamol() { elem *s=elso; char *pch; char tm[25]; int d=0,i=0,j; while(s!=NULL) { pch = strtok (s->sor," ,.-"); j=0; while (pch!=NULL) { strcpy(tm,pch); for(j=0;tm[j]!='\0';j++) { } if(tm[0]=='A'||tm[0]=='a' &&j<3) { d++; } // cout<<tm<<endl; pch = strtok (NULL, " ,.-"); } s=s->kovetkezo; } return d; }

    Kicsit primitív de működik!
    Köszi a segítséget neked is és a többieknek is!!
    Jár a pont!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd