Ir ao conteúdo
  • Cadastre-se
DiogoTBr

C Contador de letras em C

Recommended Posts

Boa noite galera, estou enfrentando problemas ao fazer um exercício do meu curso. Ele consiste em contar apenas letras maiúsculas e minúsculas de determinada frase. Eu preciso fazer isso incluindo apenas a biblioteca stdio.h. Só achei um vídeo falando através apenas dessa biblioteca. 

Exemplo:

Entrada:

Ola!

 

Saida:

3

 

O máximo do código que eu consegui alcançar (através do vídeo ainda) foi:

#include <stdio.h>

int a(char b[])
{
    int num = 1;
    while (b[num] != '\0')
    {
        num++;
    }
    return num;
}


int main ()
{
    int a(char b[]);
    char c[50];
    scanf ("%s", c);
    int nume = a(c);
    printf ("%d", nume);
    return 0;
}

 

Além disso, eu não entendi o porquê que chama a função "a" logo no começo da int main e também não sei como funciona esse "char b[]" nem o porquê dessas "[]".

Compartilhar este post


Link para o post
Compartilhar em outros sites

@DiogoTBr Olá. Quanto a essa dúvida:

21 minutos atrás, DiogoTBr disse:

eu não entendi o porquê que chama a função "a" logo no começo da int main

 

Na verdade não está fazendo a chamada da função. Isso seria o que é conhecido como "Protótipo de uma função"

Alguns preferem definir o protótipo da função na main mesmo, já eu acredito ser mais interessante definir o protótipo das funções no início do código:

Ex:

#include <stdio.h>

// Protótipo da função
int a(char b[]);

int main ()
{
    char c[50];
    int nume;

    printf("Digite um texto: ");
    scanf ("%s", c);
    nume = a(c);
    printf ("%d", nume);
    return 0;
}

int a(char b[])
{
    // lógica a ser usada
}

Percebeu a vantagem de se definir o protótipo de cada função em um código. Dessa forma é possível colocar a implementação da função depois no main, algo que não seria possível sem o protótipo da função declarado como no exemplo que passei. Deu para entender a lógica nessa parte?

 

quanto a essa dúvida:

37 minutos atrás, DiogoTBr disse:

também não sei como funciona esse "char b[]" nem o porquê dessas "[]"

 

Esse seria o parâmetro da função, ou seja, nesse caso quando a função for chamada você precisa passar uma string como parâmetro dessa função, e isso está sendo feito nessa parte do código:

nume = a(c);  // aqui a função 'a' está de fato sendo chamada e está sendo passado uma string como parâmetro

Entenda uma string em C como um vetor de caracteres (Vetor de char)

Recomendo esse tutorial para conhecer mais sobre strings em C:

Cap 06 - Cadeia de Caracteres.pdf

E, para entender um pouco mais sobre funções recomendo esse tutorial:

Cap 04 - Funções.pdf

 

Com respeito a lógica da função 'a' (recomendo o uso de um nome mais sugestivo para essa função) você vai precisar verificar se os caracteres da string são letras do alfabeto e, se for, incrementar o contador

Por uma string ser um vetor de caracteres, ela é indexada. Ou seja: a primeira letra de uma string seria o índice 0, a segunda o índice 1, etc... Tal como em um vetor de inteiros, por exemplo

Uma das maneiras para fazer esse verificação, seria usar um while ou for (como preferir) para percorrer toda a string digitada pelo usuário. Uma das maneiras para se fazer isso sem o uso de uma função seria essa:

int i;
	
for (i = 0; b[i] != '\0'; i++)

Toda string em C termina com o caractere NULO, ou '\0'. Lembre sempre disso. 

Nesse tutorial acima que passei sobre cadeia de caracteres é explicado melhor sobre esse assunto

 

Só não vou postar a resposta pronta pois vejo que isso não te ajudaria em nada

 

Caso tiver dúvidas é só perguntar

adicionado 22 minutos depois

Com respeito a nome de variáveis e nomes de funções, perceba o mesmo código com nomes mais sugestivos para as variáreis e para a função:

#include <stdio.h>

// Protótipo da função
int buscar_letras(char var_texto[]);

int main ()
{
    char texto[50];
    int num;

    printf("Digite um texto: ");
    scanf ("%s", texto);
    
    num = buscar_letras(texto);
    
    printf ("%d", num);
    
    return 0;
}

int buscar_letras(char var_texto[])
{
    int i;

    while (var_texto[i] != '\0') {
        // lógica a ser usada
        i++;
    }
    
    // aqui retorna um valor inteiro, que seria a quantidade de letras encontradas na string

}

Viu como o código fica muito mais legível e de fácil entendimento?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá todos!

 

Curti tudo @giu_d ! E mais o fato de ter chamado atenção nesse quesit.

Já eu coloco verdadeiras descrições nos identificadores de palavras globais(tipos e funções). No caso e pessoal: 

numero_de_letras(char na_string[]); // #1 indução interrogativa
// o número de letras na string é ?

 

Quase não uso verbos, mais poderia

conta_as_letras(char na_string[]); // #2 verbo imperativo
// conta as lestras na string: é uma ordem.

 

Teve um momento na programação que a falta de sentido nos algoritmos foi tamanha que Kernighan escreveram um livro só para tratar disso.

 

Editado por AnsiC
UPDATE
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC Olá. Devo confessar que usar verbos em nomes de funções é algo que trago lá do Java

Pois em Java para o nome dos métodos se tem como padrão, até mesmo de boa prática de programação, o uso de verbos para nomes de métodos, com ler(), imprimir(), listar(), etc...

Inclusive em Java não é comum o uso do caractere underline '_' em nomes de métodos

Logo para um exemplo que você passou acima, em Java ficariam assim:

contarLetras(String texto)  

 

Até vou comentar aqui sobre um podcast que ouvi a poucos dias: "Programação Orientada a Gambiarra"

Ex: O cara vai lá e cria o método somar. Esse método recebe como parâmetro dois tipos. 

Se passar o tipo 1 o método soma, mas se passar o tipo 2 o método subtrai  :confused:

 

Se interessar ouvir esse podcast segue o link:

https://mundopodcast.com.br/podprogramar/6-programacao-orientada-gambiarra/

Editado por giu_d
corrigir comentário
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
3 horas atrás, giu_d disse:

Ex: O cara vai lá e cria o método somar. Esse método recebe como parâmetro dois tipos. 

Se passar o tipo 1 o método soma, mas se passar o tipo 2 o método subtrai  :confused:

kkkkkkk no sense! Não pode ser assim!

 

Existe duas formas mais normais de se separar as palavras nos identificadores em Java: CalmeCase (upper + lower). Cultura C, para mim é, undescore_case :aplausos:

 

Baixarei sim. Eu gosto de podcast.

 

UPDATE:

Gostei muito de podProgramar elas são muito espertinhas.

 

Editado por AnsiC
UPDATE
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
5 horas atrás, AnsiC disse:

UPDATE:

Gostei muito de podProgramar elas são muito espertinhas.

Cara... gostei desse comentário. De fato elas são mesmo! 

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

×