Ir ao conteúdo

Posts recomendados

Postado

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
Postado
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
Postado

@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
Postado
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
Postado
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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!