Ir ao conteúdo
  • Cadastre-se

C Ordenar nomes em um vetor


s4lezardv1A

Posts recomendados

Boa tarde pessoal. Estou aprendendo C faz pouco tempo. Aprendi os condicionais e estruturas de repetição(if else,switch,while,for,do while). Agora estou em vetores. Estou com um exercicio aqui que pede para incluir 10 nomes("Andre","Maria","Marcio","Bruno","Henrique","Zoraide","Daniel","Danilo","Zuleica","Adriano) e colocar em um vetor de 10 posiçoes e depois colocar em ordem crescente. Ja fiz um exercicio que era pra colocar numeros em ordem crescente mas de nomes nunca fiz. Como faria? A linguagem C só aceita um caractere por vez isso? eu teria que usar uma string né,fica assim? O que eu tentei ate agora:

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


int main()
{
    system ("title NOME EM ORDEM CRESCENTE THIAGO");
int i,j,aux,cont=0;
char vetor[10][10] = {"Andre","Maria","Marcio","Bruno","Henrique","Zoraide","Daniel","Danilo","Zuleica","Adriano"};




for (i=0;i<10;i++)
printf("%s\n",vetor[i]);


return 0;
}

 

1] Ate agora eu consegui imprimir os nomes, eu fiz da maneira certa? fiz um vetor CHAR de 10 posições com um maximo de 10 caracteres cada, é isso? e na hora da escrita eu coloco %s para dizer que é uma string, isso?

 

2] Como eu comparo 2 nomes para ver se é maior ou não dentro de um vetor?

 

 

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

1 hora atrás, s4lezardv1A disse:

Já fiz um exercício que era pra colocar números em ordem crescente mas de nomes nunca fiz

É a mesma coisa, fará apenas alguns substituições.

Quando com números, podemos comparar diretamente,  com string isso não é possível para tanto usamos um função chamada strcmp cprogressivo.net e para realizar a cópia no instante que precisamos trocar os valores usamos também mais um função strcpy cprogressivo.net. Mais alguma dúvida?

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

6 minutos atrás, AnsiC disse:

É a mesma coisa, fará apenas alguns substituições.

Quando com números, podemos comparar diretamente,  com string isso não é possível para tanto usamos um função chamada strcmp cprogressivo.net e para realizar a cópia no instante que precisamos trocar os valores usamos também mais um função strcpy cprogressivo.net. Mais alguma dúvida?

usarei dois FOR para isso então?

para usar essa função incluo string.h isso?

como é a estrutura dessa função strcmp?pode me mostrar a formatação q uso para usa la?

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

2 minutos atrás, s4lezardv1A disse:

usarei dois FOR para isso então?

Para essa questão sim, pois será o mesmo algoritmo que usou em números, se com eles usou dois FOR com string será igual.

 

3 minutos atrás, s4lezardv1A disse:

para usar essa função incluo string.h isso?

como é a estrutura dessa função strcmp?pode me mostrar a formatação q uso para usa la?

Para mais detalhes é só clicar nos nomes que são links, tudo está vem explicado lá. Na mesma pagina há também um atalho para Wikipedia onde tudo já foi escrito. 

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

Precisa usar um algoritmo de ordenação, o algoritmo mais usado por iniciantes é o bubble sort, e funciona da mesma forma que com números, só muda que ao invés de comparar números agora compara strings.

 

Para comparar strings seguindo a ordem alfabética usa-se a função strcmp() da biblioteca string.h. E postei aqui uma explicação de como funciona:

 

E outra função da biblioteca string.h necessária é a strcpy() que serve para copiar strings para um vetor de chars, assim:

char vet1[] = "abcd";
char vet2[10];
char vet3[10];

strcpy(vet2, "123456789"); //guarda a string "123456789" em vet2

strcpy(vet3, vet1); //guarda a string "abcd" de vet1 em vet3

 

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

32 minutos atrás, isrnick disse:

Precisa usar um algoritmo de ordenação, o algoritmo mais usado por iniciantes é o bubble sort, e funciona da mesma forma que com números, só muda que ao invés de comparar números agora compara strings.

 

Para comparar strings seguindo a ordem alfabética usa-se a função strcmp() da biblioteca string.h. E postei aqui uma explicação de como funciona:

 

E outra função da biblioteca string.h necessária é a strcpy() que serve para copiar strings para um vetor de chars, assim:


char vet1[] = "abcd";
char vet2[10];
char vet3[10];

strcpy(vet2, "123456789"); //guarda a string "123456789" em vet2

strcpy(vet3, vet1); //guarda a string "abcd" de vet1 em vet3

 

Estou tentando achar algum lugar explicando como comparar strings dentro de um vetor, estou achando só comparação normal, tentei fazer isso:

 

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


int main()
{
    system ("title NOME EM ORDEM CRESCENTE THIAGO");
int i,j,cont=0;
char aux[10];
char vetor[10][10] = {"Andre","Maria","Marcio","Bruno","Henrique","Zoraide","Daniel","Danilo","Zuleica","Adriano"};





for (i=0;i<10;i++)
{
    for (i=j;i<10;i++)
    {
        if (strcmp(vetor[i], vetor[j]) > 0);
        {
             strcpy(aux[10],vetor[i]);
            strcpy(vetor[i],vetor[j]);
            strcpy(vetor[j],aux[10]);

        }



    }
}
printf("vetor em ordem:\n\n");
for (i=0;i<10;i++)
{
   printf("%s\n",vetor[i]);
}

return 0;
}

mas ainda n achei a solução, estou procurando ainda... se puderem me dar uma ajuda...

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

12 minutos atrás, isrnick disse:

O problema está aqui:


strcpy(aux[10],vetor[i]);
strcpy(vetor[i],vetor[j]);
strcpy(vetor[j],aux[10]);

Deveria ser:


strcpy(aux,vetor[i]);
strcpy(vetor[i],vetor[j]);
strcpy(vetor[j],aux);

 

alterei aux[10] para somente aux mas ainda o vetor aparece sem ordenar. na declaração das variaveis aux tem que ser aux[10] mesmo né? para poder receber palavras com ate 10 caracteres isso? Onde pode ser q eu esteja errando?

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

35 minutos atrás, AnsiC disse:

Tem dois laços for de contador i.

verdade, consertei, coloquei :

or (i=0;i<10;i++)
{
    for (j=0;i<10;i++)
    {
        if (strcmp(vetor[i], vetor[j]) >  0);
        {
             strcpy(aux,vetor[i]);
            strcpy(vetor[i],vetor[j]);
            strcpy(vetor[j],aux);

        }

Agora melhorou, mas ainda assim não ordenou todos os nomes, ficou incompleto, ficou:

 

Adriano/Andre/Maria/Marcio/Bruno/Henrique/Zoraide/Daniel/Danilo/Zuleica;

O que pode ser?

 

Mais uma pergunta, para declarar a variavel aux é assim mesmo?:

char aux[10];

esse 10 reserva 10 espaços de caracteres isso? mas na função strcpy não necessito colocar aux[10] porque?

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

Ainda continua dois laços for com contador i

adicionado 1 minuto depois
47 minutos atrás, AnsiC disse:

Os dois laços for estão contando i. Quando o certo é um laço para i, e outro laço com ii.


for (int i = 0; i  <  10; i++){
      for (int ii = i; ii  <  10; ii++){
      /*
         Aqui vem o resto do algoritmo
       */
      } }

 

 

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

1 minuto atrás, AnsiC disse:

Ainda continua dois laços for com contador i

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


int main()
{
    system ("title NOME EM ORDEM CRESCENTE THIAGO");
int i,j,cont=0;
char aux[10];
char vetor[10][10] = {"Andre","Maria","Marcio","Bruno","Henrique","Zoraide","Daniel","Danilo","Zuleica","Adriano"};





for (i=0;i<10;i++)
{
    for (j=0;j<10;j++)
    {
        if (strcmp(vetor[i], vetor[j]) >  0);
        {
             strcpy(aux,vetor[i]);
            strcpy(vetor[i],vetor[j]);
            strcpy(vetor[j],aux);

        }



    }
}

printf("vetor em ordem:\n\n");
for (i=0;i<10;i++)
{
   printf("%s\n",vetor[i]);
}

return 0;
}

perdão, arrumei, ainda fica incompleto.

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

Tem um ; no fim da linha do if que não deveria estar lá:

if (strcmp(vetor[i], vetor[j]) >  0);

 

Aqui está como poderia ficar usando bubble sort:

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


int main()
{
    system ("title NOME EM ORDEM CRESCENTE THIAGO");
    int i,j,cont=0;
    char aux[10];
    char vetor[10][10] = {"Andre","Maria","Marcio","Bruno","Henrique","Zoraide","Daniel","Danilo","Zuleica","Adriano"};

    for (i=0; i<10; i++)
    {
        for (j=0; j<9; j++)
        {
            if (strcmp(vetor[j], vetor[j+1]) > 0)
            {
                strcpy(aux, vetor[j]);
                strcpy(vetor[j], vetor[j+1]);
                strcpy(vetor[j+1], aux);
            }
        }
    }

    printf("vetor em ordem:\n\n");
    for (i=0; i<10; i++)
    {
        printf("%s\n",vetor[i]);
    }

    return 0;
}

 

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

@s4lezardv1A 

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

int main (){
    int i, ii;
    char aux[10], vetor[10][10] = {
        "Andre", "Maria", "Marcio", "Bruno", "Henrique", "Zoraide", "Daniel",
        "Danilo", "Zuleica", "Adriano" };
        for (i = 0; i < 10; i++){
              for (ii = i; ii < 10; ii++){
                    if (strcmp(vetor[i], vetor[ii]) >  0){
                          strcpy (aux, vetor[i]);
                          strcpy (vetor[i], vetor[ii]);
                          strcpy (vetor[ii], aux); }}}

    system ("title NOME EM ORDEM CRESCENTE THIAGO");
    printf("vetor em ordem:\n\n");
    for (i = 0; i < 10; i++){
          printf("%s\n",vetor[i]); }
    return  0; }

 

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

25 minutos atrás, AnsiC disse:

Porque tem ; no final da declaração IF?

porque esqueci isso afff, face palm para mim!!!!

Agora deu certo. 

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


int main()
{
    system ("title NOME EM ORDEM CRESCENTE THIAGO");
int i,j,cont=0;
char aux[10];
char vetor[10][10] = {"Andre","Maria","Marcio","Bruno","Henrique","Zoraide","Daniel","Danilo","Zuleica","Adriano"};





for (i=0;i<10;i++)
{
    for (j=0;j<10;j++)
    {
        if (strcmp(vetor[i], vetor[j]) >  0)
        {
             strcpy(aux,vetor[i]);
            strcpy(vetor[i],vetor[j]);
            strcpy(vetor[j],aux);

        }



    }
}

printf("vetor em ordem:\n\n");
for (i=0;i<10;i++)
{
   printf("%s\n",vetor[i]);
}

return 0;
}

Desculpem incomodar vcs, mas queria pedir um favor, se puderem rodar esse codigo ai. porque aqui ele ta dando em ordem decrescente, e para dar em ordem crescente eu tenho que alterar essa linha, mas a logica ficaria errada:

if (strcmp(vetor[i], vetor[j]) >  0)


PARA ESSA:

if (strcmp(vetor[i], vetor[j]) <  0)

Sei q a logica ta errada mas porque ta dando esse erro nessa parte. E no exercicio de ordenar numeros tambem deu, e do nada, depois q eu abri mais tarde ele ficou certo. Eu tenho q resetar alguma coisa talvez?

adicionado 18 minutos depois
16 minutos atrás, s4lezardv1A disse:

porque esqueci isso afff, face palm para mim!!!!

Agora deu certo. 


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


int main()
{
    system ("title NOME EM ORDEM CRESCENTE THIAGO");
int i,j,cont=0;
char aux[10];
char vetor[10][10] = {"Andre","Maria","Marcio","Bruno","Henrique","Zoraide","Daniel","Danilo","Zuleica","Adriano"};





for (i=0;i<10;i++)
{
    for (j=0;j<10;j++)
    {
        if (strcmp(vetor[i], vetor[j]) >  0)
        {
             strcpy(aux,vetor[i]);
            strcpy(vetor[i],vetor[j]);
            strcpy(vetor[j],aux);

        }



    }
}

printf("vetor em ordem:\n\n");
for (i=0;i<10;i++)
{
   printf("%s\n",vetor[i]);
}

return 0;
}

Desculpem incomodar vcs, mas queria pedir um favor, se puderem rodar esse codigo ai. porque aqui ele ta dando em ordem decrescente, e para dar em ordem crescente eu tenho que alterar essa linha, mas a logica ficaria errada:


if (strcmp(vetor[i], vetor[j]) >  0)


PARA ESSA:

if (strcmp(vetor[i], vetor[j]) <  0)

Sei q a logica ta errada mas porque ta dando esse erro nessa parte. E no exercicio de ordenar numeros tambem deu, e do nada, depois q eu abri mais tarde ele ficou certo. Eu tenho q resetar alguma coisa talvez?

Acho q descobri porque:

char aux[10]={0};

atribui zero uma vez nessa variavel e agora ta indo normal, mesmo eu tirando o zero. Se puderem me responder só essa ultima pergunta, porque eu atribuindo uma unica vez, e depois tirando não da mais problema? No mais muito obrigado pessoal.

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

2 horas atrás, s4lezardv1A disse:

Sei q a logica ta errada mas porque ta dando esse erro nessa parte. E no exercicio de ordenar numeros tambem deu, e do nada, depois q eu abri mais tarde ele ficou certo. Eu tenho q resetar alguma coisa talvez?

 

O problema é que no segundo for j começa com valor 0, mas seguindo a lógica do algoritmo usado j deveria começar igual a i, assim ele não troca novamente as posições que já estão ordenadas.

 

 

2 horas atrás, s4lezardv1A disse:

Acho q descobri porque:


char aux[10]={0};

atribui zero uma vez nessa variavel e agora ta indo normal, mesmo eu tirando o zero. Se puderem me responder só essa ultima pergunta, porque eu atribuindo uma unica vez, e depois tirando não da mais problema? No mais muito obrigado pessoal.

 

Inicializar o vetor aux não afeta o resultado, essa não é a causa.

 

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

11 horas atrás, s4lezardv1A disse:

Sei q a logica ta errada mas porque ta dando esse erro nessa parte. E no exercicio de ordenar numeros tambem deu, e do nada, depois q eu abri mais tarde ele ficou certo. Eu tenho q resetar alguma coisa talvez?

Não e o código abaixa funciona.

 

12 horas atrás, AnsiC disse:

@s4lezardv1A 

 

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

int main (){
    int i, ii;
    char aux[10], vetor[10][10] = {
        "Andre", "Maria", "Marcio", "Bruno", "Henrique", "Zoraide", "Daniel",
        "Danilo", "Zuleica", "Adriano" };
        for (i = 0; i < 10; i++){
              for (ii = i; ii < 10; ii++){
                    if (strcmp(vetor[i], vetor[ii]) >  0){
                          strcpy (aux, vetor[i]);
                          strcpy (vetor[i], vetor[ii]);
                          strcpy (vetor[ii], aux); }}}

    system ("title NOME EM ORDEM CRESCENTE THIAGO");
    printf("vetor em ordem:\n\n");
    for (i = 0; i < 10; i++){
          printf("%s\n",vetor[i]); }
    return  0; }

 

 

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

Obrigado pessoal, valeu mesmo. dando o segundo FOR com o valor inicial de J igual a i, deu certinho. Agora estou na segunda parte do codigo. Tenho que fazer com que o codigo faça o menos comparações possiveis para ordenar.

for (i=0;i<14;i++)
{
for (j=i+1;j<15;j++)

alterei o segundo FOR para j=i+1 para que ele sempre conte uma casa acima do primeiro FOR, ja que depois de posicionado no indice 0,1,etc ele não tem necessidade de fazer outra comparação.

e coloquei o limite para 14 loops no primeiro FOR, ja que vi que ate o decimo quarto ciclo o vetor ja esta organizado e não precisa mais fazer comparações. Tem como maximizar ainda mais essa comparação? Não coloquem dica, só quero saber se da pra fazer ou isso é o maximo que vou conseguir?

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
5 horas atrás, s4lezardv1A disse:

Obrigado pessoal, valeu mesmo. dando o segundo FOR com o valor inicial de J igual a i, deu certinho. Agora estou na segunda parte do codigo. Tenho que fazer com que o codigo faça o menos comparações possiveis para ordenar.


for (i=0;i<14;i++)
{
for (j=i+1;j<15;j++)

alterei o segundo FOR para j=i+1 para que ele sempre conte uma casa acima do primeiro FOR, ja que depois de posicionado no indice 0,1,etc ele não tem necessidade de fazer outra comparação.

e coloquei o limite para 14 loops no primeiro FOR, ja que vi que ate o decimo quarto ciclo o vetor ja esta organizado e não precisa mais fazer comparações. Tem como maximizar ainda mais essa comparação? Não coloquem dica, só quero saber se da pra fazer ou isso é o maximo que vou conseguir?

 

Nesse método, creio que não dá mais para otimizar...

 

 

Perceba que foram citados 2 métodos de ordenação diferentes.

 

Esse:

Em 05/08/2018 às 22:26, s4lezardv1A disse:

        if (strcmp(vetor[i], vetor[j]) >  0)

 

E a do Bubble Sort:

Em 05/08/2018 às 21:57, isrnick disse:

if (strcmp(vetor[j], vetor[j+1]) > 0)

 

 

Sem dar muitas dicas: no Bubble Sort dar para ir mais além.

 

 

Link para o comentário
Compartilhar em outros sites

Pessoal, eu novamente. Entaõ simon, fiquei pensando no que você escreveu. O meu codigo o professor falou que eu fiz o SELECTION SORT, o bubble seria esse que você fez. Algum de vcs pode me mostrar qual seria a diferença de estrutura do bubble e do selection? porque eu pensava q o que eu tinha feito era o bubble.

adicionado 39 minutos depois
38 minutos atrás, s4lezardv1A disse:

Pessoal, eu novamente. Entaõ simon, fiquei pensando no que você escreveu. O meu codigo o professor falou que eu fiz o SELECTION SORT, o bubble seria esse que você fez. Algum de vcs pode me mostrar qual seria a diferença de estrutura do bubble e do selection? porque eu pensava q o que eu tinha feito era o bubble.

for (i=0;i<14;i++)
{
for (j=0;j<15-i;j++)
{
 if (vetor[j] > vetor[j+1])
 {
     aux = vetor[j];
     vetor[j] = vetor[j+1];
     vetor[j+1] = aux;
     cont=cont+1;

é isso?Bubble sort? A primeira q eu tinha feito la no começo seria o selection sort isso?

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

  • Membro VIP

Olá.

 

Sobre:

Em 08/08/2018 às 23:26, s4lezardv1A disse:

é isso?Bubble sort? A primeira q eu tinha feito la no começo seria o selection sort isso?

 

@s4lezardv1A, resumidamente falando:

- sobre este último código ser Bubble Sort, poderíamos dizer que sim. Existem várias variações. (Adendo: só não entendo cont+1 ali no meio)

- sobre o anterior ser Inserte Sort, eu que faço a pergunta! É?

 

 

É simples... veja como funciona o Insert Sort e compare com o código. Fuce um pouco as duas estruturas... Verás por exemplo que uma das características do Bubble Sort é justamente aplicar um conceito que remete a uma "bolha". Então, como funciona essa tal bolha no algoritmo? Faz sentido se chamar bolha e não ter uma bolha???

 

Dá mesmo forma, como são as características do Inserte Sort. Veja, só pelo nome já vem a mente que é algo relacionada a "inserção", correto?. Como funciona essa (suposta) "inserção"? Aquele código tem isso? segue outros princípios do algoritmo?

 

 

obs.: claro que no mundo real nem tudo pode ser levado ao "pé da letra". Um exemplo clássico é do tal Átomo, que o nome remete a "indivisível". Obviamente a muitos anos já sabemos que é divisível né? (já chegamos pra lá do Bóson de Higgs :D). Mas existe todo um contexto para "manter essa incoerência no mome". Entende? 

Resumindo: Se se chama Bubble, "tem que ter" a bolha no meio dessa história. Assim como se se chama Insert "teria que ter algo relacionado a inserção".

 

Por ai vai.

 

 

***

 

Tente verificar se é ou não Insert Sort.

 

No aguardo.

 

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

Na ciência do achismo: eu acho que você @s4lezardv1A errou para o professor somente em colocar 2 for, inclusive lembro que perguntou se era com 2 for

 

Em 05/08/2018 às 19:16, s4lezardv1A disse:

usarei dois FOR para isso então?

Ao que parece esse é o problema, na sua forma "canônica" ele tem apenas 1. Assim como @Simon Viegas nos explica existem variações que seu professor conservador que é se opõe a essas mudanças ou variações.

 

 

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

Selection Sort ordem crescente - Para cada posição procura (apenas) nas posições subsequentes da lista de items, qual é o item de menor valor, e uma vez encontrado faz a troca de posição se o item de menor valor não estiver na posição atual.

 

Insertion Sort ordem crescente - Cada novo item da lista analisado é inserido na lista de items verificados anteriormente tal que a lista com todos os items já processados se mantenha ordenada, para isso todos os items anteriores maiores que o item atual são movidos em 1 casa para a frente para abrir espaço para inserir o item atual na posição correta da lista já ordenada.

 

Bubble Sort ordem crescente - Percorre a lista várias vezes comparando cada item com o próximo item da lista, e trocando-os de posição se o item atual for maior que o próximo, o que implica que a cada passagem o maior item será movido para o fim da lista, portanto não é preciso ir até o fim da lista nas próximas passagens pois os maiores já vão ficando ordenados no fim da lista, e para de percorrer a lista quando não foi necessário fazer mais nenhuma troca, pois isso indica que a lista já está ordenada.

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