Jump to content

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


Carlos7

Recommended Posts

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)

Edited by Carlos7
Link to comment
Share on other sites

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 😄 )

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
Link to comment
Share on other sites

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);
}
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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

Edited by Carlos7
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.