guilhoto Posted March 31, 2013 at 01:39 AM Report #500968 Posted March 31, 2013 at 01:39 AM (edited) 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 March 31, 2013 at 01:44 AM by guilhoto
Marzkor Posted March 31, 2013 at 01:46 AM Report #500969 Posted March 31, 2013 at 01:46 AM Mas não podes ter uma matriz de INT?
guilhoto Posted March 31, 2013 at 02:02 AM Author Report #500971 Posted March 31, 2013 at 02:02 AM 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
Marzkor Posted March 31, 2013 at 02:14 AM Report #500973 Posted March 31, 2013 at 02:14 AM Mas qual é realmente o problema ?
guilhoto Posted March 31, 2013 at 02:15 AM Author Report #500974 Posted March 31, 2013 at 02:15 AM e que nao ta a ordenar...basicamente andei a fazer um rastreio e ele nao imrpime nenhuma string...
Marzkor Posted March 31, 2013 at 03:21 AM Report #500975 Posted March 31, 2013 at 03:21 AM (edited) 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 March 31, 2013 at 03:40 AM by Marzkor
HappyHippyHippo Posted March 31, 2013 at 06:13 AM Report #500980 Posted March 31, 2013 at 06:13 AM (edited) #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 March 31, 2013 at 06:14 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Marzkor Posted March 31, 2013 at 10:36 AM Report #500989 Posted March 31, 2013 at 10:36 AM happy isso n vale 🙂 e o algoritmo?
guilhoto Posted March 31, 2013 at 12:01 PM Author Report #500996 Posted March 31, 2013 at 12:01 PM (edited) 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 March 31, 2013 at 11:55 AM by guilhoto
Marzkor Posted March 31, 2013 at 01:57 PM Report #501006 Posted March 31, 2013 at 01:57 PM 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 ?
guilhoto Posted March 31, 2013 at 03:44 PM Author Report #501015 Posted March 31, 2013 at 03:44 PM 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
HappyHippyHippo Posted March 31, 2013 at 10:30 PM Report #501042 Posted March 31, 2013 at 10:30 PM 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 Portugol Plus
guilhoto Posted March 31, 2013 at 11:48 PM Author Report #501051 Posted March 31, 2013 at 11:48 PM fiz copy paste e deu.me erros no sscanf...
HappyHippyHippo Posted April 1, 2013 at 01:37 AM Report #501053 Posted April 1, 2013 at 01:37 AM e que tal (ao menos) dizer dizer que erros te dão ??? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
guilhoto Posted April 2, 2013 at 02:00 PM Author Report #501246 Posted April 2, 2013 at 02:00 PM (edited) 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 April 2, 2013 at 02:03 PM by guilhoto
HappyHippyHippo Posted April 2, 2013 at 02:14 PM Report #501249 Posted April 2, 2013 at 02:14 PM 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 Portugol Plus
guilhoto Posted April 2, 2013 at 02:17 PM Author Report #501252 Posted April 2, 2013 at 02:17 PM 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?
guilhoto Posted April 2, 2013 at 02:29 PM Author Report #501260 Posted April 2, 2013 at 02:29 PM alterei o teu for para for (iter=modalidade_size-1; iter>=0; iter--) assim ja me da correcto 🙂 . muito obrigado pela paciencia happy
HappyHippyHippo Posted April 2, 2013 at 02:53 PM Report #501261 Posted April 2, 2013 at 02:53 PM 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 Portugol Plus
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