Teen sellaista ohjelmaa, jossa kysytään 3 lukua ja ne pitäisi tulostaa nousevassa järjestyksessä eli pienimmästä suurimpaan.
Olen yrittänyt saada ohjelmaa toimimaan koko eilisen illan ja tämän päivän, mutta tuloksetta, voisiko joku olla ystävällinen ja auttaa minua tässä.
Laitan tähän koodin, jonka olen tehnyt.Siinä voi kyllä olla paljonkin virheitä, sillä olen vasta äskettäin alkanut opiskelemaan tätä C .
Koodi on tällainen:
#include
void main()
{
int lukua,lukub,lukuc,tulostus;
printf("Anna kolme lukua
");
scanf("%d,%d,%d",&lukua,&lukub,&lukuc);
scanf("%d,%d,%d",&lukub,&lukua,&lukuc);
scanf("%d,%d,%d",&lukub,&lukuc,&lukua);
scanf("%d,%d,%d",&lukua,&lukuc,&lukub);
scanf("%d,%d,%d",&lukuc,&lukub,&lukua);
scanf("%d,%d,%d",&lukuc,&lukua,&lukub);
if (lukua
Olen yrittänyt saada ohjelmaa toimimaan koko eilisen illan ja tämän päivän, mutta tuloksetta, voisiko joku olla ystävällinen ja auttaa minua tässä.
Laitan tähän koodin, jonka olen tehnyt.Siinä voi kyllä olla paljonkin virheitä, sillä olen vasta äskettäin alkanut opiskelemaan tätä C .
Koodi on tällainen:
#include
void main()
{
int lukua,lukub,lukuc,tulostus;
printf("Anna kolme lukua
");
scanf("%d,%d,%d",&lukua,&lukub,&lukuc);
scanf("%d,%d,%d",&lukub,&lukua,&lukuc);
scanf("%d,%d,%d",&lukub,&lukuc,&lukua);
scanf("%d,%d,%d",&lukua,&lukuc,&lukub);
scanf("%d,%d,%d",&lukuc,&lukub,&lukua);
scanf("%d,%d,%d",&lukuc,&lukua,&lukub);
if (lukua
Vastaukset 23
Vanhimmat
Ellei ole mitään todella tähdellistä syytä säilyttää luvut oikeissa kohdissaan on paljon järkevämpää ensin järjestää ne, ja vasta sitten printata.
C/C :aa en osaa, mutta voin antaa esimerkin järjestämisestä pythonilla, soveltaminen ei pitäisi olla erityisen vaikeaa. Jos ambitiota rittää, tämän voi tehdä _paljon_ näppärämmin/yleisemmin.
def sort(a, b, c):
if b < a:
tmp = a
a = b
b = tmp
if c < b:
tmp = b
b = c
c = tmp
if b < a:
tmp = a
a = b
b = tmp
print a, b, c
Koodiesimrkissä pitäisi olla tab-lyöntejä. Yksi ennen jokaista "if" riviä, yksi ennen "print" riviä, nolla ennen "def" riviä ja kaksi ennen kaikkia muita.
Tyylikkämpää on jos lisäät yhden koko viimeiselle if-blokille.
Jostakin syystä foorumi söi tabulattorit...
En ole mikään c guru itsekään mutta tein toimivan(?) esimerkin, joka toimii samalla periaatteella kuin sinun ohjelmasi paitsi näyttää luvut päinvastaisessa järjestyksessa;)
int main()
{
int a, b, c;
printf("Syötä kolme lukua:");
while( scanf("%d %d %d", &a, &b, &c) != 3 );
if( a>=b && a>= c) {
/* a suurin */
if(b>=c) {
printf("a:%d, b:%d, c:%d", a, b, c);
}
else {
printf("a:%d, c:%d, b:%d", a, c, b);
}
}
else if( b>=a && b>=c ) {
/* b suurin */
if(a>=c) {
printf("b:%d, a:%d, c:%d", b, a, c);
}
else {
printf("b:%d, c:%d, a:%d", b, c, a);
}
}
else {
/* c suurin */
if(a>=b) {
printf("c:%d, a:%d, b:%d", c, a, b);
}
else {
printf("c:%d, b:%d, a:%d", c, b, a);
}
}
return 0;
}
Kuten varmaan huomaat tällä periaatteella tulee helposti melkoista if-lause viidakkoa ja ohjelman koko paisuu melkoisesti. Suosittelisin lukemaan numerot taulukkoon ja järjestämään taulukon paikallaan pienessä aliohjelmassa. Näin samalla periaatteella voit lukea vaikka 100 lukua tarvitsematta juurikaan ohjelmaa muuttaa tai kirjottaa tuhansia if lausekkeita :)
Nyt tein hieman paremman ratkaisun.. tosin tämäkin on kaukana vielä täydellisestä ;)
Ohjelma varaa muistin numeroille dynaamisesti mallocilla, joten kysyttävien numeroiden lukumäärää ei tarvitse hitsata kiinni edeltä käsin (vaikka tässä on niin tehtykin).
Numerot luetaan merkkijonoina puskuriin josta ne sitten muutetaan atoi -funktiolla numeroiksi. -Tällä vältytään ohjelman kaatumiselta jos käyttäjä syöttää muita kun numeroita.
Kun numerot on luettu, järjestetään taulukko yksinkertaisella bubblesort menetelmällä ja tulostetaan numerot.
Tulihan tällekin yllättävä määrä rivejä, mutta en koittanutkaan tehdä erityisen kompaktia ;) Ainakin ohjelmaa on helpompi muuttaa lukemaan vaikka 100 numeroa!
#include
#include
int *kysy_n_lukua(int lkm);
void vaihda(int *a, int *b);
void jarjesta(int *taulukko, int koko);
int main()
{
int *taulukko, i, lkm;
lkm = 10;
taulukko = kysy_n_lukua(lkm);
if(!taulukko) {
printf("Muistin varaaminen epäonnistui!
");
return(1);
}
else
{
/* jarjesta taulukko */
jarjesta(taulukko, lkm);
/* tulostetaan taulukko */
for(i=0;i
Kiitos neuvoista keijo, ne auttoivat, mutta en saanut vieläkään ohjelmaani toimimaan oikein. Ohjelmani tulostaa vain luvun a, ei lukuja b ja c ja tulostus tulee aina vain samassa järjestyksessä eli a,b,c, eikä se ota huomioon sitä, että ne olisivat suuruusjärjestyksessä. Ja vielä sekin, että b ja c -luvut tulostuvat suurempina lukuina kuin olen ne syöttänyt, esim. jos olen syöttänyt vaikka 9,6,4, niin tulostuu: 9,8653,10175.
Missähän voisi olla vika?
Olisi tosi kiva saada tämä ohjelma toimimaan.
Vastausta toivoen, C -kielen opiskelija.
Kiitos vielä ohjeista, mutta minulle ei ole opetettu vielä tuota taulukon käyttöä, joten en taida vielä hallita sitä. Oisiko mitenkään mahdollista tehdä tämä ohjelma nuilla if-else -lauseilla? En saanut sitä vielä toimimaan oikein, vaikka kokeilin monia vaihtoehtoja siihen ehdottamaasi ohjelmaan.
Toivottavasti saan siihen vielä ratkaisun.
Toivoo, Minni
Hmm ettei vaan olis printf -lausekkeisiin eksynyt &-merkkiä muuttujien nimien eteen?
näin:
printf("a:%d, b:%d, c:%d", a, b, c);
ei näin:
printf("a:%d, b:%d, c:%d", a, &b, &c);
(tämä tulostaisi b ja c muuttujien muistipaikan numeron eikä muuttujan sisältämää lukua)
Kuitenkin scanf tarvitsee muuttujien nimen eteen tuon merkin, koska se tarvitsee parametreinään muuttujien osoitteet joihon tieto luetaan.
Toinen mahdollisuus on että kohta, jossa luet näppäimistöltä numerot muuttujiin ei toimi. Lisää tällainen rivi heti sen kohdan jälkeen missä muuttujiin on luettu numerot niin näet onko muuttujat luettu oikein:
printf("a:%d, b:%d, c:%d", a, b, c);
Olin aivan oikein laittanut ne printf-muodot ja kokeilin tuota riviä,jonka annoit muuttujien perään, mutta ei toiminut, en tiedä sitten, laitoinko sen rivin oikeaan paikkaan?
Laitan tähän vielä uudestaan tuon ohjelman koodin.
Olen yrittänyt ratkaista tätä ohjelmaa jo niin kauan, että en enää keksi mitään ratkaisua.
Alkaa jo tuntua epätoivoiselta....
#include
int main()
{
int a, b, c;
printf("Syötä kolme lukua:");
(scanf("%d %d %d", &a, &b, &c) != 3);
{
if( a
Toimii tuo ainakin minulla:)
Näköjään tämä riittää lukujen syöttämiseen, se while härpäke oli liikaa minkä siihen alkuperäiseen esimerkkiin olin pistänyt:
scanf("%d %d %d", &a, &b, &c);
Main -funktion lopussa voisi olla "return 0" että kääntäjä pysyy tyytyväisenä(ja onhan main int tyyppiäkin).
Ohjelma kääntyi ilmankin noita muutoksia, mutta herjoista noilla pääsee eroon.
Ompa kumma juttu, koska minulla ei toimi tuolla koodilla. Ja jos lisään vielä sen return=0 loppuun, niin silloin minulle tulee virheilmoitus, ilman sitä ohjelma lähtee käyntiin, mutta se vain tulostaa edelleenkin väärin. Voisiko minulla olla jotain vikaa tuossa itse ohjelmassa, minulla on Borland C 4.52.
Vai voiko olla, niin että tuohon minun ohjelmaan on tullut jokin virhe ja se täytyisi asentaa uudelleen? Se kyllä toimii muilla tekemilläni ohjelmilla. Muuten onko Sinulla erilainen ohjelma kuin minulla?
Ei kai tässä enää voi mitään tehdä...
Vai voiko? Olet jo niin paljon aikaa kuluttanut tähän minun ongelmaan, joten kiitos siitä.
aaltosulkeet (eli ennen ensimmäistä if:iä, yksi lopusta), muutin
"(scanf("%d %d %d", &a, &b, &c) != 3);"
Keijon ehdottamaksi
"scanf("%d %d %d", &a, &b, &c);":iksi. Lisäksi tungin pari
merkkiä mukaan, parantamaan tulostuksen ulkonäköä.
Hienosti kääntyi, ja toimii (Kääntäjänä gcc 3.2.3).
Alla sorsa:
#include
int main()
{
int a, b, c;
printf("Syota kolme lukua:
");
scanf("%d %d %d", &a, &b, &c);
if ( a
Yritin tätä Sinun ehdotelmaasi, mutta ei toimi vieläkään. Jos syötän esim. luvut 9,5,3, niin ohjelma tulostaa: 9, 8653, 8959, tätä virhettä se tekee koko ajan. Eli se tulostaa aina ensimmäisenä ensimmäisen syötetyn luvun ja seuraavat tulostuvat paljon suurempina lukuina, kuten esim. huomasit. Olisiko minulla tässä kääntäjässä jokin vika (Borland C 4.52)? Jokin asetus olisi väärin tai jokin osa puuttuu siitä? En kyllä enää keksi muutakaan selitystä.
Taitaa olla tämä "mahdoton tehtävä"?
Kiitos avustasi, ei taida enää olla mitään ratkaisua tähän ongelmaan...
Minulla on Borland C 5.5 ja tuo toimi mainiosti. Ikävä kyllä en taida osata auttaa tuossa :(
saattaa olla bugi kaantajassasi. Voisit koittaa katsoa borlöandin sivuilta paivityksen
Poistin ohjelman ja asensin uudelleen, eikä sillä ollut mitään vaikutusta, sitten huomasin, että kun aloin asentamaan ohjelmaa, niin se antoi ensin virheilmoituksen: INSTBI25 caused a general protection fault in module BAMGR16.DLL at 0004:0D70, minkä jälkeen se sitten asensi ohjelman. Eli tässä minun Borlandissa on sovellusvirhe. En vielä tiedä miten sen saan korjattua, ehkä tuo Borland pitäisi päivittää. Muuten mistähän löytäisin tuon päivityssivun, olen yrittänyt hakea, mutta en ole vielä löytänyt.
Tämä ohjelma, joka mulla on, niin se on koulusta saatu versio, voisikohan sillä olla jotain vaikutusta asiaan, ei ole aivan täydellinen versio. Menen huomenna käymään opiskelupaikassani ja yritän saada sieltä apua.
Kiitos hirveesti avusta, nyt ainakin tiedän missä se vika on.
terv. Minni
Jos scanf lukee ensimmäisen numeron oikein niin mikset käyttäisi 3 scanf kutsua:
scanf("%d", &a);
scanf("%d", &b);
scanf("%d", &c);
Miksiköhän tämä ei tullut aikaisemmin mieleen kuin vasta nyt.. tunnenpas itseni hölmöksi :)
Kun kokeilin tuota Sinun ehdottamaasi juttua, niin ohjelma antoi mulle stop-merkin eli se jumittui kokonaan. Luulen, että siinä minun Borlandissa on jokin virhe, ehkä saan selville sen huomenna, kun käyn illalla opiskelemassa.
Ilmoitan Sinulle, kun saan tietää missä oli vika, sillä onhan tätä ongelmaa jo niin kauan yritetty ratkaista, että kerron Sinulle, kun se on selvitetty.
Joten nyt lähden katsomaan formuloita ja huomenna taas lähden ratkomaan tätä ongelmaa....
Heippa taas!
atoi taitaa palauttaa nollan, jos se ei saanut luettua numeroa. strtol/strtoul sopivilla parametreilla on toimivampi ratkaisu. qsort on parempi lajitteluun (ks. äsken laittamani esimerkki).
scanf("%9s", buf);
taulukko[i] = atoi(buf);
on kenties selkeämpi:
if (scanf("%d", taulukko[i]) != 1)
virhe(...);
sillä lukeminen em. scanf:llä epäonnistuu, jos ei saatu luettua yhtä numeroa (tyyppiä int).
Ei return=0, vaan return 0;. Mikään C-kääntäjä ei hyväksy lausetta return=0;.
while toimii, jos sille annetaan heti kolme numeroa peräkkäin.
Jos whilen scanf saa vastaansa muuta kuin numeroita, ei saada milloinkaan luettua kolmea numeroa, sillä whilessä ei virhetilanteessa lueta ei-numeromerkkejä pois. Sen takia while pamahtaa ja jää ikilooppiin.
Syötteenluvun ensimmäinen sääntö: "käyttäjä on aina väärässä, tarkista kaikki käyttäjän antama syöte".
Nyt ohjelmani toimii. Siinä koodissa oli virhe eli olit oikeassa, kun ehdotit laitettavan jokaisen muuttujan erikseen. Laitan tähän sen koodin pätkän, jolla ohjelma alkoi toimia.
#include
void main()
{
int a, b, c;
printf("Syötä ensimmäinen luku
");
scanf("%d", &a);
printf("Syötä toinen luku
");
scanf("%d",&b);
printf("Syötä kolmas luku
");
scanf("%d",&c);
{
if( a
Kiva juttu että sait toimimaan
Traagisen näköinen if-printf systeemi. Miksi alussa luetaan kuusi kertaa luvut samoihin muuttujiin, kun yksikin kerta riittää ? Sitä paitsi viisi ensimmäistä scanf:ää menee hukkaan, koska kuudes scanf ylikirjoittaa ne aiemmin luetut luvut..
int main(..)
tulostus=lukua