Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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
Postado (editado)

@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

Editado por AnsiC

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
Postado (editado)
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

Editado por AnsiC
  • 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






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

×