Hi guys, I have been working on this for 13 hours straight now, and I am going out of my mind. I have a final due tonight and I cannot figure this out at all. The program is basically a product database for a sporting goods store, and I have to store all of the data in a struct record, then put in it a binary file and display all of the records as a report when the report() function is selected from the menu. Problem is my report() function is completely messed up and it displays a weird jumbled report a bunch of times and then exits out to the menu. I have to figure this out, please help me!
// ** Prototypes **
void heading(void);
int menu();
int add();
void report();
void getstring(char entry[], char prompt[]);
int getint(int min, int max, char prompt[]);
double getreal(double min, double max, char prompt[]);
double total(double quantity, double amount);
double profit(double profit_cost, double profit_price);
void init_costs(double t[], int x);
void show_costs(double t[], int x);
void show(int prodnum, int prodtype, char prodscrip[], int prodquan, double cost, double price, double prod_price, double prod_cost, double prod_profit);
int menuerror(int min, int max, char prompt[]);
int prompt(char msg[]);
int quit(void);
void message(char msg[]);
void firstUpper(char *buf);
void line(char c, int t);
struct sports
{
int prodnum;
int prodtype;
char prodscrip[20];
int prodquan;
double cost;
double price;
};
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "10 final.h"
/* ================================================================== */
// ** Functions **
#define clrscr() system("cls")
int main()
{
int TRUE = 1;
int FALSE = 0;
int select, end = TRUE;
do
{
select = menu();
switch (select)
{
case 1: add(); break;
case 2: report(); break;
case 3:
case 4:
case 5: end = quit(); break;
default: message("\n\nPlease make a selection between 1 and 5.\a");
}
}
while (end);
return 0;
}
/* ================================================================ */
int menu()
{
int choice;
system("cls");
printf("Sierra Sporting Goods\n\n");
printf("1 = Add a record\n");
printf("2 = Report\n");
printf("3 = Delete a record\n");
printf("4 = Change a record\n");
printf("5 = Quit\n\n");
choice = menuerror(1, 5, "Enter your selection");
return(choice);
}
/* ================================================================ */
int add()
{
double prod_cost, prod_price, prod_profit;
double MINCOST;
double MAXCOST;
double MINPRICE;
double MAXPRICE;
int MINPROD;
int MAXPROD;
int MINTYPE;
int MAXTYPE;
int MINQUAN;
int MAXQUAN;
int i;
double types[6];
char choice;
FILE *fp;
FILE *f;
init_costs(types,6);
struct sports s;
f = fopen("limits.txt", "rt");
if (f == NULL)
{
printf("File does not exist");
return 0;
}
else
{
fscanf(f, "%d %d %d %d %d %d %lf %lf %lf %lf", &MINPROD, &MAXPROD, &MINTYPE, &MAXTYPE, &MINQUAN, &MAXQUAN, &MINCOST, &MAXCOST, &MINPRICE, &MAXPRICE);
}
fclose(f);
fp = fopen("data.dat", "ab+");
if (fp == NULL)
{
message("Error opening data file\a");
return 1;
}
fseek(fp, 0L, SEEK_END);
i = (int)ftell(fp) / sizeof(struct sports);
do
{
heading();
s.prodnum = getint(MINPROD, MAXPROD, "product number");
s.prodtype = getint(MINTYPE, MAXTYPE, "product type");
printf("Enter the product description:");
gets(s.prodscrip);
s.prodquan = getint(MINQUAN, MAXQUAN, "product quantity");
s.cost = getreal(MINCOST, MAXCOST, "product cost");
s.price = getreal(MINPRICE, MAXPRICE, "product price");
prod_cost = total(s.prodquan, s.cost);
prod_price = total(s.prodquan, s.price);
prod_profit = profit(prod_price, prod_cost);
types[s.prodtype] += prod_cost;
fwrite(&s, sizeof(struct sports), 1, fp);
show(s.prodnum, s.prodtype, s.prodscrip, s.prodquan, s.cost, s.price, prod_price, prod_cost, prod_profit);
choice = prompt("Would you like to enter another product");
getchar();
}
while (choice != 'N');
show_costs(types,6);
return 0;
fclose(fp);
}
/* ================================================================ */
void report()
{
double prod_profit = 0, total_profit = 0;
FILE *fp;
struct sports s;
int c;
printf("Sierra Sporting Goods\n");
fp = fopen("data.dat","ab+");
if (fp == NULL)
{
printf("File does not exist");
return;
}
printf("Product Inventory\n\n");
c = printf("%-4s%6s%20s%18s%10s%10s%11s\n", "#", "Type", "Description", "Quantity", "Cost", "Price", "Profit");
line('=', c-1);
while (fread(&s, sizeof(s), 1, fp) != 0)
{
prod_profit = (s.price - s.cost) * s.prodquan;
printf("%-4d%5d%15s%8d%13.2lf%10.2lf%11.2lf\n", s.prodnum, s.prodtype, s.prodscrip, s.prodquan, s.cost, s.price, prod_profit);
line('=', c-1);
total_profit += prod_profit;
printf("Total Expected Profit%58.2f\n\n", total_profit);
}
fclose(fp);
return;
}
/* ================================================================ */
void heading()
{
system("cls");
printf("Sierra Sporting Goods\n\n\n");
return;
}
/* ================================================================ */
void show(int prodnum, int prodtype, char prodscrip[], int prodquan, double cost, double price, double prod_price, double prod_cost, double prod_profit)
{
printf("\n\n\nThe product number is ----------> %04d\n", prodnum);
printf("The product type is ------------> %d\n", prodtype);
printf("The product description is -----> %s\n", prodscrip);
printf("The quantity is ----------------> %d\n", prodquan);
printf("The cost is --------------------> $%.2lf\n", cost);
printf("The price is -------------------> $%.2lf\n\n", price);
printf("Total product price ----------> $%.2lf\n", prod_price);
printf("Total product cost -----------> $%.2lf\n", prod_cost);
printf("Total product profit ---------> $%.2lf\n\n\n\n", prod_profit);
return;
}
/* ================================================================ */
void getstring(char *entry, char * prompt)
{
printf("Enter the %s: ", prompt);
gets(entry);
firstUpper(entry);
}
/* ================================================================ */
void firstUpper(char *buf)
{
while (*buf)// Continue as long as characters available.
{
while( isspace(*buf) || !isalpha(*buf) )
*buf++; // Skip all spaces until next character.
*buf = toupper(*buf); // Capitalize first character after space.
while(*buf && !isspace(*buf) )
*buf++; // Skip all characters until next space.
}
}
/* ================================================================ */
int getint(int min, int max, char item[])
{
int x;
printf("Enter the %s between %d and %d: ", item, min, max);
scanf("%d%*c", &x);
while (x < min || x > max)
{
message("\nError in range. Press Enter to continue.\a");
printf("Enter the %s between %d and %d: ", item, min, max);
scanf("%d%*c", &x);
}
return(x);
}
/* ================================================================ */
double getreal(double min, double max, char item[])
{
double y;
printf("Enter the %s between $%.2lf and $%.2lf: ", item, min, max);
scanf("%lf%*c", &y);
while (y < min || y > max)
{
message("\nError in range. Press Enter to continue.\a");
printf("Enter the %s between $%.2lf and $%.2lf: ", item, min, max);
scanf("%lf%*c", &y);
}
return(y);
}
/* ================================================================ */
double total(double quantity, double amount)
{
return (quantity * amount);
}
/* ================================================================ */
double profit(double profit_price, double profit_cost)
{
return (profit_price - profit_cost);
}
/* ================================================================ */
void init_costs(double *t, int x)
{
int z;
for (z = 1; z < x; z++)
*(t + z) = 0;
}
/* ================================================================ */
void show_costs(double *t, int x)
{
int z;
double total = 0;
system("cls");
printf(" Product Cost by Type\n\n");
printf("_Type_____________Cost_\n\n");
for (z = 1; z < x; z++)
{
printf(" %2d%20.2lf\n", z, *(t+z));
total += *(t+z);
}
printf("________________________\n");
printf("%23.2lf\n\n\n\n", total);
printf("Press ENTER to return to the Main Menu...");
getchar();
}
/* ================================================================ */
void message(char *msg)
{
printf("%s\n\n", msg);
}
/* ================================================================ */
void line(char c, int t)
{
while (t--) putchar(c);
putchar('\n');
}
/* ================================================================ */
int prompt(char *msg)
{
int z;
do
{
printf("%s (Y/N)? ", msg);
z = toupper(getchar());
if (z != 'Y' && z != 'N') printf("\nError, please enter Y or N only.\n");
}
while (z != 'Y' && z != 'N');
return(z);
}
/* ================================================================ */
int quit()
{
int TRUE = 1;
int FALSE = 0;
int z, end = TRUE;
z = prompt("\nEnd program\a");
if (z == 'Y')
{
system("cls");
message("\nSierra Sporting Goods Database closed successfully.");
end = FALSE;
}
return(end);
}
/* ================================================================ */
int menuerror(int min, int max, char item[])
{
int z;
printf("%s from %d to %d: ", item, min, max);
scanf("%d%*c", &z);
while (z < min || z > max)
{
message("\nError in range.\a");
printf("%s from %d to %d: ", item, min, max);
scanf("%d%*c", &z);
}
return(z);
}
/* ================================================================ */
Note: The limits file looks like this:
1 9999
1 5
1 50
5.00 900.00
6.00 1000.00