Kirjoitan ohjelmaa, joka arpoo lukuja, joiden perusteella arvotaan sanoja ja niistä syntyy sitten lauseita. On kuitenkin ongelma: ohjelma arpoo kolme lukua väliltä 1-5 rand() funktiolla erillisissä alifunktioissa, mutta jostain syystä kaikki kolme lukua ovat aina samat, eivät vakiot, mutta samat... Käytän myös srand(time(NULL)) ja on myös kokeiltu srand(time(0)) Kääntäjä on g++ 4.3 ja järjestelmä Ubuntu 10.04 LTS. Ohjelman koodi alla:
#include <iostream> #include <cstdlib> #include <ctime> #include <string> using namespace std; int x, y, z; char valinta; string tekija; string verbi; string paikka; void arvo(); void print(); void arvo2(); void arvo3(); int main() { system("clear"); cout <<"\nVesikuusi Words 1.0\n\n"; sleep(1); arvo(); switch (x) { case 1: tekija = "Rölli "; break; case 2: tekija = "Rotta "; break; case 3: tekija = "Hitler "; break; case 4: tekija = "Jeesus "; break; case 5 :tekija = "Joukupukki "; break; default: main(); } arvo2(); switch (y) { case 1: verbi = "kusee "; break; case 2: verbi = "kurkkii "; break; case 3: verbi = "dokaa "; break; case 4: verbi = "myy joulukuusia "; break; case 5: verbi = "syö muurahaisia "; break; default: main(); } arvo3(); switch (z) { case 1: paikka = "torilla."; break; case 2: paikka = "Saharalla."; break; case 3: paikka = "Kampissa."; break; case 4: paikka = "kaivossa."; break; case 5: paikka = "eteisessä."; default: main(); } print(); } void arvo() { srand(time(0)); x=rand() % 5+1; } void print() { cout <<tekija <<verbi <<paikka; cin.get(); cout <<"\n\nUudestaan? K/E "; cin >>valinta; switch (valinta) { case 'k': case 'K': system("clear"); main(); break; case 'e': case 'E': system("clear"); exit(0); default: main(); } } void arvo2() { srand(time(0)); y=rand() % 5+1; } void arvo3() { srand(time(0)); z=rand() % 5+1; }
Kutsu srand vain kerran.
kiitos paljon! Homma pelittää :D
Pieni kirjoitusvirhe luultavasti?
case 5 :tekija = "Joukupukki ";
:)
Ohjelma on virheellinen. C++ ei salli main-funktion käyttämistä (standardin määrittelemällä tavalla "käyttäminen") ohjelman sisällä; toisin sanoen, main-funktiota ei saa (mm.) kutsua rekursiivisesti. Suosittelen säätämään kääntäjän varoitustason suuremmalle, ja hankkimaan hyvän C++-kirjan aloittelijoille oppimista varten.
(Ohjelman rakenne ei ole kehuttava muutenkaan.)
Tässä eräs toteutus tuosta tehtävästä. Ihan paras mahdollinen tämäkään ei ole.
#include <iostream> #include <fstream> #include <cstdlib> #include <ctime> #include <string> #include <vector> // satunnaisen numeron arposeen saa parametrinä // kaksi lukua, joiden väliin numero osuu int arvo_numero(int ala, int yla); // lauseen rakenne ei täydellinen, mutta sopiva tarkoitukseen struct lause { // Lauseen osien säilytyspaikat jokaiselle oma std::vector <std::string> tekijat; std::vector <std::string> paikat; std::vector <std::string> verbit; // Tulostettava lause std::string generoitu_lause; // Generoi lauseen kolmesta osasta void generoi_lause(); // Sanat ovat tiedostossa, josta ne noudetaan säilytyspaikkoihin void hae_sanat(std::string tiedosto); // Palautetaan generoitu lause std::string palauta_generoitu_lause(); }; int main() { std::cout <<"Vesikuusi Words 1.0" << std::endl; // Käyttäjän valinta jatkolle std::string valinta = "e"; // do - while looppi kierretään kunnes käyttäjä antaa muun kuin K tai k do { // Uusi lause lause tmp; // Tulostetaan katso logista funktioiden kutsu järjestys std::cout << tmp.palauta_generoitu_lause() << std::endl; //Kysytään vieläjkö generoidaan std::cout << "Uudelleen? K tai E" << std::endl; std::cin >> valinta; } while (valinta == "K" || valinta == "k"); // Onnistui return 0; } void lause::hae_sanat(std::string tiedosto) { std::clog << "lause::hae_sanat(" << tiedosto << ")" << std::endl; std::ifstream sisaan("sanat.txt", std::ios::in); std::string sana; int kontti; std::srand(std::time(NULL)); while (sisaan >> sana) { if (sana == "Paikat:") { kontti = 1; continue; } else if (sana == "Tekijat:") { kontti = 2; continue; } else if( sana == "Verbit:") { kontti = 3; continue; } else { if (kontti == 1) { paikat.push_back(sana); } else if (kontti == 2) { tekijat.push_back(sana); } else if (kontti == 3) { verbit.push_back(sana); } } } } void lause::generoi_lause() { std::clog << "lause::generoi_lause()" << std::endl; this->generoitu_lause += tekijat[arvo_numero(0, tekijat.size())]; this->generoitu_lause += " "; this->generoitu_lause += verbit[arvo_numero(0, verbit.size())]; this->generoitu_lause += " "; this->generoitu_lause += paikat[arvo_numero(0, paikat.size())]; } std::string lause::palauta_generoitu_lause() { std::clog << "lause::palauta_generoitu_lause()" << std::endl; hae_sanat("sanat.txt"); generoi_lause(); return generoitu_lause; } int arvo_numero(int ala, int yla) { return (ala + rand() % (ala + yla)); }
Kas vain jäi vielä tuon tiedoston formaatti näyttämättä, joskin sen voi varmaankin päätellä aika helpolla.
Tekijat: Joulupukki Jesse Pelle Paikat: Saharassa Kiinassa Suomessa Verbit: Hölkkää Juoksee Suunnistaa Aivastaa
Teuro kirjoitti:
Tässä eräs toteutus tuosta tehtävästä. Ihan paras mahdollinen tämäkään ei ole.
Juuh, miä oon vasta aika alottelija, peruskoulu vasta loppuu tossa kevääl..mutta kiitosta vaan :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.