Ir para o conteúdo
Carlos7

[Resolvido] Explicação na ordenação

Mensagens Recomendadas

Carlos7

Boas, estou a utilizar esta forma para ordenar os dados de uma estrutura pelo nome.

/*
* File:   main.c
* Author: carlosmendes
*
* Created on 18 de Dezembro de 2012, 11:44
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
unsigned int number;
char nome[25];
} Cliente;
void quickSort(Cliente *cliente, int first, int last) {
int pivot, j, i;
Cliente temp;
if (first < last) {
	pivot = first;
	i = first;
	j = last;
	while (i < j) {
		while (cliente[i].number <= cliente[pivot].number && i < last)
			i++;
		while (cliente[j].number > cliente[pivot].number)
			j--;
		if (i < j) {
			temp = cliente[i];
			cliente[i] = cliente[j];
			cliente[j] = temp;
		}
	}
	temp = cliente[pivot];
	cliente[pivot] = cliente[j];
	cliente[j] = temp;
	quickSort(cliente, first, j - 1);
	quickSort(cliente, j + 1, last);
}
}
/*
*
*/
int main(int argc, char** argv) {
Cliente cliente[5];
int i;
cliente[0].number = 5;
cliente[1].number = 8;
cliente[2].number = 2;
cliente[3].number = 10;
cliente[4].number = 1;
fgets(cliente[0].nome, 25, stdin);
fgets(cliente[1].nome, 25, stdin);
fgets(cliente[2].nome, 25, stdin);
fgets(cliente[3].nome, 25, stdin);
fgets(cliente[4].nome, 25, stdin);

quickSort(cliente, 0, 4);

for(i=0;i<5;i++){
	printf("%d\n", cliente[i].number);
	printf("%s\n", cliente[i].nome);
}

return (EXIT_SUCCESS);
}

Dúvidas:

Está a ser feito de forma correcta?

Porquê ter de utilizar o * na função quickSort. Sem ele dá erros e não funciona.

void quickSort(Cliente *cliente, int first, int last)

Editado por Carlos7

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

eu não olhei para o código do quickSort, se o resultado está correcto para 10 arrays significativamente diferentes, então terás 90% de hipóteses de estar correcto (se bem que 100% seria melhor :D)

respondendo à tua questão de ponteiros, o problema é simples: tu tens uma lista de estruturas, seria impossivel aceder a essa lista dentro da função quickSort de outra forma:

exemplo para uma simples estrutura:

struct S { int i; }

void foo(struct S s) // esta variável é uma estrutura é uma cópia exacta da estrutura passada (mas não é a mesma)
{
 s.i = 101010;
}

int main()
{
 struct S s = {8888};

 foo(s); // as funções em C são sempre de passagem por valor (estas a enviar os dados de s)
 printf("%d\n", s.i);

 return 0;
}

mas para uma lista, existe um conceito de dualidade ponteiro/array, isto quer dizer que um ponteiro pode se comportar como uma lista e uma lista podesse comportar como um ponteiro.

e é por isso que quando envias uma lista para uma função, está na realidade a enviar um ponteiro para a posição de memória onde se encontra a lista/array.

exemplo para perceber como funciona os ponteiros:

struct S { int i; }

void foo(struct S s)
{
 printf("%p\n", &s); // estou a imprimir a posoçºão de memória da variável s declarada na função foo
}

void bar(struct S * s)
{
 printf("%p\n", s); // estou a imprimir a posoçºão de memória da variável s que é um ponteiro
}

int main()
{
 struct S s = {8888};
 struct S * ponteiro = &s;

 printf("%p\n", &s); // estou a imprimir a posoçºão de memória da variável s declarada no main

 foo(s);
 bar(ponteiro);

 return 0;
}

vai ver no output que a primeira linha e a última são iguais enquanto a do meio é diferente


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Carlos7

Já percebi a parte do ponteiro.

Testei com 20 clientes e ordenou correctamente, podes dar uma olhadela ver se está +/- correcto sff?

Editado por Carlos7

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Carlos7

E porque é que eu fizer desta forma, que tenho o contador de clientes dentro de uma estrutura ele não me ordena nada? Não Estou a perceber.

/*
* File:   main.c
* Author: carlosmendes
*
* Created on 18 de Dezembro de 2012, 11:44
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
   unsigned int number;
   char nome[25];
} Cliente;
typedef struct{
   Cliente cliente[5];
} ContadorCliente;
void quickSort(ContadorCliente contadorCliente, int first, int last) {
   int pivot, j, i, k;
   ContadorCliente temp;
   if (first < last) {
    pivot = first;
    i = first;
    j = last;
    k = 0;
    while (i < j) {
	    while (contadorCliente.cliente[i].number <= contadorCliente.cliente[pivot].number && i < last)
		    i++;
	    while (contadorCliente.cliente[j].number > contadorCliente.cliente[pivot].number)
		    j--;
	    if (i < j) {
		    temp.cliente[k] = contadorCliente.cliente[i];
		    contadorCliente.cliente[i] = contadorCliente.cliente[j];
		    contadorCliente.cliente[j] = temp.cliente[k];
	    }
    }
    temp.cliente[k] = contadorCliente.cliente[pivot];
    contadorCliente.cliente[pivot] = contadorCliente.cliente[j];
    contadorCliente.cliente[j] = temp.cliente[k];
    quickSort(contadorCliente, first, j - 1);
    quickSort(contadorCliente, j + 1, last);
   }
}
/*
*
*/
int main(int argc, char** argv) {
   int i;
   ContadorCliente contadorCliente;
   contadorCliente.cliente[0].number = 2;
   contadorCliente.cliente[1].number = 1;
   contadorCliente.cliente[2].number = 5;
   contadorCliente.cliente[3].number = 10;
   contadorCliente.cliente[4].number = 8;
   fgets(contadorCliente.cliente[0].nome, 25, stdin); //Introduzo "dois"
   fgets(contadorCliente.cliente[1].nome, 25, stdin); //Introduzo "um"
   fgets(contadorCliente.cliente[2].nome, 25, stdin); //Introduzo "cinco"
   fgets(contadorCliente.cliente[3].nome, 25, stdin); //Introduzo "dez"
   fgets(contadorCliente.cliente[4].nome, 25, stdin); //Introduzo "oito"

   quickSort(contadorCliente, 0, 5);

   for(i=0;i<5;i++){
    printf("number - %d\n", contadorCliente.cliente[i].number);
    printf("nome - %s\n", contadorCliente.cliente[i].nome);
   }

   return (EXIT_SUCCESS);
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

exemplo para uma simples estrutura:

struct S { int i; }

void foo(struct S s) // esta variável é uma estrutura é uma cópia exacta da estrutura passada (mas não é a mesma)
{
 s.i = 101010;
}

int main()
{
 struct S s = {8888};

 foo(s); // as funções em C são sempre de passagem por valor (estas a enviar os dados de s)
 printf("%d\n", s.i);

 return 0;
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Carlos7

Mas se eu enviar como apontador isto dá-me erros:

quickSort(&contadorCliente, 0, 5); //enviar
void quickSort(ContadorCliente *contadorCliente, int first, int last){
//função
}

Dá-me este erro várias vezes

main.c:31: error: request for member 'cliente' in something not a structure or union

Editado por Carlos7

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

que operador se deve usar para resolver um ponteiro ?

que operador se deve usar para resolver um elemento de uma estrutura ?

qual é que estás a usar ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Carlos7

Estava a user counterStruct.student e deveria usar counterStruct->student.

Estou certo?

Pelo menos alterei isso e está a funcionar....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.