• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

PTtidus_

Ajuda: Algoritmos de Ordenação

7 mensagens neste tópico

Este é o enunciado do exercicio que tou a tentar fazer:

Escreva um programa que ordene alfabeticamente, de forma crescente, as letras existente numa “string” previamente pedida ao utilizador. Esta ordenação deverá ser efectuada num vector auxiliar que será inicializado com os endereços de memória de cada uma das letras existente na “string”. A construção deste vector, o qual é constituído por endereços de memória, não poderá alterar a “string” original. Utilize qualquer um dos métodos de ordenação apresentados nas aulas.

Segue aqui o código que escrevi até agora, com as devidas duvidas como comentário:

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

void ordenarVector(char nome[100], int len);

main()
{
   char nome[100];
   int len ;
   
   printf("Introduza uma palavra\n");
   gets(nome);
   
   len=strlen(nome);
   
   ordenarVector(nome,len);
   
   scanf("%d",&nome);
}

void ordenarVector(char nome[100], int len)
{
   int i, v_aux[len], j, k, pm, aux, x;
   
   for(i=0;i<len;i++)
      v_aux[i]=(int)&nome[i];          //aqui vou passar o endereço de cada letra para a posiçao respectiva do vector auxiliar
      
   //Algoritmo de ordenação por selecção
   
   for(k=0;k<len-1;k++)
   {
      pm=k;
      for(j=k+1;j<len;j++)
         if(nome[pm]>nome[j])     //aqui vou comparar os caracteres dentro da string original
            pm=j;
      aux=v_aux[k];
      v_aux[k]=v_aux[pm];      //e aqui faço a troca mas no vector auxiliar que tem os endereços de memoria de cada letra da string
      v_aux[pm]=aux;
   }


   /*penso que até aqui procedi bem, o problema é que não sei como vou imprimir depois as letras no vector auxiliar. Sendo que dentro do vector auxiliar
estao agora os endereços de cada letra ordenados conforme a posição da letra*/

   for(x=0;x<len;x++)
      printf("%s\n", v_aux[x]);         
}

Se alguem poder ajudar... :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

OK.

Em

void ordenarVector(char nome[ 100 ], int len)

não deve ter tamanho senão o len não faz sentido. Deve ser só ponteiro.

for(k=0;k<len-1;k++) é for(k=0;k<len;k++)

variavel pm,x,k não servem para nada! Basta existir i e j.

Isto "nome[ pm ]>nome[ j ]" não compara caracteres mas sim endereços, que foi o que guardaste em "v_aux[ i ]=(int)&nome[ i ];"

Opa, vou parar por aqui depois ve-se o resto.

PS: Possa, tenho de colocar espaços nos indices dos arrays para aparecer alguma coisa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu estive a ver assim um pouco de rajada e parece-me que esta tudo bem. Sim o codigo pode ser um pouco optimizado sem tantas copias de variaveis mas parece-me que só no fim é que te falta uma coisa.

eu já nao toco em C há anos, e agora estou todo baralhado com a cena dos ponteiros e das referencias.

Portanto... o vector auxiliar tem os endereços de momoria do conteudo que queres... portanto.. para acederes a esse conteudo poes um asterisco antes.

   for(x=0;x<len;x++)
      printf("%s\n", *v_aux[x]);  //repara no asterisco

PS:Nao tenho a certeza se esta é a sintaxe correcta...rui carlos, saco, help!

Está aqui uma explicação bem simples de perceber que vale a pena perder 5 minutos a ler com atenção:

http://gpwiki.org/index.php/C:Pointers_and_References

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pedrotuga:

O que disseste está correcto. Só que ele declara mal a variavel, o que estraga tudo.

A declaração v_aux[len] não só não funciona, devido a que o campo len tenha de ter valor em tempo de compilação, como deveria ser tipo: char  *v_aux[100]; para depois ser dereferênciado como disseste.

Melhor ainda era ser alocado dinamicamente, porque o parametro da função não devia ter um array com 100 elementos se tem uma variavel que indica o numero de elementos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, por isso é que eu estava confuso, faltava la o asterisco na declaração.Era isso entao. A pagina que eu apontei explica a sintaxe de forma simples.

Quanto a alocação dinamica penso que, tratando-se isto de um exercicio didactico o professor dele nao ligará a isso. Ficará para outra aula. Digo eu.

Já que cá estamos tenho a dizer que sou frontalmente contra este tipo de exercicio em que se diz ao aluno o que fazer e como fazer ( mesmo que ele nao perceba a logica ) e basicamente se deixa este a jogar a bulha com a sintaxe em vez de o deixar tentar arranjar formas de resolver problemas.

Com este tipo de exercicios os alunos perguntam, e com razao:

"mas para que é que servem os ponteiros?"

Na verdade neste caso nao servem para nada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

variavel pm,x,k não servem para nada! Basta existir i e j.

O algoritmo de ordenação esta ai tal e qual o prof deu nas aulas, eu tambem ja me tinha apercebido desse facto mas infelizmente o prof mandou-se saber os algoritmos de ordenaçao como ele os deu.

Já que cá estamos tenho a dizer que sou frontalmente contra este tipo de exercicio em que se diz ao aluno o que fazer e como fazer ( mesmo que ele nao perceba a logica ) e basicamente se deixa este a jogar a bulha com a sintaxe em vez de o deixar tentar arranjar formas de resolver problemas.

Com este tipo de exercicios os alunos perguntam, e com razao:

"mas para que é que servem os ponteiros?"

Na verdade neste caso nao servem para nada.

Pois, lá está é que ordenar um vector é bastante facil, e podes faze-lo de bastantes maneiras diferentes, agora fazer deste modo...Embora sirva também para mexer um pouco com ponteiros acho que o exercicio em si foge um bocado aquilo que é o tema.

Ainda não tive tempo de corrigir o codigo, tou a braços com um projecto de outra cadeira. Mas amanha dou noticias. Obrigado a todos pela ajuda.

0

Partilhar esta mensagem


Link 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