Параметры коммандной строки - Си

В условии выполнения работы, есть параметр для выполнения: введите сюда описание изображения

Перевод:

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

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

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

Сам код, если нужен:

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

#define N 3

int square_matrix(int arr_conv[], int arr_res[]) {
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            for (int k = 0; k < N; k++)
                arr_res[i * N + j] = arr_conv[i * N + k] * arr_conv[k * N + j];
    return;
}

int is_digit_prime(int n, short res, int i) {
    for (i; i < n / 2; i++)
        if (n % i == 0)
            res = 0;
    return res;
}

double average(int count, ...)
{
    va_list ap;
    int j;
    double sum = 0;

    va_start(ap, count); /* Требуется последний известный аргумент (чтобы получить адрес первого неизвестного) */
    for (j = 0; j < count; j++) {
        sum += va_arg(ap, double); /* Увеличивает ap до следующего аргумента. */
    }
    va_end(ap);

    return sum / count;
}

int main(int argc, char** argv) {
    /*
    if (argc != 2)
    {
        printf("Usage: prime n");
        return -1;
    }
    int x = atoi(argv[1]);
    */

    srand(time(NULL));

    int arr[N][N];
    int arr_conv[N*N];
    int arr_res[N*N];

    // заполнение массива arr случайными числами
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            arr[i][j] = rand() % 10 + 1;

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("[%d] [%d] -- %d     ", i, j, arr[i][j]);
        }
        printf("\n");
    }

    printf("\n\n");

    // преобразование двумерного массива в одномерный
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            arr_conv[i * N + j] = arr[i][j];

    square_matrix(arr_conv, arr_res);

    int printed_array[N][N];
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            printed_array[i][j] = arr_res[i * N + j];

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("[%d] [%d] -- %d    ", i, j, printed_array[i][j]);
        }
        printf("\n");
    }

    /*---------------------------------------------------------------------*/
    /*---------------------------------------------------------------------*/
    /*---------------------------------------------------------------------*/

    int n;
    n = rand() % 20;
    
    printf("num is: %d\n", n);

    int i = 2;
    short res;

    res = 1;

    if (n > 1)
        res = is_digit_prime(n, res, i);

    else
        res = 0;

    printf("%d", res);

    /*---------------------------------------------------------------------*/
    /*---------------------------------------------------------------------*/
    /*---------------------------------------------------------------------*/

    average(3, 2, 4, 3, 1);

    double avg = average(3.0, 2.0, 4.0, 3.0, 1.0);

    printf("%.2f", avg);

    return 0;
}

Ответы (1 шт):

Автор решения: Sergey

не могу понять что от меня требуется сделать в условии, и как правильно дополнить код.

Переписывать за Вас программу я не буду. А что бы Вам было легче разобраться с тем, что такое аргументы командной строки, поэкспериментируйте с вот такой простенькой программой:

#include <stdio.h>

int main(int argc, char *argv[]) {

    int j;
    
    if (argc == 1) {
        printf("Параметры командной строки не заданы.\n");
    } else {
        printf("Задано %d параметров в командной строке.\n", argc-1);
        for (j=1; j<argc; j++) {
            printf("argv[%d] : %s\n", j, argv[j]);
        }
        printf("Разбор параметров командной строки закончен.\n");
   }
}

Позапускайте её с разным числом параметров. Получится нечто вроде:

$ ./a.out
Параметры командной строки не заданы.

$ ./a.out 111
Задано 1 параметров в командной строке.
argv[1] : 111
Разбор параметров командной строки закончен.

$ ./a.out 111 asd
Задано 2 параметров в командной строке.
argv[1] : 111
argv[2] : asd
Разбор параметров командной строки закончен.

$ ./a.out 111 asd 22/11/2021
Задано 3 параметров в командной строке.
argv[1] : 111
argv[2] : asd
argv[3] : 22/11/2021
Разбор параметров командной строки закончен.
$ 
→ Ссылка