Ir ao conteúdo
  • Cadastre-se
Mpixell

C Ordenar nomes com o comando strcpy

Recommended Posts

Boa tarde,estou a fazer um exercício em que preciso de ordenar apenas os nomes do seguinte programa:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<locale.h>
#include<string.h>
#include<unistd.h>
int j,i,Q=2;
typedef struct agenda{
    char Nome [20];
    char Email[40];
    char observacoes[500];
    typedef struct endereco{
        char Rua[20];
        int  Numero;
        char Complemento[20];
        char Bairro[20];
        char Cep[20];
        char Cidade[20];
        char Estado[20];
        char Pais[20];    
    };
    struct endereco Endereco;
    typedef struct telefone{
        char DDD[10];
        char NumeroTelefone[9];
    };
    struct telefone Telefone;
    typedef struct aniversario{
        int Dia;
        int Mes;
        int Anos;
    };
    struct aniversario Aniversario;
};
struct agenda Agenda[100];
void Inserir()
{
    char sair;
    do{
        for(i=0;i<Q;i++)
        {

            printf("Quandos dados quer introduzir:");
            scanf("%d",&Q);
            system("CLS");
            printf("Dados da %d pessoa:\n",i+1);
            printf("\tNome:");
            fflush(stdin);
            gets(Agenda.Nome);
            printf("\tEmail:");
            fflush(stdin);
            gets(Agenda.Email);
            printf("\tEndereço:\n");
            printf("\t\tRua:");
            fflush(stdin);
            gets(Agenda.Endereco.Rua);
            printf("\t\tNúmero:");
            scanf("%d",&Agenda.Endereco.Numero);
            printf("\t\tComplemento:");
            fflush(stdin);
            gets(Agenda.Endereco.Complemento);
            printf("\t\tBairro:");
            fflush(stdin);
            gets(Agenda.Endereco.Bairro);
            printf("\t\tCep:");
            fflush(stdin);
            gets(Agenda.Endereco.Cep);
            printf("\t\tCidade:");
            fflush(stdin);
            gets(Agenda.Endereco.Cidade);
            printf("\t\tEstado:");
            fflush(stdin);
            gets(Agenda.Endereco.Estado);
            printf("\t\tPais:");
            fflush(stdin);
            gets(Agenda.Endereco.Pais);
            printf("\tTelefone:\n");
            printf("\t\tDDD:");
            fflush(stdin);
            gets(Agenda.Telefone.DDD);
            printf("\t\tNumeto de Telefone:");
            fflush(stdin);
            gets(Agenda.Telefone.NumeroTelefone);
            printf("\tAniversario:\n");
            printf("\t\tDia:");
            scanf("%d",&Agenda.Aniversario.Dia);
            printf("\t\tMês:");
            scanf("%d",&Agenda.Aniversario.Mes);
            printf("\t\tAnos:");
            scanf("%d",&Agenda.Aniversario.Anos);
            printf("Observações:");
            fflush(stdin);
            gets(Agenda.observacoes);
        }
        printf("\nPressione 0 para sair");
        sair=getch();
    }while(sair!='0');
    system("cls");
}
void Ordenar()
{
    int p;
    char NomeO[100][20];
    char sair,aux;
    do{
        for(i=0;i<Q;i++)
        {
            for(j=0;j<20;j++)
            {
                NomeO[j]=NomeO[j];
            }
        }
        for(i=0; i<Q; i++) 
        {
            for(p=0; p<Q; p++) 
                {
                    if(strcmp(NomeO,NomeO)<0)
                    {
                        for(j=0;j<20;j++)
                        {
                            strcpy(aux,NomeO[j]);
                            strcpy(NomeO[j],NomeO[p][j]);
                            strcpy(NomeO[p][j],aux);
                        }
                    }
                }
        }
        printf("Nomes ordenados:\n");
        for(i=0; i<Q; i++)
        {
            for(j=0;j<20;j++)
            {
                printf("%c",NomeO[j]);
            }
            printf("\n");
        }
        printf("\nPressione 0 para sair");
        sair=getch();
    }while(sair!='0');
    system("cls");
}
int main()
{
    setlocale(LC_ALL,"");
    int op;
    do{
        printf("1.Inserir\n2.Ordenar\n");
        printf("Opção:");
        scanf("%d",&op);
        else if(op==1)
        {
            system("CLS");
            Inserir();
        }
        else if(op==2)
        {
            system("CLS");
            Ordenar();
        }
    }while(op!=0);
}

mas estou a ter uns problemas com o comando strcpy e não sei porque, se alguém me puder ajudar agradeço.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Mpixell     na função ordenar, precisa usar o strcpy para carregar a variável Nome[ i ] com Nome[ j ],  e dentro  dos dois loop depois do strcmp, não precisa do outro laço .

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse exercício é uma ótima chance de usar uma árvore binária


Facilita a ordenação e a busca. Já cogitou ? 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eis um pedaço do código

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

struct dados {
	char Nome[20];
	char Email[40];
	char observacoes[500];
	struct endereco {
		char Rua[20];
		char Numero[10];
		char Complemento[20];
		char Bairro[20];
		char Cep[20];
		char Cidade[20];
		char Estado[20];
		char Pais[20];
	} endereco;
	struct telefone {
		char DDD[10];
		char NumeroTelefone[9];
	} telefone;
	struct aniversario {
		int Dia;
		int Mes;
		int Anos;
	} aniversario;
};
typedef struct dados dados;

/* árvore binária com os dados da agenda */
struct agenda {
	struct dados nota;
	struct agenda *maior;
	struct agenda *menor;
};

typedef struct agenda agenda;

/* fim da declaração da árvora binária */

int busca(struct agenda **Raiz, char nome[]) {
	if (*Raiz == NULL) {
		return 0; // não achou
	}
	int compara = strcmp(((*Raiz)->nota.Nome), nome);
	if (compara == 0) { // achou !
		return 1;
	} else if (compara < 0) {
		return (busca(&(*Raiz)->maior, nome));
	} else {
		return (busca(&(*Raiz)->menor, nome));
	}
}
void insercao(struct agenda **Raiz, char nome[]) {
	if (*Raiz == NULL) {
		*Raiz = (agenda *)malloc(sizeof(agenda));
		(*Raiz)->maior = NULL;
		(*Raiz)->maior = NULL;
		strcpy((*Raiz)->nota.Nome, nome);
	} else {
		int compara = strcmp(((*Raiz)->nota.Nome), nome);
		if (compara < 0) {
			insercao(&(*Raiz)->maior, nome);
		} else {
			insercao(&(*Raiz)->menor, nome);
		}
	}
}

void insere_nota(struct agenda **Raiz, struct dados *mais_um) {
	if (*Raiz == NULL) {
		*Raiz = (agenda *)malloc(sizeof(agenda));
		(*Raiz)->maior = NULL;
		(*Raiz)->maior = NULL;
		/* strcpy( (*Raiz)->nota.Nome ,  nome) ;*/
		(*Raiz)->nota = (*mais_um);
	} else {
		int compara = strcmp(((*Raiz)->nota.Nome), (*mais_um).Nome);
		if (compara < 0) {
			insere_nota(&(*Raiz)->maior, mais_um);
		} else {
			insere_nota(&(*Raiz)->menor, mais_um);
		}
	}
}

void exibe_asc(agenda **Raiz) {
	if (*Raiz == NULL) {
		return;
	}
	exibe_asc(&(*Raiz)->menor);
	printf("Nome : %s\nEmail: %s \n\n", (*Raiz)->nota.Nome, (*Raiz)->nota.Email);
	exibe_asc(&(*Raiz)->maior);
}

void exibe_desc(agenda **Raiz) {
	if (*Raiz == NULL) {
		return;
	}
	exibe_desc(&(*Raiz)->maior);
	printf("Nome: %s\nEmai: %s \n\n", (*Raiz)->nota.Nome, (*Raiz)->nota.Email);
	exibe_desc(&(*Raiz)->menor);
}
void mostra(struct dados *entrada) {
	printf("Dados da pessoa:\n");
	printf("\tNome: %s\n",(*entrada).Nome);
	printf("\tEmail:%s\n",(*entrada).Email);
	printf("\tEndereço:\n");
	printf("\t\tRua:%s\n",(*entrada).endereco.Rua);
	printf("\t\tNúmero:%s",(*entrada).endereco.Numero);
	printf("\t\tComplemento:%s",(*entrada).endereco.Complemento);
	printf("\t\tBairro:%s",(*entrada).endereco.Bairro);
	printf("\t\tCep: %s",(*entrada).endereco.Cep);
	printf("\t\tCidade: %s",(*entrada).endereco.Cidade);
	printf("\t\tEstado: %s",(*entrada).endereco.Estado);
	printf("\t\tPais: %s",(*entrada).endereco.Pais);
	printf("\tTelefone:\n");
	printf("\t\tDDD: %s",(*entrada).telefone.DDD);
	printf("\t\tNumeto de Telefone: %s",(*entrada).telefone.NumeroTelefone);
	printf("\tAniversario:\n");
	printf("\t\tDia: %d", &(*entrada).aniversario.Dia);
	printf("\t\tMês: %d", &(*entrada).aniversario.Mes);
	printf("\t\tAnos: %d\n", &(*entrada).aniversario.Anos);
	printf("Observações: %s\n\nA",(*entrada).observacoes);
}

/* função para obter dados do teclado */
void pega_dados(struct dados *entrada) {
	printf("Dados da pessoa:\n");
	printf("\tNome:");
	fflush(stdin);
	gets((*entrada).Nome);
	printf("\tEmail:");
	fflush(stdin);
	gets((*entrada).Email);
	printf("\tEndereço:\n");
	printf("\t\tRua:");
	fflush(stdin);
	gets((*entrada).endereco.Rua);
	printf("\t\tNúmero:");
	fflush(stdin);
	gets((*entrada).endereco.Numero);
	printf("\t\tComplemento:");
	fflush(stdin);
	gets((*entrada).endereco.Complemento);
	printf("\t\tBairro:");
	fflush(stdin);
	gets((*entrada).endereco.Bairro);
	printf("\t\tCep:");
	fflush(stdin);
	gets((*entrada).endereco.Cep);
	printf("\t\tCidade:");
	fflush(stdin);
	gets((*entrada).endereco.Cidade);
	printf("\t\tEstado:");
	fflush(stdin);
	gets((*entrada).endereco.Estado);
	printf("\t\tPais:");
	fflush(stdin);
	gets((*entrada).endereco.Pais);
	printf("\tTelefone:\n");
	printf("\t\tDDD:");
	fflush(stdin);
	gets((*entrada).telefone.DDD);
	printf("\t\tNumeto de Telefone:");
	fflush(stdin);
	gets((*entrada).telefone.NumeroTelefone);
	printf("\tAniversario:\n");
	printf("\t\tDia:");
	scanf("%d", &(*entrada).aniversario.Dia);
	printf("\t\tMês:");
	scanf("%d", &(*entrada).aniversario.Mes);
	printf("\t\tAnos:");
	scanf("%d", &(*entrada).aniversario.Anos);
	printf("Observações:");
	fflush(stdin);
	gets((*entrada).observacoes);

}

int main(void) {
	struct agenda *minha_agenda;
	minha_agenda = NULL;
	struct dados um_cara;
	strcpy(um_cara.Nome, "Criatura");
	strcpy(um_cara.Email, "bokomoko@gmail.com");
	mostra(&um_cara);
	insere_nota(&minha_agenda, &um_cara);
	mostra(&um_cara);
	
	pega_dados(&um_cara);
	insere_nota(&minha_agenda, &um_cara);

	insercao(&minha_agenda, "Joao");
	insercao(&minha_agenda, "Lara");
	insercao(&minha_agenda, "Eduardo");
	insercao(&minha_agenda, "Ana");
	insercao(&minha_agenda, "Joaquim");
	insercao(&minha_agenda, "Bernardo");
	insercao(&minha_agenda, "Diego");

	exibe_asc(&minha_agenda);
	printf("Buscando Ana...\n%d\n", busca(&minha_agenda, "Ana"));
	printf("Buscando Chica..\n%d\n", busca(&minha_agenda, "Chica"));
	printf("Buscando Criatura..\n%d\n", busca(&minha_agenda, "Criatura"));

	return 0;
}

Ainda não está pronto, mas usei uma boa parte do que você definiu. As structs (simplifiquei uns detalhes), a rotina de obtenção de dados.

 

adicionado 26 minutos depois

Pode experimentar rodá-lo aqui

https://repl.it/@bokomoko/Insercao-em-arvore-binaria-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

×