Jump to content
Carlos7

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

Recommended Posts

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)

Edited by Carlos7

Share this post


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

Share this post


Link to post
Share on other sites
Carlos7

Já percebi a parte do ponteiro.

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

Edited by Carlos7

Share this post


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

Share this post


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

Share this post


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

Edited by Carlos7

Share this post


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

Share this post


Link to post
Share on other sites
Carlos7

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

Estou certo?

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.