FUNKTIOT
MERKKIJONO - JA MERKKIFUNKTIOT
Otsikkotiedosto string.h määrittelee funktiot, jotka käsittelevät merkkijoukkoja. C-kielessä ei ole merkkijonotyyppiä joten yhden merkkijonon arvoa ei voi sijoittaa toisen merkkijonon arvoksi.Ohjelmassa on käytettävä funktioita, jotka kopioivat yhden merkkijonon sisällön toiseen merkkijonoon.char a[23]; char b[23] = ”Mahdoton sijoitus”; a = b; /* ei mahdollinen sijoitusoperaatio */
Otsikkotiedoston string.h sisältämiä funktioita:#include <string.h> ............. char a[23]; char b[23]; strcpy(a, b); /* Tämä on mahdollista */
Esimerkki merkkijonon kopiointi -funktion käytöstä eli strcpy-funktion käytöstä.funktio kuvaus strcpy() kopioi yhden merkkijonon toiseen strcmp() vertaa kahta merkkijonoa strlen() palauttaa merkkijonon pituuden strncat() lisää yhden merkkijonon toiseen
Esimerkki kahden merkkijonon vertailu -funktion käytöstä eli strcmp-funktion käytöstä./* strcpy-funktion käyttäminen */ #include <stdio.h> #include <string.h> /* DevC++ ei välttämättä tarvitse tätä riviä */ int main () { char jono1[]="Mato Valtonen"; char jono2[40]; char jono3[40]; strcpy (jono2,jono1); /* kopioi jono1:den jono2-taulukkoon */ strcpy (jono3,"Remu Aaltonen"); /* kopioi "tekstin" jono3-taulukkoon */ printf (" jono1: %s\n jono2: %s\n jono3: %s\n",jono1,jono2,jono3); printf("\n Anna oma nimesi: "); gets(jono1); /* Muista, miten luetaan annettu nimi */ fflush(stdin); printf(" Nimesi on: %s", jono1); getch(); return 0; }
TEHTÄVÄ. Miten esimerkki-ohjelmaa pitäisi muuttaa jos siitä tehtäisiin tunnussanaa kysyvä rakenne ? Esimerkki merkkijono pituus -funktion käytöstä eli strlen-funktion käytöstä./* strcmp-funktion käyttäminen */ #include <stdio.h> #include <string.h> int main () { char S_auto[] = "BMW\n"; char vastaus[80]; do { printf ("Anna paras saksalainen auto-merkki: "); fgets (vastaus,80,stdin); } while (strcmp (S_auto,vastaus) != 0); puts ("No jaa...makuasia !"); getch(); return 0; } /* fgets - lukee merkki kerrallaan vastaus-muuttujaan */
Esimerkki merkkijono liittäminen merkkijonoon -funktion käytöstä eli strncat-funktion käytöstä./* strlen-funktion käyttäminen */ #include <stdio.h> #include <string.h> int main () { char Teksti[256]; printf ("Ohjelma tutkii annetun tekstin pituuden (maks 256 merkki\x084)\n\n"); printf ("Anna tutkittava teksti: "); gets (Teksti); printf ("Tekstin mitta on %u merkki\x084.\n",(unsigned)strlen(Teksti)); getch(); return 0; } /* ä -kirjain tekstiin saadaan ohjausmerkeillä \x084 */
/* strncat-funktion käyttäminen */ #include <stdio.h> #include <string.h> int main () { char teksti1[20]; char teksti2[20]; strcpy (teksti1,"Ollako vai "); strcpy (teksti2,"ei olla?"); strncat (teksti1, teksti2, 8); puts (teksti1); getch(); return 0; } /* strncat (teksti 1, liitettävä teksti 2, 2:sta liitettävien merkkien määrä) HUOM. Kopioitavien merkkien määrä ilmoitetaan tekstin alusta laskien, jolloin voidaan poimia haluttu määrä tekstiä. */
FUNKTIOT ELI ALIOHJELMAT JA NIIDEN MÄÄRITTELY
Aliohjelmia käytetään ohjelmakoodin pilkkomiseen toiminnallisiksi osiksi. Ohjelmat rakennetaan pysymään pääasiassa pääohjelmassa, josta siirrytään vain tarvittaessa suorittamaan jonkin tehtävä aliohjelmassa tai aliohjelmissa.Funktion käyttö koostuu kolmesta osasta:
- funktion esittelystä (aliohjelman esittely), tämä tarvitaan esimerkissä koska aliohjelma sijaitsee ohjelmakoodissa pääohjelman jälkeen.
- funktion määrittelystä (aliohjelman määrittely), aliohjelman varsinainen ohjelmankoodi.
- funktion-kutsusta aliohjelmakutsu), aliohjelmaan siirrytään ns aliohjelmakutsulla. Aliohjelmaan voidaan "hypätä" vieden sinne muuttujissa tietoa tai ilman minkään tiedon viemistä.
#include<stdio.h> int esimerkki(); /* aliohjelman esittely */ int main() { printf("Paaohjelmassa \n\n"); esimerkki(); /* aliohjelma-kutsu, siirrytään aliohjelmaan */ printf("\n\nOllaan taas paaohjelmassa"); getch(); return 0; } int esimerkki() /* aliohjelman määrittely */ { printf("Aliohjelmassa"); return 0; }
Funktion eli aliohjelman esittely:
Funktio on esiteltävä ennen sen käyttöä.Kääntäjä tarvitsee tiedon millaista funktiota tullaan käyttämään, jossain kohtaa määritellään kyseinen funktio. Funktion esittely tapahtuu ohjelman alussa prototyypin avulla. Prototyyppi sisältää funktion paluuarvon, funktion nimen ja parametrien tyypit sekä puolipisteen.
int funk( int, char); esitellään funk-niminen aliohjelma sekä aliohjelmaan aiotaan siirtää kokonaisluku sekä merkki.int funk( int, char); void funk1(void); int ali1();
void funk1(void); esitellään funk1-niminen aliohjelma johon ei siirretä mitään muuttujaa.
int ali1(); esitellään ali1-niminen aliohjelma johon ei siirretä mitään muuttujaa.
Funktion eli aliohjelman määrittely:
Funktion määrittely poikkeaa funktion esittelystä siinä, että funktion runkoon kirjoitetaan ne lauseet jotka funktio suorittaa.
int funk(int luku, char merkki) { int a, b; a = luku * luku; b = luku * a; printf(”%d %c\n”, luku, merkki); return b; }
Funktio- eli aliohjelma-kutsu:
Funktion siirrytään funktio-kutsulla (aliohjelma-kutsulla). Erilaisia funktio- eli aliohjelmakutsuja:
aliohjelma(); siirrytään aliohjelma-nimiseen aliohjelmaan viemättä sinne tietoa.aliohjelma(); funk(luku, merkki); laske(taulukko); lopputulos = laske(taulukko);
funk(luku, merkki); siirrytään funk-nimiseen aliohjelmaan vieden sinne luku- sekä merkki-muuttujissa oleva tieto.
laske(taulukko); siirrytään laske-nimiseen aliohjelmaan vieden sinne taulukko tietoineen.
lopputulos = laske(taulukko); siirrytään laske-nimiseen aliohjelmaan vieden sinne taulukko, aliohjelmasta palatessa tuodaan tieto joka sijoitetaan lopputulos-muuttujaan.
Alla esimerkkiohjelmassa, siirretään parametri-muuttujassa oleva tieto aliohjelmakutsussa absolute-nimiseen aliohjlemaan. Aliohjelmassa saatu tieto palautetaan käskyssä return tulos.
/* funktio palauttaa arvon */ #include <stdio.h> int absolute(int luku); int main() { int paluuarvo, parametri = 9; paluuarvo = absolute(parametri); printf(”Funktio palautti %d\n”, paluuarvo); getch(); return 0; } int absolute(int luku) { int tulos; tulos = luku / 2; return tulos; }

Kuvassa esitetään yllä oleva esimerkki ohjelma SASD-kaaviona. Pääohjelmasta siirrytään absolute-aliohjelmaan aliohjelmakutsulla siirtäen sinne parametri-muuttujassa oleva numero-arvo. Aliohjelmassa sinne siirettyä numeroa käsitellään ja käsittelystä saatu tulos-muuttujassa oleva numero-arvo siirretään eli palautetaan pääohjelmaan.
TAULUKON VÄLITTÄMINEN FUNKTIOON
Taulukko siirretään aliohjelmaan samalla tavalla kuin muuttujakin.Toisenlainen pää- ja aliohjelman määrittely esimerkki:/* taulukon siirtäminen aliohjelmaan */ #include <stdio.h> int aliohjelma(int taulukko[]); int main() { int taulukko[3] = {1,2,3}; aliohjelma(taulukko); getch(); return 0; } int aliohjelma(int taulukko[]) { printf("Aliohjelmassa \n\n"); printf("%i \n %i \n %i \n", taulukko[0],taulukko[1],taulukko[2]); return 0; }
/* kokonaislukutaulukon lajittelu */ #include <stdio.h> void sorttaa(int lista[]); const int MAX = 10; int main() { int counter = 0, lista[10]; do { printf("Anna numero %d: \n", counter +1); scanf("%d", &lista[counter++] ); } while (counter < MAX); sorttaa(lista); printf("\nTulokset ovat:\n"); for (counter =0; counter < MAX; counter++) printf("Paikka %d sisaltaa %d\n", counter,lista[counter]); getch(); return 0; } void sorttaa(int lista[]) { int i, j, temppu; for (i=0; i < MAX - 1; i++) { for (j = i + 1; j < MAX; j++) if (lista[i] > lista[j] ) { temppu = lista[j]; lista[j] = lista[i]; lista[i] = temppu; } } }
C-kielen suunnittelijoiden mielestä taulukon välittäminen näin säästää sekä muistitilaa että prosessorin aikaa.
Alla, esimerkkiohjelma jossa lista-nimiseen taulukkoon luetaan viisi lukua pääohjelmassa. Aliohjelmakutsun yhteydessä lista-taulukko siirretään laske-aliohjelmaan, jossa lasketaan lukujen summa, eli yhteispisteet. Aliohjelmasta yhteispisteet siirretään pääohjelmaan return tulos; avulla. Yhteispisteet näytetään pääohjelmassa.
/* Piste-taulukon välittäminen aliohjelmaan */ #include <stdio.h> int laske(int lista[]); const int MAX = 5; int main() { int counter = 0, lista[5], yhteispisteet; do { printf("Anna %d. pisteet: \n", counter +1); scanf("%d", &lista[counter++] ); } while (counter < MAX); yhteispisteet = laske(lista); printf("\nYhteispisteet ovat: %d\n", yhteispisteet); getch(); return 0; } int laske(int lista[]) { int rivi, tulos; for (rivi=0; rivi< MAX; rivi++) tulos = tulos + lista[rivi]; return tulos; }
Aliohjelmat ja desimaaliluvut
Aliohjelmiin voi siirtää float-tyyppisenä taulukon tai useita desimaalilukuja muuttujissa. Yllä ohjelmassa jossa on sorttaa-niminen aliohjelman, on esimerkki josta voi rakennella float-tyyppistä taulukkoa siirtelevän rakenteen ohjelmaan.Ongelmallista on kuitenkin demimaaliluvun palauttaminen desimaaliosineen sillä aliohjelma palauttaa vain kokonaislukuosan luvusta. Ongelman voi kiertää kertomalla palautettavan float-tyypin muuttujan sisällön esim luvulla 1000, vastaavasti luku on palautuksen jälkeen jaettava samalla luvulla eli luvulla 1000.
#include<stdio.h> int ali(); int main() { float luku; luku = ali(); luku = luku/1000; getch(); return 0; } int ali() { float testi = 1.55; testi = testi*1000; return testi; }
MUUTTUJIEN NÄKYVYYS JA ELINIKÄ
Muuttuja, joka on määritelty funktion sisällä (paikallinen muuttuja), on käytössä vain funktion sisällä olevien komentojen kautta. Mikäli muuttuja määritellään funktion ulkopuolella ohjelman kaikki funktiot voivat käyttää muuttujaa (globaali muuttuja).main ( ) - FUNKTIO
Funktioon main() voidaan määritellä argumentteja, joita nimitetään komentoriviargumenteiksi. Komentoriviargumentit ovat parametreja, jotka kirjoitetaan ohjelman nimen yhteydessä komentoriviltä ohjelmaa käynnistettäessä.edit tiedostonimi
Tiedostonomi on tiedoston nimi, jota aiotaan editoida. Komentoriviargumentteja käytetään viemään informaatiota ohjelmaan. Nämä parametrit viedään ohjelmaan funktion main() parametreina.
Kahta sisäänrakennettua argumenttia käytetään vastaanottamaan komentoriviargumentteja. Nämä argumentit, argv[] ja argc, ovat ainoat argumentit, jotka funktiolla main() voi olla.Parametri argc (argument counter) on kokonaisluku, joka sisältää komentoriviltä annettujen argumenttien lukumäärän. Parametri argv[] (argument values) on osoitin merkkiosoittimien taulukkoon ja kutakin taulukon alkiota vastaa komentoriviargumentti.int main(int arc, char *argv[])