knuto Skrevet 8. april 2005 Del Skrevet 8. april 2005 Hallo! Etter å ha lese ut ei bok, har eg begynt å forstå C++ mykje meir, men det er ein ting som begrensar meg enormt. Ettersom det ofte er lite vits å lage program som ikkje har muligheit til å lagre informasjon mellom kvar gong det køyrar, må eg lagre mykje i filer. Det er her problemet mitt er. Eg må jo kunne "få ut" den informasjonen eg treng, enkelt, frå fila. Eg har ikkje funne ein einaste string-funksjon i C++ som kan minne om dei som det finnes utallige av i PHP. Eksempel på kva som finnes i PHP, som eg hadde likt å hatt her er: str_replace(); (!) strlen(); substr(); explode(); (!) implode(); preg_match(); preg_replace (!) No reknar eg ikkje med at eg kom på alt i farten, men finnes det (gjerne eit standard) bibliotek som har nokre liknande funksjonar? Og ein ting til. Kunne nokon vist eit eksempel på korleis det går ann å lage ein heimelaga funksjon som gjer jobben til f.eks. explode? (dele opp ein string ved eit valgfritt teikn/streng f.eks. ! og lage eit nytt "ledd" i ein array, eller vector, for kvar del) Eg hadde likt å fått litt inspirasjon til korleis ein kan "gå inn" og "jobbe" med stringar. Lenke til kommentar
Ernie Skrevet 8. april 2005 Del Skrevet 8. april 2005 (endret) Sånn fort ut av hodet har du iallfall size() (i stringklassen) som erstattning for strlen(); Ellers er et godt tips å sjekke hva string-klassen faktisk inneholder av funksjoner. Det er svært mange skal jeg si deg Edit: må bare friske opp PHP-kunnskapene litt så kanskje jeg kommer med flere til deg Endret 8. april 2005 av Ernie. Lenke til kommentar
Kjeksen Skrevet 8. april 2005 Del Skrevet 8. april 2005 Dette her er vel kanskje det du leter etter? http://www.cppreference.com/cppstring/ Lenke til kommentar
knuto Skrevet 8. april 2005 Forfatter Del Skrevet 8. april 2005 Hmm. Kom forresten bare ikkje på at string hadde size(), men det har han jo. Dersom lista som Kjeksen her viser er fullstendig, var det ikkje meir enn substr() som virka nyttig for meg. Finnes det ikkje ein einaste funksjon for å køyre regular expression? Lenke til kommentar
hishadow Skrevet 8. april 2005 Del Skrevet 8. april 2005 (endret) Kanskje Boost biblioteket er et alternativ: Boost.org http://www.boost.org/doc/html/string_algo.html http://www.boost.org/libs/regex/doc/index.html Har ikke brukt disse to til nå, men bruker andre deler av biblioteket jevnlig (conversion/lexical_cast). Templates er mye brukt, så koden kan bli litt uoversiktlig hvis en ikke har mye erfaring med dette. Endret 8. april 2005 av hishadow Lenke til kommentar
knuto Skrevet 8. april 2005 Forfatter Del Skrevet 8. april 2005 (endret) Hmm. Ja, kan jo sjå på det der, men er det ikkje litt teit at dette ikkje finnes i standard C++? Og for det andre. Det er ikkje nokon som gidder å vise litt _enkel_ behandling av ein streng. F.eks. hente ut alt mellom første "h" og første "i" i denne: "Hallo! Til deg "? Då tenkjer eg ikkje med ein eigen funksjon, men bare med, ja, kva det no er som må brukast for å "spasere gjennom" stringen og hente ut det viktige. Endret 8. april 2005 av knuto Lenke til kommentar
A_N_K Skrevet 8. april 2005 Del Skrevet 8. april 2005 (endret) Hmm. Ja, kan jo sjå på det der, men er det ikkje litt teit at dette ikkje finnes i standard C++?C++ har nok sine mangler, bare størrelsen på Boost sier sitt. Men sånn er det nå en gang Og for det andre. Det er ikkje nokon som gidder å vise litt _enkel_ behandling av ein streng. F.eks. hente ut alt mellom første "h" og første "i" i denne: "Hallo! Til deg "? Då tenkjer eg ikkje med ein eigen funksjon, men bare med, ja, kva det no er som må brukast for å "spasere gjennom" stringen og hente ut det viktige.Jeg pleier ikke å gjøre noe særlig strengbehandling i C++, så jeg husker ikke noen enkel måte å gjøre det case-insensitivt, men selve søket bør være enkelt: string s = "Hallo! Til deg"; string::size_type b(s.find_first_of("H")), e(s.find_first_of("i") + 1); string str = s.substr(b, e - b); // 'H' til og med 'i' Én måte å gjøre det case-insensitivt kunne være std::find med egen kode for selve sammenligningen. Endret 8. april 2005 av A_N_K Lenke til kommentar
knuto Skrevet 8. april 2005 Forfatter Del Skrevet 8. april 2005 Hmm. Det var jo ei orginal løysing. Faktisg ganske grei. Det er ingen som har lyst å løyse ei anna oppgåve då? Nemleg å konvertere denne fila til to array'ar der ein har dei norske orda, og den andre har dei engelske? sausheep hus house gard farm Noreg Norway glad happy Som de kanskje ser har eg lyst å utvikle eit gloseprogram, ettersom eg endå ikkje har funne eit som eg er fornøgd med. Den overnemnte oppstillinga er ganske brukarvennleg etter mi meining. Omtrent noko slikt: norwegian = array( 0 => 'sau', 1 => 'hus', 2 => 'gard', 3 => 'Noreg', 4 => 'glad' ); english = array( 0 => 'sheep', 1 => 'house', 2 => 'farm', 3 => 'Norway', 4 => 'happy' ); Eller dersom dette er ein ting som ikkje egnar seg til arrays, kan det jo brukast to vectors. Lenke til kommentar
hishadow Skrevet 8. april 2005 Del Skrevet 8. april 2005 Explode alternativ... 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); } } Referanse. Lenke til kommentar
A_N_K Skrevet 8. april 2005 Del Skrevet 8. april 2005 Var forresten en liten bug i koden min, skal se slik ut: s.substr(b, e - b); Det siste argumentet (e - b) skal være antall tegn ikke posisjon. Lenke til kommentar
hishadow Skrevet 8. april 2005 Del Skrevet 8. april 2005 (endret) Det er ingen som har lyst å løyse ei anna oppgåve då? Nemleg å konvertere denne fila til to array'ar der ein har dei norske orda, og den andre har dei engelske? // Les inn all data i en lang string. string data = LesFraFil(); // Overfør ordene i data strengen til en tabell. vector<string> words; Tokenize(data, words, " \n") // Hvert ord kan nå aksesseres fra tabellen. Ord nr.(i) = norsk og // nr.(i+1) = engelsk ord Videre kan du beregne tallverdier ut av hvert norske ord. Disse tallverdiene kan legges til et binært søketre. Sammen med tallverdien lagres også indeksen til ordets posisjon i tabellen. Dette gjentas for de engelske ordene, men lagres i et nytt binært søketre. Når dette er klart gjør du følgende når du vil lete opp et ord på norsk til engelsk: 1. Beregn tallverdi av ordet. 2. Slå opp tallverdien i det binære søketreet for norske ord. 3. Bruk (indeksverdien + 1) du finner her til å slå opp i tabellen (gitt at ordet finnes i søket). Når dette er klart gjør du følgende når du vil lete opp et ord på engelsk til norsk: 1. Beregn tallverdi av ordet. 2. Slå opp tallverdien i det binære søketreet for engelske ord. 3. Bruk (indeksverdien - 1) du finner her til å slå opp i tabellen (gitt at ordet finnes i søket). Endret 8. april 2005 av hishadow Lenke til kommentar
knuto Skrevet 8. april 2005 Forfatter Del Skrevet 8. april 2005 Tusen takk! Mykje nyttig her. Sjølv om eg sikkert ikkje kjem til å bruke alt som du viste i eksempelet, ser eg jo fint korleis du klarer å gjere oppgåva. Lenke til kommentar
hishadow Skrevet 8. april 2005 Del Skrevet 8. april 2005 (endret) Tusen takk! Mykje nyttig her. Sjølv om eg sikkert ikkje kjem til å bruke alt som du viste i eksempelet, ser eg jo fint korleis du klarer å gjere oppgåva. Som du ser. Null problem å lage softwaren... problemet er å skaffe en ordentlig datakilde. Bruker Clue istedet. Edit: Som du ser så koster programmet flesk for alle unntatt studenter. Kanskje litt konkurranse hadde gjort seg. Det er iallefall et marked for dette Endret 8. april 2005 av hishadow Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå