Inu Posted October 11, 2012 Report Share Posted October 11, 2012 (edited) (receber caracteres do usuario e retornar primeiro as letras depois os dígitos na seguinte ordem:A34RGF -> ARGF43#include<stdio.h> #include<stdlib.h> #include<math.h> #include<ctype.h> /*estabelecendo estrutura para receber um caractere*/ struct lista { char caractere; struct lista *prox; }; typedef struct lista list; /*função para inserir uma nova estrutura na lista*/ list *insere(list *L,char c) { list*novo=(list*) malloc(sizeof(list)); novo-> caractere = c; novo-> prox = L; return novo; } /*função para fazer a ordenação de caracteres utilizando um vetor*/ list *ordenar(list *L) { list *p; int cont_dig, cont_caract; int i=0,j=0; for(list *p= L; p!=NULL; p= p->prox) { if(isdigit(p->caractere)) cont_dig++; else cont_caract++; } char *vetor=(char*) malloc(cont_dig*sizeof(char)); /*Alocando espaço na memoria para o vetor de digitos*/ char *vetor2=(char*) malloc(cont_caract*sizeof(char)); /*Alocando espaço na memoria para vetor de caracteres*/ for(list *p= L; p!=NULL;p= p->prox) { if(isdigit(p->caractere)) { vetor[i]= p->caractere; i++; } else { vetor2[j]= p->caractere; j++; } } vetor[i] = ''; vetor2[j] = ''; list *organizado; organizado = NULL; for(i=j-1;i>=0;i--) { organizado=insere(organizado,vetor[i]); } for(i=0;i<j;i++) { organizado=insere(organizado,vetor2[j]); } return organizado; } /*função para imprimir*/ void imprime(list *L) { list *p = L; while(p!= NULL) { printf("%c",p->caractere); p= p->prox; } } main() { char caractere_user; int valor=0; list*L; L=NULL; switch(valor) { case 0 : { printf("Digite um caractere\n"); scanf("%c", caractere_user); fflush(stdin); L=insere(L , caractere_user); printf("Voce deseja digitar outro caractere?\n(0=SIM)(1=não)"); scanf("%d",valor); fflush(stdin); } case 1 : { printf("Voce optou por não digitar mais caracteres\n"); break; } default: { printf("Valor inexistente\nERRO\n"); exit(0); } } L= ordenar(L); imprime(L); system("pause"); }Galera não tá compilando, e eu não consigo achar o erro! Passa pelo run, porém dá erro durante o .exeAlguém poderia me ajudar? Vlw Edited October 11, 2012 by Inu Quote Link to comment Share on other sites More sharing options...
0 Septimus C Posted October 12, 2012 Report Share Posted October 12, 2012 o comando scanf() no switch() do main() está sem o & Quote Link to comment Share on other sites More sharing options...
0 Inu Posted October 12, 2012 Author Report Share Posted October 12, 2012 (edited) #include<stdio.h> #include<stdlib.h> #include<math.h> #include<ctype.h> /*estabelecendo estrutura para receber um caractere*/ struct lista { char caractere; struct lista *prox; }; typedef struct lista list; /*função para inserir uma nova estrutura na lista*/ list *insere(list *L,char c) { list*novo=(list*) malloc(sizeof(list)); novo-> caractere = c; novo-> prox = L; return novo; } /*função para fazer a ordenação de caracteres utilizando um vetor*/ list *ordenar(list *L) { list *p; int cont_dig, cont_caract; int i=0,j=0; for(list *p= L; p!=NULL; p= p->prox) { if(isdigit(p->caractere)) cont_dig++; else cont_caract++; } char *vetor=(char*) malloc(cont_dig*sizeof(char)); /*Alocando espaço na memoria para o vetor de digitos*/ char *vetor2=(char*) malloc(cont_caract*sizeof(char)); /*Alocando espaço na memoria para vetor de caracteres*/ for(list *p= L; p!=NULL;p= p->prox) { if(isdigit(p->caractere)) { vetor[i]= p->caractere; i++; } else { vetor2[j]= p->caractere; j++; } } vetor[i] = ''; vetor2[j] = ''; list *organizado; organizado = NULL; for(i=j-1;i>=0;i--) { organizado=insere(organizado,vetor[i]); } for(i=0;i<j;i++) { organizado=insere(organizado,vetor2[j]); } return organizado; } /*função para imprimir*/ void imprime(list *L) { list *p = L; while(p!= NULL) { printf("%c",p->caractere); p= p->prox; } } main() { char caractere_user; int i,numero_caract; list*L; L=NULL; printf("Digite o numero de caracteres que voce deseja ordenar\n"); scanf("%d", &numero_caract); for(i=0;i<=numero_caract;i++) { printf("Digite um caractere\n"); scanf("%c", &caractere_user); fflush(stdin); L=insere(L , caractere_user); fflush(stdin); } L= ordenar(L); imprime(L); system("pause"); }Vlw!Agora já da pra entrar os caracteres, porém mais a frente o mesmo erro persiste, da a mensagem ''o programa parou de funcionar''.. Edited October 12, 2012 by Inu Quote Link to comment Share on other sites More sharing options...
0 Marcelo Utikawa da Fonseca Posted October 16, 2012 Report Share Posted October 16, 2012 Boa tarde!Seguem minhas considerações:1) Dentro do for na função de ordenar você está declarando list *p. Mas ele já havia sido declarado no início da função! Use apenas "p=L" no for.2) Não precisa carregar o zero no final dos vetores já que você não vai exibir a string em um printf, por exemplo.3) O loop para criação da nova lista ordenada está com os contadores incorretos. Apenas crie uma nova variável e incremente-a até i ou j.4) Sempre que usar o scanf podem sobrar caracteres não utilizados no buffer como a quebra de linha. O fflush(stdin) é errado e não deve ser usado! Uma forma simples de descartar o \n é como a seguir:scanf("%d", &valor); // O \n fica no buffer scanf("%d%*c", &valor); // um caracter após o final é lido e descartado. \n é removido! Use desta forma 5) O loop que carrega os caracteres pede 1 a mais do que deveria. O correto é usar o operador "<" e não "<=" na comparação 6) Lembre-se sempre de adicionar uma quebra de linha após exibir um texto. A saída da função imprime não tem a quebra e embaralha com a mensagem do comando "pause" (que por sinal dá erro aqui pois uso o linux, evite usar a função system!) Segue abaixo o código completo já funcionando: #include<stdio.h> #include<stdlib.h> #include<math.h> #include<ctype.h> /*estabelecendo estrutura para receber um caractere*/ struct lista { char caractere; struct lista *prox; }; typedef struct lista list; /*função para inserir uma nova estrutura na lista*/ list *insere(list *L,char c) { list*novo=(list*) malloc(sizeof(list)); novo-> caractere = c; novo-> prox = L; return novo; } /*função para fazer a ordenação de caracteres utilizando um vetor*/ list *ordenar(list *L) { list *p; int cont_dig, cont_caract, cont; int i=0,j=0; for(p= L; p!=NULL; p= p->prox) { if(isdigit(p->caractere)) cont_dig++; else cont_caract++; } char *vetor=(char*) malloc(cont_dig*sizeof(char)); /*Alocando espaço na memoria para o vetor de digitos*/ char *vetor2=(char*) malloc(cont_caract*sizeof(char)); /*Alocando espaço na memoria para vetor de caracteres*/ for(p= L; p!=NULL;p= p->prox) { if(isdigit(p->caractere)) { vetor[i]= p->caractere; i++; } else { vetor2[j]= p->caractere; j++; } } list *organizado; organizado = NULL; for(cont=0;cont<i; cont++) { organizado=insere(organizado,vetor[cont]); } for(cont=0;cont<j; cont++) { organizado=insere(organizado,vetor2[cont]); } return organizado; } /*função para imprimir*/ void imprime(list *L) { list *p = L; while(p!= NULL) { printf("%c",p->caractere); p= p->prox; } } main() { char caractere_user; int i,numero_caract; list*L; L=NULL; printf("Digite o numero de caracteres que voce deseja ordenar\n"); scanf("%d%*c", &numero_caract); for(i=0;i<numero_caract;i++) { printf("Digite um caractere\n"); scanf("%c%*c", &caractere_user); fflush(stdin); L=insere(L , caractere_user); fflush(stdin); } L= ordenar(L); imprime(L); printf("\n"); system("pause"); }Abraços,Marcelo Utikawa da Fonseca Quote Link to comment Share on other sites More sharing options...
Question
Inu
(receber caracteres do usuario e retornar primeiro as letras depois os dígitos na seguinte ordem:
A34RGF -> ARGF43
Galera não tá compilando, e eu não consigo achar o erro! Passa pelo run, porém dá erro durante o .exe
Alguém poderia me ajudar? Vlw
Edited by InuLink to comment
Share on other sites
3 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.