Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Array de Struct para funcao ( C )


Guest gege

Pergunta

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

#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);
}

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

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

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

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Visitante

Obrigado pela ajuda

fiz algumas mudanças e mudei de compilador

estava 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 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);
}
[/php]

Link para o comentário
Compartilhar em outros sites

  • 0

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);
}

Link para o comentário
Compartilhar em outros sites

  • 0

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!

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Visitante

Opa, valeu, eu arrumei e testei nos dois jeitos e você estava certo

ele trocava sempre que as strings fossem diferentes

programa.jpg

Valeu, obrigado pelas dicas

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...