Ir ao conteúdo
  • Cadastre-se

C código de ordenação e comparação


DogTroll633

Posts recomendados

Boa Noite, estou com dificuldade em resolver um erro nesse comparativo de string

o erro é que nomes maiores que 7 da erro, e não estou conseguindo entender o porque

 

#include <stdio.h>
#include <strings.h>

int main(void)
{
    char vetor [5][10];  // primeira dimensão é o vetor, segunda é a palavra
    char aux [10];
    int i, j; 

    for (i = 0; i < 5; i++)
      {
         printf ("Informe as palavras que compoem o vetor: ");
         scanf ("%s", &vetor[i]);
      }
      
// bubblesort
    for (i = 0; i < 5; i++)
         for (j = 0; j < 5; j++)
         {
             if (strcmp(vetor[j], vetor[j+1]))   /// compara strcmp(   ,   )  ==> 1 
             {
                 strcpy(aux, vetor[j]);       // strcpy (   ,  );
                 strcpy(vetor[j], vetor[j+1]);
                 strcpy(vetor[j+1], aux);
             }
         }
         
    printf ("Palavras que compoem o vetor ordenado apos BubbleSort: ");
    for (i = 0; i < 5; i++)
    {
         printf (" %s \n", vetor[i]);
    }

}

 

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

1 hora atrás, DogTroll633 disse:

o erro é que nomes maiores que 7 da erro, e não estou conseguindo entender o porque

 

escreveu o algoritmo errado. Apesar de o nome não estar certo, a ideia do bubblesort é de bubble, bolha em inglês. E você compara dois elementos a partir do início, invertendo quando estiver fora de ordem.

 

O modo como é descrito e implementado é mais para uma âncora do que para uma bolha, mas assim é o clássico. Eu postei aqui uma solução com uma animação, em C ou C++ que você pode rodar em sua máquina e ajuda a entender o mecanismo. E a entender um pouco dessas animações em programas de console. Pode ver o fonte aqui no forum mesmo.

 

Seu programa não está bom.

 

Em especial NUNCA use variáveis globais. Muito menos com nomes ingênuos como i e j.

 

Teste sempre o retorno de scanf()

 

SEMPRE declare as variáveis de controle do for DENTRO do comando

 

NUNCA escreva um programa interativo a toa. Qual o propósito de ficar inventando vetores para testar seu programa toda vez? 

 

Use arquivos e constantes. É muito, mais muito mais fácil.

 

E veja isso:
 

    char vetor [][10] = 
    {
        "clube",
        "do",
        "hardware",
        "forum",
        "C",
        "C++",
        "C#"  
    };

 

Não acha muito mais fácil testar seu programa com um vetor assim? Ou é melhor ficar digitando a cada teste?

 

Arrume os índices. O algoritmo está errado.

Tem uma referência para o programa que postei em '19 aqui:

 


E essa imagem talvez ajude a entender o que o programa mostra e como o algoritmo funciona: o par em amarelo é uma comparação do loop. Os números em azul já desceram e estão em ordem.

 

image.png.aac4824db3e8d0a814de92c282970343.png

 

 

 

 

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

@DogTroll633     por que você acredita que as palavras maiores de 7 dêem problemas  ?   ,  pois não dá ,  o que pode acontecer é que do modo como você colocou o scanf ,  ele só pega os caracteres digitados até encontrar um espaço em branco ,  e o que vier depois será descartado ,  e outra coisa é que esse bubblesort está errado ,  o j+1 acaba pegando um elemento que não existe no vetor de apenas cinco posições ,  e ele pega o da sexta posição ,  e cporrigindo essa parte , seu código fica assim    :

#include <stdio.h>
#include <strings.h>

int main(void)
{
    char vetor [5][10];  // primeira dimensão é o vetor, segunda 
                         // é a qtd de caracteres da  palavra menos um
                         // pois precisa de uma posição para o '\0'
                         // finalizador de string's
    char aux [10];       // string q pode armazenar até 9 caracteres 
                         // e o último será o '\0' q marca o fim da string
    int i, j;

    for (i = 0; i < 5; i++)
      {
         printf ("Informe as palavras que compoem o vetor: ");
         scanf ("%s", &vetor[i]);
      }

    // bubblesort
    for (i = 0; i < 4; i++)
         for (j =i+1; j < 5; j++)
         {
             if ( strcmp(vetor[i], vetor[j]) > 0 ) /// compara strcmp( 1ª  , 2ª  )  ==> 1
             {                                     /// se o val do cod ASCII da 1ª 
                                                   /// letra é maior q o da 2ª letra
                 strcpy(aux     , vetor[j]);       /// strcpy (   ,  );
                 strcpy(vetor[j], vetor[i]);
                 strcpy(vetor[i],      aux);
             }
         }

    printf ("Palavras que compoem o vetor ordenado apos BubbleSort:\n");
    for (i = 0; i < 5; i++) printf ("\t%d -> %s\n",i+1, vetor[i]);
    return 0;
}

 

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

11 horas atrás, DogTroll633 disse:
#include <strings.h>

O nome correto é string.h (sem s)

 

11 horas atrás, DogTroll633 disse:
scanf ("%s", &vetor[i]);

Para a entrada de strings não use o operador de endereço, então remova o &.

 

11 horas atrás, DogTroll633 disse:
for (j = 0; j < 5; j++)

Nesse loop interno onde está j < 5 deixe como: j < 5 - i - 1 (ou apenas j < 4 - i).

 

11 horas atrás, DogTroll633 disse:
if (strcmp(vetor[j], vetor[j+1]))

No teste lógico em C tudo que é zero é falso e o que for diferente de disso (positivo ou negativo) é verdadeiro. A função strcmp pode retornar três valores: zero, negativo ou positivo. Então quando você deixa a sua condicional assim será verdadeira em dois casos, por isso faltou usar o operador > ou < para ordenar corretamente: > 0 para ordem crescente ou < 0 decrescente.

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

1 hora atrás, Midori disse:

Para a entrada de strings não use o operador de endereço, então remova o &.

Isso está certo, mas não aqui, @Midori Preste atenção à declaração de vetor. vetor não é string. vetor é char[ ][10] e precisa sim do operador &. vetor é um vetor de ponteiros para char

 

Evite o uso de constantes a todo custo, como em

 

1 hora atrás, Midori disse:

Nesse loop interno onde está j < 5 deixe como: j < 5 - i - 1 (ou apenas j < 4 - i).

 

1 hora atrás, devair1010 disse:
for (i = 0; i < 4; i++)
         for (j =i+1; j < 5; j++)
         {

 

12 horas atrás, DogTroll633 disse:
    for (i = 0; i < 5; i++)
         for (j = 0; j < 5; j++)

 

Isso é um pesadelo e sempre vai cair na sua cabeça. Se mudar o tamanho vai ter que alterar esses números mágicos em toda parte, um 1nf3rn0

 

Como fazer?
 

O vetor foi declarado 
 

    char vetor [5][10];


e assim esse trecho
 

    // quantos tem no vetor? n
    int     n = sizeof(vetor) / sizeof(vetor[0]);
    printf( "\nvetor com %d elementos\n\n",  n);

 

calcula n como o número de ítens e é muito mais seguro usar isso no algoritmo, usando o operador sizeof

 

1 hora atrás, devair1010 disse:
    // bubblesort
    for (i = 0; i < 4; i++)
         for (j =i+1; j < 5; j++)

 

Esse não é o algoritmo conhecido por bubble sort. veja o desenho que eu postei:
 

image.png.ad2788b894cc5119379efe6fed56c69e.png

 

 

O par comparado "desce" junto no algoritmo tradicional --- como uma âncora e não como uma bolha.

  • Curtir 1
  • Obrigado 1
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...