Ir ao conteúdo

Posts recomendados

Postado

Olá gente,faz muito tempo que não programo em linguagem c ,estou com muita dificuldade nessa questão.

obs;primeira vez aqui ^^



Escreva um programa com uma função que receba uma palavra de até 30 caracteres e devolvaquantas letras diferentes essa palavra contém.O protótipo da função deve ser este abaixo:

int letras_ diferentes(char palavra [ ] ,int tam ) ;

 

Escreva um programa com uma função que receba uma palavra de até 30 caracteres e devolvaquantas letras diferentes essa palavra contém.O protótipo da função deve ser este abaixo:

int letras_ diferentes(char palavra [ ] ,int tam ) ;

  • Curtir 2
  • Moderador
Postado

Caro usuário,

 

Seja bem-vindo ao Clube do Hardware.

 

No intuito de servir como fonte de pesquisa no caso de instituições de ensino, informamos que incorrer no resolvimento por completo de questões relacionadas a disciplinas escolares de cursos técnicos e faculdades podem ser revistas e removidas pela Equipe de Moderação do Clube do Hardware.

 

Para sanar dúvidas sobre esse tipo de problema, por gentileza, publique o passo a passo do desenvolvimento da questão, projeto, monografia ou conteúdo em dúvida para que possamos analisar se a resposta está correta ou não, ou para que possa ser auxiliado com a dúvida no desenvolvimento do exercício.

 

Infelizmente, não há como resolver os trabalhos pelos usuários. O objetivo do Clube do Hardware é auxiliar seus usuários a encontrar soluções para que possam sanar suas dúvidas, e não de trazer soluções prontas para seus usuários. Além disso, copiar e colar respostas que não são de autoria própria do qualquer usuário é considerado plágio, o que é ilegal.

 

Esperamos que compreenda.

 

Atenciosamente,

Equipe Clube do Hardware

  • Curtir 1
Postado

Considerando palavras em caixa baixa;

 

Use um vetor [25] para chamadas inicialmente zerado; coloque a letra no índice desse vetor; se a expressão vetor [palavra [indice] - 'a'] tem valor 0 então incremente a variável designada para valor que retorno depois troque o valor 0 da expressão para 1.

 

Repetia (em Loop) esse procedimento tam vezes na mesma função.

com fim retorne a variável designada.

 

 

  • Curtir 1
  • Amei 1
Postado

@andre costac    no caso ali creio que seja uma frase de até 30 letras , pois não existe tal palavra com tantas letras , e então você vai pegar essa frase usando o comando fgets e envia la para a função e junto também o tamanho dessa frase , que você consegue saber usando o comando strlen(frase) ,e na função faça as comparações , então faça seu código sobre esse exercício e poste aqui para vermos como está e em que podemos ajudar   .

  • Curtir 1
Postado

@devair1010 

int letras_diferentes(char palavra [30] ,int tam ){
	int cont=0,i,j;
		
		for(i=0;i<=strlen(palavra);i++){				//aloca cada letra da palavra em uma posição
			for(j=0;j<=strlen(palavra);j=i+1){			//passa para a proxima letra
				if(palavra[i]==palavra[j]){				//compara uma letra com a outra
					tam = palavra[i];					//armazena as letras que forem iguais
					palavra++; 
					
				}
			}
		}
}

bom,minha linha de raciocinio está mais ou menos assim.

(como eu disse faz muito tempo que não programo em c)

  • Curtir 1
Postado

@andre costac      ali você incrementou a palavra , não pode ser assim , erro ,  o tamanho da palavra será enviado para a função , por isso não precisa pegar novamente o tamanho da frase ,  e a cada letra que seja igual a outra  marque ela como repetida para não fazer a contagem dela novamente , e então seu código poderia ser assim  :

int letras_ diferentes( char palavra [ ] ,int tam ){  // aqui já vai receber o tamanho da frase
    int cont=0,i,j;                                   // não precisa do strlen
    for( i=0; i<tam; i++ )                            // aloca cada letra da palavra em uma posição
        for( j=i; j<tam; j++ )                        // passa para a proxima letra
            if( palavra[i] == palavra[j] && i != j )  // compara uma letra com todas as outras
                palavra[j] = ( char )219;             // se iguais marca as outras com esse caractere
    for( i=0; i<tam; i++ )                            // percorre toda a frase
        if( palavra[i] != (char)219 )                 // se o caractere nessa posição da frase não for espaço reverso
            cont++;                                   // é letra diferente de todas as outras , incrementa o contador
    return cont;                                      // retorna o total de letras diferentes
}

 

  • Curtir 2
  • Amei 1
Postado
3 horas atrás, andre costac disse:

se importaria de montar a estrutra do codigo pra ficar mais claro .?

Eu tendo explicar ser dá uma resposta e acabo como mal português.

 

Enfim, é aproximadamente o que @devair1010 . diferença é que não precisei fazer mudanças em palavra e conto com 1x loop e não 2x loops; mas tem mesma lógica.

 

 

adicionado 4 minutos depois
3 horas atrás, devair1010 disse:

no caso ali creio que seja uma frase de até 30 letras , pois não existe tal palavra com tantas letras , e então você vai pegar essa frase usando o comando fgets e envia la para a função e junto também o tamanho dessa frase

https://pt.wikipedia.org/wiki/Lista_das_maiores_palavras_de_cada_língua

  • Curtir 1
  • Amei 1
Postado
3 horas atrás, andre costac disse:

bom,minha linha de raciocinio está mais ou menos assim.

(como eu disse faz muito tempo que não programo em c)

 

em que linguagem vinha programando depois de C?

 

Seu programa parece muito complicado para esse objetivo. 

 

Escreva seu programa sempre em torno dos dados. SEMPRE.

 

Pense assim: uma palavra não tem muita opção em termos de letras. Sua função é assim

int letras_diferentes(char palavra[] ,int tam );

Então em C palavra é uma string, uma sequência de até 30 caracteres com o último valendo zero. Só isso. E o que pode ter um char? É um byte. Pode ter 256 valores entre 0 e 255. Como são letras, a gente pode até imaginar que vá ter apenas letras, ou algum espaço, ou algum professor chato testou com "teste234".

 

Mas importa mesmo? Não.

 

Só precisamos contar quantos são diferentes e retornar o número. Para ser diferente tem que estar lá pelo menos uma vez.

 

Assim se eu pegar um papel e for marcando quantas letras tem na palavra...

palavra
p
aaa
l
v
r
teste
tt
ee
s
aaaaa

Então já deu pra ver que se a gente marcar assim basta contar o número de linhas no papel e teremos quantas letras diferentes tem na palavra

 

Escrevendo em C deve ficar igualzinho

int     letras_diferentes(char palavra[], int tam)
{
    char tabela[256] = { 0 };
    for (int i = 0; i < tam; i += 1) tabela[palavra[i]] += 1; // a letra
    int n = 0;
    for (int i = 0; i < 256; i += 1) if(tabela[i] != 0) n = n + 1; // + essa
    return n;
};

Sim, só isso. 

    char tabela[256] = { 0 }; 

 

é uma maneira simples de inicializar todos os valores da tabela com zero. Claro que pode trocar por um loop.
 

Como a tabela tem lugar pra todo mundo você não precisa de lógica para testar as letras. Só vai lá na posição e soma. É como se tivesse no papel um formulário pronto para ir marcando as letras. Pense nisso. É só somar lá. Nem precisa somar: é só colocar qualquer valor diferente de zero, porque a gente só quer retornar o total de letras diferentes, não importa se todas são a mesma.
 

O segundo loop apenas soma quantos caras na tabela tem valor não zero, ou seja, apareceram ao menos uma vez. Como a gente fez "no papel" acima.


E a função retorna esse valor.

 

Veja o resultado de um programa de teste 

'teste': 3 letras diferentes
'palavra': 5 letras diferentes
'aaaaaaaaaaaaaaaab': 2 letras diferentes
'a': 1 letras diferentes
'abcdeabcdeabcdeabcdeabcdeabcd': 5 letras diferentes

Veja como declarar por exemplo umas palavras pra testar:

    const char teste[5][30] =
    {
        "teste",
        "palavra",
        "aaaaaaaaaaaaaaaab",
        "a",
        "abcdeabcdeabcdeabcdeabcdeabcd" // 29 letras
    };

Sim, 5 palavras com até 30 bytes e alguns testes importantes: uma letra só, 29 letras (não pode usar 30 porque a última é o null que termina a string) e os exemplos que a gente colocou acima. É bobagem ficar lendo do teclado num programa antes dele estar pronto.

 

E main() como seria?

    for (int i = 0; i < 5; i = i + 1)
        printf("'%s': %d letras diferentes\n",
            teste[i],
            letras_diferentes(teste[i], strlen(teste[i]))
        );

Só isso. teste é o vetor acima, com as 5 palavras. o loop chama a função passando as palavras e o printf() mostra o resultado que está acima. E a vida segue.

 

Eis o programa todo

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

int     letras_diferentes(char[], int); 

int main()
{
    const char teste[5][30] =
    {
        "teste",
        "palavra",
        "aaaaaaaaaaaaaaaab",
        "a",
        "abcdeabcdeabcdeabcdeabcdeabcd" // 29 letras
    };
    for (int i = 0; i < 5; i = i + 1)
        printf("'%s': %d letras diferentes\n",
            teste[i],
            letras_diferentes(teste[i], strlen(teste[i]))
        );
    return 0;
};  // main()

int     letras_diferentes(char palavra[], int tam)
{
    char tabela[256] = { 0 };
    for (int i = 0; i < tam; i += 1) tabela[palavra[i]] += 1; // conta a letra
    int n = 0;
    for (int i = 0; i < 256; i += 1) if(tabela[i] != 0) n = n + 1; // esse tinha
    return n;
};

//  fim

Estou postando isso porque achei tudo as soluções aqui muito complicadas sem razão.

Confirme se entendeu.

 

 

 

  • Curtir 1
  • Amei 1
Postado

Você pode usar um vetor que represente o alfabeto para ir incrementando as posições e considerar apenas as que aparecem uma vez,

 

int main(){
    char palavra[30];
    scanf("%s", palavra);
    printf("%d\n",letras_diferentes(palavra, strlen(palavra)));
    return 0;
}

int letras_diferentes(char palavra[] , int tam){
    char aux[27] = {0}, a;
    int i = 0, t = 0;
    
    for(t=0;t<tam;t++){
        a = palavra[t];
        if(a>=65 && a<=90) a-=65;
        else a-=97;
        aux[a]++;
        if(aux[a]==1) i++;
    }
    return i;
}

 

  • Curtir 2
  • Obrigado 1
  • Amei 1
Postado

Exemplo moderno de palavra: v6 equivale à vocês; próximos em pronuncia e mesmo significado.

 

Entretanto, não é o caso, fora algumas exceções modernas: palavra tem somente caracteres do alfabeto.

Por exemplo: "qualquer86544!!!" é não palavra.

 

C11

#include <ctype.h>
int letras_diferentes (char palavra [], int tam){
	char chmda [1 + 'Z' - 'A'] = {0};
	int letra = '\0', ctdor = 0;

	for (int t = 0; t < tam; ++ t){
		letra = toupper (palavra [t]) - 'A';

		if (chmda [letra ]) continue;
		chmda [letra] = 1,
		++ ctdor;
	}				
	return ctdor;
}

 

* continue apenas por preferência, pois uma comparação com valor 0 tem mesmo efeito.

Optativo, sem o vetor acho que fica como @devair1010 .

 

 

 

 

  • Curtir 1
  • Amei 1
Postado

Off-tópico: Recurso X aritmética

 

Gostei da solução  @Midori porque só aloca os recursos necessário, e não altera a fonte no processo.

 

Isso é importante ? Sim.

Até mesmo o mais simples processador é capaz de realizar uma simples subtração, nesse caso em particular, para economizar recursos [temporário e não].

 

  • Curtir 2

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!