C программа для сортировки 3 случайных чисел, void reorder3 (int a, int * b, int ** c); - PullRequest
1 голос
/ 08 ноября 2011

Этот код работает, но это не совсем то, что я хочу.У кого-нибудь есть идеи, как сделать это правильно и без q sort ?.Идея состоит в том, чтобы понять, как использовать указатели.Три числа должны быть случайными в диапазоне от -3 до 12. Код ниже - что-то похожее и самое близкое, которое я нашел.Любая помощь приветствуется.Заранее спасибо!!.

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

//functions
int compare(const void *a, const void *b)
{
   const int *ia = a;
   const int *ib = b;

   if (*ia < *ib)
      return -1;
   else if (*ia > *ib)
      return +1;

   return 0;
}

//qsort function
void sort3(int *a, int *b, int *c)
{
   int temp[3];

   temp[0] = *a;
   temp[1] = *b;
   temp[2] = *c;

   qsort(temp, 3, sizeof(int), &compare);

   *a = temp[0];
   *b = temp[1];
   *c = temp[2];
}

//random function
int rand_int(int a, int b)
{
return rand()%(b-a+1)+a;
}

int main(void)
{

   //declaration of variables
   int a,b,c;
   int rand_int(int a, int b);
   srand(time(0));  
   a = rand_int(-3,12);
   b = rand_int(-3,12);
   c = rand_int(-3,12);

   printf("%i %i %i\n", a, b, c);
   sort3(&a, &b, &c);
   printf("%i %i %i\n", a, b, c);

   return 0;
}

Ответы [ 2 ]

7 голосов
/ 08 ноября 2011

Вам не нужна функция compare(), если вы не хотите использовать qsort().

Вы можете переписать sort3() так:

void compare_and_swap(int *a, int *b) {
    int t;
    if (*a > *b) {
        t = *a;
        *a = *b;
        *b = t;
    }
}

void sort3(int *a, int *b, int *c) {
    compare_and_swap(a, b);
    compare_and_swap(a, c);
    compare_and_swap(b, c);
}

Это на самом деле " пузырьковая сортировка ".

0 голосов
/ 08 ноября 2011

Это сложная задача для сортировки 3 целых чисел. Используйте операторы if.

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

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

...