Ir ao conteúdo

Posts recomendados

Postado

Boa noite prezados.

 

Não estou conseguindo excluir as letras repetidas e contar somente as distintas. Por exemplo: "CALCULO" tem 7 letras e 4 repetidas, com isso, deveriar mostrar somente 3. Porém no meu programa ele só remove um "c" e um "l" ao invés dos dois. Alguem pode me ajudar? ja tentei de tudo e nao consigo . Segue codigo.

 Escrever um programa em C que calcule e imprima o número de caracteres distintos presentes em uma cadeia de caracteres dada.
Considerar o tamanho máximo da cadeia como sendo de 80 colunas. */

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

int main()
{
    char texto[50];
    int i,c, conta=1;
    int total;
	int repetidos=0;

    printf("\nDigite a frase: ");
    fgets(texto, 50, stdin);

    c = strlen(texto);
    printf("\n %s", texto);

   

    for(i=0; i<texto[i]; i++)
        {
            if(texto[i]==' ') 
                {
                    conta++; // espaços
                }
        }
   for(i=0;i<texto[i];i++)
		{
			for(int j=i+1;j<texto[j];j++)
				{
					if(texto[i] == texto[j])
						{
							repetidos++;
						}
				}
		}

    total = c - conta - repetidos;
    
    printf("\nNumero de letras retirando repetidos = %d", total);
	
    return 0;
}

 

  • Obrigado 1
Postado
44 minutos atrás, matheuscrluiz disse:

"CALCULO" tem 7 letras e 4 repetidas, com isso, deveriar mostrar somente 3

 

Há uma controvérsia nessa conta, já que as letras "originais" são C A L e U, 4...

 

Há claro um milhão de maneiras de fazer isso, e confesso que não entendi direito a maneira que você está tentando usar. Mas vou explicar uma outra:

 

Como

  • você já leu a string e ela não serve mais de nada, já que seu único interesse é contar as letras únicas
  • você já sabe quantas são porque pode usar strlen() como de fato usou...

Então

  • você pode ir varrendo seu vetor até a última posição, determinada por strlen(texto) e
  • a cada passo
  •     se a letra não for zero considera a letra que está vendo,  digamos o primeiro C de CALCULO
        essa é uma letra única porque acabou de ver e se já tivesse passado por ela estaria com zero :)
        E então soma ao contador e
            usa um outro loop para ir desta posição inclusive até o fim do texto inclusive  trocando todo C por zero
  • imprime o total 

pronto

 

Você declarou uma variável total apenas pra usar na última linha num printf() então podia usar a própria subtração no printf() 

  • Curtir 1
Postado

Use um vetor para registra a primeira ocorrência, use o caractere no índice desse vetor quando registrar.

 

1 hora atrás, matheuscrluiz disse:

obrigado pela resposta e me perdoe, mas não consegui entender. Poderia me explicar melhor, por favor? 

 

Desde ja, agradeço. 

 

Por exemplo; A tabela padrão "C" de caracteres comuns vai de 0 até 255 , tem-se ...

char ocorrencia [255]= {0};

 

Agora quero o registro das ocorrências na string "ola mundo".

Percorro a string e incremento a ocorrência, e a quantidade de caracteres quando na posição do vetor de ocorrência tem valor igual 0.

ola_mundo []= {"ola mundo"}; //< Exemplo de strings

int qtd= 0;   // de caracteres
int index= 0; // índice da strings
while ('\0' != ola_mundo [index])
{
	// Se for igual a 0 é porque ainda não registrou
	if (0 == ocorrencia [ola_mundo [index]])
	{
		// incremente a quantidade
		// aqui complemento de maneira a garantir o registro na clausula IF acima
		// com ocorrencia para esse caractere diferente de 0
	}
  // vem próxima coluna
  ++index;
}

Ainda está difícil?

  • Curtir 1
Postado

Está cometendo um erro de interpretação, o enunciado pede para calcular "o número de caracteres distintos", não pede para calcular "a quantidade de caracteres que não se repetem", na palavra CALCULO tem 5 letras distintas entre si C, A, L, U e O, logo o seu programa deve imprimir 5 como resultado.

  • Curtir 2
Postado

@matheuscrluiz      seu código está bom ,  mas os loop for estão funcionando por sorte , pois ali o melhor seria verificar o final da frase , que nesse caso , foi usado o comando fgets , que pega todos os caracteres digitados e mais o newline ou quebra de linha que é  o sinalizador de final de linha \n ,  e em seguida o finalizador de string \0 ,  e na hora de comparar precisa comparar todos com todos , e verificar se não é o mesmo caractere ,  então seu código poderia ser assim  :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
    char texto[50];
    int i,j,c,conta=1;
    int total;
	int repetidos=0;
    printf("\nDigite a frase: ");
    fgets(texto, 50, stdin);/* fgets pega todos caracteres + newline \n + finalizador \0 */
    c = strlen(texto);
    printf("\n%s",texto);
    for(i=0; texto[i]!='\n'; i++){
        if(texto[i]==' '){
            conta++; // espaços
        }
    }
    /*  pegando com fgets
        frase ex: calculo
        no vetor de char ficaria assim : calculo\n\0
    */
    for(i=0; texto[i]!='\0';i++){/* siginifica : i começando de zero , enquanto conteúdo de texto na posição i diferente de \0 */
        for(j=0; texto[j]!='\0';j++){/* testar todos com todos */
            if(texto[i] == texto[j] && j != i){/* se os caracteres forem iguais e não for o mesmo caractere */
                repetidos++;
                break;/* encontrou caract igual  termine esse loop */
            }
        }
    }
    total = c - conta - repetidos;
    printf("\nNumero de letras retirando repetidos = %d\n\n", total);
    return 0;
}

 

  • Curtir 1
Postado

@devair1010 Obrigado pela ajuda, não tinha pensado nisso. Mas tive uma dúvida no seu programa, se puder me ajudar, agradeço.

 

no "fgets" eu pegaria \n\0, mas no meu for pra contabilizar os espaços, já não tiraria o \n e \0?

 

e "if(texto == texto[j] && j != i)", você fez " j != i" para as posições serem diferentes, certo? Não sei se isso interferiu ou não, mas na palavra "calculo" funcionou direitinho, porém, quando testei com "rinosoro", deveria retornar 3(i,n,s), certo? Mas retornou zero e não consegui entender o por que. Será que teve influencia desse FOR?

 

Mas desde já, muito obrigado pela ajuda no programa, ajudou muito.

 

Att; Matheus

  • Curtir 1
Postado

@matheuscrluiz  Claro que tem muitas possíveis soluções, como a que usou e outras demonstradas aqui, mas como eu disse não é preciso usar nada disso

 

Imagine o que faria você com um papel e caneta.

Algo assim:

ch-191011-calculo.jpg.8b784229da0892e6109b53f4b8d90900.jpg

Um programa de computador não poderia fazer igual e imprimir 

A cadeia [CALCULO] tem tamanho 7 e 5 letras unicas

Sim. Podia escrever assim:

#define _CRT_SECURE_NO_WARNINGS

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

int main(int argc, char** argv)
{
	char*		teste_1 = "CALCULO";
	char*		teste_2 = "coisa coisa";
	char*		teste_3 = "Clube do Hardware";

	char		linha[80];
	int			tamanho = 0;
	int			total = 0;

	//strncpy(linha, teste_3, 80);		// so para poder testar com mais 
	//strncpy(linha, teste_2, 80);		// linhas trocando os comentarios 
	strcpy(linha, teste_1, 80);		//  
	tamanho = strlen(linha);
	printf( "A cadeia [%s] tem tamanho %d e ", linha, tamanho);
	for (int i = 0; i < tamanho; i = i + 1)
	{
		char letra = linha[i];
 		if (letra != 0)
		{	// uma letra original
			total = total + 1;			// original
			linha[i] = 0;				// apaga essa
			for (int j=i+1; j<tamanho; j = j + 1)
			{
				if (linha[j] == letra)
					linha[j] = 0;		// apaga repetido
			}	// end for (j)
		}
	}	// end for(i)
	printf("%d letras unicas\n", total);
	return 0;
}	// end main()

Como no papel, você pode marcar a cadeia na própria cadeia... Como eu disse, não precisa mais dela. O enunciado não diz se brancos são letras, então não precisa interpretar isso. 

  • Curtir 1
Postado

 

2 horas atrás, matheuscrluiz disse:

Obrigado pela ajuda. Consegui entender melhor o conceito do que deveria fazer no meu programa. De novo, muito obrigado pela ajuda de todos vocês.

Ótimo!

  • Curtir 1
Postado

@matheuscrluiz     esqueci do break lá de dentro do loop for de dentro .

for(i=0; texto[i]!='\0';i++){/* siginifica : i começando de zero , enquanto conteúdo de texto na posição i diferente de \0 */
    for(j=0; texto[j]!='\0';j++){/* testar todos com todos */
        if(texto[i] == texto[j] && j != i){/* se os caracteres forem iguais e não for o mesmo caractere */
            repetidos++;
            break;
        }
    }
}

 

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