Voisiko joku auttaa!!
Eli tarvis olisi seuraavanlainen ohjelma ja sen auki selittäminen.
Tee ohjelma, joka kysyy käyttäjältä kahden henkilön etu- ja sukunimet. Ohjelma tulostaa sen jälkeen aakkosjärjestyksessä ensimmäisenä olleen henkilön nimen. Ohjelman on toimittava myös silloin, kun näillä kahdella henkilöllä on sama sukunimi
Kiitokset etukäteen mestarille!
Mikä kieli?
Ei täällä koulutehtäviin suoria vastauksia anneta. Kerro vielä kieli ja kertaa jokin opas ja kerro sitten mistä kohdasta kiikastaa, että mitä et osaa itse.
Kannattaa myös mainita kieli.
Teet molempien henkilöiden nimille muuttujat. Luet niihin syötteen ja vertailet nimin ensimmäistä kirjainta. Ulosta.
Kannattaa myös mainita mitä et osannut ja näyttää mitä olet saanut aikaseksi.
Ja vielä muiden jo mainittujen asioiden lisäksi:
lainaus:
Kirjoita viestille kunnollinen otsikko, josta ilmenee heti viestin aihe. Näin viestisi ei huku muiden samanlaisten sekaan. Esimerkiksi "Ongelma" on huono otsikko, sillä ongelmia voi olla niin monenlaisia. Tarkempi otsikko "Pokerivastustajan tekoäly" kertoo jo paljon enemmän.
a = [] 2.times { a.push [print("Etunimi: ").to_s + gets.chomp, print("Sukunimi: ").to_s + gets.chomp].reverse } puts a.sort[0].join(', ')
Auki selittäminen jää sitten kotitehtäväksi >:)
Offtopic: Ruby on kivaa :)
Edit: hmph, korjattu speksien mukaseks :P
Vastaava (lievästi obfuskoituna) Perlillä:
for $c (0,1) { print "Anna ${_}unimi: " and chomp ($a[$c] = ($a[$c] && "$a[$c] ").<>) for qw<et suk> } print @{[sort {(reverse split " ", $a) cmp (reverse split " ", $b)} @a]}[0]
<edit>
Nyt kysyy etunimen ensin ja tulostaa lopussa vain nimen (kuten pyydettiin), ilman mitään ylimääräistä.
</edit>
Blaze: Ruby on suht yksinkertaista, jonka vuoksi se on kivaa :)
Tännekkin pitäisi saada Ruby-opas jossain vaiheessa, kun vaan jaksais/osais jotain :)
Teillon pojjaat nyt speksit hukassa. Ensin kysytään etunimeä.
miilis kirjoitti:
Tee ohjelma, joka kysyy käyttäjältä kahden henkilön etu- ja sukunimet.
main = (flip mapM) ["Etunimi: ", "Sukunimi: ", "Etunimi: ", "Sukunimi: "] (\s -> putStr s >> getLine) >>= return . (\[a,b,c,d] -> uncurry (++) $ min (b ++ ", ",a) (d ++ ", ",c)) >>= print . ("Ensin tulee: " ++)
Ajo:
*Main> :main Etunimi: Aapeli Sukunimi: Ukkonen Etunimi: Matti Sukunimi: Matilainen "Ensin tulee: Matilainen, Matti"
Vähän huolellisuutta, pyytäisin.
Ettei mene ihan kiusanteoksi, tässä alkup. kysyjälle pseudokoodia.
proseduuri kysy & valitse varaa muistia neljälle merkkijonolle m1-m4 varaa muistia kokonaisille nimille n1 ja n2 tulosta ohje "anna etunimi:" lue annettu merkkijono muuttujaan m1 tulosta ohje "anna sukunimi:" lue annettu merkkijno muuttujaan m2 tulosta ohje "anna etunimi:" lue annettu merkkijono muuttujaan m3 tulosta ohje "anna sukunimi:" lue annettu merkkijono muuttujaan m4 muodosta nimet yhdistämällä sukunimi ennen etunimeä pilkun avulla n1 := m2 + ", " + m1 n2 := m4 + ", " + m3 (* plus tulkittakoon merkkijonojen yhdistämiseksi *) vertaile muuttujia n1 ja n2 leksikografisesti valitse pienempi (ts. ensin tuleva) ja tulosta se loppu
Ei tuo pilkkukikka varmaankaan ole pakollinen. Muutenkin olen tulkinnut vähän omiani, koska selitys ei ollut aivan tarkka.
Leksikografinen on vain hieno sana sanakirjajärjestykselle, eli aakkosten mukaiselle järjestykselle. Yo. tekstiä voit käyttää runkona ohjelmasi toiminnan selitykselle, mutta se ei varmasti kelpaa sellaisenaan. Apua voit sitten kysellä kielesi keinoista ilmaista nämä asiat. Kunhan näytät, että olet itse tehnyt jotain, ilkeily loppuu (no ainakin enimmäkseen).
Vertaile nimien kirjaimia yksi kerrallaan aloittaen sukunimen ensimmäisestä kirjaimesta jatkaen niin kauan, kun eri henkilöiden sukunimien vastaavat kirjaimet ovat samat. Jos kirjaimet poikkeavat toisistaan, se nimi, jossa aakkosissa ennemmin tuleva kirjain oli, on aakkosjärjestyksessä ensimmäinen. Jos toisesta nimestä loppuvat kirjaimet keseken eli se on toisen osajono (Niemi, Nieminen), pitempi nimi on aakkosissa viimeinen. Jos sukunimet ovat samat, tee sama etunimille.
Isojen ja pienten kirjainten välinen ero täytyy huomioida (esimerkiksi muuttaa kaikki kirjaimet pieniksi), jos ja kun käyttäjä ei osaa kirjoittaa nimiä oikein.
int vertaile(const char *nimi1, const char *nimi2) { int i=0; while(nimi1[i]!='\0' && nimi2[i]!='\0') // merkkijono päättyy nollatavuun if(nimi1[i]!=nimi2[i]) break; else i++; if(nimi1[i]!=nimi2[i]) if(nimi1[i]!=nimi2[i]) if(nimi1[i]=='\0') return 1; // nimi 1 ensin else if(nimi2[i]=='\0') return 2; // nimi 2 ensin else if(nimi1[i]<nimi2[i]) return 1; // nimi 1 ensin else return 2; // nimi 2 ensin return 0; // nimet ovat samat }
Merkkijonojen lukemisen ja käsittelyn voi kerrata C-oppaasta.
Tai jos ei käytä C:tä niin edellisiltä herroilta voi varmaan pyytää lisää hyödyllisiä Ruby-koodinpätkiä.
Delphin vertailu tapahtuisi hieman toisella tavalla:
function vertaile(nimi1,nimi2: string): integer; begin if nimi1<nimi2 then result:=1 // nimi 1 ensin else if nimi1=nimi2 then result:=0 // nimet ovat samat else result:=2; // nimi 2 ensin end;
Aika paljon työtä merkkijonojen vertailun toteutus tuntuu vaativan...
Oikeasti tekstien lajittelu aakkosjärjestykseen ei olekaan ihan niin simppeli juttu. Katsokaapa vaikka standardia SFS 4600, niin lähtee turhat luulot. Ja muissa maissa on sitten omat standardinsa.
Kuten hiljattain käydyssä keskustelussa tekstin muuttamisesta pieniksi tai isoiksi kirjaimiksi, tässäkin tarvittaisiin lokaalien ominaisuuksia: C++:ssa locale
- sekä collate
-luokkia ja C:ssä setlocale
- ja strcoll
-funktioita. Olettaen, että standardikirjaston toimittaja on hoitanut hommansa.
Jos on kyse vain yksinkertaisen koulutehtävän tekemisestä, ihan tavallisella strcmp
-funktiolla tai stringien vertailuoperaattoreilla luulisi kyllä pääsevän läpi.
koo kirjoitti:
Oikeasti tekstien lajittelu aakkosjärjestykseen ei olekaan ihan niin simppeli juttu. Katsokaapa vaikka standardia SFS 4600, niin lähtee turhat luulot. Ja muissa maissa on sitten omat standardinsa.
No tuon standardin mukaisesti on teknisesti mahdotonta aakkosjärjestää sanalista, josta ei ole itse sanojen lisäksi muuta tietoa. Pitäisi tietää esimerkiksi onko VII roomalainen numero 7 vai normaalia tekstiä. Lisäksi esimerkiksi nimistä pitäisi tietää, minkä kielinen nimi on kyseessä. Esimerkiksi de-etuliite luetaan sukunimeen mukaan espanjankielisissä nimissä ja erikseen ruotsinkielisissä nimissä.
Grez kirjoitti:
No tuon standardin mukaisesti on teknisesti mahdotonta aakkosjärjestää sanalista, josta ei ole itse sanojen lisäksi muuta tietoa.
Näin on. Ja vaikka nuo sanojen merkitykset jätettäisiin pois, jäljelle jääviä sääntöjäkin on jonkinmoinen määrä eivätkä ne ole kaikki ihan yksinkertaisia. Eivätkä suomalaiset säännöt sentään ole edes kaikkein monimutkaisimpia.
Tsekistä löytyy tällainen rimpsu, mutta vastaavat hienoudet ovat pikemminkin sääntö kuin poikkeus eri kielissä/maissa:
co < hlaska < hláska < hlava < chlapec < krtek
miilis kirjoitti:
Voisiko joku auttaa!!
Eli tarvis olisi seuraavanlainen ohjelma ja sen auki selittäminen.Tee ohjelma, joka kysyy käyttäjältä kahden henkilön etu- ja sukunimet. Ohjelma tulostaa sen jälkeen aakkosjärjestyksessä ensimmäisenä olleen henkilön nimen. Ohjelman on toimittava myös silloin, kun näillä kahdella henkilöllä on sama sukunimi
Kiitokset etukäteen mestarille!
LISÄYS!
Kiitoksia asianosaisille koodia näyttää pukkaavan, joo olen näköjään noviisi näillä palstoilla mutta apu kelpaa silti.
Eli täydennettäköön alkuperäistä kysymystä: kyseessä on c-kieli ja itselläni on vain heikko runko ohjelmasta (sitä tuskin kannattaa laittaa esille minnekään!)
Joten tältä pohjalta asiaa pähkäilen.
Tässä on köykäinen vertailufunktio merkkijonoille. Funktio vertailee kahta merkkijonoa ja tulostaa vastauksen suoraan. HUOMAA! funktio ei palauta mitään, vaan antaa se tulostaa suoraan oikean vastauksen.
Funktio ei ota kantaa paikallisiin tapoihin järjestellä merkkijonoja, riittänee kuitenkin aloittajan ongelmaan. Loput saat kyllä rakentaa itse, oletan että osaat tehdä ohjelman, joka kysyy ja sijoittaa stringit muuttujiin.
void Vertaile(string mjono1, string mjono2){ if(mjono1 < mjono2) cout << "Ensin tulee " << mjono1 << " ja sitten " << mjono2 << endl; else cout << "Ensin tulee " << mjono2 << " ja sitten " << mjono1 << endl; }
Teuro,
miilis kirjoitti:
kyseessä on c-kieli
Mitenkä laitetaan aakkosjärjestykseen vaikkapa Kekkonen ja Van Halen? Käsittääkseni tuo Van on etuliite ja Van Halen tulisi ennen Kekkosta, vai tuleeko? En ole kylläkään hollantia lukenut koskaan.
Legu kirjoitti:
Teuro,
miilis kirjoitti:
kyseessä on c-kieli
Pitänee korvata cout asianmukaisella print-funktiolla. Tulipas taas mokattua tuon kanssa. Muuta ilmeista vikaa en keksi tuosta, mutta kerro toki, mikäli on.
Teuro kirjoitti:
Legu kirjoitti:
Teuro,
miilis kirjoitti:
kyseessä on c-kieli
Pitänee korvata cout asianmukaisella print-funktiolla. Tulipas taas mokattua tuon kanssa. Muuta ilmeista vikaa en keksi tuosta, mutta kerro toki, mikäli on.
C:ssä ei ole luokkia, joten siinä ei ole myöskään string-luokkaa.
Sen siitä saa kun koittaa olla nokkela :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.