2015-01-26 4 views
0

Я хочу создать программу в C, которая создает N пар (х, у) случайных чисел, соблюдая следующие условия:Сформировать массив случайных разных чисел

  • N представляет собой случайное число в диапазоне от 5 до 13;
  • все пары (xi, yi) различны;
  • абсолютная разница между всеми х и у элементов, по крайней мере 2.

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

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

Пока я писал эти функции:

int different (int i, int N, int adress) 
{ 
// write something to get the array back from the address of first element  
int count = 0; 
for (int k=0; k<i; k++) 
    { 
     if (array[k][0]=array[i][0] && array[k][1]=array[i][1]) 
     count++; 
    } 
    return count; 
} 

/

int distance (int x, int i, int N, int adress) 
{ 
// write something to get the array back from the address of first element 
    int count=0; 
    for (int k = 0; k < i; ++k) 
    { 
     if (abs(array[i][x]-array[k][x]) < 2) 
      count++; 
    return count; 
    } 
} 

/

type coordinates (void) 
{ 
    N = rand()%8 + 5; 
    int array[N][2]; 
    for (int i = 0; i < N; ++i) 
    { 
     do 
     { 
      int x = rand()%60 - 30; 
      int y = rand()%60 - 30; 
     } while (different(i, N, adress)>0 || distance(x, i, N, adress) || distance (y, i, N, adress)); 
     array[i][0] = x; 
     array[i][1] = y; 
    } 
} 

На самом деле я не знаю, как дать параметров от одной функции к другой. Я думаю, что я должен использовать указатели, но не знаю, как это сделать.

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

Спасибо заранее! :)

+0

'N = rand()% 8 + 5;' -> 'N = rand()% (13-5 + 1) + 5;' – chux

ответ

0

Прежде всего я рекомендовал бы делать что-то вроде этого (хотя это не обязательно):

struct complex_number { 
    int real; 
    int img; 
}; 

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

int is_candidate(struct complex_number *array, size_t size, struct complex_number candidate)

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

Внутри этой функции вы можете придерживаться своих функций, но у вас есть некоторые проблемы с правильным синтаксисом C на данный момент. Есть два основных вопроса: вы никогда не передаете фактический массив, и для сравнения вы используете =, что является назначением, где вы должны использовать ==.

Так же, как, например:

//impelement your functions - left out 
int is_same(struct complex_number c1, struct complex_number c2); 
int check_distance(struct complex_number c1, struct complex_number c2); 

int is_candidate(struct complex_number *array, size_t size, struct complex_number candidate){ 
    int i; 
    for (i = 0; i < size; ++i){ 
     if (is_same(array[i], candidate) 
     || !(check_distance(array[i], candidate)){ 
      return false; 
     } 
    } 
    return true; 
} 

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

0
  1. Изменение 5 до 13 генератора: 5,6,7,8,9,10,11,12,13 9 номеров

    // N = rand()%8 + 5; 
    N = rand()%9 + 5; 
    
  2. ли сравнивать, а не назначение в different()

    // if (array[k][0]=array[i][0] && array[k][1]=array[i][1]) 
    if (array[k][0]==array[i][0] && array[k][1]==array[i][1]) 
    
Смежные вопросы