/* lukukasittely.c 020598 SJ */ /* Ohjelma ottaa syötteenään kokonaislukuja, tekee niille halutut operaatiot ja tulostaa tulokset. Operaatiot ovat + - * / vakiotermillä, operaatiot annetaan komentorivillä, esim +7 /2 lisää 7 ja vähentää 2. Huomaa, että * operaatio tulee antaa unixissa '*42', jottei kuori yritä lavennusta. Muut kuin em operaattoreilla alkavat parametrit tulkitaan ensin syötetiedoston nimeksi ja sitten tulostiedoston nimeksi. Jollei näitä anneta, käytetäan stdin:iä ja stdout:ia. Esim lukukasittely syote.dat *2 +1 tulos.dat */ #include #define MAXOP 20 int main(int argc, char *argv[]) { int i, opmaara = 0, uusiluku; FILE *syote = NULL, *tuloste = NULL; char c; int vakiot[MAXOP]; char operaatiot[MAXOP]; /* luetaan komentoriviparametrit */ for (i = 1; i < argc; i++) { /* Jos eka kirjain on + - * / , otetaan talteen operaatio ja perässä oleva vakio */ c = *argv[i]; if (c == '+' || c == '-' || c == '*' || c == '/') { operaatiot[opmaara] = c; sscanf(argv[i]+1, "%d", &vakiot[opmaara]); opmaara++; } /* Jollei syötettä vielä avattu, avataan */ else if (!syote) syote = fopen(argv[i], "r"); /* Jollei tulostetta vielä avattu, avataan */ else if (!tuloste) tuloste = fopen(argv[i], "w"); else fprintf(stderr, "Tuntematon parametri!\n"); } /* for */ /* jollei syötettä vielä avattu, stdin */ if (!syote) syote = stdin; /* jollei tulostetiedostoa vielä avattu, stdout */ if (!tuloste) tuloste = stdout; /* luetaan kunnes syöte loppu */ fscanf(syote, "%d", &uusiluku); while (!feof(syote)) { /* käydään operaatiot läpi */ for(i = 0; i < opmaara; i++) { switch (operaatiot[i]) { case '+': uusiluku += vakiot[i]; break; case '-': uusiluku -= vakiot[i]; break; case '*': uusiluku *= vakiot[i]; break; case '/': uusiluku /= vakiot[i]; break; } } fprintf(tuloste, "%d\n", uusiluku); /* luetaan seuraava */ fscanf(syote, "%d", &uusiluku); } /* while */ fclose(syote); fclose(tuloste); exit(0); } /* main() */