Kirjoittaja: Antti Laaksonen (2004).
Jokaiselle ohjelmoijalle on hyötyä C-kielen osaamisesta. C on tehokas ja monikäyttöinen ohjelmointikieli, ja hyvin tehty C-kielinen ohjelma toimii vähäisin muutoksin lukuisilla järjestelmillä. Tämän opassarjan tarkoituksena on toimia selkeänä suomenkielisenä johdatuksena C-ohjelmointiin ja samalla osoittaa, että C-kielen oppiminen ei ole mikään vaikea juttu. Aikaisemmasta ohjelmointikokemuksesta on paljon hyötyä, mutta aloittelijallekaan oppaiden seuraaminen ei pitäisi olla mahdotonta. Esimerkit toimivat kaikilla standardinmukaisilla C-kääntäjillä.
Tässä on C-kääntäjän asennusohje Windowsille. Jos sinulla on jo C-kääntäjä tai käytät jotain toista käyttöjärjestelmää, voit hypätä tämän osuuden yli. Asentamamme ilmainen C(++)-kääntäjä on nimeltään MinGW. Samalla asennamme Dev-C++-ohjelmointiympäristön, johon kuuluu muun muassa näppärä tekstieditori. Myös Windows-ohjelmointi on näillä ohjelmilla mahdollista, mutta sitä asiaa ei tässä opassarjassa käsitellä.
Dev-C++:n kopiointisivun osoite oli oppaan kirjoitushetkellä http://www.bloodshed.net/dev/devcpp.html. Noin 12 megatavun kokoisessa paketissa on mukana siis sekä Dev-C++-ympäristö että MinGW-kääntäjä. Dev-C++:n asentaminen ja käyttö on mutkatonta. C-ohjelman kääntäminen tapahtuu Execute-valikon kohdasta Compile ja ajaminen tapahtuu saman valikon kohdasta Run.
Kannattaa kuitenkin myös tuntea komentorivin käyttö Dev-C++:n valikoiden lisäksi. Komentorivillä ohjelma käännetään näin:
c:\devcpp\bin\gcc ohjelma.c -o ohjelma.exe
Sitten ohjelman voi käynnistää näin:
ohjelma
Tässä oletetaan, että Dev-C++ on asennettu hakemistoon c:\devcpp\ ja ohjelma.c on siinä hakemistossa, jossa käännöskomento kirjoitetaan. Kun tekstipohjaisen ohjelman käynnistää suoraan komentoriviltä, sen tulostama teksti jää näkyviin, kun ohjelman suoritus päättyy. Ohjelmalle pystyy myös antamaan komentoriviparametreja, ja sen tulostuksen voi ohjata tiedostoon.
Ensimmäisen C-ohjelman nimi on testi.c, ja se tulostaa näytölle tekstin "C-ohjelmointi on kivaa!"
#include <stdio.h> int main(void) { /* tulostetaan tekstiä näytölle */ printf("C-ohjelmointi on kivaa!\n"); return 0; }
Ensimmäisellä rivillä oleva #include <stdio.h>
liittää ohjelmaan mukaan stdio.h
-tiedoston. Tässä tiedostossa on tekstin tulostukseen käytettävän printf
-funktion määrittely. C-kielessä ei ole valmista keinoa tekstin tulostamiseksi näytölle, koska kieli pyrkii olemaan mahdollisimman yleiskäyttöinen. Tosin jokaisen C-kääntäjän mukana on stdio.h
ja joukko muita tiedostoja, joissa on usein tarvittavien funktioiden määrittelyitä. Nämä funktiot muodostavat standardikirjaston.
Varsinainen ohjelma alkaa rivillä int main(void) {
ja päättyy riviin }
. Näistä merkinnöistä kääntäjä tunnistaa ohjelman alun ja lopun, ja ne toistuvat samanlaisina joka ohjelmassa. C-ohjelma on itse asiassa main-niminen funktio, jolla on myös palautusarvo. Ohjelman viimeisellä rivillä return 0;
palauttaa käyttöjärjestelmälle arvon 0, joka tarkoittaa, että ohjelman suorituksessa ei tapahtunut virhettä.
Ohjelman sisällä ensimmäisellä rivillä on kommentti eli ohjelman kirjoittajan oma muistutus, jonka kääntäjä jättää huomioimatta. Kommenttien kirjoittaminen on hyvä tapa, sillä muuten koodia voi olla vaikea lukea myöhemmin. Tietenkään näin selvässä tapauksessa kommentti ei oikeasti olisi tarpeellinen. Kommentti alkaa merkinnällä /*
ja päättyy merkintään */
. Kommentti voi olla useamman rivin pituinen.
Rivillä printf("C-ohjelmointi on kivaa!\n");
tulostetaan tekstiä printf
-funktion avulla. Tämän funktion vuoksi siis ohjelmaan liitettiin alussa mukaan stdio.h
-tiedosto. Tekstin jäljessä oleva \n
tarkoittaa rivinvaihtoa. printf
-funktio on paljon monipuolisempi kuin tämän ohjelman perusteella voisi luulla, ja lisää tietoa funktion käytöstä on opassarjan seuraavissa osissa.
Jokainen C-kielisen ohjelman lause päättyy puolipisteeseen (;
). Kuitenkaan puolipistettä ei ole esikääntäjälle tarkoitettujen komentojen perässä, jotka alkavat risuaitamerkillä (#
). Myöskään puolipistettä ei tavallisesti tule aaltosulkujen ({
ja }
) jälkeen. Aaltosulut yhdistävät useamman ohjelmalauseen esimerkiksi funktion sisällä. Ohjelman kirjoitusasu on vapaa välien ja rivinvaihtojen osalta. Koodin lukeminen on tosin hankalaa, jos ohjelma näyttää esimerkiksi seuraavalta.
#include <stdio.h> int main ( void ) { printf ( "C-ohjelmointi on kivaa!\n" ) ; return 0 ; }
Kirjaston poistomyynnistä ostamani Kari Silpiön kirjoittama C-kieli (ISBN 951-37-1041-6
) osoittautui todelliseksi löydöksi. Kirja on hyvin kirjoitettu, ja siihen on ujutettu tiiviissä muodossa suuri määrä hyödyllistä tietoa. Erityisen hyvin kirja soveltuu käsikirjaksi sekä henkilölle, joka on aikaisemmin ohjelmoinut jollain toisella ohjelmointikielellä. Suosittelen!
Ota selvää C-kielen historiasta Internetin tai kirjaston avulla.
Mitä hyviä ja mitä huonoja puolia on mielestäsi siinä, että C on yleiskäyttöinen ja järjestelmäriippumaton ohjelmointikieli?
Kirjoita ohjelma, joka tulostaa näytölle seuraavan kuvion:
CCCC C C C C C C C CCCC
(Windowsissa:) Ohjelman palautusarvo selviää kirjoittamalla ohjelman suorituksen jälkeen komentoriville echo %ERRORLEVEL%
. Tutki, muuttuuko %ERRORLEVEL%
todella return-lauseessa olevan luvun mukaan. Tutki myös muiden ohjelmien palautusarvoja. Tuleeko niiden arvoksi joku muu kuin nolla, jos ohjelmassa tapahtuu virhe?
Antti Laaksonen, 16.2.2004
No niin... Oli tämänkin opassarjan jo aika tulla :)
huaah, pyhäinhäväistys! :D
Kaikkein ensimmäinen ohjelma millä tahansa kielellä ei saa olla yhtään mikään muu kuin legendaarinen Hello World ;)
Tarvitaankos enää C++ opasta kun on C opas jo. Voisin kirjoittaa ainakin C++ alkeet oppaan :).
Äh! Mä olin just kirjoittamassa c++ opasta, mutta Antti kerkesi ensin. Antti muuten, tota koodia piristäis jos siihen laittais värityksen ja boldit. Siis esim. int, char ja return ovat boldattuja ja numerot on kirjoitettu sinisellä, " merkkien sisältö punasella. Silleen niinku esim devc++ värittää tekstiä
Kyllä puolipisteen pitää joskus laittaa aaltosulkeen jälkeen, ainakin tietueiden lopussa.
Hyvä opas... Taisin itsekin taas innostua C-ohjelmoinnista parin vuoden tauon jälkeen!
lainaus:
Antti muuten, tota koodia piristäis jos siihen laittais värityksen ja boldit. Siis esim. int, char ja return ovat boldattuja ja numerot on kirjoitettu sinisellä, " merkkien sisältö punasella. Silleen niinku esim devc++ värittää tekstiä
Tai vaikka OP:n keskustelun koodic-tagien värityksen mukaan...
Loistavaa! Ajattelin ensin treenata delphiä, mutta tää opas... On parasta kattoa opas alta pois ja vähän harjotellakki tätä, ja sitte vasta siirtyä delphiin!
Antti, kuinka kauan sä olet oikeen koodannu? Sultahan näyttäs sujuvan jokanen kieli mitä nyt äkkituntumalta tulee mieleen.
Gwaur: Eihän tuommoinen teksti suomenkieliseen oppaaseen sovi! :)
Meitsi: Väritys tulee ehkä sitten, kun saan skriptin kunnolla toimimaan.
Jaska: Olet oikeassa, paransin tekstiä.
Meitsi: Uuden ohjelmointikielen oppiminen ei ole temppu eikä mikään, kun yhden ensin osaa.
Hienoa, että saatiin vielä C-opaskin. Tuo on muuten totta, että, kun yhden osaa, oppii toisen helposti, kun on ensimmäisen yhteydessä oppinut asiat, joita kaikki ohjelmointikielet käyttävät, kuten muuttujat, funktioit jne.
Mitähän voisi tehdä sille ongelmalle, että XP sulkee ohjelman, heti kun se loppuu, eikä mitään tekstiä ehdi näkyä? Ellei perään pistä vaikka "cin >>", jolloin pitää painaa jotain näppäintä ennen kuin ohjelma loppuu.
Antti: mutta eihän "Hello, world!" ole suomeksi "C-ohjelmointi on kivaa!", eihän? :D
Kuitenkin monissa c/c++-kirjoissa jotka on suomennettu englannista opastetaan kuitenkin kirjoittamaan esimmäiseksi ohjelmaksi "Hello, world".
Meitsi kirjoitti:
Äh! Mä olin just kirjoittamassa c++ opasta, mutta Antti kerkesi ensin.
Antti kirjoitti C-oppaan, ei C++-opasta :) C on C++:n yksi osa-alue. C++ > C ;)
mistä saa C:n
Lueppas opas... Siinä kerrotaan minun mielestäni aika selvästi että mistä saa C/C++ ohjelmointiympäristön.
Microsoft Visual Studio .NET on hyvä ohjelma C/C++/C#-ohjelmoinissa....
"Mitähän voisi tehdä sille ongelmalle, että XP sulkee ohjelman, heti kun se loppuu, eikä mitään tekstiä ehdi näkyä? Ellei perään pistä vaikka "cin >>", jolloin pitää painaa jotain näppäintä ennen kuin ohjelma loppuu."
Itse käytän tähän komentoa system("PAUSE"), joka toimii ainakin C++ kanssa.
PS. vähän myöhässä tämäkin kommentti, mutta nyt vasta tajusin katsella C oppaita :)
Ja tääl sit esitellään mahdollisimman huonoja tapoja kommenteissa. :)
Asensin nyt tuon Dev-C++-ohjelmointiympäristön. Kertokaapas pällille tarkemmin miten tuo konsolissa kääntäminen ja ajaminen oikein tapahtuu :)
mä en älyy kyl mitää, kun mä tungen ton tekstin sinne ohjelmaan ja painan "run" ei tapahu mitää. (olen painanut sitä ennen "compile"!)
Hm mikähän olis ongelma kun olen tehnyt tuon"esimmäisen ohjelman"niin kun painan "run" niin ohjelma vain välähtää näytöllä??
Ei mitään enää kun luin ooppaan tarkemmin niin ymmärsin
Exe:n suoritus:
Resurssienhallinnassa tiedosto - uusi - tekstitiedosto.
Muuta tiedoston nimeksi vaikka testi.bat (pitää olla bat- tai cmd-pääte).
Klikkaa bat-tiedostoa hiiren kakkosnappulalla eli yleensä oikealla "korvalla" ja valitse "muokkaa". Kirjoita tiedostoon
@ECHO OFF EXETIEDOSTONNIMI ECHO _________________________________________________________ ECHO Ohjelma palautti arvon %ERRORLEVEL% PAUSE
hieno opas, varsinkin aloittelevalle! ;)
En älyä tuota ensimmäistä printtausta. Kun käynnistän testi.exen niin aukeaa musta ikkuna ja suunnilleen puolen sekunnin päästä se sulkeutuu. En ehdi nähdä mitä tekstiä siihen tuli.
Kaffir:
Avaa se komento kehotteella!
win nappi pohjaan + r :::> "cmd"
Komento kehotteen käyttö:
kannattaa laittaa exesi helppoon paikkaan esim. a:\testi.exe tai c:\ohjelmointi\testi.exe, eikä esim. c:\document and settings\<Nimi>\omat tiedostot\ohjelmointi\omat ohjelmat\testit\testi.exe, koska tuon koko hössykän joutuu kirjoittamaan ite käsin!
cd.. komennolla pakitat hakemistossa
cd <kansio/asema> avaa kansion/aseman
testi.exe avaa test.exen
käytännössä:
c:\document and settings\<Nimi>\omat tiedostot\cd..
c:\document and settings\<Nimi>\cd..
c:\document and settings\cd..
c:\a:
a:\testi.exe
testi.exe avautuu eikä sen tulostamat asiat häviä...
mihin kohtaan koodia ja mitä sen eteen pitää laittaa se "cin>>" laitetaan tai siis jos sen pystyy tekemään silleinkin että lisää koodin loppuun "cin>>" komennon tai mikä se nytten on
tein mitä tahansa niin ohjelma vaan vilahtaa ruudulla, mitä pitäis tehdä ?
Tämä oli hyvä alku opettelin sen yöllä kun en saanut nukutuksi.
Nyt minulla on on kirja c++ trainer jonka on tehnyt Jesse Liberty se vaikuttaa hyvältä. Olen lukenut sitä nytten 43 sivua Siina olen oppinut jo aika paljon.
Mutta width, lenght ja sen semmoiset ei oo vielä jäänyt päähäni.
~aloittelija
mulle tulee vaa ilmotus "source file not complited"
onko vika mussa vai mun kääntäjässä?
joo. vika oli kääntäjässä. nyt toimii ku latasin uudestaa. :)
printf:n käyttö tuossa on aika yliampuvaa, puts toimii ihan hyvin. Helposti joku mokaa kun kirjoittaa tuonne prosenttimerkkejä tai muuta printf:n käsittelemää ja sitten ihmetellään mikä meni pieleen.
Mihin väliin noi cin-jutut tulee? Ihmettelen vaan. Olen siis ihan alittelija. :D
nyt on kasa vaikuttavan näköisiä ja eri värisiä sanoja ruudulla mutta eipä näy mitään painettaessa run. kun Dev-C:ssä aloittaa uuden projektin, tulee ruutuun jo valmiiksi koodia täynnä oleva ruutu. ajamalla sen koodin saa näkyviin tyhjän windows-ikkunan. pitääkö tämä koodinpätkä tunkea sen väliin vai poistanko sen merkkisotkun ja aloitan puhtaalta pöydältä. ? Nostan hattua niille, jotka ovat kielen oppineet... :D
Ei toimi vaikka mikä olisi aina vain välähtää ruudulla, olen mennyt compiler optioniin sieltä compile delayhyn laitoin 10000, ja ei vieläkään toimi myös "exe:n suoritus" ei toiminut
Öö.. Yhtä juttua en ole älynyyt.. Mitä tuolla kielellä ohjelmoidaan? :)
Jon31, sillä ohjelmoidaan ohjelmia..? vaikka hirsipuu :D
kannattaa oikeesti laittaa se ohjelma pysäyttään ittensä lopuks, et kerkii nähä mitä se tekee sen vilauksen sijaan.
Tää on hyvä tapa, lisää system("PAUSE");-komennon sinne perään, ni ohjelma pysäyttää ittensä:
#include <stdio.h> int main(void) { /* tulostetaan tekstiä näytölle */ printf("C-ohjelmointi on kivaa!\n"); system("pause"); return 0; }
Larwex: kooditägit?
> Jon31
Yääh!
System("PAUSE"); ei ole hyvä tapa, koska se vain käynnistää pause-nimisen ohjelman. Jos käyttäjän koneella ei ole sellaista ohjelmaa, näytölle vain tulostuu virheilmoitus. Esim. getchar() on suositeltavampi.
Gwaur kirjoitti:
huaah, pyhäinhäväistys! :D
Kaikkein ensimmäinen ohjelma millä tahansa kielellä ei saa olla yhtään mikään muu kuin legendaarinen Hello World ;)
Olen 110%:sesti samaa mieltä!
Tuo vaan välähti mutta ku lisäs tuon hunajavohvelin jutun niin toimi. Latasin turbo c++ssan.
voiko joku kirjoittaa oppaan miten tuota dev-c++:saa käytetään ja mistä napista se suorittaa sen ohjlman minkä on luonut.
kun yritän suorittaa ohjelmaa tulee vain ilmoitus "projeck is not compiled" mistä se johtuu.. se tulee vaikka kopioisin tekstin suoraan tästä opaasta. edes tuo ohjelmointi on kivaa ei toimi.
"kun yritän suorittaa ohjelmaa tulee vain ilmoitus "projeck is not compiled" mistä se johtuu..."
Compile ja ajaminen tapahtuu saman valikon kohdasta Run. Tai paina vain F9.
Tuo että ohjelmaikkuna vilahtaa...Eikös perusjuttu sen estämiseksi ole laittaa vaikka conio.h sekä getche();
Mitäs pitäis tehdä kun tulee tällainen virheilmoitus:
16-bittinen MS-DOS-alijärjestelmä
C:\DOVUME~1\RONILI~1\TYPY~1\testi.exe
CS:072d IP:0103 OP: 636c756465 Sulje sovellus valitsemalla Sulje.
Vaihtoehtoja on Sulje tai Ohita.
Jos painaa ohita ohjelma katoaa ruudulta.
Missä meni väärin?
ei asennu vistalle ei siis mitenkään tietääkö joku miten sais ton Dev-C++
Asensin tuon Dev-C++ 4:sen Vistalle ja kokeilin kääntää tota "C-ohjelmointi on kivaa!" -ohjelmaa "Compile"-komennolla, jolloin ilmestyy "Compilation completed" -ikkuna ja erroreita 0 kpl. Alhaalla olevan "Linker" -tabin alle tulee kuitenkin ilmoitus: "gcc: c:\...\testi.o: No such file or directory
gcc: file path prefix `C:\DEV-C_~1\Bin\' never used". Sama tapahtuu myös kun painaa "Run". Sama tuli myös kun asensin ensin tuon uuden beta-version Dev-C++:sta.
kyll mulla ainakin vistassa on kääntynyt c/c++ ohjelmat...
Itse pistän ohjelman loppuun cin.get(); en kyllä oo varma onko tämä c++.
Edit: ja käytössä on Dev-cpp 5 beta.
Muuten hyvä, mutta ilmoittaa virheestä dev-cpp:llä #include <stdio.h> kohdassa.
Huomasin, että ohjelma alkoi toimia kun <stdio.h>:n paikalle sijoitti <iostream>, vaikka minulla ei kylläkään ole varmaa käsitystä mitä kyseinen iostream tekee. Jos joku haluaa valaista asiaa niin olkoon hyvä.
Edit: Kokeilin uudestaan ja alkoi toimimaan tuolla <stdio.h>:llakin. :)
Tuli vain sellainen ongelma vastaan, että ohjelmaikkuna näkyy vain olemattoman ajan näytöllä. :(
Huom! Huomasin oppaita ettiessäni sivun jolta nämä on kopioitu:
http://ta.ramk.fi/~aku.kesti/ohj1/
jee, meni ainaskin puol tuntii dev-cpp asennuksen aloituksesta siihen että nyt on ruudulla musta ikkuna missä lukee c-on kivaa! jihuu, toi ikkuna kertoo totuuden!
juhlin liian aikaisin, en muista mitä tein ja mitä en, uudestaan, plaah.
pääsin perille miten teen ohjelman, jes! ja eiku next-->
kannattaa laittaa tohon printf:n jälkeen getchar();
jotta ikkuna heti sulkeudu kun ohjelma on ajettu
Sain viimeinki ton ohjelman toimimaan. ;D
Nyt vielä se itse kieli...
Latasin tuon kääntäjän ja kirjoitin tuon C-ohjelmointi on kivaa!, mutta se heittää kaksi virhesanomaa:
1. [Linker error] undefined reference to `__cpu_features_init'
2. ld returned 1 exit status
HELP!
Tämä oli hyvä opas.
Kiitokset kirjoittajalle :)
Hacker kirjoitti:
...
Tuli vain sellainen ongelma vastaan, että ohjelmaikkuna näkyy vain olemattoman ajan näytöllä. :(
...
Sama ongelma. Miten ratkaistaan? O_o
Voisko joku kertoa miten saadaan printf tulostamaan:
______________
|o |
|__________ |
| |
|x____________|
kun tällänen ei toiminu:
{printf("\n
______________\n
|o |\n
|__________ |\n
| |\n
|x____________|\n")
}
Oho, "Muokkaa" nappi ei toimi, vaan vie muualle. Tarkotus oli tulostaa jotain ihan muuta, tuolta löytyy:
http://sooda.dy.fi/paste/?ar
Jaketyyppi:
Virheitä on useita. Ensinnäkin printf kuuluu loppua puolipisteeseen. Toisekseen et voi tuolla tapaa jakaa stringiä useammalle riville. Voit korjata tuon:
a) Kirjoittamalla koko stringin yhdessä pötkössä (\n riittää kertomaan ohjelmalle missä kohtaa rivi vaihtuu)
b) Kirjoittamalla printf joka riville erikseen
c) Lisäämällä rivin loppuun \ ,joka kertoo esikääntäjälle että seuraava rivi on jatkoa kyseiselle riville.
Jos ei näidenkään toimenpiteiden jälkeen lähde toimimaan, niin saattaa olla että käyttämäsi kirjaston printf:n toteutus ei automaattisesti tyhjennä kirjoituspuskuria näytölle. Sen saa korjattua lisäämällä printf:n jälkeen puskurin tyhjennyksen:
fflush(stdout);
Minä olin 3-vuotias kun tämä opas tuli. Olisin oppinut ohjelmoimaan tämän lukemisen innoittamana. Sen sijaan luin c++ oppaan viime vuonna, ja sitä ennen luin java kirjaa kunnes kyllästyin pitkäksi aikaa.
Kiitos tästä oppaasta, C on kiva koska aika samanlainen kuin PHP, toisin kuin esimerkiksi C++...
Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.