Ir ao conteúdo
  • Cadastre-se

C como colocar em ordem alfabética?


Amanda Kellen

Posts recomendados

Preciso criar um programa que coloque em ordem alfabetica as referencias bibliograficas dadas mas não sei como criar uma função que faça isso.Também queria saber o porque na função imprime ai invés de imprimir um ao lado do outro imprime abaixo e porque a editora não aparece.

#include <stdio.h>
 #include <string.h>
 #define TAMANHO1 150
 #define TAMANHO2 50
 #define nlivros 3

 struct TipoLivro
 {
 char NomeAutor[TAMANHO1];
 char titulo[TAMANHO1];
 char cidade[TAMANHO1];
 char editora[TAMANHO2];
 char isbn[TAMANHO2];
 int edicao, volume, ano, pag;
 };

 int main()
 {
 struct TipoLivro VetorLivro[nlivros];
 cadastrarlivro(VetorLivro);
 ordenaLivros(VetorLivro);
 imprime(VetorLivro);
 return 0;
 }

 void cadastrarlivro(struct TipoLivro livro[nlivros])
 {
 int i;
 printf("----------------------------------------\n");
 printf("-----------------CADASTRO---------------\n");
 for(i = 0; i<nlivros; i++)
    {
    printf("Livro %d\n", i+1);

    printf("Digite o nome do autor: ");
    gets(livro[i].NomeAutor);
    printf("\n");

    printf("Digite o titulo do livro: ");
    gets(livro[i].titulo);
    printf("\n");

    printf("Digite o numero da edicao: ");
    scanf("%d", &livro[i].edicao);
    setbuf(stdin,'\0');
    printf("\n");

    printf("Digite o Volume: ");
    scanf("%d", &livro[i].volume);
    setbuf(stdin,'\0');
    printf("\n");

    printf("Digite o cidade de publicacao: ");
    gets(livro[i].cidade);
    printf("\n");

    printf("Digite o nome da editora: ");
    gets(livro[i].editora);
    printf("\n");

    printf("Digite o ano de publicacao: ");
    scanf("%d", &livro[i].ano);
    setbuf(stdin,'\0');
    printf("\n");

    printf("Digite o numero de paginas: ");
    scanf("%d", &livro[i].pag);
    printf("\n");
    setbuf(stdin,'\0');

    printf("Digite o numero de ISBN: ");
    gets(livro[i].isbn);
    printf("\n----------------------------------------\n");

    }
 }
 void imprime(struct TipoLivro livro[nlivros])
 {
  int i;
 printf("----------------------------------------\n");
 printf("-----------------SAIDA------------------\n");
 PRINTF("Referencias Bibliograficas");
 for(i=0;i<nlivros;i++)
  {
  printf("%d -",i+1);
  puts(livro[i].NomeAutor);
  printf(".");
  puts(livro[i].titulo);
  printf(".");
  printf("%d Edicao,",livro[i].edicao);
  printf("%d Volume.",livro[i].volume);
  puts(livro[i].cidade);
  printf(":");
  printf("Editora");
  puts(livro[i].editora);
  printf(",");
  printf("%d .",livro[i].ano);
  printf("%d .",livro[i].pag);
  printf("ISBN ");
  puts(livro[i].isbn);
 }
 printf("----------------------------------------\n");
 }

 

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

  • Membro VIP

Olá @Amanda Kellen.

 

1) ORDENAÇÃO DE VETORES

4 horas atrás, Amanda Kellen disse:

Preciso criar um programa que coloque em ordem alfabetica as referencias bibliograficas dadas mas não sei como criar uma função que faça isso.

 

Como está utilizando vetores, pode usar algum algoritmo de ordenação já existente. Um bastante popular, e de fácil implementação, é o Bubble Sort. O processo de ordenação vetores com struct é análogo a um vetor sem ele, a diferença que em vez de usar o próprio valor da posição do vetor, utilizará o valor de um dos campos struct, algo assim:

 

Pegando como exemplo o código do Wikipedia:

void BubbleSort(int vetor[], int tam) {
    for (int fim = tam-1; fim > 0; --fim) {
        for (int i = 0; i < fim; ++i) {
            if (vetor[i] > vetor[i+1]) {
                int aux = vetor[i];
                vetor[i] = vetor[i+1];
                vetor[i+1] = aux;
            }
        }
    }
}

Observe que está comparando o valor que está em vetor[i ]. Supondo que esse vetor acima está utilizando a struct TipoLivro igual ao do seu código, nesse caso, é necessário definir qual será o parâmetro de ordenação, por exemplo, o NomeAutor....  daí usaria algo assim:

void BubbleSort(int vetor[], int tam) {
    for (int fim = tam-1; fim > 0; --fim) {
        for (int i = 0; i < fim; ++i) {
            if (vetor[i].NomeAutor > vetor[i+1].NomeAutor) {
                int aux = vetor[i];
                vetor[i] = vetor[i+1];
                vetor[i+1] = aux;
            }
        }
    }
}

Obs.: lembrando que é necessário adaptar o algoritmo ao seu código... apenas utilizei esse trecho para exemplificar.

 

Ou seja, o vetor ficará ordenado tomando como base o NomeAutor, entende? a ordenação sempre será relativa a alguma coisa... É como ordenar linhas no Excel... é necessário escolher qual coluna vai servi como parâmetro de ordenação...  aqui você escolhe qual campo da struct vai servi de base.

 

ADENDO: existe ainda a questão caso tenha nomes iguais, ou seja, ai teria (ou não) que usar outro sub-critério... mas ai vai depender da exigência do enunciado.

 

 

 

2) IMPRESSÃO DE TEXTOS

 

4 horas atrás, Amanda Kellen disse:

Também queria saber o porque na função imprime ai invés de imprimir um ao lado do outro imprime abaixo e porque a editora não aparece.

 

Vou tentar explicar como entender os erros e procurar uma solução:

 

Veja, aparentemente você não inseriu nenhum comando para pular a alinha... daí observei que está utilizando o comando puts() (que eu não conheço), apenas dei uma pesquisada no Google...

 

Citação

puts

int puts ( const char * str );

Write string to stdout

Writes the C string pointed by str to the standard output (stdout) and appends a newline character ('\n').

The function begins copying from the address specified (str) until it reaches the terminating null character ('\0'). This terminating null-character is not copied to the stream.

Notice that puts not only differs from fputs in that it uses stdout as destination, but it also appends a newline character at the end automatically (which fputs does not).

 

Fonte: http://www.cplusplus.com/reference/cstdio/puts/

Caso não saiba inglês, é só colocar no Google Translator... mas dá para deduzir.. veja.. lá na 4a linha tem "appends a newline character ('\n')", ou seja, "acrescenta um caractere de nova linha ('\ n').".

 

Resumindo: o comando que está utilizando faz pular a linha a cada escrita... use outro!

 

 

 

***

 

No aguardo.

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

@Amanda Kellen     você quer ordenar os nomes dos autores em ordem alfabética ?, então é do mesmo jeito que para ordenar números, apenas que você precisa passar  todas as letras do nome para maiúsculas e pegar o valor da primeira letra do nome,  e para ordenar struct é como ordenar vetores, mas para facilitar é melhor usar um espaço do struct para armazenar os dados na hora de trocar o maior pelo menor, então usei o primeiro espaço do struct que é o zero, portanto sobrará os espaços de 1 em diante para fazer os cadastros .
        na função imprimir estava confuso e não entendi o que você disse sobre imprimir do lado do outro  então coloquei para imprimir um embaixo do outro mesmo .  no caso de você querer imprimir um do lado do outro não coloque " \n " no printf e quando quiser pular de linha coloque " \n " e a editora está sendo impressa .
  seu código ficou assim :

#include <stdio.h>
#include <string.h>
#define TAMANHO1 150
#define TAMANHO2 50
#define nlivros 3

struct TipoLivro
{
    char NomeAutor[TAMANHO1];
    char titulo[TAMANHO1];
    char cidade[TAMANHO1];
    char editora[TAMANHO2];
    char isbn[TAMANHO2];
    int edicao, volume, ano, pag;
};
char a[30],b[30];
int main(){
     struct TipoLivro VetorLivro[nlivros];
     cadastrarlivro(VetorLivro);
     ordenaLivros(VetorLivro);
     imprime(VetorLivro);
     return 0;
}
int cadastrarlivro(struct TipoLivro livro[nlivros]){
    int i;
    printf("----------------------------------------\n");
    printf("-----------------CADASTRO---------------\n");
    for(i = 1; i<nlivros; i++){
        printf("Livro %d\n", i);
        printf("Digite o nome do autor: ");
        gets(livro[i].NomeAutor);
        printf("\n");
        printf("Digite o titulo do livro: ");
        gets(livro[i].titulo);
        printf("\n");
        printf("Digite o numero da edicao: ");
        scanf("%d", &livro[i].edicao);
        setbuf(stdin,'\0');
        printf("\n");
        printf("Digite o Volume: ");
        scanf("%d", &livro[i].volume);
        setbuf(stdin,'\0');
        printf("\n");
        printf("Digite o cidade de publicacao: ");
        gets(livro[i].cidade);
        printf("\n");
        printf("Digite o nome da editora: ");
        gets(livro[i].editora);
        printf("\n");
        printf("Digite o ano de publicacao: ");
        scanf("%d", &livro[i].ano);
        setbuf(stdin,'\0');
        printf("\n");
        printf("Digite o numero de paginas: ");
        scanf("%d", &livro[i].pag);
        printf("\n");
        setbuf(stdin,'\0');
        printf("Digite o numero de ISBN: ");
        gets(livro[i].isbn);
        printf("\n----------------------------------------\n");
    }
 }
int imprime(struct TipoLivro livro[nlivros]){
    int i;
    printf("----------------------------------------\n");
    printf("-----------------SAIDA------------------\n");
    printf("Referencias Bibliograficas\n");
    for(i=1;i<nlivros;i++){
        printf("%d - Livro\n",i);
        printf("    Autor   -> %s\n",livro[i].NomeAutor);
        printf("    Titulo  -> %s\n",livro[i].titulo);
        printf("    %d Edicao,\n",livro[i].edicao);
        printf("    %d Volume.\n",livro[i].volume);
        printf("    Cidade  -> %s\n",livro[i].cidade);
        printf("    Editora -> ");
        puts(livro[i].editora);
        printf("    Ano Do Livro      -> %d\n",livro[i].ano);
        printf("    Numero De Paginas -> %d\n",livro[i].pag);
        printf("    ISBN ");
        puts(livro[i].isbn);
        printf("\n");
    }
    printf("----------------------------------------\n");
}
int ordenaLivros(struct TipoLivro livro[nlivros]){
    int i,j,n;
    for(i=1;i<nlivros;i++){
        for(j=i+1;j<nlivros;j++){
            strcpy(a,livro[i].NomeAutor);
            for(n=0;n<strlen(a);n++)
                a[n]=toupper(a[n]);
            strcpy(b,livro[j].NomeAutor);
            for(n=0;n<strlen(b);n++)
                b[n]=toupper(b[n]);
            if(a[0] > b[0]){
                livro[0] = livro[i];
                livro[i] = livro[j];
                livro[j] = livro[0];
            }
        }
    }
    return 0;
}

 

  • Curtir 2
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...