Программа должна считать поставки и продажи магазина, но почему-то она выдает неправильные ответы. Помогите найти ошибку, пожалуйста
#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 ];