2014-11-05 3 views
0

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

Моя попытка:

#include <stdio.h> 

int main() 
{ 
    int p = 0; 
    int s; 
    int aRRay[1001]; 
    printf("\n Enter size of an array to fill random numbers: "); 
    scanf("%i",s); 
    printf("%i",fillArray(aRRay,p,s)); 

} 
int fillArray(int aRRay[],int p, int s) 
{ 
    srand((unsigned)time(NULL)); 
    int ran = rand()%1001; 
    aRRay[p] = ran; 
    if(p>s) 
    { 
     return 0; 
    } 

    else 
    { 
     return fillArray(aRRay,++p,s); 
    } 
} 

Этот код аварии. Я не уверен, поставил ли я последний вывод printf в главном не в том месте. Вместо того, чтобы помещать его в основную часть, могу ли я поместить его в функцию fillArray и использовать рекурсию для распечатки один за другим?

+1

scanf («% i», & s) может быть хорошим началом – Alexis

+0

Во-первых, зачем рекурсия? В чем проблема с итерацией? Во-вторых, 'srand (time)' будет делать следующее: rand() 'возвращает одно и то же значение почти каждый раз (« время »имеет разрешение 1 секунду). Наконец, не 'fillArray' всегда возвращает 0? – Skizz

ответ

0

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

  1. вы должны передать адрес переменной:

    scanf("%i", &s); 
    

    плюс вы должны check the count of the scan'd items, чтобы убедиться, что чтение было успешным.

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

    int fillArray(int aRRay[], int p, int s) 
    { 
        if (p >= s) 
        { 
         return 0; 
        } 
        else 
        { 
         srand((unsigned)time(NULL)); 
         int ran = rand() % 1001; 
         aRRay[p] = ran; 
    
         return fillArray(aRRay, ++p, s); 
        } 
    } 
    

Example

+0

Прочитайте документацию по [scanf (3)] (http://man7.org/linux/man-pages/man3/scanf.3.html). Обратите внимание, что он может выйти из строя. Вы должны использовать & проверить результат (количество отсканированных элементов) 'scanf'. –

+0

Я был скорее на «исправлении ошибок», а на полной обработке ошибок, но я упомяну, что это правильно. Спасибо –

1

Несколько вещей явно неправильно в этом коде, многие из которых будут генерировать предупреждения, которые вы должны были адресованы уже:

В общем:

  • srand() и rand() определены в stdlib.h, которые вы не включили.
  • time() определено в time.h, которое вы не можете включить.
  • Вы не пропустите intадрес по номеру scanf в качестве выходной цели.
  • Вы не проверяете результат своего звонка scanf.
  • Вы имеете дело с величинами, которые должны быть неподписанными типами. Даже если вы исправите вышеуказанные пункты, кто-то может ввести -5, и ваш код будет с удовольствием проанализировать его и перейти к неопределенному поведению.
  • Если номер stdout является буферизированным по строке, ваше приглашение ввода не будет видно без флеша.
  • Если вы собираетесь использовать жесткий лимит на свой размер массива (1001 в вашем случае), это значение должно быть принудительно введено после корректного чтения размера ввода для вашего массива.
  • fillArray не имеет официального прототипа перед его первым использованием в main(). Поэтому предполагается, что функция принимает произвольное число аргументов и возвращает int.

В функции генерации:

  • Ты катапультирование логика делается слишком поздни, и с неправильным состоянием.
  • Вы не должны звонить srand() в функции заполнения. Его следует вызывать от main() при запуске процесса раз.
  • Незначительное: вам не нужно передавать как текущее входное гнездо, так и длину. Вы заполняете все слоты, поэтому будет достаточным нисходящий слот, основанный на значении, или увеличивающий целевой указатель через указатель-арифметику.

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

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

int fillArray(int arr[], unsigned int s); 

int main() 
{ 
    unsigned int s = 0; 
    int arr[1001]; 

    srand((unsigned)time(NULL)); 

    printf("Enter size of an array to fill random numbers: "); 
    fflush(stdout); 

    if (scanf("%u",&s) == 1 && s < sizeof(arr)/sizeof(*arr)) 
     printf("%d\n", fillArray(arr,s)); 

} 

int fillArray(int arr[], unsigned int s) 
{ 
    if (s) 
    { 
     *arr = rand() % 1001; 
     return fillArray(arr+1, --s); 
    } 
    return 0; 
} 
+0

, и вы не имеете дело с случаем, когда пользователь вводит 2000 – pm100

+0

@ pm100 's WhozCraig

+0

+1 для полноты. Nitpick: '--s' должно быть' s-1'. Результат тот же, но первый - плохой стиль, когда вам не нужно изменять переменную. Это также будет соответствовать «arr + 1». – interjay

Смежные вопросы