Carlos7 Posted December 18, 2012 at 12:43 PM Report Share #487672 Posted December 18, 2012 at 12:43 PM (edited) 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 December 18, 2012 at 12:43 PM by Carlos7 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 18, 2012 at 01:17 PM Report Share #487678 Posted December 18, 2012 at 01:17 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
Carlos7 Posted December 18, 2012 at 02:45 PM Author Report Share #487690 Posted December 18, 2012 at 02:45 PM (edited) Já percebi a parte do ponteiro. Testei com 20 clientes e ordenou correctamente, podes dar uma olhadela ver se está +/- correcto sff? Edited December 18, 2012 at 02:45 PM by Carlos7 Link to comment Share on other sites More sharing options...
Carlos7 Posted December 18, 2012 at 05:36 PM Author Report Share #487715 Posted December 18, 2012 at 05:36 PM 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 More sharing options...
HappyHippyHippo Posted December 18, 2012 at 05:54 PM Report Share #487718 Posted December 18, 2012 at 05:54 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
Carlos7 Posted December 18, 2012 at 05:58 PM Author Report Share #487722 Posted December 18, 2012 at 05:58 PM Podes explicar melhor isso, estou numa parte do dia que já trabalho a carvão :s Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 18, 2012 at 06:07 PM Report Share #487724 Posted December 18, 2012 at 06:07 PM o que estás a enviar para a função é uma cópia da estrutura ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Carlos7 Posted December 18, 2012 at 06:15 PM Author Report Share #487725 Posted December 18, 2012 at 06:15 PM (edited) 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 December 18, 2012 at 06:17 PM by Carlos7 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 18, 2012 at 07:27 PM Report Share #487734 Posted December 18, 2012 at 07:27 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
Carlos7 Posted December 18, 2012 at 09:29 PM Author Report Share #487743 Posted December 18, 2012 at 09:29 PM Estava a user counterStruct.student e deveria usar counterStruct->student. Estou certo? Pelo menos alterei isso e está a funcionar.... Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 18, 2012 at 09:49 PM Report Share #487745 Posted December 18, 2012 at 09:49 PM sim, era isso IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Carlos7 Posted December 18, 2012 at 09:54 PM Author Report Share #487749 Posted December 18, 2012 at 09:54 PM Obrigado 🙂 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now