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

486

    Vastaukset 19

    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. Puukotus Kajaanissa

      Kuka puukotti ja ketä? https://yle.fi/a/74-20247765 Vähemmän yllättäen päihteet mainittu
      Kajaani
      52
      1197
    2. Taas henkirikos

      Kuka lienee nyt asialla.
      Ilomantsi
      16
      825
    3. Mitä söpö

      Mies mietit?
      Ikävä
      63
      735
    4. 68
      732
    5. Miten uskallan sua nähdä

      Kun vaikutat suuttuneelta :(
      Ikävä
      47
      704
    6. Nainen, tässä olen kahden vaiheilla

      Toinen pitäisi valita ja kummassakin on hyvät ja huonot puolensa. Toinen olisi sellainen pysyvä mutta työläs. Toinen taa
      Ikävä
      69
      688
    7. Hyvä on sitten, jos et sitä s*ksiä halua kanssani.

      Rakastetaan vaan toisiamme, voin käydä muualla tyydyttämässä fyysisenpuolen tarpeet. Puhumalla tämäkin olisi selvinnyt.
      Ikävä
      131
      615
    8. Suloinen ja herkkä

      Toiset huomioiva, räväkkä, yllättävä. Ei sellaisesta voi olla pitämättä.
      Rakkaus ja rakastaminen
      31
      585
    9. Humalassa autolla ajo.

      Tuhti humala hyydytti kuljettajan Suomussalmella -sammui rattiin ,uutisoi Ylä-Kainuu.
      Suomussalmi
      9
      550
    10. Minä muistan

      Minä muistan sinut nauravana. Sellaisena, joka sai tavallisenkin hetken tuntumaan vähän kevyemmältä, kuin huoneeseen ol
      Ikävä
      45
      518
    11. Tiesitkö? Jorma Uotisen EX-rakas on Helena Lindgren - Nämä ovat välit nyt: "Me ollaan..."

      Jorma Uotinen ja Helena Lindgren olivat avoliitossa v. 1982-1999. Pariskunta oli aikansa näyttävä julkkispari, missä i
      Kotimaiset julkkisjuorut
      8
      510
    12. Hurja pako Kuhmossa

      19 vuotias kaahasi humalassa jalkakäytävälle tänään. Kuka mitä häh.
      Kuhmo
      4
      482
    13. Hyvää yötä hurmuri

      Iltaa haaveeni! Kauniita unia😘 Jospa me vielä nähtäis ja juteltais, suukoteltais ja halittais, siliteltäis ja hyväiltä
      Ikävä
      24
      473
    14. Jäljitelmä Birginit

      Ei jumaleisson, Jeffin vaimo kertoo et nää Hermesit olikin jäljitelmiä ja timangit labrarääsää. Anna mun kaikki kestää �
      Kotimaiset julkkisjuorut
      104
      469
    15. Pitäisikö seksille asettaa huvivero?

      (ja jos hankkisi todistuksen sen harrastamisesta velvollisuudesta tai lisääntymistarkoituksessa, saisi siitä vapautuksen
      Sinkut
      113
      444
    16. Mä voisin rakastua noihin tähti silmiin

      Katseesi on niin lumoava nainen💚.
      Ikävä
      16
      431
    17. Olet pelottava ilme vakavana

      Sitä alkaa ajatella äkkiä kaikenlaista. Synkkiäkin juttuja. Kai tässä oma mielikuvitus kun laukkaa. 🤔😳
      Ikävä
      26
      427
    18. Taidat olla

      Luovuttanut jo minun suhteeni osalta?
      Ikävä
      36
      415
    19. Kaduttaako kun jätit vastaamatta

      Vai oliko tarkoitus satuttaa?
      Ikävä
      34
      414
    20. Jos tullaan toisiamme vastaan, niin

      pitäiskö pysähtyä ja onnitella?
      Ikävä
      35
      409
    Aihe