Guest gege Postado Junho 3, 2008 Denunciar Share Postado Junho 3, 2008 Boa tarde pessoalentão, tenho uma dúvida quanto a estruturas em Ctenho que fazer um programa que permita a entrada de nome, endereço e telefone de 5 pessoas e os imprima em ordem alfabética.até consigo fazer um vetor de estruturas mas o problema é na hora de passar para a funcaoquando eu debugo, ele só pega o primeiro item do array, e esquece os outros.alguém poderia me dar uma luz?? #include <stdio.h> #include <stdlib.h> #define TAM_N 40 #define TAM_E 99 #define TAM_R 5 typedef struct registro { char nome[TAM_N]; char end[TAM_E]; long int tel; }REG; void bubble(REG pess[], int tam); int main(){ REG pess[TAM_R]; for(int i=0;i<TAM_R;i++){ printf("Digite o nome:\n"); gets_s(pess[i].nome); printf("Digite o endereco:\n"); gets_s(pess[i].end); printf("Digite o telefone:\n"); scanf_s("%d",&pess[i].tel); fflush(stdin); } bubble(pess,TAM_R+1); for(int i=0;i<TAM_R;i++){ printf("nome = %s\n",pess[i].nome); printf("endereco = %s\n",pess[i].end); printf("telefone = %d\n",pess[i].tel); } system("pause"); return 0; } void bubble(REG *pess, int tam){ if(tam==0){ return; } REG aux; for(int i=0;i<tam;i++){ if(pess[i].nome>pess[i+1].nome){ //copia a estrutura para um axiliar aux=pess[i]; //troca as posiçoes das estruturas no vetor pess[i]=pess[i+1]; //recupera a estrutura trocada pess[i+1]=aux; } } bubble(pess,tam-1); } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Marcelo Utikawa da Fonseca Postado Junho 3, 2008 Denunciar Share Postado Junho 3, 2008 Eu tenho duas observações:1) Em linguagem C é recomendado que se declarem as variáveis no início do bloco, antes de qualquer código de execução. Inclusive até pouco tempo atrás os compiladores geravam um erro nessa situação.2) Você não pode fazer comparações entre strings diretamente. Assim:pess[i].nome>pess[i+1].nomeNão funciona! Utilize strcmp para comparar strings pois esta função retorna zero se as strings forem iguais ou um valor positivo ou negativo para indicar se a string do primeiro parâmetro é maior ou menor que a outra string, respectivamente. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Visitante Postado Junho 4, 2008 Denunciar Share Postado Junho 4, 2008 Obrigado pela ajudafiz algumas mudanças e mudei de compiladorestava no Visual C++agora estou no DEV C++#include <stdio.h>#include <stdlib.h>#include <string.h>#define TAM_N 40#define TAM_E 99#define TAM_R 5typedef struct registro { char nome[TAM_N]; char end[TAM_E]; long int tel;}REG;void bubble(REG *pess, int tam);int main(){ REG pess[TAM_R]; for(int i=0;i<TAM_R;i++){ printf("\nDigite o nome:\n"); gets(pess[i].nome); printf("Digite o endereco:\n"); gets(pess[i].end); printf("Digite o telefone:\n"); scanf("%d%*c",&pess[i].tel); fflush(stdin); } bubble(pess,TAM_R); for(int i=0;i<TAM_R;i++){ printf("nome = %s\n",pess[i].nome); printf("endereco = %s\n",pess[i].end); printf("telefone = %d\n",pess[i].tel); } system("pause"); return 0;}void bubble(REG *pess, int tam){ if(tam==0){ return; } REG aux; for (int j=tam-1;j>0;j--){ for(int i=0;i<j;i++){ if(strcmp(pess[i].nome,pess[i+1].nome)){ //copia a estrutura para um axiliar aux=pess[i]; //troca as posiçoes das estruturas no vetor pess[i]=pess[i+1]; //recupera a estrutura trocada pess[i+1]=aux; } } } bubble(pess,tam-1);}[/php] Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest gege Postado Junho 4, 2008 Denunciar Share Postado Junho 4, 2008 opa, desculpa, mandei a tag errada #include <stdio.h> #include <stdlib.h> #include <string.h> #define TAM_N 40 #define TAM_E 99 #define TAM_R 5 typedef struct registro { char nome[TAM_N]; char end[TAM_E]; long int tel; }REG; void bubble(REG *pess, int tam); int main(){ REG pess[TAM_R]; for(int i=0;i<TAM_R;i++){ printf("\nDigite o nome:\n"); gets(pess[i].nome); printf("Digite o endereco:\n"); gets(pess[i].end); printf("Digite o telefone:\n"); scanf("%d%*c",&pess[i].tel); fflush(stdin); } bubble(pess,TAM_R); for(int i=0;i<TAM_R;i++){ printf("nome = %s\n",pess[i].nome); printf("endereco = %s\n",pess[i].end); printf("telefone = %d\n",pess[i].tel); } system("pause"); return 0; } void bubble(REG *pess, int tam){ if(tam==0){ return; } REG aux; for (int j=tam-1;j>0;j--){ for(int i=0;i<j;i++){ if(strcmp(pess[i].nome,pess[i+1].nome)){ //copia a estrutura para um axiliar aux=pess[i]; //troca as posiçoes das estruturas no vetor pess[i]=pess[i+1]; //recupera a estrutura trocada pess[i+1]=aux; } } } bubble(pess,tam-1); } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Marcelo Utikawa da Fonseca Postado Junho 4, 2008 Denunciar Share Postado Junho 4, 2008 Ainda não vai funcionar. O if em:if(strcmp(pess[i].nome,pess[i+1].nome)){ será verdadeiro sempre que strcmp retornar um número diferente de zero, ou seja, sempre que as strings forem diferentes! O que você precisa saber é se a primeira string é maior, ou seja, se ela deverá ser colocada depois da segunda string na lista. Assim o correto seria: if(strcmp(pess[i].nome,pess[i+1].nome)>0){Teste o programa e diga se funciona! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Visitante Postado Junho 5, 2008 Denunciar Share Postado Junho 5, 2008 Opa, valeu, eu arrumei e testei nos dois jeitos e você estava certoele trocava sempre que as strings fossem diferentesValeu, obrigado pelas dicas Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Guest gege
Boa tarde pessoal
então, tenho uma dúvida quanto a estruturas em C
tenho que fazer um programa que permita a entrada de nome, endereço e telefone de 5 pessoas e os imprima em ordem alfabética.
até consigo fazer um vetor de estruturas mas o problema é na hora de passar para a funcao
quando eu debugo, ele só pega o primeiro item do array, e esquece os outros.
alguém poderia me dar uma luz??
Link para o comentário
Compartilhar em outros sites
5 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.