Eli yritin eräästä kirjasta (Ohjelmointi, Kernigan & Ritchie) saada apua ohjelmoinnin aloitukseen, mutta en meinaa päästä edes alkuun kun en tajua mitä tarkoittaa getchar ja putchar funktiot. :) Voisiko joku valaista tyhmälle, mitä nämä tekee ja vaikka joku helppo käytännön esimerkki funktioista?
Eräässä ketjussa yksi tämän kyseisen kirjan esimerkkikoodista haukuttiin rumaksi ja huonoksi, niin onko tämä nyt edes hyvä kirja? Ja voisiko joku suositella putkan C-oppaan lisäksi hyviä nettisivuja ja kirjoja ohjelmoinnin aloitukseen?
Ja lisäksi, onko C:llä ja C++:lla suuria eroja kun mietin kumpaa kannattaisi opiskella?
Tuossa on selitetty molemmat funktiot ja lisäksi löytyy esimerkki:
http://www.cplusplus.com/reference/clibrary/
Eli siis getchar lukee konsolista yhden merkin ja putchar kirjoittaa konsoliin yhden merkin.
lainaus:
Ja lisäksi, onko C:llä ja C++:lla suuria eroja kun mietin kumpaa kannattaisi opiskella?
Jos noista kahdesta pitää valita, niin c++. Kun osaat c++:aa, pystyt kirjoittamaan c:täkin. Jos taas osaat c:tä, niin saattaa olla että c++-ympäristössäkin kirjoitat c:tä etkä koskaan opi kunnolla c++:aa.
Se on sitten toinen juttu onko noista kumpikaan paras kieli aloitteluun.
Suosittelisin C++:aa enemmän kuin C:tä. Olen lukenut kolmea C++ oppikirjaa: Stroustrupin "The C++ Programming Language", Libertyn "Opeta itsellesi C++ ohjelmointi" ja Pratan "C++ Primer Plus". Mielestäni Pratan kirja on näistä selkein aloittelijalla.
erkki4 kirjoitti:
.. en meinaa päästä edes alkuun kun en tajua mitä tarkoittaa getchar ja putchar funktiot. :)
getchar() lukee stdin:sta (eli normaalisti terminaalista) yhden tavun. Nain voit lukea merkki kerrallaan syotetta nappaimistolta. putchar() vastaavasti kirjoittaa stdouttiin tavun. Jos ohjelman ulostetta ei ole ohjattu esim. tiedostoon, niin ko. tavu tulostuu terminaaliin.
lainaus:
Eräässä ketjussa yksi tämän kyseisen kirjan esimerkkikoodista haukuttiin rumaksi ja huonoksi, niin onko tämä nyt edes hyvä kirja? Ja voisiko joku suositella putkan C-oppaan lisäksi hyviä nettisivuja ja kirjoja ohjelmoinnin aloitukseen?
Kirjasi on hyva. Jatka lukemista.
lainaus:
Ja lisäksi, onko C:llä ja C++:lla suuria eroja kun mietin kumpaa kannattaisi opiskella?
C:lla ja C++:lla on suuria eroja. Kannattaa miettia soveltuuko C siihen mita olet tekemassa, ja jos ei sovellu, niin sitten mietitaan mika olisi parempi vaihtoehto. Itse en nae yhtakaan hyvaa syyta kayttaa C++:aa mihinkaan; matalan tason sovelluksiin C ja assembly soveltuvat mainiosti, ja C++:n hienot ominaisuudet vain sotkevat kuvioita. Jos taas haetaan korkean tason kielien ilmaisuvoimaa, niin C++ ei valitettavasti kaikesta monimutkaisuudestaan huolimatta pysty paljon tarjoamaan. Worst of both worlds...
jcd3nton kirjoitti:
Itse en nae yhtakaan hyvaa syyta kayttaa C++:aa mihinkaan
Yhtä lailla kun et näytä näkevän yhtään hyvää syytä käyttää ä-kirjainta? :D
Minusta se, että C++ on kaupallisesti kaikista ohjelmointikielistä tärkein on oikein hyvä syy käyttää C++:aa. C++ mahdollistaa tehokkaan olio-ohjelmoinnin, mitä C ei tee. Tämä on toinen hyvä syy C++:n käyttämiselle. Lisää löytyy googlaamalla vaikkapa "C vs C++". En sano etteikö C olisi hyvä ohjelmointikieli, mutta jos valita pitää, niin C++. Itse olen aina koodannut kyseisellä kielellä alusta asti eikä ole ollut hankaluuksia oppia. Sen kun osaa niin oppii helposti muutkin kielet ;)
vesikuusi kirjoitti:
Minusta se, että C++ on kaupallisesti kaikista ohjelmointikielistä tärkein on oikein hyvä syy käyttää C++:aa.
Jos suosio menee teknisten ominaisuuksien edelle, niin mikas siina. Itse valitsisin tuossa tilanteessa ennemmin vaikkapa Javan.
lainaus:
C++ mahdollistaa tehokkaan olio-ohjelmoinnin, mitä C ei tee. Tämä on toinen hyvä syy C++:n käyttämiselle.
En ole vakuuttunut olio-ohjelmoinnin paremmuudesta muihin paradigmoihin verrattuna. Mita C++:aan tulee, niin kuten edella jo totesin, monet muut kielet tarjoavat paljon enemman ilmaisuvoimaa (tehoa ohjelmointiin) niin olio-ohjelmoinnin kuin muunkin ohjelmoinnin osalta. Mutta kylla ne C:lla onnistuvat oliotkin; kuka tahansa esim. standardikirjaston IO-operaatioita kayttanyt tietanee taman.
lainaus:
Itse olen aina koodannut kyseisellä kielellä alusta asti eikä ole ollut hankaluuksia oppia.
Jos et muilla kielilla ole koodannut, niin olet kylla luolassa elanyt. Ei valttamatta kannata huudella liiaksi mielipiteita moisella sivistyksella..
jcd3nton kirjoitti:
Jos et muilla kielilla ole koodannut, niin olet kylla luolassa elanyt. Ei valttamatta kannata huudella liiaksi mielipiteita moisella sivistyksella..
Enpä ole vielä ehtinyt muihin tutustua muuten kuin infoa lukemalla. Tietää voi vaikkei koodaisikaan :)
jcd3nton kirjoitti:
Itse valitsisin tuossa tilanteessa ennemmin vaikkapa Javan.
Entä jos käyttäjällä ei satu olemaan java-tulkkia? :D No joo voihan javaakin kääntää. Mutta taitaa olla myös API-hommat paremmin C:n (ja sen myötä C++:n) puolella.
vesikuusi kirjoitti:
Entä jos käyttäjällä ei satu olemaan java-tulkkia?
Entä jos käyttäjällä ei satu olemaan vcrun<versio>.dll:ää?
Entä jos käyttäjällä on Java-tulkki, muttei Windowsia?
Edit: no joo, mainittakoon vielä oma kanta langan aiheeseen: opetelkaa C ensin.
vesikuusi kirjoitti:
Mutta taitaa olla myös API-hommat paremmin C:n (ja sen myötä C++:n) puolella.
Mielestäni Java API on aivan loistavan sopiva minulle, kaikki tarvittava ja tarpeeton tieto löytyy helposti! :)
jcd3nton kirjoitti:
lainaus:
Itse olen aina koodannut kyseisellä kielellä alusta asti eikä ole ollut hankaluuksia oppia.
Jos et muilla kielilla ole koodannut, niin olet kylla luolassa elanyt. Ei valttamatta kannata huudella liiaksi mielipiteita moisella sivistyksella..
Väittelijöiden kommenttien painoarvoa mitattaessa olisi hyvä tietää kuinka monta vuotta kukin on työkseen ohjelmoinut? Jos luku on hyvin pieni tai peräti 0 ei kannata hirveästi huudella moisella kokemuksella. On aivan eri asia puuhastella vapaa-ajalla ohjelmoinnin parissa kuin tehdä ammattimaisesti koodia. Se että joku kieli on helppo oppia tai ilmaisuvoimainen ei paljon korreloi sen kanssa kuinka paljon kyseistä kieltä käytetään kaupallisissa projekteissa. Mutta jos vain ohjelmoi ilokseen on aivan sama mitä kieltä käyttää. Jos taas haluaa saada osaamisesta palkkaakin on hyödyllistä osata niitä kieliä mistä työmarkkinoilla on kysyntää.
Oman kokemukseni perusteella ainakin mobiilipuolella C ja C++ ovat hyödyllisiä, paljon enemmän kuin Java. Tulevaisuutta ei tietysti kukaan tiedä varmaksi mutta C-kielen kuolemaa on pitkään ennustettu eikä se mihinkään ole kadonnut.
lakeus kirjoitti:
Se että joku kieli on helppo oppia tai ilmaisuvoimainen ei paljon korreloi sen kanssa kuinka paljon kyseistä kieltä käytetään kaupallisissa projekteissa. Mutta jos vain ohjelmoi ilokseen on aivan sama mitä kieltä käyttää. Jos taas haluaa saada osaamisesta palkkaakin on hyödyllistä osata niitä kieliä mistä työmarkkinoilla on kysyntää.
Itse taas väitän, että kokenut itseoppinut "ilokseen" ohjelmoiva kaveri kyllä oppii parissa päivässä uuden ohjelmointikielen syntaksin riittävän hyvin pystyäkseen työskentelemään sillä. Omasta mielestäni ohjelmointikielen valinta loppujen lopuksi on aika merkityksetön. Kannattaa valita se, mikä tuntuu itselle luontevalta.
lakeus kirjoitti:
Oman kokemukseni perusteella ainakin mobiilipuolella C ja C++ ovat hyödyllisiä, paljon enemmän kuin Java.
Taitavat nuo Android laitteet kyllä olla tehneet Javasta ihan hyvän valinnan tuonne mobiilipuolellekin.
lakeus kirjoitti:
Se että joku kieli on helppo oppia tai ilmaisuvoimainen ei paljon korreloi sen kanssa kuinka paljon kyseistä kieltä käytetään kaupallisissa projekteissa. Mutta jos vain ohjelmoi ilokseen on aivan sama mitä kieltä käyttää. Jos taas haluaa saada osaamisesta palkkaakin on hyödyllistä osata niitä kieliä mistä työmarkkinoilla on kysyntää.
Jep, sanoinhan jo, etta C++ (ja Java) ovat mainioita vaihtoehtoja, jos suosio on tarkeampi edellytys kuin varsinaiset kielen ominaisuudet. Siksi kehotin keskustelun avaajaa miettimaan kielen tulevia kayttotarkoituksia ja pohtimaan valintaa sitten.
jalski kirjoitti:
Itse taas va:ita:n, etta: kokenut itseoppinut "ilokseen" ohjelmoiva kaveri kylla: oppii parissa pa:iva:ssa: uuden ohjelmointikielen syntaksin riitta:va:n hyvin pystya:kseen tyo:skentelema:a:n silla:.
Syntaksin toki oppii, mutta kannattaa huomioida vaihtoehtoisten ajatusmallien ja paradigmojen tuntemus. Jos proseduraalisen ohjelmoinnin lisaksi loytyy kokemusta homoikonisuudesta, funktionaalisesta ohjelmoinnista, logiikkaohjelmoinnista, jne. niin kyseisen konkarin ajatusmaailma on todennakoisesti kielta kuin kielta kirjoittaessa avarampi kuin koodarilla, jolle tuttuja kielia ovat C++, C#, Java, ja VB.
Toisaalta ei pida aliarvioida kielen perinpohjaista tuntemusta, jota pelkka syntaksi ei kata, ja joka muotoutuu vain kokemuksen myota. Esim. C:n standardikirjastostakin loytyy paljon kamaa jonka oikea (tai vaara) kayttotapa on kiviin kirjoitettu, mutta ensikertaa kielta kokeileva ei valttamatta hoksaa vaikka kuinka ymmartaisi syntaksin ja osaisi ohjelmointia yleisella tasolla.
Siita huolimatta, jos olisin tyonantaja, niin todennakoisesti palkkaisin monipuolisen osaajan vaikka projektin kieli olisi jotain mainstreamia.
lainaus:
Omasta mielesta:ni ohjelmointikielen valinta loppujen lopuksi on aika merkitykseto:n. Kannattaa valita se, mika: tuntuu itselle luontevalta.
Varmaan olet ihan oikeassa siina, etta itselleen luontevimman tuntuisella kielella ohjelmointi sujuu parhaiten. En kuitenkaan vaita, etteiko kielissa olisi suuria eroja, joilla voi olla merkittavaa vaikutusta seka ohjelmoijan tuottavuuteen, lopputuloksen bugittomuuteen, huollettavuuteen, kokoon, porttautuvuuteen, suorituskykyyn, jne.
Tassa taitaa olla sellainen ongelma, etta vaihtoehdoista ei voi poimia luontevimpia kielia, jos ei niihin tutustu. Siispa ollaan siina tilassa, etta vaihtoehdot ovat C ja C++, ja valtaosa (vain) naihin kahteen kieleen tutustuneista ohjelmoijista pitanee C++:aa tehokkaampana -- ja siten luontevampana.
Olisi hienoa, jos harrastefoorumi innostaisi ihmisia tutkimaan kielia ja niiden ominaisuuksia monipuolisemmin.
Grez kirjoitti:
Jos noista kahdesta pitää valita, niin c++. Kun osaat c++:aa, pystyt kirjoittamaan c:täkin. Jos taas osaat c:tä, niin saattaa olla että c++-ympäristössäkin kirjoitat c:tä etkä koskaan opi kunnolla c++:aa.
Noista perusteluista olen eri mieltä, koska
- C++-koodari ei välttämättä tunne C-kirjastoja eikä siksi osaa ollenkaan ohjelmoida C:llä, ja
- huonoista tavoista pääsee kyllä eroon pienellä itsekurilla. Idiomaattisen C++:n oppiminen C-pohjalta ei ole sen vaikeampaa kuin sen oppiminen tyhjästä. Lisäksi ongelma on olemassa toisinkin päin, eli kokenut C++-koodari saattaa kirjoittaa hassua C:tä.
For teh record: Minusta C kannattaa opetella ensin, mutta järjestyksellä ei ole juurikaan väliä. Vaikka tavoitteena olisi opetella pelkästään C++ hyvin, niin C:n skippaamisella säästää ehkä 5% ajasta. Toisaalta ei C:n skippaaminen haittaakaan, koska sen oppii sitten tarvittaessa hyvin nopeasti.
Aloitat opiskelun C++:sta ja laajennat C:hen jos joskus niitä taitoja tarvitset. C:n alkeissa on niin paljon turhaa tauhkaa ettei siihen kannata aikaansa tuhlata. Näin ajattelen itse.
The Alchemist kirjoitti:
C:n alkeissa on niin paljon turhaa tauhkaa ettei siihen kannata aikaansa tuhlata.
Loytyyko esimerkkeja?
jcd3nton kirjoitti:
The Alchemist kirjoitti:
C:n alkeissa on niin paljon turhaa tauhkaa ettei siihen kannata aikaansa tuhlata.
Loytyyko esimerkkeja?
No perus-C++:aa käyttäessä tarvitsee harvemmin kikkailla malloc():n tai C-tyylisten merkkijonojen kanssa. Sitten on vielä kasa muitakin muistinhallintaan liittyviä funktioita, joiden käytöstä en itsekään ole C++-koodarina kovin hyvin perillä.
Minusta pelkästään nuo kaksi asiaa ovat jo sen verran suuria kokonaisuuksia hallita hyvin, ettei C:stä aloittamisessa ole mitään järkeä, ellei erityisesti aio C-koodariksi erikoistua.
The Alchemist kirjoitti:
jcd3nton kirjoitti:
The Alchemist kirjoitti:
C:n alkeissa on niin paljon turhaa tauhkaa ettei siihen kannata aikaansa tuhlata.
Loytyyko esimerkkeja?
No perus-C++:aa käyttäessä tarvitsee harvemmin kikkailla malloc():n tai C-tyylisten merkkijonojen kanssa. Sitten on vielä kasa muitakin muistinhallintaan liittyviä funktioita, joiden käytöstä en itsekään ole C++-koodarina kovin hyvin perillä.
Minusta pelkästään nuo kaksi asiaa ovat jo sen verran suuria kokonaisuuksia hallita hyvin, ettei C:stä aloittamisessa ole mitään järkeä, ellei erityisesti aio C-koodariksi erikoistua.
malloc(), calloc(), ja free() ovat yksinkertaisia ja pienempia kokonaisuuksia kuin C++:n new ja delete, joihin sisaltyy enemman syntaksisaantoja ja muodostin- ja tuhoajafunktiot.
Itse naen C:n perusteissa tulevan muistinhallinnan kuuluvan ohjelmoijan ja tietokoneihmisen yleissivistykseen. Yleisten tietoturvaongelmien ymmartamisen vuoksi myos C-tyylisten merkkijonojen hallinta kuuluu yleissivistykseen. Erityisesti C++-ohjelmoijan osaaminen on huteralla pohjalla jos nama (kieleen sisaltyvat) asiat ole tuttuja. Lohdutukseksi voi sanoa, etta myos C-tyyliset merkkijonot ovat aarettoman yksinkertaisia, ja niista oppii kaiken tarvittavan (sis. standardikirjaston funktiot) yhden oppitunnin aikana. Valitettavasti samaa ei voi sanoa C++:sta, joka lienee yksi monimutkaisimpia ohjelmointikielia.
The Alchemist kirjoitti:
Minusta pelkästään nuo kaksi asiaa ovat jo sen verran suuria kokonaisuuksia hallita hyvin, ettei C:stä aloittamisessa ole mitään järkeä, ellei erityisesti aio C-koodariksi erikoistua.
Nuo molemmat ovat sellaisia perusasioita, jotka jokaisen ohjelmoijan on syytä tuntea. Samat asiat tulevat väistämättä vastaan myös c++:ssa. Jalskin kanssa olen samaa mieltä, että aloituskielellä ei ole suuremmin väliä. C on siinä mielessä looginen aloituskielenä, että se ei ole hirvittävän laaja, mutta tärkeimmät ohjelmoinnin perusasiat tulevat esiin. Kun ne hallitsee on helpompi tarvittaessa siirtyä laajempaan c++ -kieleen. Toisaalta jokin korkeamman tason kieli, kuten Python voi olla aloittajaystävällisempi ohjelmointiin tutustuttaessa.
Kernighanin ja Ritchien kirjan alussa jo sanotaan, että se on kirjoitettu ohjelmoinnin perusteet jo osaavalle. Muistaakseni he sanovat asian jtoenkin näin, että lukijalle pitää kääntäjien ja tietokoneiden toiminta olla tuttua, eikä sellaisia asioita, kuten mitä n=n+1 tarkoittaa, siinä kirjassa selitetä erikseen. Varmaankin myös getcharin ja putcharin toiminnan selvittäminen ihan itse kuuluu näihin olettuihin taitoihin, vaikka varmasti siellä jonkinlainen selitys on.
Koodia voi ehkä sanoa rumaksi, koska se on klassista C-kieltä, jota on jonkin verran päivitetty 80-luvun lopun ANSI-standardin mukaiseksi kirjan toiseen painokseen (suomennos perustuu tähän). Siellä on muistaakseni mm. vielä main-funktio kirjoitettu pelkästään main()
, koska ennen aikaan C-kääntäjät tulkitsivat puuttuvan tyyppimääreen int-tyyppinä ja sen sai jättää pois. Muutenkin K ja R harrastavat kompaktia ilmaisua, joka ei nykyään ole suosittua, eikä niin tarpeellistakaan, koska kääntäjä kuitenkin muokkaa koodia monella tavalla ennen kuin sylkee ulos asmit tai binaarit. Ennen ehkä nokkelat rakenteet olivat edullisia, kun kääntäjät olivat yksinkertaisempia, mutta enpä minä niistä ajoista tiedä. Kikkailu on tietenkin aina ohjelmoijien suosiossa, mutta en tohdi guruja turhasta kikkailusta syyttää näin julkisesti :)
Iän ja kohdeyleisön ottaen huomioon kirja on kyllä ihan hyvä lisä C-ohjelmoijan kirjastoon. Pakollinen luettava se ei enää ole, eikä varsinkaan sellaiselle, joka haluaa hyväksi ohjelmoijaksi jossakin muussa kielessä. C-kielestäkin on varmasti muitakin hyviä kirjoja nimenomaan opettelijoille, mutta en tähän hätään osaa suositella mitään erityistä.
Kannattaa siis etsiä lähteitä ohjelmoinnin opetteluun muualta, jos K&R tökkii. Kielenkin saa valita vapaasti, koska aina voi oppia uusia myöhemmin. Eivät sen kirjan esimerkitkään ehkä ole kaikki ihan helpoimmin avautuvia ja tarpeellisimman oloisia nykyisiin ohjelmointi- ja tietokoneympäristöihin tottuneelle.
Summa summarum: Ikä painaa, mutta vanha kirja jaksaa porskuttaa. Ei sovi silti jokaiselle.
Pekka Karjalainen kirjoitti:
Kernighanin ja Ritchien kirjan alussa jo sanotaan, että se on kirjoitettu ohjelmoinnin perusteet jo osaavalle.
Ei ihan noin voimakkaasti, ainakaan 2. laitoksessa:
öThe book is not an introductory programming manual; it assumes some familiarity with basic programming concepts like variables, assignment statements, loops, and functions. Nonetheless, a novice programmer should be able to read along and pick up the language, although access to more knowledgeable colleague will help.ö
Teos muuten löytyy netistä PDF:nä (en tiedä miten laillisesti):
http://www.inf.unideb.hu/grafika/eng/rtornai/
lainaus:
Muistaakseni he sanovat asian jtoenkin näin, että lukijalle pitää kääntäjien ja tietokoneiden toiminta olla tuttua,
Ei nyt sentään.
lainaus:
eikä sellaisia asioita, kuten mitä n=n+1 tarkoittaa, siinä kirjassa selitetä erikseen.
Se kieltämättä saattaa jäädä vähän implisiittiseksi.
lainaus:
Varmaankin myös getcharin ja putcharin toiminnan selvittäminen ihan itse kuuluu näihin olettuihin taitoihin, vaikka varmasti siellä jonkinlainen selitys on.
Asia selitetään kyllä sivulla 18 ihan eksplisiittisesti.
lainaus:
Koodia voi ehkä sanoa rumaksi, koska se on klassista C-kieltä, jota on jonkin verran päivitetty 80-luvun lopun ANSI-standardin mukaiseksi kirjan toiseen painokseen (suomennos perustuu tähän).
Koodinkin kauneus on katsojan silmässä.
Suomennos on näköjään (kansallisbibliografian mukaan) julkaistu kahdesti, ensin nimellä öC-ohjelmointiö ja sitten varsin kyseenalaisella nimellä öOhjelmointiö.
Yucca kirjoitti:
Koodinkin kauneus on katsojan silmässä.
Sinänsä totta, mutta hyvin kirjoitettu koodi on aina selkeämpää ja helpommin ymmärrettävää katsoi sitä millä silmillä tahansa. Äkkiä kun vilkaisin Yuccan tarjoamaa linkkiä kirjaan, niin koodiesimerkit vaikuttivat varsin hyviltä ja siististi sekä ymmärrettävästi kirjoitetuilta. Lukuunottamatta sitä, että mainina on käytetty pelkkää main() ja sille ei ole annettu paluuarvoa lainkaan. Sinänsä sallittua, mutta mielestäni harhaanjohtavaa.
Aloittelija saattaa tarvita tukea tuon kirjan rinnalle, mutta eiköhän tuolla pärjää kun internetin ihmeellinen maailma ja sen tehokkaat hakukoneet ovat apuna. Sekä tietysti Putkan omat aloittelijan oppaat.
Aihe on jo aika vanha, joten et voi enää vastata siihen.