Voisko joku jelpsiä, miten tää ois järkevin. yritin pilkotella tätä jutskaa osiin, mut eips sitte tulosta-homma onnista.
#include <iostream>
#include <string>
using namespace std;
const string erottimet = " ,.\"\n"; // Sanojen erotinmerkit
const int max_sanoja = 1000; // Sanojen maksimimäärä
void tulosta(string *psanat,int sanaLkm);
void lue(string teksti)
{
// Luetaan merkkijono näppäimistöltä
cout << endl << "Syötä merkkijono, # lopettaa:" << endl;
getline(cin, teksti, '\n');
}
int sana_irrotus(string teksti)
{
// Otetaan tekstin kaikki sanat erilleen
int alku = teksti.find_first_not_of(erottimet); // Sanan alkuindeksi
int loppu = 0; // Loppuerotinmerkin indeksi
int sanaLkm = 0;
string sanat[max_sanoja]; // Sanojen taulukko
string* psanat[max_sanoja]; // osoitintaulukko sanoihin
//yksitt. sanojen irrottaminen mjonosta ja tallett. taulukkoon silmukalla
while(alku != string::npos && sanaLkm < max_sanoja)
{
loppu = teksti.find_first_of(erottimet, alku + 1);
if(loppu == string::npos) // erotinmerkki?
loppu = teksti.length(); // Ei löytynyt
sanat[sanaLkm] = teksti.substr(alku, loppu - alku); // Talletetaan sana
psanat[sanaLkm] = &sanat[sanaLkm]; // Talletetaan osoitin
sanaLkm++; // kasvatetaan lukumäärää
// Etsitään seuraavan sanan ensimmäinen merkki
alku = teksti.find_first_not_of(erottimet, loppu + 1);
}
return sanaLkm;
}
void lajittele(string teksti, int sanaLkm)
{
// pitää kirjaa "pienimmän" sanan indeksistä lajittelun aikana:
string* psanat[max_sanoja]; // osoitintaulukko sanoihin
int pienin = 0; // Pienimmän sanan indeksi
for(int j = 0; j < sanaLkm - 1; j++)
{
pienin = j; // Asetetaan pienin
//Tarkistetaan nykyinen sana kaikkiin muihin sen jäljessä oleviin sanoihin
for(int i = j + 1 ; i < sanaLkm ; i++)
if(*psanat[i] < *psanat[pienin]) // Nykyinen on pienin?
pienin = i;
if(pienin != j)
{ //Vaihdetaan osoittimet
string* papu = psanat[j]; //
Talletetaan nykyinen
psanat[j] = psanat[pienin]; // Pienin nykyiseen
psanat[pienin] = papu; // Palautetaan nykyinen
}
}
//return !(int)psanat;
}
void tulosta(string *psanat ,int sanaLkm)
{
//psanat-taulukon alkiot osoittavat sanoihin nous.järjestyksessä.
// Tulostetaan sanat nousevassa järjestyksessä
for(int i = 0 ; i < sanaLkm ; i++)
cout << endl << psanat[i] ; //EI TULOSTA VAAN EI
}
int main()
{
int lkm=0;
string teksti; // Lajiteltava merkkijono
lue(teksti);
sana_irrotus(teksti);
lajittele(teksti,lkm);
tulosta(teksti,lkm );
cout << endl;
return 0;
}Voisit ensin vaikka kertoa mitä ohjelman olisi tarkoitus tehdä, auttaisi vähän jyvälle pääsemisessä.
Muutamia huomioita ohjelmastasi:
Lue()-funktio ei palauta luettua merkkijonoa mitenkään. Voit joko muuttaa teksti-muuttujan pointteriksi näin:
lue(string *teksti) //Funktion esittely
getline(cin, *teksti, '\n'); //luetaan syöte
lue(&teksti); //Funktion kutsu pääohjelmassa
...tai muuttaa lue()-funktio string-tyyppiseksi, jolloin voit palauttaa muuttujan return-lauseella.
Sama juttu on sana_irrotus()-funktiossa. Se kyllä palauttaa lukumäärän, mutta sitä ei lueta pääohjelmassa mihinkään.
Niinpä seuraavaksi lajittele()-funktiolle välittyy lukumääräksi 0. Lukumäärän saat talteen muuttamalla pääohjelmaa näin:
lkm=sana_irrotus(teksti);
En oikein päässyt jyvälle pitäisikö tämän funktion palauttaa jokin sanataulukko, joka on tarkoitus tulostaa, vai mikä on idea?
olis tarkotus et nousevaan järjestykseen sanat tulostaa. ja kyllähän se niin tekis oikeesti, mut jos osasiks laittaa niin eips sitte niin helppoo ookkaa! ja mä täs lähin niinku mahollisimman helppo? void-tyylillä.. mutta olisi ihanteellista jos return-systeemillä olisi.
Näin sen voi ainakin tehdä:
#include <iostream>
#include <string>
using namespace std;
const string erottimet = " ,.\"\n"; // Sanojen erotinmerkit
const int max_sanoja = 1000; // Sanojen maksimimäärä
string lue();
int sana_irrotus(string , string []);
void lajittele(string[], int);
void tulosta(string[], int);
string lue()
{
string teksti;
// Luetaan merkkijono näppäimistöltä
cout << endl << "Syötä merkkijono, # lopettaa:" << endl;
getline(cin, teksti, '\n');
return teksti;
}
int sana_irrotus(string teksti, string sanat[max_sanoja])
{
// Otetaan tekstin kaikki sanat erilleen
int alku = teksti.find_first_not_of(erottimet); // Sanan alkuindeksi
int loppu = 0; // Loppuerotinmerkin indeksi
int sanaLkm = 0;
//yksitt. sanojen irrottaminen mjonosta ja tallett. taulukkoon silmukalla
while(alku != string::npos && sanaLkm < max_sanoja)
{
loppu = teksti.find_first_of(erottimet, alku + 1);
if(loppu == string::npos) // erotinmerkki?
loppu = teksti.length(); // Ei löytynyt
sanat[sanaLkm] = teksti.substr(alku, loppu - alku); // Talletetaan sana
sanaLkm++; // kasvatetaan lukumäärää
// Etsitään seuraavan sanan ensimmäinen merkki
alku = teksti.find_first_not_of(erottimet, loppu + 1);
}
return sanaLkm; //Palautetaan sanojen lukumäärä
}
void lajittele(string sanoja[max_sanoja], int sanaLkm)
{
int pienin = 0; // Pienimmän sanan indeksi
for(int j = 0; j < sanaLkm - 1; j++)
{
pienin = j; // Asetetaan pienin
//Tarkistetaan nykyinen sana kaikkiin muihin sen jäljessä oleviin sanoihin
for(int i = j + 1 ; i < sanaLkm ; i++)
{
if(sanoja[i] < sanoja[pienin]) // Nykyinen on pienin?
pienin = i;
}
if(pienin != j)
{
string papu = sanoja[j]; // Talletetaan nykyinen
sanoja[j] = sanoja[pienin]; // Pienin nykyiseen
sanoja[pienin] = papu; // Palautetaan nykyinen
}
}
}
void tulosta(string sanoja[max_sanoja] ,int sanaLkm)
{
//psanat-taulukon alkiot osoittavat sanoihin nous.järjestyksessä.
// Tulostetaan sanat nousevassa järjestyksessä
for(int i = 0 ; i < sanaLkm ; i++)
cout << endl << sanoja[i] ; //PITÄISI TULOSTAA
}
int main()
{
int lkm=0;
string teksti,sanoja[max_sanoja];
teksti=lue(); //Funktio palauttaa syötetyn tekstin
lkm=sana_irrotus(teksti,sanoja); /*Funktio palauttaa sanojen määrän ja
taulukkoon luetut sanat. Taulukon kanssa ei tarvitse käyttää pointterimerkkiä * koska
taulukon nimi itsessään on osoite muistipaikkaan. */
lajittele(sanoja,lkm); //Välitetään sanataulukko ja lukumäärä
tulosta(sanoja,lkm ); //Välitetään sanataulukko ja lukumäärä
cout<<endl;
system("PAUSE");
return 0;
}Tuota voi tietysti viilata monella tapaa paremmaksikin. Lajittelufunktio on mahdollista tehdä tehokkaammin ja sen lajitteluun on olemassa valmiita kirjastofunktioita kuten qsort. Lisäksi talukon voisi tehdä dynaamisesti, niin ei haaskattaisi muistitilaa, mutta noin pienessä ohjelmassa sillä ei käytännössä ole merkitystä.
jees toimii. pitäs kyl opiskella tota muisti-jutskaa!
Aihe on jo aika vanha, joten et voi enää vastata siihen.