मेरी कक्षा, मेरे शिक्षक और मैं सभी यह पता नहीं लगा सके कि कोड में क्या गलत है। यह एक कैंटीन ऑर्डरिंग सिस्टम है, इसलिए एक छात्र के रूप में आप कुछ ऑर्डर करते हैं और यह एक सिस्टम में लॉग इन करता है और कैंटीन के कर्मचारी उसके अनुसार खाना बना सकते हैं। विशिष्ट समस्या यह है कि मैं एक मिलान करने की कोशिश कर रहा हूं, लेकिन यह केवल पहले खाद्य पदार्थ को प्रिंट करता है जिसे ऑर्डर किया गया था। प्रासंगिक कोड नीचे है और चित्र संलग्न हैं।

उपलब्ध वस्तुओं का मेनू, आदेश दिया गया, आदेश मिलान का परिणाम // ध्यान दें कि छात्र का आदेश खाद्य पदार्थ की एक आईडी है

struct food
{

    int   foodID;

    char  foodName[namesize];//namesize is 30

    char  foodItems[size];//specials for the day//size is 3

    int   itemTally;//total of food that needs to be prepared - REPLACED

    float totalEarnt;//total amount earnt for selling the food

    float totalSpen;//cost of food to the employer

    float totalProfits;//total profts made

    float itemCost;//cost of the food item

};

struct student
{

    char  firstname[namesize];

    char  lastname[namesize];

    int   ID;//students ID

    float form;//student's form room

    int   order;//ID of the food they ordered

    int   quantity;//how much of the food item

    float paid;//how much they paid

    int   delivery;//This is a yes or no

    char  location[aSize];//where it will be delivered to; aSize is 20

};

void orderTally()//Tallies up all the orders based on their ID; Student 1 orders 3 fish, student 2 orders 4 fish, outputs 7 fish
{

    FILE*fp;
    FILE*fp1;

    struct food foodie={0,"","",0,0.0,0.0,0.0,0.0};
    struct student orderie={"","",0,0.0,0,0,0.0,0,""};
    int i;//This is the food ID.

    if((fp1 = fopen("student", "rb+"))==NULL)//order file
    {
        printf("Cannot open order file \n");
        exit(1);
    }
    if ((fp = fopen("food", "rb+"))==NULL)//menu file
    {
        printf("Cannot open food file \n");//UPDATE: update other statements
        exit(1);
    }
    int sum=0;

    for(i=1;i<=100;i++)
    {
        fread(&orderie,sizeof(struct student),1,fp1);

        while(!feof(fp1))
        {
            if(orderie.order==i)//If the order ID is equal to one of the 100 food IDs...
            {   
                sum=sum+orderie.quantity;
            }
            fread(&orderie,sizeof(struct student),1,fp1);
        }
        if(sum!=0)
        {
            fseek(fp,(i-1)*sizeof(struct food),SEEK_SET);
            fread(&foodie,sizeof(struct food),1,fp);

            printf("------------------------------------------------------------\n");
            printf("\t\t\tORDERS\n");
            printf("------------------------------------------------------------\n\n");
            printf("%s",foodie.foodName);
            printf(" - %d\n\n",sum);
            sum=0;
        }
    }
    fclose(fp1);
    fclose(fp);
}
0
Thomas 23 मार्च 2020, 22:04

1 उत्तर

सबसे बढ़िया उत्तर

यह मेरी शीर्ष टिप्पणी द्वारा प्रस्तुत किया गया है:

आप for (i=1;i<=100;i++) कर रहे हैं और उस लूप का पहला भाग fread fp1 की संपूर्ण सामग्री पर [while लूप में] कर रहा है। इसलिए, जब i 2 है, तो fread को तत्काल EOF मिलेगा। क्या आपको for लूप के प्रत्येक पुनरावृत्ति पर fp1 [इसे रिवाइंड करने के लिए] के लिए fseek की आवश्यकता है? यदि नहीं, तो while के लिए fp1 को लूप के ऊपर रखना बेहतर होगा। वैसे भी, फ़ाइल को 100 बार फिर से पढ़ना बेकार लगता है।

मैंने चीजों को थोड़ा सा पुनर्गठित और सरल किया है। छात्र फ़ाइल को एक बार पढ़ना और सभी योगों को एक सरणी में रिकॉर्ड करना बहुत आसान है।

struct food {
    int foodID;
    char foodName[namesize];            // namesize is 30
    char foodItems[size];               // specials for the day//size is 3
    int itemTally;                      // total of food that needs to be prepared - REPLACED
    float totalEarnt;                   // total amount earnt for selling the food
    float totalSpen;                    // cost of food to the employer
    float totalProfits;                 // total profts made
    float itemCost;                     // cost of the food item
};

struct student {
    char firstname[namesize];
    char lastname[namesize];
    int ID;                             // students ID
    float form;                         // student's form room
    int order;                          // ID of the food they ordered
    int quantity;                       // how much of the food item
    float paid;                         // how much they paid
    int delivery;                       // This is a yes or no
    char location[aSize];               // where it will be delivered to; aSize is 20
};

// Tallies up all the orders based on their ID; Student 1 orders 3 fish,
// student 2 orders 4 fish, outputs 7 fish
void
orderTally()
{
    FILE *fp;
    FILE *fp1;

    struct food foodie;
    struct student orderie;
    int i;                              // This is the food ID.

    // order file
    if ((fp1 = fopen("student", "rb+")) == NULL)
    {
        printf("Cannot open order file \n");
        exit(1);
    }

    int sums[101] = { 0 };

    // read _entire_ student file in one pass
    while (1) {
        if (fread(&orderie,sizeof(struct student),1,fp1) != 1)
            break;
        sums[orderie.order] += orderie.quantity;
    }

    fclose(fp1);

    // menu file
    if ((fp = fopen("food", "rb+")) == NULL)
    {
        printf("Cannot open food file \n"); // UPDATE: update other statements
        exit(1);
    }

    for (i = 1; i <= 100; i++) {
        int sum = sums[i];
        if (sum == 0)
            continue;

        fseek(fp, (i - 1) * sizeof(struct food), SEEK_SET);
        fread(&foodie, sizeof(struct food), 1, fp);

        printf("------------------------------------------------------------\n");
        printf("\t\t\tORDERS\n");
        printf("------------------------------------------------------------\n\n");
        printf("%s", foodie.foodName);
        printf(" - %d\n\n", sum);
    }

    fclose(fp);
}
0
Craig Estey 24 मार्च 2020, 00:56