#include #include #include #include #include #define LINE_LEN 1024 typedef struct { long a; long n; } sum_t; typedef struct { /* stores all results */ long * s_result; /* stores the sum of all */ long sum; } sum_result_t; int readSumParams(sum_t * sum, char * line); void __shutdown(); /* store program name */ char * program = NULL; /* storage for file-handle */ FILE * fh = NULL; int main (int argc, char * argv[]) { int i = 0; /* storage for the x's * as count of x's is not yet known * we're going to allocate on demand */ long * x; /* storage for file line */ char line[LINE_LEN+1]; /* stores a and n */ sum_t sum_params; /* stores all single results */ sum_result_t sum_result; /* stores time needed for execution */ clock_t start, stop; /* storing program name used for error output */ program = argv[0]; /* checking if required arguments were passed */ if(argc < 2) { fprintf(stderr, "%s: You must pass a file containing, a,n and x's\n", program); __shutdown(); return EXIT_FAILURE; } /* if file was passed content is opened and read */ fh = fopen(argv[1], "r"); if(fh == NULL) { fprintf(stderr, "%s: Couldn't open file '%s'", program, argv[1]); __shutdown(); return EXIT_FAILURE; } if(fgets(line, LINE_LEN, fh) == NULL) { fprintf(stderr, "%s: Couldn't read first line!\n", program); __shutdown(); return EXIT_FAILURE; } /* get a and n in a structure */ if(!readSumParams(& sum_params, line)) { __shutdown(); return EXIT_FAILURE; } x = (long *)calloc(1,sizeof(long)); if(fgets(line, LINE_LEN, fh) == NULL) { fprintf(stderr, "%s: No values given for x. Check syntax please!\n", program); __shutdown(); return EXIT_FAILURE; } x[i] = strtol(line, NULL, 10); /* store all x's */ while(fgets(line, LINE_LEN, fh) != NULL) { x = (long *)realloc(x, sizeof(long)); x[i] = strtol(line, NULL, 10); i++; } /* check whether less values are given */ if((i+1) < sum_params.n) { fprintf(stderr, "%s: Not enough values for x are given!. Check n!\n"); __shutdown(); return EXIT_FAILURE; } /* check whether more values for x are given than n */ if((i+1) > sum_params.n) { fprintf(stderr, "%s: More values for x than given by n! These are gonna be ignored!\n", program); } start = clock(); i = 0; /* doing the calculation for each x */ sum_result.s_result = (long *)calloc(1, sizeof(long)); sum_result.sum = 0; for(i = 0; i < sum_params.n; i++) { sum_result.s_result = (long *)realloc(sum_result.s_result, sizeof(long)); sum_result.s_result[i] = sum_params.a*x[i]; if(LONG_MAX - (sum_result.sum + sum_result.s_result[i]) < 0) { fprintf(stderr, "%s: Sorry, Sum is already bigger than %ld\n", program, LONG_MAX); __shutdown(); return EXIT_FAILURE; } /*printf("Sum x%d: %d\n", i,sum_result.s_result[i]); */ sum_result.sum += sum_result.s_result[i]; } stop = clock(); printf("Start: %ld\nStop: %ld: %d\n", start, stop, CLOCKS_PER_SEC); fprintf(stdout, "Result for Calculation: %ld\n", sum_result.sum); fprintf(stdout, "Time for Caluclation: %ld\n", (double)((clock() - start)/CLOCKS_PER_SEC)); __shutdown(); return 0; } int readSumParams(sum_t * sum, char * line) { /* token for splitting */ char token[] = " "; char * buffer; buffer = strtok(line, token); if(buffer != NULL) { sum->a = strtol(buffer, NULL, 10); } else { fprintf(stderr, "%s: Couldn't read value for a. Please check your file syntax!\n", program); return 0; } buffer = strtok(NULL, token); if(buffer != NULL) { sum->n = strtol(buffer, NULL, 10); } else { fprintf(stderr, "%s: Couldn't read value for n. Check file syntax!\n", program); return 0; } return 1; } void __shutdown() { /* close file */ if(fh != NULL) fclose(fh); }