Ir ao conteúdo

C Ordem alfabética de letras de uma frase


Ir à solução Resolvido por Simão.,

Posts recomendados

Postado

Alguém me ajude com o programa que tenho de fazer, o programa tem que pedir uma frase, e depois diz as letras da frase por ordem alfabética.

Não consigo fazer nada, está muito difícil!
 

  • Obrigado 1
Postado
15 horas atrás, Midori disse:

Procure por algoritmos de ordenação, pode ser o Bubble Sort que é bem simples e aplique na string.

Ok vou experimentar, obrigado!

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

int main()
{
char frase[100], i;
	printf("Digite uma frase: ");
	gets(frase);
	char ordem();
	ordem (frase);
}	
	
	char ordem (char )
	for 
}
}

Estou completamente perdido, alguém que me possa dar uma ajuda por favor

Também não sei como usar o bubble sort

  • Curtir 1
Postado
4 horas atrás, Simão. disse:

Também não sei como usar o bubble sort

Esse algoritmo é usado para ordenar vetores e a frase é um vetor de caracteres, p.ex,

 

https://pt.wikipedia.org/wiki/Bubble_sort

 

Modifique os tipos dos parâmetros para char da função swap e o primeiro da bubble e teste assim,

 

int main(){
    char frase[100] = "teste de ordenacao";
    bubbleSort(frase, strlen(frase) - 1);
    puts(frase);
    return 0;
}

 

Obs: Nesse bubble em C foi usado recursão, então se ainda não viu esse assunto acho que devia tentar implementar de forma não recursiva como p.ex no pseudocódigo.

  • Curtir 1
Postado
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char frase[100], i, j;

	printf("Digite uma frase: ");
	scanf("%s", &frase);

{
strlen(frase);
	for (i = 0; i <= frase; i++)
{
		for (j = i + 1; j <= frase; j++);
{

	if (frase [i] < frase [j])
		
	}
}
}
}

Fiz desta forma, mas ainda faltam algumas coisas que não estou a conseguir fazer

 

  • Curtir 1
Postado

@Simão. A implementação da função com base no pseudocódigo pode ser assim,

char *ordena(char *frase, int n){
    int trocado;
    do{
        trocado = 0;
        for(int i = 0; i < n - 1; i += 1){
            if(frase[i] > frase[i + 1]){
                char aux = frase[i];
                frase[i] = frase[i + 1];
                frase[i + 1] = aux;
                trocado = 1;
            }
        }
    }while(trocado);
    return frase;
}

Se não quiser alterar a frase original crie outro parâmetro.

 

Aí é só passar os argumentos para a função, p.ex,

puts(ordena(frase, strlen(frase)));

 

  • Curtir 1
Postado
15 horas atrás, Midori disse:

@Simão. A implementação da função com base no pseudocódigo pode ser assim,

char *ordena(char *frase, int n){
    int trocado;
    do{
        trocado = 0;
        for(int i = 0; i < n - 1; i += 1){
            if(frase[i] > frase[i + 1]){
                char aux = frase[i];
                frase[i] = frase[i + 1];
                frase[i + 1] = aux;
                trocado = 1;
            }
        }
    }while(trocado);
    return frase;
}

Se não quiser alterar a frase original crie outro parâmetro.

 

Aí é só passar os argumentos para a função, p.ex,

puts(ordena(frase, strlen(frase)));

 

Obrigado pela ajuda, o meu professor estava a explicar de outra forma, vou experimentar.

  • Curtir 1
Postado
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char frase[100], i, j;

	printf("Digite uma frase: ");
	scanf("%s", &frase);


	for (i = 0; i <= strlen(frase); i++)
{
		for (j = i + 1; j <= strlen(frase); j++)
{

	if (frase [i] < frase [j])
		{
			j = i 
		}
	}
}
}

Estou a fazer dessa forma, como faço para fazer a troca das variavéis?

  • Curtir 1
Postado

@Simão.   se você for modificar a frase  , então pode usar o metodo  AnchoSort  que é mais fácil mesmo , 

fgets(frase , 99 , stdin   );    /// pegue a Frase com essa funCAo "fgets" eh melhor
int tm = strlen( frase     );
char ax = ' ';
for   ( i=0; i   <tm;  i++  )    /// esse metodo de OrdenaCAo AnchorSort
{
  for ( j=i + 1; j<tm; j++  )
  {
    if (frase [i] > frase[j])    /// colocar em Ordem crescente
    {
      ax          = frase[i];
      frase[i]    = frase[j];
      frase[j]    =       ax;
    }
  }
}

 

Postado
2 minutos atrás, devair1010 disse:

@Simão.   se você for modificar a frase  , então pode usar o metodo  AnchoSort  que é mais fácil mesmo , 

fgets(frase , 99 , stdin );    /// pegue a Frase com essa funCAo "fgets" eh melhor
int tm = strle(frase);
char ax = ' ';
for ( i=0; i<tm; i++ )         /// esse metodo de OrdenaCAo AnchorSort
{
  for ( j=i + 1; j<tm; j++ )
  {
    if (frase [i] > frase [j]) /// colocar em Ordem crescente
    {
      ax       = frase[i];
      frase[i] = frase[j];
      frase[j] =       ax;
    }
  }
}

 

O problema é que ainda não dei isso, acho que tenho de fazer de outra forma

 

  • Amei 1
Postado

@Simão.  ouTra forMa poderia ser assim 

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

int main()
{
  char frase[100] = {"kiko lolipop juju"};
  int i, j;
  char ax =' ';
  int tm = 0;
  printf("Digite uma frase: ");
  fgets( frase , 99 , stdin );
  tm = strlen(frase);
  printf("tamanho -: %d\n",tm);
  for( i=0; frase[i]!=0; i++ )
  {
    printf("posiCAo na Frase %3d ",i);
    if(frase[i] == '\n')
      printf("Barra Ene !\n");
    else
      if(frase[i] == ' ' )
        printf("EspaCo em Branco\n");
      else
        printf("%c\n",frase[i]);
  }
  printf("posiCAo na Frase %3d ",i);
  printf("Finalizador de String's   ( zero \"0\" oU barra zero \"\\0\" )\n");
  for ( i=0; i<tm; i++ )    /// esse metodo de OrdenaCAo AnchorSort
  {
    for ( j=i + 1; j<tm; j++ )
    {
      if (frase [i] > frase [j])
      {
        ax       = frase[i];
        frase[i] = frase[j];
        frase[j] =       ax;
      }
    }
  }
  for(i=0; i<60000;i++)for(j=0; j<10000;j++);
  printf("\n\n");
  for( i=0; i<tm; i++ )
  {
    printf("%3d ",i+1);
    if(frase[i] > 64)
      printf("%c\n",frase[i]);
    else
      printf("Caractere Qua nhAo eh letra\n");
  }
  printf("\n\n\n");
  return 0;
}

 

Postado

@devair1010 não há uma forma parecida a esta??

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

int main()
{
char frase[100], i, j, c;

	printf("Digite uma frase: ");
	scanf("%s", &frase);


	for (i = 0; i <= strlen(frase); i++)
{
		for (j = i + 1; j <= strlen(frase); j++)
{

	if (frase [i] < frase [j])
		{
			c = i;
			i = j;
			j = c;
		}
	}
}
	printf("A ordem da frase e: %s\n", frase, i, j);
}

Ou uma forma de corrigir e pôr a funcionar

  • Curtir 1
Postado
1 hora atrás, Simão. disse:

Estou a fazer dessa forma, como faço para fazer a troca das variavéis?

Para trocar as letras deixe os loops assim,

int n = strlen(frase);

for (i = 0; i < n - 1; i++){
    for (j = 0; j < n - i - 1 ; j++){
        if (frase [j] > frase [j + 1]){
            char aux = frase[j];
            frase[j] = frase[j + 1];
            frase[j + 1] = aux;
        }
    }
}

 

  • Curtir 2
Postado

@Simão.   seu código poderia ser assim

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

int main()
{
    char frase[100], i, j, c;    /// voce colocou j e  i  como char e funciona
                                 /// mas nhAo eh o jeito ideal , que seria o int
    char ax = ' ';               /// Aqui para auxiliar nas trocas de letras da frase
    printf("Digite uma frase: ");
    /// scanf("%s", &frase);         esse scanf só pega as letras da primeira palavra da frase
    fgets(frase , 99 , stdin );  /// fgets pega todas as letras da frase
    int tm = strlen(frase);      /// calcula o tamanho da frase apenas uma vez
    for (i = 0; i < tm; i++)     /// economizando cpu
    {
        for (j = i + 1; j < tm; j++) /// e só vai até enquanto for menor que o tamanho
        {
            if (frase [i] < frase [j]) /// Aqui voce vai colocar em ordem dec Drescente
            {
                /// c = i;                 para que seve isso aqui ?
                /// i = j;                 para que seve isso aqui ?
                /// j = c;                 para que seve isso aqui ?
                ax       = frase[i];       
                frase[i] = frase[j];       /// faz as trocas
                frase[j] =       ax;
            }
        }
    }
    frase[i] = 0;  /// finaliza a string
    printf("A ordem Decrescente da frase e: %s %3d %3d\n\n\n\n", frase, i, j);
}

 

  • Curtir 1
  • Obrigado 1
Postado
2 horas atrás, devair1010 disse:
ax       = frase[i];       
                frase[i] = frase[j];       /// faz as trocas
                frase[j] =       ax;

esqueci me de dizer, eu enganei me, é pra ser na ordem crescente, tenho que trocar quais?? não estou a conseguir

  • Amei 1
  • Solução
Postado
2 minutos atrás, devair1010 disse:

@Simão.   no if  ,  coloque > .

não funciona

não aparece nada

 

antes aparecia em ordem decrescente, agora não aparece nada

é mesmo só o sinal de menor que é para mudar??

 

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

int main()
{
int i, j;
char frase[100], c;

	printf("Digite uma frase: ");
	gets(frase);

	for (i = 0; i < strlen(frase); i++)
{
		for (j = i + 1; j < strlen(frase); j++)
{

	if (frase [i] > frase [j])
		{
			c = frase[i];
			frase[i] = frase[j];
			frase[j] = c;
		}
	}
}
	printf("A ordem da frase e: %s\n", frase);
}

Já está, fiz dessa forma e funciona!

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!