Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

guilhoto

correcao na funcao de ordenaçao

Mensagens Recomendadas

guilhoto

void ordena_l3(void){
 while(y<6){
	   while(lu<26){
				 j=0;
				 while(j<26){
					 if(modalidades[j][y]<modalidades[j+1][y]){
								 strcpy(temp, modalidades[j]);
								 strcpy(modalidades[j],modalidades[j+1]);
								 strcpy(modalidades[j+1],temp);
										 }
					 j++;
					 }
			 lu++;
			 }
 y++;
 }
}

ora eu tenho 1 string que apresenta uma letra seguida de um espaco e 4 numeros. quero ordenar pelo maior numero. o modalidades[j][0] e a letra o modalidades[j][1] o espaco e o modalidades[j][2] e o 1º algarismo o modalidades[j][3] o 2º algarismo ate ao modalidades[j][5] que e o 4º algarismo.

o que tento e ordenar esses algarismos por ordem crescente. mas penso que nao esteja a dar...

modalidades esta definido como modalidades[26][7]

Editado por guilhoto

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Marzkor

não tens nenhum printf

void main(){

char tmp,modalidade [26][6]={ {"A 612"} , {"B 231"} ,{"C 123"}};
int j,i,n;

for (i=0;i<26;i++){
	for(n=2;n<5;n++){
		for(j=2;j<5;j++){
			if (modalidade[i][j]>modalidade[i][j+1] && modalidade[i][j+1]!='\0'){
				tmp=modalidade[i][j];
				modalidade[i][j]=modalidade[i][j+1];
				modalidade[i][j+1]=tmp;
			}

		}

	}		

}

}

Acho que da para fazer melhor mas não tive paciência.

Editado por Marzkor

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo
#include <stdio.h>

#define ELEM_SIZE 7

int compare(void * a, void * b)
{
 int int_a = 0, int_b = 0;

 sscanf(a, "%*c %d", &int_a);
 sscanf(b, "%*c %d", &int_b);

 return int_a - int_b;
}

int main()
{
 int iter = 0;

 // 1 string que apresenta uma letra seguida de um espaco e 4 numeros
 char modalidade[][ELEM_SIZE]={ {"A 6124"} , {"B 2312"} ,{"C 1231"}};
 int modalidade_size = sizeof (modalidade) / ELEM_SIZE;

 qsort(modalidade,      // ponteiro para o array
       modalidade_size, // numero de elementos do array
       ELEM_SIZE,       // tamanho de cada elemento
       compare);        // função de comparação

 for (; iter < modalidade_size; iter++)
 {
     printf("%s\n", modalidade[iter]);
 }

 return 0;
}

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
guilhoto

happy isso da-me uma catrufada de erros :S

não tens nenhum printf

void main(){

char tmp,modalidade [26][6]={ {"A 612"} , {"B 231"} ,{"C 123"}};
int j,i,n;

for (i=0;i<26;i++){
	for(n=2;n<5;n++){
		for(j=2;j<5;j++){
			if (modalidade[i][j]>modalidade[i][j+1] && modalidade[i][j+1]!='\0'){
				tmp=modalidade[i][j];
				modalidade[i][j]=modalidade[i][j+1];
				modalidade[i][j+1]=tmp;
			}

		}

	}		

}

}

Acho que da para fazer melhor mas não tive paciência.

acho que isso nao so ordena os termos mas tambem os numeros individualmente dentro da string...por exemplo essa atribuicao que deste do A 612, B231, C 123,

o que queria que desse desse era assim, A 612 B 231 C 123. acho que o que isso vai dar e A 126 B123 C 123

mas penso que trocando o teu 1º for com o 2º for ja da bem...

outro exemplo...queria que A 612 B 231 C 312 desse A 612 C312 B 231...

Editado por guilhoto

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Marzkor

void ordena_l3(void){
 while(y<6){
	   while(lu<26){
				 j=0;
				 while(j<26){
					 if(modalidades[j][y]<modalidades[j+1][y]){
								 strcpy(temp, modalidades[j]);
								 strcpy(modalidades[j],modalidades[j+1]);
								 strcpy(modalidades[j+1],temp);
										 }
					 j++;
					 }
			 lu++;
			 }
 y++;
 }
}

ora eu tenho 1 string que apresenta uma letra seguida de um espaco e 4 numeros. quero ordenar pelo maior numero. o modalidades[j][0] e a letra o modalidades[j][1] o espaco e o modalidades[j][2] e o 1º algarismo o modalidades[j][3] o 2º algarismo ate ao modalidades[j][5] que e o 4º algarismo.

o que tento e ordenar esses algarismos por ordem crescente. mas penso que nao esteja a dar...

modalidades esta definido como modalidades[26][7]

Mas n queres ordenar os algarismos nas strings ? E tens 26 Strings e cada string tem um tamanho de 6 ?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
guilhoto

sim tenho 26 strings com tamanho de 6...1 letra 1 espaco e 4 0's que depois no resto do programa aumentam...

mas dessas 26 strings e tendo em conta o numero que ta nesses 4 0's...quero ordenalas...para que a string com o maior numero fique em 1º e a string c o menor numero em ultimo...

tenho 26 strings pq tenho 26 letras...as letras do alfabeto xD

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

happy isso n vale :) e o algoritmo?

ninguém disse que era para implementar uma algoritmo de ordenação ...

happy isso da-me uma catrufada de erros :S

o código só tens dois problemas :

- falta o include do stdlib.h

- os argumentos da função de comparação deveriam ser "const"

mas nenhum dos problemas é critico, sem -Werror o compilador come isso

se dá erros é porque andas a mudar o que apresentei com código para fazer algo que não dizes. código esse que deverá ter erros


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
guilhoto

desculpa a demora

invalid conversion from `void*' to `const char*'

initializing argument 1 of `int sscanf(const char*, const char*, ...)'

da estes dois erros para os dois sscanf

Editado por guilhoto

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

não são erros, são warnings (a não ser que uses a flag -Werror)

cheira-me que andas a usar um compilador de c++ que não gosta das conversões de void * para um ponteiro de um outro tipo qualquer ...

mas mesmo assim, se o problema é mesmo os casts ...

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

#define ELEM_SIZE 7

int compare(const void * a, const void * b)
{
 int int_a = 0, int_b = 0;

 sscanf((const char *)a, "%*c %d", &int_a);
 sscanf((const char *)b, "%*c %d", &int_b);

 return int_a - int_b;
}

int main()
{
 int iter = 0;

 // 1 string que apresenta uma letra seguida de um espaco e 4 numeros
 char modalidade[][ELEM_SIZE]={ {"A 6124"} , {"B 2312"} ,{"C 1231"}};
 int modalidade_size = sizeof (modalidade) / ELEM_SIZE;

 qsort(modalidade,      // ponteiro para o array
       modalidade_size, // numero de elementos do array
       ELEM_SIZE,       // tamanho de cada elemento
       compare);        // função de comparação

 for (; iter < modalidade_size; iter++)
 {
     printf("%s\n", modalidade[iter]);
 }

 return 0;
}


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
guilhoto

happy so 1 cena...o meu objectivo era ordenalos de forma decrescente...do maior para o menor, esse programa nao ordena do menor para o maior?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
guilhoto

alterei o teu for para for (iter=modalidade_size-1; iter>=0; iter--) assim ja me da correcto :) . muito obrigado pela paciencia happy

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

alterei o teu for para for (iter=modalidade_size-1; iter>=0; iter--) assim ja me da correcto :) . muito obrigado pela paciencia happy

solução errada !!

para ordenar inversamente, o que é necessário fazer não é apresentar o array por ordem inversa, mas sim alterar a ordem de comparação dos elementos da função de comparação:

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

#define ELEM_SIZE 7

int compare(const void * a, const void * b)
{
 int int_a = 0, int_b = 0;

 sscanf((const char *)a, "%*c %d", &int_a);
 sscanf((const char *)b, "%*c %d", &int_b);

//  return int_a - int_b;
 return int_b - int_a;  // <-------------
}

int main()
{
 int iter = 0;

 // 1 string que apresenta uma letra seguida de um espaco e 4 numeros
 char modalidade[][ELEM_SIZE]={ {"A 6124"} , {"B 2312"} ,{"C 1231"}};
 int modalidade_size = sizeof (modalidade) / ELEM_SIZE;

 qsort(modalidade,      // ponteiro para o array
       modalidade_size, // numero de elementos do array
       ELEM_SIZE,       // tamanho de cada elemento
       compare);        // função de comparação

 for (; iter < modalidade_size; iter++)
 {
     printf("%s\n", modalidade[iter]);
 }

 return 0;
}


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

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.