Code:
Code:
#include<stdio.h>
#include<string.h>
#define NOT_FOUND -1
typedef struct
{
char name[30];
char abbrev[15];
char class[20];
double standard;
} unit_t
int fscan_unit(FILE *filep,unit_t *unitp){
int status;
status = fscanf(filep, "%s%s%s%lf",(*unitp).name,(*unitp).abbrev,(*unitp).class,&(*unitp).standard);
if(status == 4)
status = 1;
else if (status != EOF)
status = 0;
return (status);
}
void
load_units(int unit_max,
unit_t units[],
int *unit_sizep)
{
FILE *inp;
unit_t data;
int i, status;
inp = fopen("units.dat","r");
i = 0;
for (status = fscan_unit(inp, &data);
status == 1 && i < unit_max;
status = fscan_unit(inp, &data)) {
units[i++] = data;
}
fclose(inp);
if (status == 0) {
printf("\n*** Error in data format ***\n");
printf("*** Using first &d data format ***\n");
} else if (status != EOF) {
printf("\n*** Error: too much data in file ***\n");
printf("*** Using first %d data values ***\n", i);
}
*unit_sizep = i;
}
int
search(const unit_t units[],
const char *target,
int n)
{
int i,
found = 0,
where;
i = 0;
while (!found && i < n) {
if (strcmp(units[i].name, target) == 0 ||
strcmp(units[i].abbrev, target) == 0)
found = 1;
else
++i;
}
if(found)
where = i;
else
where = NOT_FOUND;
return(where);
}
double convert(double quantity,double old_stand, double new_stand)
{
return(quantity*old_stand/new_stand);
}
int main(void)
{
unit_t units[20];
int num_units;
char old_units[30],new_units[30];
int status;
double quantity;
int old_index,new_index;
load_units(20,units,&num_units);
printf("Enter a conversion problem or q to quit.\n");
printf("To convert 25 kilometers to miles,you would enter\n");
printf(">25 kilometers miles\n");
printf(" or,alternatively,\n");
printf(">25 km mi\n>");
for(status = scanf("%lf %s%s",&quantity,&old_units,&new_units);
status == 3;
status = scanf("%lf %s%s",&quantity,&old_units,&new_units)){
printf("attempting conversion of %.4e %s to %s ...\n",quantity,&old_units,&new_units);
old_index = search(units,old_units,num_units);
new_index = search(units,old_units,num_units);
if (old_index == NOT_FOUND){
printf("Unit %s not in database\n",old_units);
}
else if (new_index == NOT_FOUND){
printf("UNit %s not in database\n",new_units);
}
else if (strcmp(units[old_index].class,units[new_index].class)!=0)
else
printf(" Cannot convert %s(%s) to %s (%s)\n",old_units,units[old_index].class,new_units,units[new_index].class);
else
printf("%.4e %s = %.4e %s\n",quantity,old_units,convert(quantity,units[old_index].standard,units[new_index].standard),new_index);
printf("\nEnter a conversion problem or q to quit\n");
}
return(0);
}