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

236

    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. Kiitos nainen

      Kuitenkin. Olet sitten ajanmerkkinä. Tuskin enää sinua näen ja huomasitko, että olit siinä viimeisen kerran samassa paik
      Tunteet
      12
      4030
    2. MTV: Kirkossa saarnan pitänyt Jyrki 69 koki yllätyksen - Paljastaa: "Se mikä oli hyvin erikoista..."

      Jyrki Linnankivi alias Jyrki 69 on rokkari ja kirkonmies. Teologiaa opiskeleva Linnankivi piti elämänsä ensimmäisen saar
      Maailman menoa
      82
      2081
    3. Hyväksytkö sinä sen että päättäjämme ei rakenna rauhaa Venäjän kanssa?

      Vielä kun sota ehkäpä voitaisiin välttää rauhanponnisteluilla niin millä verukkeella voidaan sanoa että on hyvä asia kun
      Maailman menoa
      549
      1647
    4. Kirjoita yhdellä sanalla

      Joku meihin liittyvä asia, mitä muut ei tiedä. Sen jälkeen laitan sulle wappiviestin
      Ikävä
      94
      1366
    5. Olet hyvin erilainen

      Herkempi, ajattelevaisempi. Toisaalta taas hyvin varma siitä mitä haluat. Et anna yhtään periksi. Osaat myös ilkeillä ja
      Ikävä
      67
      1117
    6. Yksi syy nainen miksi sinusta pidän

      on se, että tykkään luomusta. Olet luonnollinen, ihana ja kaunis. Ja luonne, no, en ole tavannut vielä sellaista, joka s
      Ikävä
      33
      1038
    7. Hyödyt Suomelle???

      Haluaisin asettaa teille palstalla kirjoittelevat Venäjää puolustelevat ja muut "asiantuntijat" yhden kysymyksen pohditt
      Maailman menoa
      216
      916
    8. Hyvää Joulua mies!

      Toivottavasti kaikki on hyvin siellä. Anteeksi että olen hieman lisännyt taakkaasi ymmärtämättä kunnolla tilannettasi, o
      Ikävä
      60
      883
    9. Hyvää talvipäivänseisausta

      Vuoden lyhyintä päivää. 🌞 Hyvää huomenta. ❄️🎄🌌✨❤️😊
      Ikävä
      171
      854
    10. Paljastavat kuvat Selviytyjät Suomi kulisseista - 1 päivä vs 36 päivää viidakossa - Katso tästä!

      Ohhoh! Yli kuukausi viidakossa voi muuttaa ulkonäköä perusarkeen aika rajusti. Kuka mielestäsi muuttui eniten: Mia Mill
      Suomalaiset julkkikset
      3
      828
    Aihe