Попытка написать программу для заполнения массива случайными числами в C - PullRequest
0 голосов
/ 04 ноября 2019

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

Я должен ввести значения с помощью компиляторанапример, "./filename 0 100", где 0 - это минимум, а 100 - это максимум.

Затем он должен заполнить массив из 10 элементов случайными числами (0-100). Я так близко, просто не могу понять основную функцию.

Кроме того, как я могу напечатать массив {0,1,2,3} в формате "[0,1,2,3]"включая запятые, без вида «[0,1,2,3,]»

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

int getRandom(int min, int max);  
void fillArray(int data[], int size, int min, int max); 
void printArray(int data[], int size);

int main(int argc, char *argv[]) {
    int a;   
    int b;
    if (argc>=3){
        a = atoi(argv[1]);
        b = atoi(argv[2]);
        int arr[10];
        printf("\t An array with random values from 0 to 100 \n");
        fillArray(arr,10 ,a, b);
        printArray(arr, 10);
    } else {
        printf("Incorrect number of arguments - please call with assignment min max\n");
    }
    return 0; 
}

int getRandom(int min, int max) {
   int result = 0;   
   int low = 0;   
   int high = 0;
   if (min<max) {
       low = min;
       high = max+1;    
   } else {     
       low = max + 1;   
       high = min;  
   }

   result = (rand() % (high-low)) + low; 
   return result;
}

void fillArray(int data[], int size, int min, int max){
   int i;
   for(i=min ; i < max+1; i++){
       data[i] = getRandom(min,max);
   }
}

void printArray(int data[], int size){
    int i;
    printf("[");
    for(i=0; i<size; i++){
        printf("%d,", data[i]);
    }
    printf("]");
}

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Я согласен с @Steve Friedl, что основная проблема вашей программы заключается в функции fillArray. Там i должно быть от 0 до size.

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

void printArray(int data[], int size) {
    printf("[");   
    for (int i = 0; i < size; i++) {
        printf("%d", data[i]);
        if (i < size - 1)
            printf(",");
    }   
    printf("]");
}

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

void printArray(int data[], int size) {
    printf("[");   
    for (int i = 0; i < size; i++) {
        printf("%d%c", data[i], i < size-1 ? ',' : ']');
    }
}

Кроме того, в вашей основной функции вы должны включить aи b в вашей печати:

printf("\t An array with random values from %d to %d \n", a, b);
0 голосов
/ 04 ноября 2019

Я считаю, что это взрывает вас:

void fillArray(int data[], int size, int min, int max){
   int i;
   for(i=min ; i < max+1; i++){   // <-- HERE
       data[i] = getRandom(min,max);
   }
}

Вызывающая функция выделяет 10 элементов в массиве arr, и это передается как параметр size, но вы неиспользуя этот параметр, чтобы ограничить заполнение массива. Если значение max равно 100, то оно пытается заполнить сто слотов вместо десяти.

   for (i = 0; i < size; i++)
      data[i] = getRandom(min,max);

должно решить хотя бы эту проблему.

РЕДАКТИРОВАТЬ: запятая, я предпочитаю добавлять запятые перед пунктов, если это не первый. В этом случае это не имеет большого значения, но оно более общее, особенно для списков переменной длины, где вы не знаете, что находитесь в конце, пока не дойдете до этого. Дополнение полезного ответа от @JohanC:

void printArray(int data[], int size) {
    printf("[");   
    for (int i = 0; i < size; i++) {
        if (i > 0) printf(",");
        printf("%d", data[i]);
    }   
    printf("]");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...