Ir ao conteúdo
  • Cadastre-se
UmPrograma

C Ordem alfabetica em C

Recommended Posts

Boa tarde, pessoal. Como estão?

Gostaria de uma ajuda nesse exercicio, que é sobre ordenar as string em ordem alfabetica.

 

Eu consegui que mostrasse em ordem, porém comparando somente a primeira letra das duas strings. Mas eu estava querendo comparar com as demais tambem, já que dois nomes podem comecar com a mesma letra.

então eu fiz um contador, porém se a palavra é  "baaa" e a outra "abbb", a primeira (baaa) que vai mostrar primeiro, ja que contem um maior numeros de letras menores que o segundo nome , mesmo comecando com a primeira letra maior que a primeira da segunda.

(ESPERO QUE TENHAM ENTENDIDO, RSRSRS)

 

Estava querendo que eles analisassem a primeira letra e se fosse iguais passassem para a segunda, contudo nao cheguei a nenhuma logica para a implementação.

Segue meu codigo.

/**4. Crie um programa capaz de ler dois nomes de pessoas e imprimi-los em ordem alfabética. Faça isto com
 string de C e de C++.**/
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 main (){
    char nome1[100], nome2[100];
    printf("Informe o primeiro nome: ");
    gets(nome1);
    printf("Informe o segundo nome: ");
    gets(nome2);
    char ordem();
    ordem(nome1, nome2);

 }
char ordem(char a[100], char b[100]){
    int tam=0,i=0,j=0, cont1=0, cont2=0, z=0;
    tam=strlen(a);
    for(i=0;i<tam;i++){
        j++;
    if(a[j]>b[j]){
//z++;
        cont1++;
    //exit(a[z]<b[z]);
        //printf("A ordem alfabetica e:\n%s.\n%s.\n", b, a);
    }
    if(a[j]<b[j]){
        cont2++;
        //printf("A ordem alfabetica e:\n%s.\n%s.\n", a, b);
    }

    }
    if(cont1>cont2)
        printf("A ordem alfabetica e:\n%s.\n%s.\n", b, a);
    else
        printf("A ordem alfabetica e:\n%s.\n%s.\n", a, b);

    printf("\n\n");
}

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Josesousa    mas você quer colocar em ordem alfabética  mesmo ou do jeito que você disse ali .  para a ordem alfabética você pode comparar com o valor ascii de cada caractere da string ,  o que for menor vem antes .

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010 Estou querendo colocar em ordem alfabetica. Mas lembrando que tem palavras que comecam com a mesma letra, entrao se elas fossem igual (primeira letra) passasse para a proxima (letra), para depois imprimir qual e menor.

Acho que do jeito que estou fazendo eu estou usando a tabela ascci, nao? 

adicionado 30 minutos depois

@devair1010 Opa, amigo.

Valeu pela disposição.....

Acho que consegui aqui.

Usei uma funcao pronta da biblioteca que nem sabia que tinha :D!!!!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Thanks.!!!

Mas eu acabei usando a strncmp() da bibblioteca string,h tambem....

Ela ja me devolve na ordem alfabetica.

Na strcmp provavelmente teria que criar condicoes para chegar no resultado. 

adicionado 9 minutos depois

na strcmp seria como? Mais ou menos dessa forma?

for(i=0;i<tam;i++){
 	if(strcmp(a[i], b[i])==-1){
		printf("A ordem e:\n%s. \n%s.\n", a,b);
	}
	if(strcmp(a[i], b[i])==1){
		printf("A ordem e:\n%s. \n%s.\n", b,a);
	}
 }

Assim ???

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

A única diferença entre strcmp e strncmp é que na segunda você especifica o número máximo de caracteres a serem comparados.

 

strcmp(a, b) == 0  --> strings a e b são iguais
strcmp(a, b) != 0  --> strings a e b são diferentes
strcmp(a, b) > 0   --> string a > string b
strcmp(a, b) < 0   --> string a < string b

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Ah sim

Pensei que ele era para ordenar kkkkkk

Ôooo vida. kkkk

 

Nele eu fiz dessa forma aí.

 

if(strncmp(a, b, tam)>0) 

 

-----------

Mas talvez seja mais certo com a strncmp, vista que a primeira palavra possa ser menor...Num sei.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
9 minutos atrás, Josesousa disse:

Mas talvez seja mais certo com a strncmp, vista que a primeira palavra possa ser menor...Num sei.

Não importa, é por este tipo de situação que strings tem o caractere nulo indicando o fim da string, ele para de comparar quando chega no caractere nulo.

 

Se uma string é menor que a outra, mas todos os caracteres que tem são iguais, então strcmp/strncmp vai retornar que a menor string é menor (como é esperado que faça).

 

O tamanho máximo na strncmp() é uma medida de segurança, você coloca o tamanho do vetor de caracteres como parâmetro, assim a função nunca tenta acessar posições que não existem no vetor.

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
12 minutos atrás, Josesousa disse:

Pensei que ele era para ordenar kkkkkk

 

Pesquise sobre o comando strcmp() em C. Veja como este funciona. Após ter entendido... pesquise sobre o comando strncmp(). Aí tente ver as diferenças entre um comando e outro.

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Simon Viegas Meio que acabei pesquisando sobre ele sim...

Valeu....:thumbsup:

 

(achei que era para ordenar pois vi em outros topicos o povo sugerindo strncmp invés de strcmp...rsrs)

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cada comando tem as suas características... de um modo geral, é necessário entender como o método funciona :)

 

Poste o código final para analisarmos

adicionado 3 minutos depois

Outro ponto: resumidamente, qual é a diferença entre strcmp() e strncmp() ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Simon Viegas Uai, pelo que entendi o strcmp()  vai comparar a string ate o \0 e strncmp() ate onde eu especificar que é para comparar, vou delimitar a comparação nesse ultimo.

Acho que é isso.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Josesousa Não.

 

strcmp compara até o primeiro '\0'.

strncmp compara até o primeiro '\0' ou até o limite máximo, o que chegar primeiro.

 

Basicamente a ideia é essa:

int strcmp (char string1[], char string2[]){
    int i;
  
    for(i = 0; string1[i] == string2[i] && string1[i] != '\0'; i++);
  
    return string1[i] - string2[i];
}

int strncmp (char string1[], char string2[], int n){
    int i;
    
    for(i = 0; i < n && string1[i] == string2[i] && string1[i] != '\0'; i++);
    
    return string1[i] - string2[i];
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
/**4. Crie um programa capaz de ler dois nomes de pessoas e imprimi-los em ordem alfabética. Faça isto com
 string de C e de C++.**/
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 main (){
    char nome1[100], nome2[100];
    printf("Informe o primeiro nome: ");
    gets(nome1);
    printf("Informe o segundo nome: ");
    gets(nome2);
    char ordem();
    ordem(nome1, nome2);

 }
char ordem(char a[100], char b[100]){
    int tam=0,i=0,j=0, cont1=0, cont2=0, z=0;
    tam=strlen(a);
    for(i=0;i<tam;i++){
        if(strncmp(a, b, tam)<0){
            printf("A ordem e:\n %s.\n %s.\n", a,b);
            break;
        }
        if(strncmp(a, b, tam)>0){
            printf("A ordem e:\n %s.\n %s.\n", b,a);
            break;
        }
    }
  }

@isrnick @Simon Viegas

Fiz dessa forma. Ta certo? Tem como enxugar mais? Algo assim.

adicionado 3 minutos depois
Citação
4 minutos atrás, isrnick disse:

strcmp compara até o primeiro '\0'.

strncmp compara até o primeiro '\0' ou até o limite máximo, o que chegar primeiro

 

Okay.....:thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual a ordem dos nomes se eles forem iguais? Seu programa não imprime nada.

 

O seu código com modificações:

 

/**4. Crie um programa capaz de ler dois nomes de pessoas e imprimi-los em ordem alfabética. Faça isto com
 string de C e de C++.**/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//Coloque o protótipo da função fora do main
void ordem(char a[100], char b[100]);

//A função main tem sempre tipo int
int main (){
    char nome1[100], nome2[100];
    printf("Informe o primeiro nome: ");
    gets(nome1);
    printf("Informe o segundo nome: ");
    gets(nome2);
    ordem(nome1, nome2);
    //main retorna 0 para indicar que o programa foi concluído normalmente
    return 0;
 }

//ordem não retorna nada então é do tipo void
void ordem(char a[100], char b[100]){
    int tam; //=0,i=0,j=0, cont1=0, cont2=0, z=0;
    //tam=strlen(a);
    tam = 100;
    //for(i=0;i<tam;i++){
    if(strncmp(a, b, tam) < 0){
        printf("A ordem e:\n %s.\n %s.\n", a,b);
        //break;
    }
    else{
        printf("A ordem e:\n %s.\n %s.\n", b,a);
        //break;
    }
    //}
}
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue:

/**4. Crie um programa capaz de ler dois nomes de pessoas e imprimi-los em ordem alfabética. Faça isto com
 string de C e de C++.**/
#include <stdio.h>
#include <string.h>
//#include <stdlib.h>   NÃO UTILIZADO
main () {
    char nome1[100], nome2[100];
    printf("Informe o primeiro nome: ");
    gets(nome1);
    printf("Informe o segundo nome: ");
    gets(nome2);
    char ordem();
    ordem(nome1, nome2);
}

char ordem(char a[100], char b[100]) {    
    if(strcmp(a, b)<0)
        printf("A ordem e:\n %s.\n %s.\n", a,b);
    else
        printf("A ordem e:\n %s.\n %s.\n", b,a);
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Porque voce mudou para void a funcao?

E tirou o for? Eu pensei que precisava do for para percorrer o vetor de caracter, e sobre ser iguais é so um if, ou modificar o primeiro, colocando ou.

if(strncmp(a, b, tam)<0 || strncmp(a, b, tam)==0)

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Adendo:

Tendo:

25 minutos atrás, Josesousa disse:

if(strncmp(a, b, tam)<0) {

 

Sendo:

26 minutos atrás, Josesousa disse:

tam=strlen(a);

ou mesmo:

6 minutos atrás, isrnick disse:

tam = 100;

 

Não fazem sentido... ou seja, tiram a funcionalidade do método.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Citação
8 minutos atrás, isrnick disse:

//Coloque o protótipo da função fora do main void ordem(char a[100], char b[100]);

 

Para que? Para ser global?

adicionado 1 minuto depois

@Simon Viegas No caso eu pensei que o tam ia pegar o tamanho da string que foi digitada e nao o tamanho que eu atribuir a ela. :(

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

É... nem percebi... o método ordem() tem que ser void.

 

1 minuto atrás, Josesousa disse:

Para que? Para ser global?

Isso estou por fora, rs

adicionado 0 minutos depois

PS: tem que ser void, porque não tem retorno!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

RESUMINDO TUDO:

- o método main() deveria retornar um int(). Antes do } colocar return 0;;

- o método ordem() deveria ser void, pois não retorna algo;

- usar a função strcmp(), em vez de strncmp(), já que não precisa limitar a comparação.

- não precisa de for, pois o método já compara a "string" toda.

adicionado 3 minutos depois

Pelo que analisei, o código ficaria assim:

/**4. Crie um programa capaz de ler dois nomes de pessoas e imprimi-los em ordem alfabética. Faça isto com
 string de C e de C++.**/

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

void ordem(); //<-- não sei porque seria melhor aqui!!!
int main () {
    char nome1[100], nome2[100];
    printf("Informe o primeiro nome: ");
    gets(nome1);
    printf("Informe o segundo nome: ");
    gets(nome2);
    ordem(nome1, nome2);
    return 0; 
}

void ordem(char a[100], char b[100]) {    
    if(strcmp(a, b)<0)
        printf("A ordem e:\n %s.\n %s.\n", a,b);
    else
        printf("A ordem e:\n %s.\n %s.\n", b,a);
}

 

adicionado 5 minutos depois

Ah! perceba que são 3 hipóteses: menor, igual e maior, mas como ficou implícito, não precisa selecionar (usar um if) para quando for igual, pois não faz diferença.

 

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
6 minutos atrás, Josesousa disse:

Para que? Para ser global?

 

Sim.

 

Senão ela só fica definida dentro do escopo da função, não podendo ser utilizada por outras funções que não estejam no mesmo escopo (por não ser global), e quando a função acabar a função declarada internamente também deixa de existir.

 

Um dos principais objetivos de se fazer uma função é poder reutilizá-la em outros lugares.

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

O tipo da função serve para especificar o tipo do valor que pode ser retornado por ela para o escopo onde a função foi chamada, usando a palavra reservada return.

 

Por exemplo:

double quadrado(double x){
    return x * x;
}

é uma função que calcula o valor do quadrado de x e retorna o resultado calculado, o resultado é do tipo double, logo a função deve ser do tipo double para poder retornar esse tipo de valor.

 

Como um valor é retornado, isso significa que onde a função é chamada podemos atribuir o valor retornado pela função a uma variável do tipo double, ou realizar operações com o valor retornado. Por exemplo:

double y;
y = quadrado(2.5) * 5;

 

 

 

Se a função não usa o termo return para retornar nenhum valor então o tipo da função deve ser void, identificando que nenhum valor é retornado (logo não podemos fazer atribuições ou operações usando esta função).

 

Por exemplo:

void imprime_double(double x){
    printf("%lf", x);
}

A função apenas imprime um valor do tipo double, e não precisa retornar nada.

 

 

 

Observação: Note que também podemos usar "return;" em uma função void, sem indicar nenhum valor de retorno, para sair da função imediatamente, o que pode ser útil para interromper a função em algum ponto antes do seu fim.

  • Curtir 3

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

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

×