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);
}