Программа должна считать поставки и продажи магазина, но почему-то она выдает неправильные ответы. Помогите найти ошибку, пожалуйста

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define MAX_DELIVERIES 10
#define MAX_STOCK_ITEMS 50

struct StockRecord
{
    int sku;
    int deliveries[MAX_DELIVERIES];
    int numDeliveries;
    int numSold;
};

int main(void)
{
    struct StockRecord stock[MAX_STOCK_ITEMS] = {
        {748, {0}, 0, 0},
        {619, {0}, 0, 0},
        {821, {0}, 0, 0},
        {554, {0}, 0, 0}
    };
    int keepRunning = 1, sku, posn = 0, i, numStockItems = 4, quantity = 0, validAction = 0;
    int found = 0, total = 0, j, lastDelivery = 0;
    char action;

    while (keepRunning)
    {
        printf("Enter d (Delivery) or s (Sale) or x (eXit): ");
        scanf("%c%*c", &action);
        if (validAction = action == 's' || action == 'S' || action == 'd' || action == 'D')
        {
            printf("Enter the SKU: ");//баркод
            scanf("%d%*c", &sku);
            posn = 0;
            found = 0;
            for (i = 0; i < numStockItems && !found; i++)
            {
                if (stock[i].sku == sku)
                {
                    posn = i;//номер товара
                    found = 1;
                }
            }
        }

        if (posn <= 0 && validAction)//не правильный баркод
        {
            printf("SKU cannot be found\n");
        }
        else
        {
            if (validAction)
            {
                printf("Enter the quantity delivered or sold: ");
                scanf("%d%*c", &quantity);//колво продаж или пополнений
            }

            switch (action)
            {
            case 'd'://поставка
            case 'D':
                lastDelivery = stock[i].numDeliveries;//кол-во доставок
                stock[posn].deliveries[lastDelivery] = quantity;
                stock[posn].numDeliveries++;
                break;
            case 's'://продажа
            case 'S':
                total = 0;
                for (j = 0; j < stock[posn].numDeliveries; j++)
                {
                    total += stock[posn].deliveries[j];
                }
                if (total >= (quantity + stock[posn].numSold))
                {
                    stock[posn].numSold -= quantity;
                }
                else if (total < (quantity + stock[posn].numSold))
                {
                    printf("Error: cannot sell more than we have in stock\n");
                }
                break;
            case 'x'://выход
            case 'X':
                keepRunning = 0;
                break;
            default:
                printf("Invalid action %c\n", action);//ошибка ввода
                break;
            }
        }
    }
    printf("%4s%6s%16s\n", "SKU", "Sales", "Remaining Stock");
    for (i = 0; i < numStockItems; i++)
    {
        total = 0;
        for (j = 0; j < stock[i].numDeliveries; j++)
        {
            total += stock[j].deliveries[i];
        }
        printf("%4d%6d%16d\n", stock[i].sku, stock[i].numSold, total - stock[i].numSold);
    }
    return 0;
}

Программа должна считать поставки и продажи магазина, но почему-то она выдает неправильные ответы. Помогите найти ошибку, пожалуйста.


Ответы (1 шт):

Автор решения: AlexGlebe

Читаем внимательно предупреждения :

warning: ‘i’ may be used uninitialized in this function [-Wmaybe-uninitialized]
lastDelivery = stock[i].numDeliveries;//кол-во доставок
~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~

Убираем общую переменную i и в циклах делаем их очень локальными.

int keepRunning = 1, sku, posn = 0, /*i,*/ numStockItems = 4,
  quantity = 0, validAction = 0;

for (int  i = 0; i < numStockItems && !found; i++)

for (int i = 0; i < numStockItems; i++)

Далее исправляем описку :

//lastDelivery = stock[i].numDeliveries;//кол-во доставок

lastDelivery = stock[posn].numDeliveries;//кол-во доставок

В конце проги перепутали индексы i и j :

for (int i = 0; i < numStockItems; i++)
{
    total = 0;
    for (j = 0; j < stock[i].numDeliveries; j++)
    {
        total += stock[ j ].deliveries[ i ];
        //              ^               ^
    }
    printf("%4d%6d%16d\n", stock[i].sku, stock[i].numSold, total - stock[i].numSold);
}

поменяйте переменные местами :

total += stock[ i ].deliveries[ j ];
→ Ссылка