Я больше привык к Scheme, но вот решение, которое работает в Lisp:
(defun f (lst)
(labels
((loop (lst atoms lists)
(cond
((null lst)
(append (reverse atoms) (reverse lists)))
((atom (car lst))
(loop (cdr lst) (cons (car lst) atoms) lists))
(T
(loop (cdr lst) atoms (cons (car lst) lists))))))
(loop lst '() '())))
(f '(5 -1 (2 6 1) (8 7 -3) (0 (9 4)) -6))
В основном вы перебираете список, и каждый элемент либо добавляется к списку атомов, либо списку списков.
EDIT
Вариант remove-if, конечно, короче:
(let ((l '(5 -1 (2 6 1) (8 7 -3) (0 (9 4)) -6)))
(append
(remove-if-not #'atom l)
(remove-if #'atom l)))
Вызов srand ()
вне цикла. Вы повторно загружаете его на каждой итерации.
srand ()
заполняет генератор случайных чисел, поэтому вы получаете различную последовательность случайных чисел в зависимости от ввода. Ваш цикл выполняется очень быстро, поэтому вызов time (NULL)
всегда возвращает одно и то же значение. Вы сбрасываетесь на одну и ту же случайную последовательность с каждой итерацией. Как правило, вызывайте srand ()
только один раз в своей программе.
Не вызывайте srand ()
каждый раз в цикле - просто сделайте это заранее.
srand
- это функция, которая «заполняет» генератор случайных чисел. Если вы не знаете, случайные числа в компьютерах на самом деле не случайны. Фактически, у компьютера просто есть список чисел, которые кажутся случайными в нем, и вы используете srand
, чтобы указать ему, где начать в этом списке, при каждом вызове rand ()
возврат следующего элемента в списке.
Причина, по которой вы пишете srand (time (NULL))
, заключается в том, чтобы заставить случайные числа запускаться в какой-то момент, который не будет одинаковым каждый раз при запуске программы (если только программы запускаются одновременно).
Таким образом, вы постоянно говорите программе перезапустить список случайных чисел в одной и той же точке (потому что время одно и то же каждый раз, когда вы проходите цикл). Переместите вызов в srand
вне цикла, и вы получите правильные результаты.
Перед входом в цикл необходимо вызвать srand ()
. srand ()
инициализирует генератор радномных чисел с заданным начальным числом и генерирует уникальную последовательность случайных чисел для этого начального числа.
Ваш цикл выполняется очень быстро, поэтому каждый вызов time (NULL)
дает одно и то же время (измеряется в секундах) - следовательно, вы инициализируете генератор случайных чисел с одним и тем же начальным числом на каждой итерации цикла.
srand(time(NULL));
for(i = 0; i < n; i++){
for(j = 0; j < (n-1); j++){
a[i,j] = rand();
}
}
Неважно. Цифры такие же ...
srand(time(NULL));
for(i = 0; i < n; i++){
printf("%d ", time(NULL));
for(j = 0; j < (n-1); j++){
a[i,j] = rand();
}
}
Вызвать srand один раз вне цикла.
Сергей, вы не получили сообщение об ошибке в версии a[i,j]
только потому, что это вполне корректное выражение. Оператор запятой оценивает подвыражения слева направо и возвращает значение последнего выражения. Таким образом, запись a[i,j]
идентична a[j]
. То, что вы получили в результате печати, было значением указателя на j-й вектор в вашей матрице.
int** a;
int i;
printf("Enter array size: ");
scanf("%d", &n);
if( n < 1 ){
printf("Size should be > 0\n\n");
return NULL;
}
a = (int**)calloc(n, sizeof(int));
for(i = 0; i < n; i++)
a[i] = (int*)calloc(n-1, sizeof(int));
Вот мой массив...