Logo Hardware.com.br
jcferranti
jcferranti General de Pijama Registrado
4.7K Mensagens 162 Curtidas

Iniciando em C++

#1 Por jcferranti 21/09/2006 - 13:44
Pessoal aproveitando que o Leandrosri tá precisando fazer a tarefa da escola e veio "pedir ajuda" aqui (aqui ó https://www.hardware.com.br/comunidade/programa-abreviatura/322802/), resolvi usar os exercicios dele para me inciar em C++.

Possuo um conhecimento superficial de C, só o suficiente para me virar com a lógica de programas desse tipo, depis vou me aprimorando.

Aqui estão os exercicios do Leandrosri, feitos em uma mistura de C e C++. Se alguém puder me ajudar a transformar em 100% C++ eu agradeço.


1.Faça um programa que dado um nome completo, informe a abreviatura deste nome. Não se devem abreviar as preposições como: do, de, etc. A abreviatura deve vir separada por pontos. Ex: Paulo Jose de Alma Prado. Abreviatura: P.J.A.P.

Ps.: Não fiz o primeiro de preguiça mesmo, e pressa para iniciar o tópico aqui...


2.Faça um programa que dado 2 palavras, determine:
a.Se as palavras são iguais;
b.Caso as palavras sejam diferentes, qual delas tem maior comprimento .


#include <iostream>
using namespace std;

char palavra1[15],palavra2[15];

int main()
{
cout << "Informe a primeira palavra: " ;
cin >> palavra1;
cout << "Informe a segunda palavra: " ;
cin >> palavra2;
if (strcmp(palavra1,palavra2)==0) cout << "Palavras são Iguais.\n";
else
{
if (strlen(palavra1)>strlen(palavra2)) cout << "A primeira palavra é mais comprida que a segunda.\n";
else if (strlen(palavra1)<strlen(palavra2)) cout << "A segunda palavra é mais comprida que a primeira.\n";
else cout << "As palavras têm o mesmo comprimento porém não são iguais.\n";
}
return 0;
}


3.Elaborar um programa em C que leia uma frase e armazene-a em um vetor de caracteres
(cuidado com a leitura!). Depois conte o número de espaços em branco na frase, outra para
contar o número de vogais, e outra para contar o número de consoantes.


#include <iostream>
using namespace std;

char vogais[]="aeiou";
char consoantes[]="bcdfghjklmnpqrstvwxyz";
char frase[50];
int contador,x,y;

int main()
{
//receber a frase
cout << "Digite sua frase:";
cin.getline(frase,50);

//contar espaços em branco
contador=0;
for (x=0;x<=strlen(frase);x++)
if (frase[x]==' ') contador++;
cout << "Foram encontrados " << contador << " espaços em branco\n";

//contar vogais
contador=0;
for (x=0;x<=strlen(frase);x++)
for (y=0;y<=strlen(vogais);y++)
if (frase[x]==vogais[y] && frase[x]!=0) contador++;
cout << "Foram encontradas " << contador << " vogais\n";

//contar consoantes
contador=0;
for (x=0;x<=strlen(frase);x++)
for (y=0;y<=strlen(consoantes);y++)
if (frase[x]==consoantes[y] && frase[x]!=0) contador++;
cout << "Foram encontradas " << contador << " consoantes\n";

return 0;
}


4.Faça um programa que transfira as consoantes para um vetor e as vogais para outro.
Depois mostre cada um dos vetores.


#include <iostream>
using namespace std;

char vogais[]="aeiou";
char consoantes[]="bcdfghjklmnpqrstvwxyz";
int contador,x,y;
char frase[50], frase_vogais[30], frase_consoantes[30];

int main()
{
//receber a frase
cout << "Digite sua frase:";
cin.getline(frase,50);

//separar vogais
contador=0;
for (x=0;x<=strlen(frase);x++)
for (y=0;y<=strlen(vogais);y++)
if (frase[x]==vogais[y] && frase[x]!=0) frase_vogais[contador++]=frase[x];
frase_vogais[++contador]=0;

//contar consoantes
contador=0;
for (x=0;x<=strlen(frase);x++)
for (y=0;y<=strlen(consoantes);y++)
if (frase[x]==consoantes[y] && frase[x]!=0) frase_consoantes[contador++]=frase[x];
frase_consoantes[++contador]=0;

//exibir vogais
cout << "Vogais separadas: ";
for(x=0;x<=strlen(frase_vogais);x++) cout << frase_vogais[x];
cout << "\n";

//exibir consoantes
cout << "Consoantes separadas: ";
for(x=0;x<=strlen(frase_consoantes);x++) cout << frase_consoantes[x];
cout << "\n";

return 0;
}


5.Fazer um programa que receba uma string de no máximo 20 caracteres
do usuário e mostre o conteúdo desta string de forma invertida.


#include <iostream>
using namespace std;

char frase[20];
int x;

int main()
{
cout << "Informe a frase: " ;
cin.getline(frase,20);

for(x=strlen(frase);x>=0;x--) cout << frase[x];
cout << "\n";

return 0;
}



6.Faça um programa que receba uma string do usuário (máx. 20 caracteres) e um caracter qualquer.
O programa deve remover todas as ocorrências do caracter da string e mostrar o resultado.


#include <iostream>
using namespace std;

char frase[20],nova[20],caracter;
int x,y;

int main()
{
cout << "Informe a frase: " ;
cin.getline(frase,20);
cout << "Informe o Caracter: ";
cin >> caracter;

for(x=0;x<=strlen(frase);x++)
if(frase[x]!=caracter) nova[y++]=frase[x];

cout << "Frase remontada sem o caracter: " << nova << "\n";

return 0;
}


7.Faça um programa que receba como entradas uma lista de nomes em ordem
aleatória e ordene essa lista em ordem alfabética.


#include <iostream>
using namespace std;
const int total=10;

char nome[total][20],temp[20];
int x,y;

int main()
{
for(x=0;x<=total-1;x++)
{
cout << "Insira o membro numero " << x << ":";
cin.getline(nome[x],20);
}

for(x=0;x<=total;x++)
for(y=x;y<=total;y++)
if(strcmp(nome[x],nome[y])>0)
{
strcpy(temp,nome[x]);
strcpy(nome[x],nome[y]);
strcpy(nome[y],temp);
}

cout << "Lista reorganizada.\n";
for(x=0;x<=total-1;x++) cout << "Membro numero " << x << ": " << nome[x] << "\n";

return 0;
}


8.Faça um programa que leia uma frase de até 60 caracteres(utilizar o comando gets) e
imprima a frase sem os espaços em branco. Imprimir também a quantidade de espaços em branco.


#include <iostream>
using namespace std;

char frase[60], nova[60];
int x,espacos,contador;

int main()
{
cout << "Digite sua frase: ";
cin.getline(frase,60);

contador=0;
espacos=0;
for(x=0;x<=strlen(frase);x++)
if(frase[x]!=' ') nova[contador++]=frase[x];
else espacos++;
nova[contador]=0;

cout << "Frase sem espaços: " << nova << "\n";
cout << "Espaços encontrados: " << espacos << "\n";
return 0;
}



9.Escreva um programa que leia do teclado uma senha alfanumérica, utilize a função strcmp() para
compará-la com uma senha definida internamente no programa e retorne ao usuário a validade ou não
da senha fornecida por ele, em função do resultado da comparação.


#include <iostream>
using namespace std;

char senha[20];
int x,espacos,contador;

int main()
{
cout << "Digite sua senha: ";
cin.getline(senha,20);

if(strcmp(senha,"minhasenha1&quot==0) cout << "Senha Correta!\n";
else cout << "Senha Invalida!\n";

return 0;
}



10.Escreva um programa que leia uma palavra e verifique se ela é um palíndromo.
Palíndromo é a palavra cuja leitura é a mesma , quer se faça da direita para a esquerda,
quer da esquerda para a direita. Exemplo : Ovo, anilina, "O TEU DRAMA". Inverso: "AMAR DUETO".


#include <iostream>
using namespace std;

char frase[50],nova[50],invertida[50];
int x,y;

int main()
{
cout << "Digite sua frase: ";
cin.getline(frase,50);

//gerar frase sem espaços
y=0;
for(x=0;x<=strlen(frase);x++)
if(frase[x]!=' ') nova[y++]=frase[x];

//inverter frase
y=0;
for(x=strlen(nova);x>=0;x--)
if(nova[x]!=0) invertida[y++]=nova[x];

//comparar
if(strcmp(nova,invertida)==0) cout << "A frase é um palindromo.\n";
else cout << "A frase não é um palindromo.\n";

return 0;
}
Responder
FabianoTraple
FabianoTrapl... Veterano Registrado
1.2K Mensagens 17 Curtidas
#2 Por FabianoTrapl...
21/09/2006 - 15:22
jcferranti...

Vou passar esse exemplo para vc poder analizar como vc pode fazer uma estrutura ficar otimizada, usar menos memória e mebos processamento.


#include <iostream>
using namespace std;

char vogais[]="aeiou";
char frase[50];

int QtdVogais = 0;
int QtdConsoantes = 0;
int QtdEspacos = 0;

int main()
{
//receber a frase
cout << "Digite sua frase:";
cin.getline(frase,50);

int Letra;
for ( Letra = 0; Letra < strlen(frase); Letra++ )
{

if( frase[Letra] == ' ' ) // Verifica se é espaço
{
QtdEspacos++;
}
else
{
char EraVogal = 'N'; // Variável que verifica se era vogal ou consoante
int Con;
for ( Con = 0; Con < 5; Con++ )
{
if( frase[Letra] == vogais[Con] ) // Verifica se é vogal
{
QtdVogais++;
EraVogal = 'S';
break;
}
}
if( EraVogal == 'N' ) // Verifica se é consoante
{
QtdConsoantes++;
}
}
}
cout << "Foram encontradas " << QtdEspacos << " espaços\n";
cout << "Foram encontradas " << QtdVogais << " vogais\n";
cout << "Foram encontradas " << QtdConsoantes << " consoantes\n\n";
return 0;
}


:mrgreen:
[email]umbrsuporte@hotmail.com[/email] bebi_demais.gif
jcferranti
jcferranti General de Pijama Registrado
4.7K Mensagens 162 Curtidas
#3 Por jcferranti
21/09/2006 - 16:18
Legal! Realmente não tinha pensado nisso, se não é vogal é consoante, então não preciso de um for para contar as consoantes....


con relação a passar isso para mais C++ possível. Nesse exemplo usamos o caso clássico do C em que uma string na verdade é um array de char. Em C++ seria possivel fazer esse mesmo exemplo usando a clase string? Ficaria melhor, pior ou dá na mesma?
Casa:MS Windows Seven (empolgando)
Trampo: MS Windows Seven (desapontando)

Quer um Fórum exclusivamente sobre Open Source? Aqui: www.linuxbsd.com.br/forum
FabianoTraple
FabianoTrapl... Veterano Registrado
1.2K Mensagens 17 Curtidas
#5 Por FabianoTrapl...
21/09/2006 - 17:31
RportM...

Boa ! só que esse exemplo é apenas educacional...

jcferranti ...

Tem como usar a classe string sim, porém acho muito mais fácil o usuário entender o conceito de string usando char[] no início, assim que eu tiver um tempinho eu mando ele feito com a classe string.

INFO - Programas utilizando a classe string geram um código de executável maior e ocupam um espaço maior de memória, essa diferença em determinados programas não tem importância, porém, um código que exige o uso restrito da memória como o kernel do linux faz uma grande diferença.

:mrgreen:
[email]umbrsuporte@hotmail.com[/email] bebi_demais.gif
Zet0
Zet0 Novo Membro Registrado
16 Mensagens 0 Curtidas
#6 Por Zet0
21/09/2006 - 18:24
Não li com a devida atenção cada um dos programas, mas vi algumas coisas que merecem alguns comentários para otimizar o desempenho dos programas...

- Evite ao máximo a utilização de variáveis globais. Não sei se em C++ continua assim, mas em ANSI C uma variável global NUNCA é armazenada em registradores, enquanto que as variáveis locais mais utilizadas sim, melhorando o tempo de acesso a essas variáveis. Portanto evite declarar contadores como variáveis globais.

- Evite utilizar funções em comparações de laço, como o "Letra < strlen(frase)", a menos que o parâmetro da função seja alterado durante o laço. Com isso vc evita que a cada comparação do laço essa função seja executada, gerando processamento desnecessário visto que a saída será a mesma. Utilize uma variável para armazenar o valor de retorno da função e utilize-a para as comparações:


tamanho = strlen(frase);
for (Letra = 0; Letra < tamanho; Letra++)
...
jcferranti
jcferranti General de Pijama Registrado
4.7K Mensagens 162 Curtidas
#7 Por jcferranti
22/09/2006 - 10:46
FabianoTraple
Tem como usar a classe string sim, porém acho muito mais fácil o usuário entender o conceito de string usando char[] no início, assim que eu tiver um tempinho eu mando ele feito com a classe string.

Esse é justamente o objetivo do tópico. ja tenho um bom conceito sobre string usando char[], então quero aprender as vantagens e desvantagens sobre o string em C++. Nesse exemplo especifico sei que o melhor é char[], mas no outros é possivel que string se saia melhor.

INFO - Programas utilizando a classe string geram um código de executável maior e ocupam um espaço maior de memória, essa diferença em determinados programas não tem importância, porém, um código que exige o uso restrito da memória como o kernel do linux faz uma grande diferença.

Já imaginava isso tb.

Zet0 Obrigado pelas dicas. Geralmente eu procuro sim otimizar meus programas, mas como esses foram passados por outro usuário ao forum, eu apenas me preocupei em fazer com que eles funcionassem para poder criar esse tópico e discutir justamente questões como essa.
Casa:MS Windows Seven (empolgando)
Trampo: MS Windows Seven (desapontando)

Quer um Fórum exclusivamente sobre Open Source? Aqui: www.linuxbsd.com.br/forum
FabianoTraple
FabianoTrapl... Veterano Registrado
1.2K Mensagens 17 Curtidas
#8 Por FabianoTrapl...
22/09/2006 - 11:28
jcferranti...

O uso do string ou do char[], depende da aplicação do programa...

Vc sabia que o windows XP é todo desenvolvido utilizando C++, por isso ele necessita de tanto processamento, memória e contém muito mais bugs e é muito mais instável que o windows 98 que é escrito e C por exemplo ! A plataforma NT é toda baseada na estrutura do C++.

O kernel do linux é todo escrito em C, veja a diferença de estabiblidade e velocidade !

:mrgreen:
[email]umbrsuporte@hotmail.com[/email] bebi_demais.gif
jcferranti
jcferranti General de Pijama Registrado
4.7K Mensagens 162 Curtidas
#9 Por jcferranti
22/09/2006 - 16:30
FabianoTraple
Vc sabia que o windows XP é todo desenvolvido utilizando C++, por isso ele necessita de tanto processamento, memória e contém muito mais bugs e é muito mais instável que o windows 98 que é escrito e C por exemplo ! A plataforma NT é toda baseada na estrutura do C++.

Não sabia, não! Para mim ele era um emaranhado de C, C++ e Assembly :P


O kernel do linux é todo escrito em C, fecha a diferença de estabiblidade e velocidade !

[/quote]
Isso eu já sabia, mas é uma comparação que pode levar e interpretações errôneas.
P.Ex.:
O Gnome e a biblioteca GTK, pelo que sei, são contruídos em C, enquanto o KDE e a QT são construídos em C++. O compilador gc é famoso pela sua portabilidade e de gerar código em C, extremamente enxuto. Já G++ é um bom compilador, mas o desenpenho dos programs em C++ deixa a desejar em comparação com os de C. No entanto, em suas atuais encarnações, tanto o Gnome quanto o KDE são sistemas pesados para máquinas menos potentes, porém ambos com excepcional estabilidade. Isso leva a crer que se houvesse um compilador C++, mais eficiente para o KDE/QT, seu desempenho seria muito melhor.

Sabe, não é demérito da linguagem os bugs ou defeitos de cada programa, mas sim unicamente de seu programador, que escolheu a linguagem, o compilador e a fez o programa.
Casa:MS Windows Seven (empolgando)
Trampo: MS Windows Seven (desapontando)

Quer um Fórum exclusivamente sobre Open Source? Aqui: www.linuxbsd.com.br/forum
FabianoTraple
FabianoTrapl... Veterano Registrado
1.2K Mensagens 17 Curtidas
#10 Por FabianoTrapl...
22/09/2006 - 17:01
jcferranti...

Concordo plenamente...

C++ não possui bugs e nem erro, sim os programas feito nele, pq ?

Veja que a forma com que é feita a estruturação do orientado a objetos leva os programadores a gerar vários erros de estruturação e sequência.

Não vi até hoje nada que não possa ser feito em C++ que não possa ser feito em C, foi ai que dicidi fazer todos os sistemas de minha empresa em C, acho que foi a melhor decisão que tomei até hj relacionado a estruturação !

O código fonte está qse pronto e tem a metade do tamanho, e depois de testado e corrigido os bugs, a estabilidade fica 100% !

Note tb que toda estruturação das janelas do windows XP ou NT são baseadas nas estruturas do C++, um dos erro mais típicos que eu tinha quando fazia programas para ele era o erro de sequência de execução...

Nos windows XP as rotinas são executadas em intervalos tipo TIMER, muitos funções podem demorar mais para executar do que o o intervalo de tempo que vc colocou, fazendo com que outras rotinas que eram para ser executadas antes passem na frente, veja exemplo hipotético;

timer1 = 2; // 2 segundos
timer2 = 1; // 1 segundo


case timer1:
{
executarotina1();
}
case timer2:
{
executarotina2();
}

Se a função "executarotina1();" demorar mais que 3 segundos para executar, será chamado um novo processo mesmo que o anterior não seja terminado, se isso acontecer e vc tiver criado classes que troquem dados entre ela ira ocorrer vários erros de precedência !
E depois de alguns laços de execução a rotina do segundo timer passará a executar antes da primeira em as duas executarão em intervalo totalmente diferente !
Nesse caso fica extremamente difícil vc estruturar programas de grande porte sem gerar centenas de bugs e ainde ter que despender um enorme tempo no concerto deles...

Agora imagine tudo isso sendo executado em máquinas diferentes com velocidades diferentes...
Dai vem a explicação pq muitos programas rodam perfeitos no micro do desenvolvedor e quando vão para o cliente geram centenas de erros !

Comprar máquinas mais e mais potentes é a solução, ou fazer em C ?

Vcs decidem !


E com relação a ter um compilador C++ mais eficiente vai ser difícil, a estruturação dos objetos é que gera esse enorme consumo de processamento e memória !
[email]umbrsuporte@hotmail.com[/email] bebi_demais.gif
Responder Tópico
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal