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:  
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.

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






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

×