previous next Up Title Contents Index

8.3.1 scanf ja muuttujan osoite &


Muuttujalle voidaan sijoittaa uusi arvo myös C- kielen scanf- funktiolla. Funktion kutsussa on kaksi osaa: ohje- eli format - osa ja lista muuttujien osoitteista, joihin arvot sijoitetaan. Matka olisi voitu lukea myös kutsulla:
	  scanf("%d",&matka_mm); 
	
Tässä "%d" tarkoittaa, että kutsun listaosassa vastaavassa paikassa oleva muuttuja on tyyppiä d eli desimaalinen (annetaan 10- järjestelmässä) kokonaisluku.

&matka_mm tarkoittaa muuttujan matka_mm osoitetta. Funktiolle ei voida viedä parametrina itse muuttujan arvoa, koska funktio ei tämän perusteella tiedä mihin se luetun arvon sijoittaisi. Tämän takia välitämmekin muuttujan osoitteen, eli sen paikan muistissa, missä muuttujan arvo sijaitsee. Näin aliohjelma tietää sen mihin paikkaan arvo tulee sijoittaa.

Varoitus! Yleinen virhe on unohtaa &- merkki pois scanf- funktion kutsusta.

Joissakin ohjelmointikielissä (kuten Pascal tai Fortran ja osittain myös C++:ssa) ei osoitemerkkiä kirjoiteta, koska kääntäjä kääntää vastaavat kutsut siten, että parametrina viedäänkin osoite. C- kielessä on mahdollista välittää vain arvoja parametrina.

	  int pituus,leveys;
	  printf("Anna kentän pituus ja leveys metreinä >");
	  scanf("%d %d",&pituus,&leveys); 
Koska kyseessä on funktio, niin se myös palauttaa jonkin arvon. Tässä tapauksessa palautetaan kokonaislukuarvo, joka kertoo montako onnistunutta sijoitusta pystyttiin tekemään.

c-muut\ala.c - tietojen kysyminen kunnes oikein

	/* ala.c */
	/* Ohjelmalla luetaan kentän leveys ja pituus sekä tulostetaan
	   näiden perusteella kentän ala.  Tietoja kysytään kunnes
	   molemmat tulevat oikein annetuksi.
	
	   Vesa Lappalainen 18.9.1991
	*/
	#include <stdio.h>
	int main(void)
	{
	  int pituus,leveys;
	  do {
	    printf("Anna kentän pituus ja leveys metreinä >");
	    fflush(stdin); /* Poistetaan mahd. ed. kier. ylim. merkit, epästd. */
	  } while ( scanf("%d %d",&pituus,&leveys) < 2 );
	  printf("Ala on %d m2.\n",pituus*leveys);
	  return 0;
	}
format- osassa voidaan pakottaa syöttämään tiettyjä merkkejä syöttötekstin väliin:
	scanf("%d,%d",&pituus,&leveys) 
Tällöin syöttöjä saataisiin seuraavasti:

Syöttö:

syöttöjen lkm
pituus
leveys

23,34
2
23
34

23, 45
2
23
45

23 34
1
23
alkup.

23 ,34
1
23
alkup.

,34
0
alkup.
alkup.


odottaa lisää



34
1
34
alkup.

kissa
0
alkup.
alkup.

Näin voitaisiin lukea esimerkiksi mittakaava:
	  printf("Anna mittakaava muodossa 1:2000 >");
	  scanf("1:%lf",&mittakaava); 
tai jopa:
	  printf("Anna mittakaava muodossa 1:2000 >");
	  scanf("%lf:%lf",&kerroin,&mittakaava); 
Mikäli syöttö on formaattiin nähden väärää muotoa, jäävät ne muuttujat alkuperäiseen arvoonsa, jotka ovat virheellisen syöttökohdan jälkeen. Esimerkiksi
	  scanf("1:%lf",&mittakaava); 
palauttaa 0 ja jättää mittakaava - muuttujan arvon koskemattomaksi, mikäli syöttö alkaa millä tahansa muulla kuin 1:.

Tehtävä 8.59 Mittakaavan kysyminen

Muuta matka- ohjelmaa siten, että myös mittakaava kysytään käyttäjältä. Mikäli mittakaavaan vastataan pelkkä [RET] pitää mittakaavaksi tulla 1:200000.


previous next Up Title Contents Index