Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Nimien järjestäminen aakkosjärjestykseen

Sivun loppuun

miilis [20.08.2007 16:06:30]

#

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!

hunajavohveli [20.08.2007 16:10:18]

#

Mikä kieli?

sooda [20.08.2007 16:11:09]

#

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.

jcd3nton [20.08.2007 16:11:33]

#

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.

Legu [20.08.2007 16:42:50]

#

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.

Blaze [20.08.2007 17:28:46]

#

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

jlaire [20.08.2007 18:32:26]

#

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>

squid [20.08.2007 18:47:37]

#

Blaze: Ruby on suht yksinkertaista, jonka vuoksi se on kivaa :)
Tännekkin pitäisi saada Ruby-opas jossain vaiheessa, kun vaan jaksais/osais jotain :)

Pekka Karjalainen [20.08.2007 19:03:09]

#

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.

Pekka Karjalainen [20.08.2007 22:06:35]

#

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).

os [22.08.2007 01:07:41]

#

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ä.

User137 [22.08.2007 12:27:13]

#

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;

koo [23.08.2007 00:32:15]

#

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.

Grez [23.08.2007 00:53:01]

#

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ä.

koo [23.08.2007 01:36:09]

#

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 [31.08.2007 11:06:38]

#

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.

Teuro [14.09.2007 18:51:46]

#

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;
}

Legu [14.09.2007 19:11:52]

#

Teuro,

miilis kirjoitti:

kyseessä on c-kieli

Jaska [14.09.2007 20:36:51]

#

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.

Teuro [14.09.2007 21:16:18]

#

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.

Megant [14.09.2007 21:22:43]

#

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.

Teuro [14.09.2007 21:43:58]

#

Sen siitä saa kun koittaa olla nokkela :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta