Kertoman C-koodi terminaalista annetusta parametrista

Ohjelmoin pari päivää sitten pienen ohjelman, joka laskee kertoman terminaalista tai komentokehoitteesta Windows-ympäristössä parametrina annetusta luvusta.

Lisäsin jakoon C-koodini Pastebiniin, jos joku haluaa kääntää ohjelman esimerkiksi Linuxille, Winkkarille, tai muuten vain haluaa tarkastella sitä, tai jopa kehittää.

Paljon vähemmällä koodilla kyseistä kertoma-laskenta-"ongelmaa" lienee mahdotonta ratkaista

19

301

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      QT on hyvä alusta tehdä samaa ohjelmaa eri alustoille.

    • Anonyymi

      Kertoman laskeminen tuskin tarvitsee rekursiota. Tuohan aiheuttaa pinon ylivuodon, teoriassa, kun argumenttina annettu luku on suuri.

      else
      {
      int tulos;
      for(tulos = 1, input = atoi(argv[1]); input > 1; tulos *= input--);
      printf("%d",tulos);
      }

      • Jos mielestäsi ei tarvitse rekursiota, niin voitko esittää oman ratkaisusi, pistä vaikka koodi Pastebiniin anonyymina, jollet ole rekannut itseäsi sinne sisään.

        Tuo koodiesityksesi on vaikeasti ymmärrettävissä, vaikka siitä saakin idean irti ehkä. Vähän selvennystä kaipaan, sain tuosta sen käsityksen, että yrität laskea lopputuloksen for-silmukassa sen sijaan, että kutsuisit kertoma-metodia rekursiivisesti. En saa ihan muuta ideaa tuosta esimerkistä, kun siinä on niin paljon syntaksivirheitä. Pistä oma ratkaisusi vaikka anonyymisti Pastebiiniin ja koodi jakoon?

        Jos ymmärsin oikein, että for-silmukassa lasket kertomaa, niin tuo ei ole lainkaan uudelleenkäytettävä ratkaisu, joka rikkoo ohjelmoinnin kultaista sääntöä, että koodin tulee olla uudelleen käytettävää. (reusable) Jos tarvitset ohjelmassasi usein laskea kertoman, tuossa sinun ratkaisussasi joudut kirjoittamaan tuon for-silmukan joka kerta uudelleen, joka viittaa proseduraalisen paradigman suuntaan, joten järkevintä on mennä suoraan niin lähelle juuria, että kirjoittaa minimimäärän tarvittavat koodirivit uudelleenkäytetäväksi metodiksi, niin säästyy aikaa, rahaa ja mielenterveys.

        Kirjoitin tuosta joskus "Kertoma Python"illa -artikkelinkin tietokoneblogiini, jonka osoite on .

        https://tietokoneblogi.wordpress.com/2019/01/17/python-kertoma/


      • Anonyymi

        Joo, kyllä tuo loopilla on järkevämpi tehdä, rekursio on turhaa kikkailua ja se myös tuhlaa koneen resursseja. Toki se looppi olla funktiossakin, jota voi kutsua ihan samalla tavalla kuin rekursiivistakin funktiota.


      • Anonyymi
        Anonyymi kirjoitti:

        Joo, kyllä tuo loopilla on järkevämpi tehdä, rekursio on turhaa kikkailua ja se myös tuhlaa koneen resursseja. Toki se looppi olla funktiossakin, jota voi kutsua ihan samalla tavalla kuin rekursiivistakin funktiota.

        Tuolla esimerkki looppi/funktio -tyyppisestä toteutuksesta.
        http://codepad.org/hnEQvoL9


      • Anonyymi

        Tuossa nuo kolme riviä {} sisällä on aivan toimivaa. Voi laittaan esim. main() funktion sisään. En ole itse käyttänyt C-kieltä, enkä paljon muutakaan, mutta tuo kyllä kääntyy päässä toimivaksi tehtäväsarjaksi :)


      • Anonyymi
        Anonyymi kirjoitti:

        Tuossa nuo kolme riviä {} sisällä on aivan toimivaa. Voi laittaan esim. main() funktion sisään. En ole itse käyttänyt C-kieltä, enkä paljon muutakaan, mutta tuo kyllä kääntyy päässä toimivaksi tehtäväsarjaksi :)

        Sen sijaan rekursio vaatisi harjoittelua. Luulen että siihenkin tottuisi.

        Hasssua kun katsoi Numberphile videota jossa matemaatikko kirjoitti pienen rekursiivisen ohjelman Pythonilla ja se mietti toimiikohan tämä, olisi pitänyt kirjoittaa tämä valmiiksi ennen kuvausta. Matemaattikot ilmeisesti käyttävät enemmän luonnostaan rekursiota, kun matematiikassa on vastaavaa.

        Toinen oli ohjelmointikurssilla (cs 106B tai X) maininta että yleensä joko mietitään joko miksiköhän tämä toimii tai sitten miksikö ei. Eli ei jokaiselle fiksummallekaan ole itsestään selvää ilman harjoitusta.

        Kannattaisi ehtä treenata :)


      • Anonyymi

        Windows-ympäristössä pinon ylivuotoa ei kovin helposti pääse sattumaan. Taskin pino on varsin suuri ja kokoa voidaan vieläpä kasvattaa ajonaikaisesti tarpeen mukaan.

        https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/resetstkoflw?view=vs-2019

        Pinon kuormittaminen ja hallitsematon rekursio ovat kuitenkin huonoja tapoja ajatellen koodin luotettavuutta ja siirrettävyyttä.

        Microsoftin C-kirjastossa oli aikaisemmin stackavail() funktio, jolla vapaan pinon määrän sai kätevästi selvitettyä. Funktio poistui ilmeisesti samalla kun em. pinon koon kasvattaminen tuli mahdolliseksi. Tietääkö joku korviketta tälle funktiolle?


    • Tosta rekursiosta vielä, että se on yksi tietojenkäsittelyn perusopintojen vaikeimmista asioista ymmärtää, vaikka tajuaisi muutenkin jotain muuta, kuin kirjoittaa suoli24-palstalle irrelevanttia matskua anonyymina.

      • Anonyymi

        Mielestäni rekursio on ihan simppeli juttu. Siinähän vaan kutsutaan itseään. Esimerkiksi pointtereiden hallinta on C-kielessä paljon vaikeammin ymmärrettävää, kuten **ptr, joka on pointteri pointteriin.

        Jokaisen pääkoppa tietysti käsittelee asioita eri tavoin. Sen vuoksi ohjelmoinnista vänkääminen on aika joutavaa ajanhukkaa.


      • Anonyymi

        Relevanttia on mielestäni arvioida onko rekursio (muuten kuin harjoitusmielessa) järkevää tai tarpeellista jossain tietyssä tehtävässä.
        Rekursion harjoitustehtävät ovat monesti sellaisia että niissä ei kannatttaisi käyttää rekursiota. Mutta kun ilmeisesti halutaan helpohkoja ja tutun tuntuisia harjoituksia. Esim hakemiston läpikäynti voisi olla motivoituneempi esimerkki..

        Relevanttia on mielestäni tuoda esiin rekursion vaatima harjoitus useimmille meistä, jotka eivät ole erityislahjakkaita siihen sopivalla tavalla.

        ps rekursiossa voi käyttää ns. dynaamista ohjelmointia, joka ei taida tarkoittaa muuta kuin laskettujen tulosten tallentamista ja hakemista siten ettei tarvitse laskea uudestaan jo laskettua"haaraa". (kertomassa ei voi hyödytää)
        https://www.quora.com/What-is-the-difference-between-dynamic-programming-and-recursion
        (tuossa kysymys "väärä")


      • Anonyymi
        Anonyymi kirjoitti:

        Relevanttia on mielestäni arvioida onko rekursio (muuten kuin harjoitusmielessa) järkevää tai tarpeellista jossain tietyssä tehtävässä.
        Rekursion harjoitustehtävät ovat monesti sellaisia että niissä ei kannatttaisi käyttää rekursiota. Mutta kun ilmeisesti halutaan helpohkoja ja tutun tuntuisia harjoituksia. Esim hakemiston läpikäynti voisi olla motivoituneempi esimerkki..

        Relevanttia on mielestäni tuoda esiin rekursion vaatima harjoitus useimmille meistä, jotka eivät ole erityislahjakkaita siihen sopivalla tavalla.

        ps rekursiossa voi käyttää ns. dynaamista ohjelmointia, joka ei taida tarkoittaa muuta kuin laskettujen tulosten tallentamista ja hakemista siten ettei tarvitse laskea uudestaan jo laskettua"haaraa". (kertomassa ei voi hyödytää)
        https://www.quora.com/What-is-the-difference-between-dynamic-programming-and-recursion
        (tuossa kysymys "väärä")

        Fraktaaleiden piirtäminen taitaa olla malliesimerkki rekursioiden käytöstä.


      • Anonyymi kirjoitti:

        Relevanttia on mielestäni arvioida onko rekursio (muuten kuin harjoitusmielessa) järkevää tai tarpeellista jossain tietyssä tehtävässä.
        Rekursion harjoitustehtävät ovat monesti sellaisia että niissä ei kannatttaisi käyttää rekursiota. Mutta kun ilmeisesti halutaan helpohkoja ja tutun tuntuisia harjoituksia. Esim hakemiston läpikäynti voisi olla motivoituneempi esimerkki..

        Relevanttia on mielestäni tuoda esiin rekursion vaatima harjoitus useimmille meistä, jotka eivät ole erityislahjakkaita siihen sopivalla tavalla.

        ps rekursiossa voi käyttää ns. dynaamista ohjelmointia, joka ei taida tarkoittaa muuta kuin laskettujen tulosten tallentamista ja hakemista siten ettei tarvitse laskea uudestaan jo laskettua"haaraa". (kertomassa ei voi hyödytää)
        https://www.quora.com/What-is-the-difference-between-dynamic-programming-and-recursion
        (tuossa kysymys "väärä")

        "Relevanttia on mielestäni arvioida onko rekursio (muuten kuin harjoitusmielessa) järkevää tai tarpeellista jossain tietyssä tehtävässä."

        Yleensä rekursio on se paras tapa millä saadaan ongelma ratkaistua siististi funktionaalisesti.

        Lähinnä C-kieli on tässä se ongelma kun siinä tulee se pinon ylivuoto jos rekursiota on liikaa, että pitää varmistaa että pahimmassa tapauksessa näin ei pääse käymään, esimerkiksi silloin jos käydään jotain puuta läpi ja puu epätasapainossa. Sitten pitää ratkoa hankalammin jos rajat tulee vastaan.


      • Anonyymi kirjoitti:

        Mielestäni rekursio on ihan simppeli juttu. Siinähän vaan kutsutaan itseään. Esimerkiksi pointtereiden hallinta on C-kielessä paljon vaikeammin ymmärrettävää, kuten **ptr, joka on pointteri pointteriin.

        Jokaisen pääkoppa tietysti käsittelee asioita eri tavoin. Sen vuoksi ohjelmoinnista vänkääminen on aika joutavaa ajanhukkaa.

        No joo, kesän alussa aloitin opiskelemaan C-kieltä, ja luin siitä kaksi kirjaakin sen jälkeen, kun olin ottanut kieltä haltuun netin kautta. Noi osoittimet,, pointterit on munkin mielestä rekursiota hankaalampia tajuta, ja ne on täysin olennaisia hallita, jos haluaa ohjelmoida C:llä jotain.

        Olen kuullut, että noi pointterit ja pointterit pointtereihin tuottaa vielä kokeneillekin ohjelmoijille vaikeuksia.

        Pahimmassa tapauksessa ohjelma kaatuu, jos on jäänyt jokin huomaamatta. On niitäkin esimerkkejä, että jokin mielettömän paljon maksanut avaruuslento-projekti on kaatunut alkumetreillä ohjelmointivirheen takia. Tuollaisessa avaruuslennolla käytettävä softa on yksi kriittisimpiä sen suhteen, että sen pitäisi toimia aukottomasti.


      • Anonyymi
        jerzunposti kirjoitti:

        No joo, kesän alussa aloitin opiskelemaan C-kieltä, ja luin siitä kaksi kirjaakin sen jälkeen, kun olin ottanut kieltä haltuun netin kautta. Noi osoittimet,, pointterit on munkin mielestä rekursiota hankaalampia tajuta, ja ne on täysin olennaisia hallita, jos haluaa ohjelmoida C:llä jotain.

        Olen kuullut, että noi pointterit ja pointterit pointtereihin tuottaa vielä kokeneillekin ohjelmoijille vaikeuksia.

        Pahimmassa tapauksessa ohjelma kaatuu, jos on jäänyt jokin huomaamatta. On niitäkin esimerkkejä, että jokin mielettömän paljon maksanut avaruuslento-projekti on kaatunut alkumetreillä ohjelmointivirheen takia. Tuollaisessa avaruuslennolla käytettävä softa on yksi kriittisimpiä sen suhteen, että sen pitäisi toimia aukottomasti.

        " On niitäkin esimerkkejä, että jokin mielettömän paljon maksanut avaruuslento-projekti on kaatunut alkumetreillä ohjelmointivirheen takia."

        Ei liittynyt ohjelmointiin, vaan käytettäviin mittayksiköihin. Kivikaudella elävät jenkit eivät ymmärrä vieläkään SI-järjestelmää.


      • Sama se. Niitä on kuitenkin ihmisen tietokoneen käytön historian sivu täysi ohjelmia, jotka eivät toimi, vaan kaatuvat. Esimerkiksi Windows 95 Blue Screen oli aika yleinen silloin, kun se julkaistiin ensimmäisen kerran.


    • No joo, kaikella kunnioituksella kaikkia ratkaisuja ja koodareiden valintoja kohtaan. Itselläni ensimmäinen rekursiosovellus, jonka kautta tajusin asian, oli klassinen "Hanoin Tornit" -ongelma.

      Hanoi Towers ongelman historiahan on se, että alkuperäisessä ongelmassa oli 64-kiekkoa, ja sen ratkaisemiseen ei riitä ihmiselämä.

    Ketjusta on poistettu 1 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Upea peppuisella naisella

      Upea peppuisella naisella on upea peppu.
      Ikävä
      85
      6314
    2. Nikkalassa vauhdilla nokka kohti taivasta

      Mitähän Darwin sanoisi näistä 4 suomalaisesta, jotka kävivät Haparandan puolella näyttämässä, kuinka Suomi auto kulkee t
      Tornio ja Haaparanta
      30
      3793
    3. törniöläiset kaaharit haaparannassa

      isäpapan autolla kaahatta 270 km/h metsään https://www.lapinkansa.fi/nsd-kaksi-suomalaista-kuoli-kolarissa-haaparannall/
      Tornio ja Haaparanta
      28
      3150
    4. Sitä saa mitä tilaa Perussuomalaiset!

      https://yle.fi/a/74-20160212 SDP:n kannatus se vain nousee ja Keskusta on kolmantena. Kokoomus saanut pienen osan persu
      Maailman menoa
      369
      1706
    5. Mihin se sysipska hävisi?

      Katso Frida Kahlo elämäkerta ja opi.
      Ikävä
      33
      1398
    6. Upea peppuisella miehellä

      Upea peppuisella miehellä on upea peppu.
      Ikävä
      27
      1330
    7. Eelin, 20, itsemurhakirje - Suomalaisen terveydenhuollon virhe maksoi nuoren elämän

      Yksikin mielenterveysongelmien takia menetetty nuori on liikaa. Masennusta sairastava Eeli Syrjälä, 20, ehti asua ensi
      Maailman menoa
      46
      959
    8. Anteeksi kulta

      En oo jaksanut pahemmin kirjoitella, kun oo ollut tosi väsynyt. Mut ikävä on mieletön ja haluisin kuiskata korvaasi, hyv
      Ikävä
      11
      946
    9. Perttu Sirviö laukoo täydestä tuutista - Farmi Suomi -kisaajista kovaa tekstiä "Pari mätää munaa..."

      Ohhoh, Farmilla tunteet alkaa käydä kuumana, kun julkkiksia tippuu jaksosta toiseen! Varo sisältöpaljastuksia: https:
      Tv-sarjat
      11
      880
    10. Tykkään susta todella

      Paljon. Olet ihana ❤️
      Ikävä
      42
      859
    Aihe