• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

256mxr

Duvidas Programa

17 mensagens neste tópico

Escreva um programa que lê uma linha de texto do standard input e apresenta o número de ocorrências de cada letra do alfabeto (considere letras maiúsculas e minúsculas como sendo equivalentes). Assuma que o texto se encontra codificado em ASCII e que, portanto, não existem caracteres acentuados no texto.

Sugestão: Utilize um vector para guardar os contadores correspondentes às 26 letras possíveis.

Queria saber qual a melhor maneira de resolver isto com vectores???

Tava a pensar em criar um vector para ficar em cada posiçao a letra inserida na frase

E depois outro vector com as 26 letras e outro vector de inteiros com o num das ocorrencias o v[0] era pa letra e assim respectivamente...

N postem o programa ok? é pa depois saber escreve-lo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

primeiro, passas o texto todo para maiusculas... depois, só necessitas de 1 vector que é o que guarda o numero de ocorrências de cada letra...

fazes um ciclo que corre todo o texto e verificas se é uma letra... se for, verificas qual o valor ascii correspondente, subtrais 65 (se for A, o valor ascii é 65 e subtraindo 65 ficas com o indice do vector igual a 0, que é o primeiro e vai representar a 1ª letra) e incrementas o indice respectivo do vector com o valor da subtração anterior... quando for para apresentar os valores, fazes um ciclo de 0 a 25 e, se for diferente de 0, é só acrescentares 65 ao valor do indice, mostrar o respectivo caracter e o valor que está armazenado no indice do vector...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    string linha;
    getline(cin,linha);
    
    vector <int> v1 (26,0);
    
     
    for(int i=0;i<=linha.length()-1;i++) 
    {       
            if (linha[i]>='A' && linha[i]<='Z')
            {
            int j=linha[i]-65;
            
                    v1[j]++;
            
    }
    for(int j=0;j<v1.size();j++)
    {
    char letra = (char)('A'+j);
     cout << letra << v1[j] << endl;
     }
    system("pause");
    return 0;
}
}

Esta foi a minha tentativa mas n esta a funcionar, apenas conta a primeira letra

N percebo pk n funciona po resto das letras???? ;)

Help me

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

muito sinceramente, agora não te posso ajudar... o que eu faria noutra linguagem, é o que descrevi em cima... c (qualquer deles) não percebo nada... a ver se começo com o c# agora...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu não percebo de c minimamente, por isso desculpem se as perguntas são descabidas ;)

qual é a instrução que te passa todas as letras para maiúsculas?

na linha onde tens o int j=... não deveria ler qual o valor ascii do linha[ i] e então subtrair o 65? ou o comando como está já o faz?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

na linha onde tens o int j=... não deveria ler qual o valor ascii do linha[ i] e então subtrair o 65? ou o comando como está já o faz?

em C/C++ um char é também um inteiro, por isso pode-se subtrair directamente 65 ao caracter.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema são mesmo as {}.

Já agora devias usar o primeiro for deste modo

for(int i=0;i<linha.length();i++)

senão se não inserires caracteres ele dá erro.

O programa só tá a contar as maiúsculas é suposto?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é, se a string for passada toda para maiúsculas, que é o que não sei se realmente foi passada...

em C/C++ um char é também um inteiro, por isso pode-se subtrair directamente 65 ao caracter.

gracias ;) é uma situação que desconhecia ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como já foi dito, falta uma } a fechar o if.

E como também já foi dito, esse programa só conta as maiúsculas. Para contar também as minúsculas basta acrescentares outro if a seguir ao que já tens, mas para as letras minúsculas em que em vez de subtrair 65 subtrais 97.

Já agora em vez de subtrair 65 e 97 podias subtrair 'A' e 'a' respectivamente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Além de pores essa } no if tens que apagar uma das duas no fim do programa, senão ficas com uma a mais.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@saco, porquê crescentar mais um if se pode resolver tudo com um só comando (digo eu), passando a string para maiúsculas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@saco, porquê crescentar mais um if se pode resolver tudo com um só comando (digo eu), passando a string para maiúsculas?

Se passares para maiúsculas estás a usar mais um comando, portanto... em número de comandos fica igual.

E não é coisa que se note num programa deste tamanho, mas passar tudo para maiúsculas tem menos eficiência, porque nesse caso tens de percorrer o array duas vezes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pensei que houvesse uma função que passasse automáticamente uma string para maiúsculas, como há em tantas outras linguagens...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pensei que houvesse uma função que passasse automáticamente uma string para maiúsculas, como há em tantas outras linguagens...

Estou certo que deve haver. Pelo menos em C existe, se não estou enganado é toupper() e tolower()

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pensei que houvesse uma função que passasse automáticamente uma string para maiúsculas, como há em tantas outras linguagens...

Estou certo que deve haver. Pelo menos em C existe, se não estou enganado é toupper() e tolower()

isso é para caracteres e não strings (mas para strings também é só fazer um ciclo).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Certo.

std::transform(str.begin(),str.end(),str.begin(),toupper);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora