Раздел «Язык Си».CoffeCookbook1:

Чтение чисел

Дано N, далее N целых чисел, N&1000

Входные данные: Целое число 0 < N < 1000. Затем N чисел, по модулю не превышающих 30000, через пробел.

Выходные данные: Входная последовательноть. Еще раз входная последовательность.

Вход Выход
3
2 17 5
2 17 5 2 17 5

#include <stdio.h>
#define N 1000
int main() {
    int a[N];       // сюда считываем и отсюда печатаем числа
    int i;          // номер очередного элемента в массиве
    int n;          // сколько чисел ожидается во входной последовательности

    // считываем количество чисел в n и далее сохраняем эти n чисел в массиве a
    scanf("%d", &n);      
    for (i=0; i<n; i++) {
        scanf("%d", &a[i]);
    }

    // печатаем n первых элементов из массива a и переводим строку
    for (i=0; i<n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");

    // печатаем n первых элементов из массива a еще раз
    for (i=0; i<n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
    return 0;
}

Дано несколько целых чисел (не более 1000)

Входные данные: N целых чисел, по модулю не превышающих 30000, через пробел, 0 < N < 1000

Выходные данные: Входная последовательность. Еще раз входная последовательность.

Вход Выход
2 17 5 2 17 5 2 17 5

Для хранения чисел используем массив int a[1000] (размер массива известен еще на этапе компиляции).

Для чтения последовательности чисел проверим, что возвращает функция scanf

IDEA! scanf возвращает количество правильно разобранных элементов ввода или EOF в случае конца файла.

При вызове z=scanf("%d%d", &x, &y)

Input z x y Пояснение
12 345 2 12 345  
12 345abc 2 12 345 abc не будет прочитано
abc def 0 ? ? Не получилось разобрать по формату %d символы с самого начала, "курсор" не сдвинулся, следующий %d разбираем с того же места abc...
12 abc 345 1 12 ?  
конец файла EOF ? ?  

#include <stdio.h>
#define N 1000
int main() {
    int a[N];       // сюда считываем и отсюда печатаем числа
    int i;          // номер очередного элемента в массиве
    int n;          // сколько элементов в массиве

    // пока scanf успешно разбирает 1 формат %d (scanf возвращает 1)
    for (i=0; i<N && 1==scanf("%d", &a[i]); i++) {
        ;
    }
    n = i;          // прочитано чисел

    // печатаем n первых элементов из массива a и переводим строку
    for (i=0; i<n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");

    // печатаем n первых элементов из массива a еще раз
    for (i=0; i<n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
    return 0;
}

Дано N, далее N целых чисел, чем ограничено N неизвестно.

Входные данные: Целое число 0 < N . Затем N чисел, по модулю не превышающих 30000, через пробел.

Выходные данные: Входная последовательноть. Еще раз входная последовательность.

Вход Выход
3
2 17 5
2 17 5 2 17 5

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

Будем выделять память динамически.

int * a;
int n;

scanf("%d", &n);      
a = malloc (n * sizeof(int)); // выделяем n*sizeof(int) байт динамической памяти, 
                              // адрес ее начала записываем в переменную а

// используем выделенную память 

free(a); // освобождаем память

#include <stdio.h>
#include <stdlib.h>

int main() {
    int * a;        // выделив память, сюда считываем и отсюда печатаем числа
    int i;          // номер очередного элемента в массиве
    int n;          // сколько чисел ожидается во входной последовательности

    
    scanf("%d", &n);              // считываем количество чисел в n
    a = malloc (n * sizeof(int)); // выделяем n*sizeof(int) байт динамической памяти, 
                                  // адрес ее начала записываем в переменную а
    for (i=0; i<n; i++) {         // считываем числа и сохраняем их в динамическом массиве а
        scanf("%d", &a[i]);
    }

    // печатаем n первых элементов из массива a и переводим строку
    for (i=0; i<n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");

    // печатаем n первых элементов из массива a еще раз
    for (i=0; i<n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");

    free(a);   // НЕ ЗАБУДЬТЕ ОСВОБОДИТЬ ПАМЯТЬ!

    return 0;
}

Дано несколько целых чисел (не более 1000)

Входные данные: Несколько целых чисел, по модулю не превышающих 30000, через пробел.

Выходные данные: Входная последовательность. Еще раз входная последовательность.

Вход Выход
2 17 5 2 17 5 2 17 5

Для хранения чисел использовать массив int a[1000] (размер массива НЕизвестен на этапе компиляции).

Выделим память динамически. Будем выделять памяти больше, чтобы вошел на 1 int больше.

#include <stdio.h>
#include <stdlib.h>

int main() {
    int * a;        // сюда считываем и отсюда печатаем числа
    int i;          // номер очередного элемента в массиве
    int n;          // сколько элементов в массиве



    // пока scanf успешно разбирает 1 формат %d (scanf возвращает 1)
    for (i=0; ; i++) {
        a = realloc((i+1)*sizeof(int));
        if (1 != scanf("%d", &a[i])
            break;
    }
    n = i-1;          // прочитано чисел, памяти выделено на 1 int больше

    // печатаем n первых элементов из массива a и переводим строку
    for (i=0; i<n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");

    // печатаем n первых элементов из массива a еще раз
    for (i=0; i<n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");

    free(a);   // НЕ ЗАБУДЬТЕ ОСВОБОДИТЬ ПАМЯТЬ!

    return 0;
}
-- TatyanaDerbysheva - 14 Nov 2016