/* 6-3 * Tanel Toova * Kirjutada programm, mis loeks käsurealt antud failist (selle puudumisel stanstandardsisendist kuni * kokkulepitud lõputunnuseni) arvulisi väärtusi ning salvestaks need linked list'i, mille elemendid peavad * säilitama sisestatud väärtuse ning veel ühte long-tüüpi muutujat. Sisendfaili lõppedes või pärast * lõputunnuse saamist peab programm arvutama välja sisestatud arvude faktoriaalid, salvestama need eelpool * nimetatud muutujasse ning väljastama arvud koos faktoriaalidega. Sisetatavate arvude vahemik on 1...10, * muud väärtused, kaasaarvatud sellised, mida ei õnnestu arvudeks konverteerida, talletatakse, kuid nende * väljastamisel antakse vastav veateade. */ #include #include #include #define END "STOPP" char line[256]; //input to be read from keyboard or file FILE *inputfile; int arv; //used in "calcf" and "faktor" int fakt; //used in "calcf" and "faktor" int i; //used in main //Object in linked list looks like this struct kirje{ struct kirje *next; char *rida; long faktoriaal; }; //Allocates memory for the linked list objekt "kirje" struct kirje *memalloc(void){ return (struct kirje *)malloc(sizeof(struct kirje)); } //Adds an object to the end of linked list struct kirje *add_node(struct kirje *pointer, char *rida){ if(!pointer){ //if at end of linked list pointer=memalloc(); //creation of new object pointer->rida=strdup(rida); //giving value to "pointer" field "rida" pointer->next=NULL;//this is the last object in linked list } else{//if not at the end of linked list list, go back by one step pointer->next=add_node(pointer->next,rida); } return pointer; } //calculation of factorial from "arv" int faktor(arv){ if (arv>0){ fakt=fakt*arv; faktor(arv-1); } return(fakt); } //uses "faktor" to give value to all pointer fields named "faktoriaal" void calcf(struct kirje *pointer){ if (pointer!=NULL){ //if not at the end of the linked list arv=atoi(pointer->rida); fakt=1; if (arv>0 && arv<11){ //if arv is suitable for calculation pointer->faktoriaal=faktor(arv); }else{ pointer->faktoriaal=0; }//if calcf(pointer->next); }//if } //function to print output to screen void output(struct kirje *pointer) { if(pointer!=NULL){ //if not at the end of the linked list if (pointer->faktoriaal!=0){ printf("Faktoriaal arvust %s on %i \n", pointer->rida,pointer->faktoriaal); }else{ printf("Sisendist %s ei saa faktoriaali leida!\n",pointer->rida); }//if output(pointer->next); }//if } int main(int argc,char **argv){ struct kirje *first_node=NULL; //creation of the head of linked list inputfile=fopen(argv[1],"r"); //opens file for reading if (!inputfile){ printf("Faili ei leitud !\nKasutage andmete sisestamiseks klaviatuuri\nLõpetamiseks kirjutage STOPP\n"); while(1){ //starts reading data from keyboard until STOPP is given scanf("%s",line); if(!strcmp(line,END)){break;} first_node=add_node(first_node,line); }//while }else{ while(1){ //starts reading data from file until EOF if ((i = fscanf(inputfile, "%s", line))== EOF){break;} first_node=add_node(first_node,line); }//while }//if calcf(first_node); //calculates factorial for all the objects in linked list output(first_node); //prints output to screen return 0; }