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

183

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

      Hurjaksi käynyt meno Laffassa. Jotain jätkää kuristettu ja joutunu teholle...
      Kokkola
      50
      5035
    2. Tappo Kokkolassa

      Päivitetty tänään Iltalehti 17.04.2024 Klo: 15:23..Mikähän tämä tapaus nyt sitten taas on.? Henkirikos Kokkolassa on tap
      Kokkola
      23
      3307
    3. Poliisit vaikenee ja paikallinen lehti

      Poliisit vaikenee ja paikallinen lehti ei kerro taposta taaskaan mitään. Mitä hyötyä on koko paikallislehdestä kun ei
      Kokkola
      28
      1452
    4. Miksi tytöt feikkavat saaneensa orgasmin, vaikka eivät ole saaneet?

      Eräs ideologia itsepintaisesti väittää, että miehet haluavat työntää kikkelinsä vaikka oksanreikään, mutta tämä väite ei
      Sinkut
      181
      1295
    5. Mitä ihmettä

      Kaipaat hänessä
      Ikävä
      75
      990
    6. MAKEN REMPAT

      Tietääkö kukaan missä tämmöisen firman pyörittäjä majailee? Jäi pojalla hommat pahasti kesken ja rahat muisti ottaa enna
      Suomussalmi
      24
      898
    7. Kuntoutus osasto Ähtärin tk vuode osasto suljetaan

      5 viikkoa ja mihin työntekijät, mihin potilaat. Mikon sairaalan lopetukset saivat nyt jatkoa. Alavudelle Liisalle tulee
      Ähtäri
      49
      857
    8. Itämaisesta filosofiasta kiinnostuneille

      Itämaisesta filosofiasta kiinnostuneille. Nämä linkit voivat auttaa pääsemään niin sanotusti alkuun. https://keskustel
      Hindulaisuus
      259
      806
    9. Mulla on kyllä

      Järkyttävä ikävä sua. Enkä yhtään tykkää tästä olotilastani. Levoton olo. Ja vähän pelottaa..
      Ikävä
      35
      738
    10. Uskoontulo julistetun evankeliumin kautta

      Ja kun oli paljon väitelty, nousi Pietari ja sanoi heille: "Miehet, veljet, te tiedätte, että Jumala jo kauan aikaa sitt
      Raamattu
      482
      707
    Aihe