Ir ao conteúdo
  • Cadastre-se

C++ ordem alfabetica de vetor linguagem C


Posts recomendados

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

Ola estou tendo dificuldades para colocar o endereço e telefone junto com a ordem dos nomes nesse programa.

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

 typedef struct {
    char nome[50];
    char endereco[50];
    int telefone;
 
}pessoa;


int main (void){
    setlocale (LC_ALL, "Portuguese");
     pessoa p[5];
    int i, x;
     char aux[50], aux2[50];
     char aux3[13];
    
    for(i=0; i<5; i++){
    printf("Digite o Nome da %dº pessoa:",i+1);
    fflush(stdin);
    fgets(p[i].nome, 50, stdin);
    printf("Digite o Endereço:");
    fflush(stdin);
    fgets(p[i].endereco, 50, stdin);
    printf("Digite o Telefone:");
    scanf("%d", &p[i].telefone);
    fflush(stdin);
    
    }
    
    for(i=0;i<5;i++){
        x = strcmp(p[i].nome, p[i+1].nome);
        if(x>0){
          strcpy(aux, p[i].nome);
          strcpy(p[i].nome, p[i+1].nome);
          strcpy(p[i+1].nome,aux);
          
          strcpy(aux2, p[i].endereco);
          strcpy(p[i].endereco, p[i+1].endereco);
          strcpy(p[i+1].endereco, aux2);
          
          strcpy(aux3, p[i].telefone);
          strcpy(p[i].telefone, p[i+1].telefone);
          strcpy(p[i+1].telefone, aux3);
        }
    }
    

printf("-----LISTA DAS PESSOAS EM ORDEM ALFABÉTICA------");

for(i=0; i<5; i++){
    printf("\nNome: %s", p[i].nome);
    printf("\nEndereço: %s", p[i].endereco);
    printf("\nTelefone: %d\n", p[i].telefone);
}    
system ("pause");
    return 0;    
}

 

Link para o comentário
Compartilhar em outros sites

Veja se assim funciona:

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

 typedef struct {
    char nome[50];
    char endereco[50];
    int telefone;
 
}pessoa;


int main (void){
    setlocale (LC_ALL, "Portuguese");
     pessoa p[5];
     int i, x;
     char aux[50], aux2[50];
     int aux3;
    
    for(i=0; i<5; i++){
    printf("Digite o Nome da %dº pessoa:",i+1);
    fflush(stdin);
    fgets(p[i].nome, 50, stdin);
    printf("Digite o Endereço:");
    fflush(stdin);
    fgets(p[i].endereco, 50, stdin);
    printf("Digite o Telefone:");
    scanf("%d", &p[i].telefone);
    fflush(stdin);
    
    }
    
    for(i=0;i<4;i++){
        for (int j=i+1; j < 5; j++)
        {
            x = strcmp(p[i].nome, p[j].nome);
            if(x>0){
                strcpy(aux, p[i].nome);
                strcpy(p[i].nome, p[j].nome);
                strcpy(p[j].nome,aux);
          
                strcpy(aux2, p[i].endereco);
                strcpy(p[i].endereco, p[j].endereco);
                strcpy(p[j].endereco, aux2);
          
                aux3 = p[i].telefone;
                p[i].telefone = p[j].telefone;
                p[j].telefone = aux3;
            }
        }
    }
    

printf("-----LISTA DAS PESSOAS EM ORDEM ALFABÉTICA------");

for(i=0; i<5; i++){
    printf("\nNome: %s", p[i].nome);
    printf("\nEndereço: %s", p[i].endereco);
    printf("\nTelefone: %d\n", p[i].telefone);
}    
system ("pause");
    return 0;    
}

 

Link para o comentário
Compartilhar em outros sites

Em vez de usar uma variável aux para cada campo você pode copiar a estrutura, p.ex,

 

for(int i = 0; i < MAX; i++){
    for(int j = 0; j < MAX - 1; j++){
        if(strcmp(p[j].nome,p[j + 1].nome) > 0){
            pessoa aux;
            memcpy(&aux, &p[j], sizeof(pessoa));
            memcpy(&p[j], &p[j + 1],sizeof(pessoa));
            memcpy(&p[j + 1], &aux, sizeof(pessoa));
        }
    }
}  

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Bom, partindo da suposição de que você não precisa "reinventar a roda", você poderia usar a função qsort que faz essa ordenação.

Spoiler

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


typedef struct {
    char nome[256];
    char telefone[17];
    char endereco[256];
} Pessoa;


int comparar(const void *a, const void *b);

Pessoa getPessoa();


int main() {
    const size_t tamanho = 5;

    Pessoa pessoas[tamanho];

    // --- Poupa tempo
    pessoas[0] = (Pessoa) {"Laura", "22 2222-2222", "Endereco da Laura"};
    pessoas[1] = (Pessoa) {"Rafaela", "11 1111-1111", "Endereco da Rafaela"};
    pessoas[2] = (Pessoa) {"Nayara", "77 7777-7777", "Endereco da Nayara"};
    pessoas[3] = (Pessoa) {"Isabelly", "55 5555-5555", "Endereco da Isabelly"};
    pessoas[4] = (Pessoa) {"Isabelly", "33 3333-3333", "Endereco da Isabely"};
    // --- Poupa tempo

    // Interage com o usuario para cadastrar as pessoas
//    for (int i = 0; i < tamanho; ++i) {
//        printf("Pessoa [ %d de %d ] \n", (i + 1), (int) tamanho);
//        pessoas[i] = getPessoa();
//    }

    qsort(pessoas, tamanho, sizeof(Pessoa), comparar);

    for (int i = 0; i < tamanho; ++i) {
        printf("{nome='%s', telefone='%s', endereco='%s'} \n",
               pessoas[i].nome, pessoas[i].telefone, pessoas[i].endereco);
    }

    return EXIT_SUCCESS;
}


int comparar(const void *a, const void *b) {
    if (a == NULL || b == NULL) return 0;

    Pessoa *p1 = (Pessoa *) a;
    Pessoa *p2 = (Pessoa *) b;

    int status = strcmp(p1->nome, p2->nome);

    if (status != 0) {
        return status;
    } else {
        // Os nomes sao iguais, usa o telefone
        status = strcmp(p1->telefone, p2->telefone);
    }

    if (status != 0) {
        return status;
    } else {
        // Os telefones tambem sao iguais, usa o endereco
        status = strcmp(p1->endereco, p2->endereco);
    }

    return status;
}

Pessoa getPessoa() {
    Pessoa pessoa;

    printf("Digite o nome: ");
    fgets(pessoa.nome, 256, stdin);
    pessoa.nome[strcspn(pessoa.nome, "\n")] = '\0';

    printf("Digite o telefone: ");
    fgets(pessoa.telefone, 17, stdin);
    pessoa.telefone[strcspn(pessoa.telefone, "\n")] = '\0';

    printf("Digite o endereco: ");
    fgets(pessoa.endereco, 17, stdin);
    pessoa.endereco[strcspn(pessoa.endereco, "\n")] = '\0';

    return pessoa;
}

 

 

O critério de ordenação é definido na função comparar, ela realiza as comparações e retorna um int que é usado pela função qsort, esse int é o que indica se os dados que estão sendo comparados precisam ou não ser trocados.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...