jfw (02/17/83)
Here is my program "feedme", which takes a file containing a survey and a census (which was the order of my "empstatus" command file), and prints a note for each sector which is in danger of famine. The arguments do the following: -s: self-sufficiency: print a note for every sector which is not self-sufficient. -v: verbose: print a note for every sector which IS self-sufficient. ================================ feedme.c ================================ #include <stdio.h> struct Sect { int x,y,sect,fert; struct Sect *next; } *root,*last; int verbose = 0, selfish = 0; main(argc,argv)char **argv; { register int s,t; char buf[256]; int x,y,sect,fert,food,c,m; while (--argc) { argv++; if (!strcmp(*argv,"-v")) verbose = 1; else if (!strcmp(*argv,"-s")) selfish = 1; else if (freopen(*argv,"r",stdin) == NULL) { perror(*argv); exit(-1); } else break; } /* hunt till "survey" */ while (s = gets(buf)) { if (!strncmp(buf,"survey",6)) break; } if (!s) { puts("EOF before \"survey\""); exit(-1); } /* skip 2 lines */ gets(buf), gets(buf); /* read sector types and fertilities */ while (s = gets(buf)) { if (buf[3] != ',') { /* not a report */ if ((t = index(buf,'s')) && !strcmp(t,"sectors")) break; /* end of data */ else continue; /* information*/ } sscanf(buf, "%d,%d %c %*d%% %*d %*d %d",&x,&y,§,&fert); create(x,y,sect,fert); } if (!s) { fprintf(stderr,"EOF before end of data\n"); exit(0); } /* hunt until "census" */ while (s = gets(buf)) if (!strncmp(buf,"census",6)) break; if (!s) { puts("EOF before \"census\" found"); exit(-1); } /* skip 2 lines */ gets(buf), gets(buf); /* now, read each sector, checking against appropriate things */ while (s = gets(buf)) { if (buf[3] != ',') { /* not a report */ if ((t = index(buf,'s')) && !strcmp(t,"sectors")) break; /* end of data */ else continue; /* information*/ } sscanf(buf,"%d,%d %*s %*c %*d%% %*d %d %d %*d %*d %*d %*d %*d %*d %d",&x,&y,&c,&m,&food); check(x,y,c,m,food); } exit(0); } check(x,y,c,m,f) { /* algorithm: find match for x,y. perform following tests: * self sufficiency: * non-agribusiness: * c + m <= fert && m <= 1.666 * c * agribusiness * c + m <= 5*fert && (fert-10)*c + (fert/5 - 10)*m >= 0 * imminent danger, if non-self-sufficient: * if (c + m)*.048 >= food, print warning of 1 day's notice * if (c + m)*.002 >= food, print FAMINE notice */ struct Sect *s; int des,fert; if (!(s = getsect(x,y))) { printf("sector %d,%d not surveyed\n",x,y); return; } des = s->sect; fert = s->fert; if (des == 'a') { if (c+m <= 5*fert && (fert-10)*c + (fert/5-10)*m >= 0) { if (verbose) printf("agribusiness at %d,%d self-sufficient\n",x,y); return; } } else if (c+m <= fert && 3*m <= 5*c) { if (verbose) printf("sector %d,%d self-sufficient.\n",x,y); return; } if ((c+m)*.048 >= (float)f) { if ((c+m)*.002 >= (float)f) printf("FAMINE imminent in %d,%d <%c>\n",x,y,des); else printf("Food shortage in %d,%d\n",x,y); } if (selfish) printf("Sector %d,%d not self-sufficient\n",x,y); } create(x,y,sect,f) { struct Sect *s; if (!(s = malloc(sizeof *s))) { printf("No Storage!\n"); exit(-2); } if (!root) root = last = s; else last->next = s; s->x = x; s->y = y; s->sect = sect; s->fert = f; s->next = 0; last = s; } getsect(x,y) { struct Sect *s = root; while (s) { if (s->x == x && s->y == y) return(s); else s = s->next; } return(0); }