-
All my calculations are coming up under the Female columns. They're in the correct age and lead type, but all the males are being calculated as females! What am I doing wrong?
Code:
#include <stdio.h>
#define MAXRECORDS 4
struct record
{
char gender;
int age;
int lead;
};
void read_file(struct record rec[]);
void calculations(int c[], struct record rec[]);
void print_report(int c[], struct record rec[]);
int main()
{
int c[36] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
struct record rec[MAXRECORDS];
read_file(rec);
calculations(c, rec);
print_report(c, rec);
}
void read_file(struct record rec[])
{
FILE *fpin;
int i;
fpin = fopen("custsurvey.dat", "r");
if(fpin == NULL)
{
printf("Error opening file");
}
else
{
for(i = 0; i < MAXRECORDS; i++)
fscanf(fpin, " %c %d %d", &rec[i].gender, &rec[i].age, &rec[i].lead);
}
fclose(fpin);
return;
}
void calculations(int c[], struct record rec[])
{
int i = 0;
while(i < MAXRECORDS)
{
if((rec[i].gender = 'F') && (rec[i].age < 25) && (rec[i].lead == 1))
{
c[0]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age >= 25) && (rec[i].age <= 40) && (rec[i].lead == 1))
{
c[1]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age > 40) && (rec[i].lead == 1))
{
c[2]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age < 25) && (rec[i].lead == 2))
{
c[3]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age >= 25) && (rec[i].age <= 40) && (rec[i].lead == 2))
{
c[4]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age > 40) && (rec[i].lead == 2))
{
c[5]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age < 25) && (rec[i].lead == 3))
{
c[6]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age >= 25) && (rec[i].age <= 40) && (rec[i].lead == 3))
{
c[7]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age > 40) && (rec[i].lead == 3))
{
c[8]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age < 25) && (rec[i].lead == 4))
{
c[9]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age >= 25) && (rec[i].age <= 40) && (rec[i].lead == 4))
{
c[10]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age > 40) && (rec[i].lead == 4))
{
c[11]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age < 25) && (rec[i].lead == 5))
{
c[12]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age >= 25) && (rec[i].age <= 40) && (rec[i].lead == 5))
{
c[13]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age > 40) && (rec[i].lead == 5))
{
c[14]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age < 25) && (rec[i].lead == 6))
{
c[15]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age >= 25) && (rec[i].age <= 40) && (rec[i].lead == 6))
{
c[16]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age > 40) && (rec[i].lead == 6))
{
c[17]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age < 25) && (rec[i].lead == 1))
{
c[18]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age >= 25) && (rec[i].age <= 40) && (rec[i].lead == 1))
{
c[19]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age > 40) && (rec[i].lead == 1))
{
c[20]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age < 25) && (rec[i].lead == 2))
{
c[21]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age >= 25) && (rec[i].age <= 40) && (rec[i].lead == 2))
{
c[22]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age > 40) && (rec[i].lead == 2))
{
c[23]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age < 25) && (rec[i].lead == 3))
{
c[24]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age >= 25) && (rec[i].age <= 40) && (rec[i].lead == 3))
{
c[25]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age > 40) && (rec[i].lead == 3))
{
c[26]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age < 25) && (rec[i].lead == 4))
{
c[27]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age >= 25) && (rec[i].age <= 40) && (rec[i].lead == 4))
{
c[28]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age > 40) && (rec[i].lead == 4))
{
c[29]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age < 25) && (rec[i].lead == 5))
{
c[30]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age >= 25) && (rec[i].age <= 40) && (rec[i].lead == 5))
{
c[31]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age > 40) && (rec[i].lead == 5))
{
c[32]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age < 25) && (rec[i].lead == 6))
{
c[33]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age >= 25) && (rec[i].age <= 40) && (rec[i].lead == 6))
{
c[34]++;
i++;
}
else if((rec[i].gender = 'M') && (rec[i].age > 40) && (rec[i].lead == 6))
{
c[35]++;
i++;
}
}
return;
}
void print_report(int c[], struct record rec[])
{
FILE *fpout;
fpout = fopen("surveyreport.txt", "w");
if(fpout == NULL)
{
printf("Error opening file");
}
else
{
fputs(" CUSTOMER SURVEY REPORT\n", fpout);
fputs(" ======================\n", fpout);
fputs(" FEMALES MALES\n", fpout);
fputs(" ======================= =======================\n", fpout);
fputs(" younger range older younger range older\n", fpout);
fputs(" than 25 25 - 40 than 40 than 25 25 - 40 than 40\n", fpout);
fputs(" LEAD TYPE ======================= ======================= TOTAL\n", fpout);
fputs(" ========= =====\n\n", fpout);
fprintf(fpout," REPEAT %3d %3d %3d %3d %3d %3d\n\n", c[0], c[1], c[2], c[18], c[19], c[20]);
fprintf(fpout,"TELEVISION AD %3d %3d %3d %3d %3d %3d\n\n", c[3], c[4], c[5], c[21], c[22], c[23]);
fprintf(fpout," NEWSPAPER AD %3d %3d %3d %3d %3d %3d\n\n", c[6], c[7], c[8], c[24], c[25], c[26]);
fprintf(fpout," RADIO AD %3d %3d %3d %3d %3d %3d\n\n", c[9], c[10], c[11], c[27], c[28], c[29]);
fprintf(fpout,"WORD OF MOUTH %3d %3d %3d %3d %3d %3d\n\n", c[12], c[13], c[14], c[30], c[31], c[32]);
fprintf(fpout," OTHER %3d %3d %3d %3d %3d %3d\n\n", c[15], c[16], c[17], c[33], c[34], c[35]);
}
}
-
Code:
if((rec[i].gender = 'F')
-
-
I haven't looked at it, but I'm quite sure you could simplify your "calculations" function quite a bit.
There are several things you could do. The first one is to move the i++ out of those if-statements [by the way, if you have a bad record, e.g. one that doesn't have 'M' or 'F' in the record, you will end up with an infinite loop, trying to process the same bad record forever - because your current code only does i++ when you have found a valid record.
Second, you are testing for the same condition many times:
Code:
if((rec[i].gender = 'F') && (rec[i].age < 25) && (rec[i].lead == 1))
{
c[0]++;
i++;
}
else if((rec[i].gender = 'F') && (rec[i].age >= 25) && (rec[i].age <= 40) && (rec[i].lead == 1))
{
c[1]++;
i++;
}
can be written as:
Code:
if(rec[i].gender = 'F')
{
if (rec[i].age < 25) && (rec[i].lead == 1))
{
c[0]++;
}
else if((rec[i].age >= 25) && (rec[i].age <= 40) && (rec[i].lead == 1))
{
c[1]++;
}
...
} else if (rec[i].gender = 'M') ...
i++;
I would probably also make the c array into a struct with a 2-element array, so you just test for male/female once, and set a variable to indicate which it is, then you can do the age/lead testing ONCE, rather than having it twice.
--
Mats
-
You can save a lot of typing and tedious counting by re-writing
Code:
int c[36] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
as
All elements that you do not specify are automatically initialized to zero. (And you have to put at least one element in, at least in C.)
My same notes about fclose() etc in the other thread also still apply here.