Неожиданный вывод - упражнение по программированию (C) - PullRequest
0 голосов
/ 13 июня 2011

Из C Primer Plus, 5-е издание: «Напишите программу, которая создает два массива типа double из восьми элементов и использует цикл, чтобы позволить пользователю вводить значения для восьми элементов первого массива. Попросите программу установить элементывторой массив к совокупной сумме элементов первого массива. Например, четвертый элемент второго массива должен равняться сумме первых четырех элементов первого массива, а пятый элемент второго массива должен равняться суммепервых пяти элементов первого массива. (Это можно сделать с помощью вложенных циклов, но используя тот факт, что пятый элемент второго массива равен четвертому элементу второго массива плюс пятый элемент первого массива,вы можете избежать вложения и просто использовать один цикл для этой задачи.) Наконец, используйте циклы для отображения содержимого двух массивов, причем первый массив отображается в одной строке, а каждый элемент второго массива отображается под соответствующим элементомпервый арЛуч. "

Я написал:

#include <stdio.h>

int main(void)
{
double first[8];
double second[8];
int i;
printf("Enter 8 'doubles':\n");
i = 0;
scanf("%lf", &first[i]);
second[i] = first[i];
    i = 1;
while(i < 8)
{
    scanf("%lf", &first[i]);
    second[i] = first[i] + first[i-1];
    i++;
}
for(i = 0; i < 8; i++)
{
    printf("%.2lf ", first[i]);
}
printf("\n");
for(i = 0; i < 8; i++)
{
    printf("%.2lf ", second[i]);
}
}

Мой вывод:

Enter 8 'doubles':
1
1
1
1
1
1
1
1
1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
1.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 Press any key to continue . . .

Ожидаемый вывод с 1 2 3 6 12 24 48 96 в нижнем ряду.Не могу понять, почему это работает только для первой итерации.Что я пропустил?

Заранее спасибо.

РЕДАКТИРОВАТЬ: Понятия не имею, почему это не «домашнее задание», я отметил это как упражнение ... Ах, хорошо.

EDIT2:

Этот код:

#include <stdio.h>

int main(void)
{
double first[8];
double second[8];
int i;
printf("Enter 8 'doubles':\n");
i = 0;
scanf("%lf", &first[i]);
second[i] = first[i];
i = 1;
while(i < 8)
{
    scanf("%lf", &first[i]);
    second[i - 1] = first[i] + first[i-1];
    i++;
}
for(i = 0; i < 8; i++)
{
    printf("%.2lf ", first[i]);
}
printf("\n");
for(i = 0; i < 8; i++)
{
    printf("%.2lf ", second[i]);
}
}

Этот вывод:

1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 
2.00 2.00 2.00 2.00 2.00 2.00 2.00 -925596313493178310000... etc

Ответы [ 4 ]

2 голосов
/ 13 июня 2011

Что ж, здесь есть проблема:

while(i < 8)
{
    scanf("%lf", &first[i]);
    second[i] = first[i] + first[i-1];
    i++;
}

Что происходит, когда я равен нулю?

И ваш новый код имеет ошибку "один за другим" в:

second[i - 1] = first[i] + first[i-1];

Если подумать, последний элемент секунды никогда не записывается.

0 голосов
/ 13 июня 2011

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

#include <stdio.h>

int main(void)
{
    double first[8], second[8], sum = 0.0;
    int i = 0;

    printf("Enter 8 'doubles':");
    while(i < 8)
    {
        scanf("%lf", &first[i]);
        sum += first[i];
        second[i] = sum;
        i++;
    }
    printf("\nfirst -  ");
    for(i = 0; i < 8; i++)
    {
        printf("%7.2f ", first[i]);
    }
    printf("\nsecond - ");
    for(i = 0; i < 8; i++)
    {
        printf("%7.2f ", second[i]);
    }

    return 0;
}

Другая небольшая ошибка - использование% lf для строки формата printf () - printf () фактически использует% f только для double и float

0 голосов
/ 13 июня 2011
second[i] = first[i] + first[i-1];

Вы ввели «1» для каждого индекса первого, поэтому вы всегда добавляете 1 + 1 (кроме первого элемента). Выглядит хорошо для меня.

0 голосов
/ 13 июня 2011

При первом входе в цикл while (i<8) возникает проблема: i по-прежнему равен нулю, поэтому вы будете перезаписывать first[0] и читать из first[-1], что недопустимо.Также:

second[i] = first[i] + first[i-1];

second[i] будет содержать сумму двух последних введенных чисел.Если вы хотите накапливать сумму, вы, вероятно, должны добавить second[i-1].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...