C: проблема с математическими результатами при использовании входных данных и массивов. - PullRequest
0 голосов
/ 28 марта 2012

Я работаю над некоторой домашней работой для введения в класс C, в котором мы должны написать программу, которая читает входные данные из текстового файла, который содержит информацию о заказе от винодельни.У меня все записано, но когда я запускаю его, математика для полной стоимости заказов отключается.Я получил некоторую помощь по исправлению массивов в этой программе от некоторых пользователей прошлой ночью, но теперь я не совсем уверен, что является причиной математической ошибки.Вот код, который у меня есть:

int main () {

//Creates the file pointer and variables
FILE *ifp;
int index, index2, index3, index4;
int wineries, num_bottles, prices, orders, sum_order, total_orders;

//Opens the file to be read from.
ifp = fopen ("wine.txt", "r");

//Scans the first line of the file to find out how many wineries there are,
//thus finding out how many times the loop must be repeated.
fscanf(ifp, "%d", &wineries);

//Begins the main loop which will have repititions equal to the number of wineries.
for (index = 0; index < wineries; index ++) {

    //Prints the winery number
    printf("Winery #%d:\n", index + 1);

    //Scans the number of bottles at the aforementioned winery and
    //creates the array "prices" which is size "num_bottles."
    fscanf(ifp,"%d", &num_bottles );
    int prices[num_bottles];

    //Scans the bottle prices into the array
    for (index2 = 0; index2 < num_bottles; index2++)
        fscanf(ifp, "%d", &prices[num_bottles]);

    //Creates variable orders to scan line 4 into.
    fscanf(ifp, "%d", &orders);


    for(index3 = 0; index3 < orders; index3++){
        int sum_order = 0;

        for(index4 = 0; index4 < num_bottles; index4++)
            fscanf(ifp, "%d", &total_orders);

            sum_order += (prices[num_bottles] * total_orders);


        printf("Order #%d: $%d\n", index3+1, sum_order);
        }
        printf("\n");

    }
    //printf("%d", prices[index2]);
    fclose(ifp);


return 0;
}

Когда я запускаю программу, выводится следующее:

Винзавод № 1

Заказ № 1: $ 150

Заказ № 2: $ 60

Заказ № 3: $ 60

Заказ № 4: $ 0

Винзавод № 2

Заказ №1: $ 0

Когда он ДОЛЖЕН распечатать:

Винзавод № 1

Заказ № 1: $ 160

Заказ № 2: $ 200

Заказ № 3: $ 120

Заказ № 4: $ 40

Винзавод № 2

Заказ № 1: $ 40

Это данные из входного файла "wine.txt":

2
3
10 20 30
4
1 0 5
8 3 2
2 2 2
4 0 0
5
17 27 44 54 75
1
1 2 0 0 0

И в случае необходимости (я полагаю, вполне возможно, что моя математическая ошибка может быть указана только через код,но я хочу включить это для ясности), это объяснение моего профессора того, что представляет собой каждое целое число во входном файле:

Первая строка каждого теста будет содержать одно положительное целое число, k (k ≤ 10), представляющий количество различных возможных бутылоквина из этой винодельни.Вторая строка каждого теста будет содержать k положительных целых чисел, представляющих стоимость каждого типа бутылки вина на этой винодельне, разделенных пробелами.Третья строка каждого теста будет содержать одно положительное целое число c (c <10), представляющее количество заказов от этой винодельни для обработки.Следующие c строк будут содержать по k целых чисел, представляющих количество бутылок каждого типа для этого заказа. </p>

Я прошу прощения за длину вопроса, я просто хочу убедиться, что я дам всеинформация, необходимая для ясности.Как всегда, я очень благодарен за помощь, поскольку вы все в stackoverflow продолжаете делать мою работу намного проще.

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

Проверьте правильность размещения фигурных скобок ({, }) для циклов - если фигурные скобки вокруг тела цикла отсутствуют, выполняется только следующий оператор.Ваш отступ предполагает, что вы ожидаете выполнения нескольких следующих операторов, но в отличие от python отступ в C

незначителен
2 голосов
/ 28 марта 2012

Проблема в строке, которая рассчитывает стоимость заказа.Поскольку index3 и index4 перебирают цены и количество бутылок, я думаю, вы хотите умножить каждую цену на количество бутылок, которые были заказаны по этой цене.

Текущий код несделать это:

sum_order += (prices[num_bottles] * total_orders);

Также:

  • Обязательно инициализируйте массив prices[] нулями.
  • Не объявляйте локальные и глобальные переменные ( например sum_order) с тем же именем.
...