L 5,R 65,J,T 5 10 @AOts(P„„teohjaus 3 vastauksia) SECTION Funktiot ja aliohjelmat HEADINGC suurin_kirjeen_paino BEGIN GESIMERKKI L 5,R 86,J,T 5 10 #include /****************************************************************************/ int /* = kirjeen suurin paino */ suurin_kirjeen_paino( /* */ double rahaa /* s K„ytett„viss„ oleva raham„„r„ */ ) /* ** Parametrina saadaan reaalilukuna raham„„r„ (muodossa mk.p). Funktio ** palauttaa arvonaan kokonaisluvun, joka kertoo kuinka painavan kirjeen ** parametrina olevalla rahasummalla voidaan l„hett„„. ** ----------------------------------------------------------------------------*/ { if (rahaa >= 9.30) return 500; else if (rahaa >= 5.20) return 200; else if (rahaa >= 3.40) return 100; else if (rahaa >= 2.10) return 50; else return 0; } int main(void) { double rahaa; printf(" Anna raham„„r„ (esim. 5.20 = 5mk 20p), niin kerron kuinka\n"); printf(" painavan kirjeen saat sill„ l„hetetty„ > "); if( scanf("%lf",&rahaa) !=1 ) { printf(" Lukujen sy”tt” ei onnistunut!\n"); return 1; } printf(" Summalla %.2lf voit l„hett„„ %d gramman painoisen kirjeen.\n\n", rahaa, suurin_kirjeen_paino(rahaa)); return 0; } END GESIMERKKI HEADINGC kysy_ika BEGIN GESIMERKKI #include /****************************************************************************/ int /* */ kysy_ika( /* = Kysymiskertojen lukum„„r„. */ int *ika /* t Hyv„ksytty ik„. */ ) /* ** Funktiolla kysyt„„n ik„„ kunnes annettu ik„ on v„lilt„ 18-65 vuotta. ** Palautaa kysymiskertojen lukum„„r„n ja ika-parametrissa hyv„ksytyn i„n. ** ----------------------------------------------------------------------------*/ { int kerrat=0; do { kerrat++; printf("Anna ik„ >"); if(scanf("%d",ika)!=1){ /* if tarkistaa ett„ ika oikeaa muotoa, */ *ika=0; /* eli numero. Muut hyl„t„„n ja */ fflush(stdin); /* inputti tyhjennet„„n. */ } } while(*ika<18 || *ika>65); return kerrat; } int main(void) { int ika; printf("Ik„„ kysyttiin %d kertaa.\n",kysy_ika(&ika)); printf("Ik„ on %d.\n",ika); return 0; } /* ** Koska k„„nt„jiss„ ei ole yhten„ist„ linjaa parametrien ** suoritusj„rjestyksest„, on parasta tulostaa ** kysytyt kerrat ja ika eri printf -lauseilla. */ END GESIMERKKI HEADINGC laske_merkin_maarat BEGIN GESIMERKKI #include #include #define JONOPIT 80 /****************************************************************************/ int /* */ laske_merkin_maarat( /* Merkkin lukum„„r„ jonossa. */ char *jono ,/* s Jono josta merkkej„ lasketaan. */ char merkki /* s Merkki jota etsit„„n. */ ) /* ** Funktiolla lasketaan annettun merkkin esiintymism„„r„ merkkijonossa. ** ** Esimerkki: jono = "Kissa" merkki = 's' -> laske_merkin_maarat = 2 ----------------------------------------------------------------------------*/ { int maara=0; char *p=jono; while (*p) { if (merkki==*p) maara++; p++; } return maara; } int main() { char rivi[JONOPIT],jono[JONOPIT],merkki; while (1) { printf("\nAnna etsitt„v„ merkki ja jono >"); fgets(rivi,JONOPIT,stdin); if (sscanf(rivi,"%c %s",&merkki,jono)<2) break; printf("Merkki '%c' esiintyi jonossa \"%s\" %d kertaa\n", merkki,jono,laske_merkin_maarat(jono,merkki)); } return 0; } END GESIMERKKI HEADINGC vero BEGIN GESIMERKKI #include /****************************************************************************/ void /* */ vero( /* */ /* */ double brutto ,/* s Bruttopalkka */ double vero ,/* s Veroprosentti (23.5 == 23.5%) */ double *netto ,/* t K„teenj„„v„ palkan osuus */ double *verottajalle /* t Verottajalle menev„ osuus */ ) /* ** Funktiolla lasketaan palkansaajan ja verottajan osuus bruttopalkasta. ** ----------------------------------------------------------------------------*/ { *verottajalle = brutto * vero / 100; *netto = brutto - *verottajalle; } int main(void) { double brutto,pros,netto,verottajalle; printf("Lasken verottajalle menev„n ja itsellesi j„„v„n osuuden.\n" "Anna tiedot muodossa 7500.0 ja 23.7\n" "Lopetus antamalla 0 0\n"); do { printf("\nAnna bruttopalkka ja veroprosentti >"); scanf("%lf %lf",&brutto,&pros); vero(brutto,pros,&netto,&verottajalle); printf("Verottaja saa palkastasi %.2lf mk, joten itsellesi j„„ %.2lf mk\n", verottajalle,netto); } while (brutto>0.0); return 0; } END GESIMERKKI SECTION Parametrit ja tietueet Tutki seuraavan ohjelman toimintaa debuggerin kanssa. tarkkaile erityisesti p„„ohjelman asi-tietueen kenttien arvoja. Kokeile ensivaiheessa ohjelmaa sellaisenaan. BEGIN GESIMERKKI Merkkitaulukko nimi on kokonaisuudessaan tietueessa. Sijoitus aliohjelmassa ei vaikuta p„„ohjelman tietueeseen. END GESIMERKKI Muuta seuraavaksi rivi #define EKA muotoon #define TOKA. Miten kenttien arvot nytmuuttuvat? BEGIN GESIMERKKI Tietueessa on vain osoitin merkkijonoon nimi. Sijoitus (strcpy) aliohjelmassa muuttaa p„„ohjelman tietueen merkkijonoa nimi. Asiakasnro ei muutu. END GESIMERKKI Muuta edellist„ ohjelmaa siten, ett„ tietue v„litet„„n osoittimen avulla aliohjelmalle. Miten nyt kenttien arvot muuttuvat? BEGIN GESIMERKKI Nyt kummassakin struct -tyyliss„ aliohjelmassa tapahtuvat muutokset muuttavat my”s p„„ohjelman tietueen kentti„. END GESIMERKKI