Ir ao conteúdo
  • Cadastre-se
Jessé P. de Melo

C Manipulando struct(s) linguagem C

Recommended Posts

Olá. 

Estou fazendo o seguinte exercicio.

10 - Utilizando uma estrutura, faça um programa que permita a entrada de nome, endereço e telefone de 5 pessoas e os imprima em ordem alfabética.

Nesse exercício terei que fazer trocas de posições de um vetor com dado tipo strutc. É possível fazer atribuição de uma estrutura com outra? ex: strutc1=struct2.

 

Segue código que fiz ate agr, esta dando erro na hora de montar. Não sei se é isso ou  o do-while não tenho muita pratica com esse comando.

 

Segue código.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main(void){
    int teste;
    struct lista_tel{
        char nome[30];
        char tel[16];
    };

    struct lista_tel lista[5];
    struct lista_tel troca;

    for(int x=0;x<5;x++){
        printf("Digite um nome: ");
        scanf("%99[^\n]*c",lista[x].nome);
        printf("Digite um numero :") ;
        scanf("%99[^\n]*c",lista[x].tel);
        printf("\n");
    }

    do{
        teste=0;
        for(int x=0;x<5;x++){
            if (lista[x].nome[0]>lista[x+1].nome[0]){
                troca = lista[x];
                lista[x]=lista[x+1];
                lista[x+1]=troca;
                teste=1;
            }
    }while(teste!=0);
        }
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Jessé P. de Melo

Sim, você pode atribuir assim como faz com as variáveis primitivas.

Editei seu código, teste para ver se agora estar fazendo próximo de ideal.

#include <stdio.h>
#define SIZE_DB 5u


int main( void )
{
     struct lista_tel
     {
          char nome [98];
          char tel  [16];
          char endereco [30];
     };
     struct lista_tel lista [SIZE_DB];
     char   scanner [] = { " %99[^\n]" };
     char * printer [] = { "%s, %s\n"
                          , "%s" };
     char * message [] = { "Digite um nome: "
                          , "Digite um numero: "
                          , "Digite um endereco: "
                          , "Nome, Telefone" };
          for( unsigned x = 0; x < SIZE_DB; ++x ){
                    printf( printer [1], message [0] );
                     scanf( scanner, lista [x].nome );
                    printf( printer [1], message [1] );
                     scanf( scanner, lista [x].tel );
                    printf( printer [1], message [2] );
                     scanf( scanner, lista [x].endereco );

                    putchar( '\n' );
                    }
     unsigned teste;
     struct lista_tel troca;
          do{
               teste = 0;
               for( unsigned x = 1; x < SIZE_DB; ++x ){
                         if( lista [x].nome [0] < lista[x-1].nome [0] ){
                                   troca       = lista [x];
                                   lista [x]   = lista [x-1];
                                   lista [x-1] = troca;

                                   teste = 1;
                                   }
                         }
               } while( teste != 0 );
     unsigned  index = 0;
          puts( message [3] );
          do{
               printf( printer [0], lista [index].nome, lista [index].tel );
               } while( ++index != SIZE_DB );
	return 0;
}

Qualquer dúvida é só perguntar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa a dmr, apareceu serviço...

Enfim... Vou me basear no seu para fazer o meu funcionar.

Por que usou incremento pré-fixado?

5 horas atrás, AnsiC disse:

for( unsigned x = 1; x < SIZE_DB; ++x )

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC Peço decupla pelo primeiro script nem compilou. Antes de envia-lo modifiquei algumas partes para utilizar recursos que o pessoal do fórum esta ensinando, acabou por não dar certo...Vou programar da maneira que fica mais comodo, quando tiver problemas do meu modo testo de outro...

Enfim, entendi o seu algoritmo e adaptei o meu a sua logica.

Segue:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main(void){
    int teste;
    struct lista_tel{
        char nome[30];
        char tel[16];
    };

    struct lista_tel lista[5];
    struct lista_tel troca;

    troca.nome[29]='\0';
    troca.tel[15]='\0';

    for(int x=0;x<5;x++){
        printf("Digite um nome: ");
        scanf("%s",lista[x].nome);
        fflush(stdin);
        printf("Digite um numero :") ;
        scanf("%%s",lista[x].tel);
        fflush(stdin);
        printf("\n");
    }

        do{
            teste=0;
            for(int x=1;x<5;++x){
                if(lista[x].nome[0]<lista[x-1].nome[0]){
                troca       = lista [x];
                lista [x]   = lista [x-1];
                lista [x-1] = troca;
                teste=1;
                }
            }

        }while(teste!=0);

    for(int x=0;x<5;x++){
        printf("%s\t",lista[x].nome);
    }
}

 

adicionado 3 minutos depois
7 horas atrás, AnsiC disse:

char * printer [] = { "%s, %s\n" , "%s" }; char * message [] = { "Digite um nome: " , "Digite um numero: " , "Digite um endereco: " , "Nome, Telefone" };

Sei o que esse trecho faz mas preferi não executar desse modo. Ponteiros é um tema sei só teoria, e só mais pra frente que vou praticar. Melhor fazer uma coisa de cada vez... No entanto já valeu a pena porque não sabia que dava pra usar ponteiros assim 

 

7 horas atrás, AnsiC disse:

char * printer [] = { "%s, %s\n" , "%s" };

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Jessé P. de Melo disse:

Desculpa a dmr, apareceu serviço...

Ok!

 

2 horas atrás, Jessé P. de Melo disse:

Por que usou incremento pré-fixado?

Não faz diferença se pré ou pós. Entretanto, pós-incremento exige em qualquer situação mais um local de memória para Recall, é um processo extra sem utilidade. Daí o motivo de pré-incremento.

 

52 minutos atrás, Jessé P. de Melo disse:

Sei o que esse trecho faz mas preferi não executar desse modo. Ponteiros é um tema sei só teoria, e só mais pra frente que vou praticar. Melhor fazer uma coisa de cada vez...

Normal cada código diz muito da personalidade de seu programador; você tem o seu, eu tenho o meu, da mesma forma que adaptei o teu para meu, adaptou o meu para teu!

Com relação aos ponteiros, eu penso que vem antes de estrutura de dados, pelo menos, a maioria dos autores indexa; vetores, matrizes e ponteiros no mesmo capítulo do livro.

 

 

 

 

:thumbsup: valeu

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×