Jump to content

correcao na funcao de ordenaçao


guilhoto
 Share

Recommended Posts

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]

Edited by guilhoto
Link to comment
Share on other sites

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.

Edited by Marzkor
Link to comment
Share on other 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;
}
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

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

Edited by guilhoto
Link to comment
Share on other sites

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 ?

Link to comment
Share on other sites

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

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

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

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

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?

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

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