Jump to content
guilhoto

correcao na funcao de ordenaçao

Recommended Posts

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]

Edited by guilhoto

Share this post


Link to post
Share on other sites
guilhoto

e como e que meto o caracter do modalidades[j][0]?...e q essa cena e um caracter nao pode tar numa cena de inteiros

Share this post


Link to post
Share on other sites
guilhoto

e que nao ta a ordenar...basicamente andei a fazer um rastreio e ele nao imrpime nenhuma string...

Share this post


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

Edited by Marzkor

Share this post


Link to post
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

Share this post


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

Edited by guilhoto

Share this post


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

Share this post


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

Share this post


Link to post
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

Share this post


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

Edited by guilhoto

Share this post


Link to post
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

Share this post


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

Share this post


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

Share this post


Link to post
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

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.