Как мы можем использовать выходные данные программы для дальнейших расчетов? C (Linux) - PullRequest
2 голосов
/ 03 сентября 2010

Когда я пишу код на C, я часто путаюсь, когда вопросы / проблемы требуют использования выходных данных для дальнейших вычислений.

Например, если нам нужно напечатать массив, а затем добавить из него только простые числа

или что-то похожее. Я застреваю и не знаю, как решать такие вопросы.

Как и в случае, когда мы принимаем данные от пользователя, просто сказать scanf() и продолжить.

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

Надеюсь, я проясню свои трудности.

EDIT1
Я хочу продолжить обработку результата в той же программе. Я упомянул пример выше. Я просто выделю это.

РЕДАКТИРОВАТЬ 2
@ bta- спасибо. Скажем: -

Пример 1: Вопрос, который просит меня вывести ряд Фибоначчи, а также добавить все четные числа из выходных данных.

Пример 2: Вопрос, который просит меня вывести массив, а затем просто возвести в квадрат все четные числа из массива (выходной) и распечатать их снова.

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

Ответы [ 2 ]

4 голосов
/ 03 сентября 2010

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

Возьмем, к примеру, такую ​​функцию:

void sample_function (void) {
    int data;

    scanf("%d\n", &data);
    printf("The input was: %d\n", data);
}

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

Эти данные можно использовать после того, как функция вернулась, но вам придется немного изменить свою технику. Одна из возможностей - сделать data глобальной переменной вместо локальной переменной внутри функции. Вы также можете передать обратно значение data, используя возвращаемое значение функции, или вы можете передать int* функции и заставить функцию сохранять данные с использованием этого указателя. С помощью любого из этих методов вы сможете вызывать такую ​​функцию, как sample_function, и сохранять данные в области видимости после того, как функция вернулась.

Пока переменная, содержащая данные, не выходит из области видимости, у вас не должно быть проблем с повторным использованием ваших данных снова и снова. Печать / отображение данных не изменяет и не уничтожает их. Единственный способ потерять возможность повторного использования данных - это если переменная, содержащая данные, будет уничтожена (выйдя из области видимости или будучи free г).

Из вашего описания трудно получить хорошее представление о том, о чем именно вы говорите. Можете ли вы привести пример (в коде) ситуации, о которой вы говорите?

Обновление: Судя по вашим правкам, вы не совсем понимаете, что происходит. Когда вы печатаете данные на экране, вы не изменяете данные вообще. У вас все еще есть возможность изменять, получать доступ и повторно использовать данные так же, как и до их отображения. Вам не нужно ничего делать, чтобы снова использовать данные. Используя один из ваших примеров, допустим, у вас есть массив, который содержит последовательность чисел в последовательности Фибоначчи:

int sequence[100];
int i, sum;

fill_with_fibonacci_sequence(sequence); // or however else you get your initial data

// Print out the sequence
printf("The Fibonacci sequence is: ");
for (i=0; i<100; ++i) {
    if ((i & 0x7) == 0)
        printf("\n   ");
    printf("%i ", sequence[i]);
}

// Sum all of the even numbers from the sequence
sum = 0;
for (i=0; i<100; ++i) {
    if ((sequence[i] & 0x1) == 0)
        sum += sequence[i];
}
printf("The sum of the even numbers is: %i\n", sum);

Здесь мы печатаем каждое значение в массиве, затем оборачиваемся и повторно обрабатываем массив для суммирования четных членов. Распечатка массива не меняет сам массив, поэтому для повторного использования данных ничего делать не нужно.

3 голосов
/ 03 сентября 2010

Я думаю, что вы неправильно понимаете проблему.

Если проблема говорит «создайте массив, напечатайте его и добавьте его четные числа», это не означает, что программа должна повторно использовать свой вывод как новый ввод (!).

Это просто означает:

int
main (int argc, char *argv[])
{
    int i,
        sum,
        array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 , 10};

    for (i = 0; i < sizeof(array)/sizeof(array[0]); i++) {
        printf("%d ", array[i]);
    }
    printf("\n");

    sum = 0;
    for (i = 0; i < sizeof(array)/sizeof(array[0]); i++) {
        if (array[i] % 2 == 0) {
            sum = sum +array[i];
        }
    }
    printf("%d\n", sum);

    return EXIT_SUCCESS;
}

Когда вы printf что-то делаете, вы отправляете это ядру с помощью системного вызова. Принимать его снова в качестве входных данных просто не имеет смысла.

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