UNIFEI – Universidade Federal de Itajubá Campus Avançado de Itabira
Laboratório de Lógica de Programação – ECOI02 Profa. Claudia A. Izeki
Laboratório 1 – Estudo Dirigido de Conceitos Básicos até
Estruturas Condicionais
Objetivos da atividade:
Familiarizar-se com os erros básicos de compilação do ambiente de programação CodeBlocks;
Entender, aplicar e avaliar os seguintes conceitos: o Variáveis, tipos de dados e constantes;
o Comandos de entrada e de saída: cin e cout; o Comandos de quebra de linha: endl e ‘\n’;
o Operadores de atribuição, aritméticos, lógicos e relacionais e suas precedências;
o Estruturas condicionais simples (if), compostas (if-else), encadeamento e aninhamento dessas estruturas.
Procedimentos da atividade:
Você deverá resolver todos os 25 exercícios desta lista em seu caderno, com sua própria caligrafia;
Utilize o material de referência da disciplina: http://bac004.wikidot.com. Observação: sempre traga esse material na forma impressa ou digital para não depender do funcionamento de Internet no laboratório;
Quando tiver alguma dúvida, verifique-a com seu colega ou acesse o material de aula. Se a dúvida persistir, contate o professor. Caso a dúvida ocorra fora do horário de aula, favor enviar um e-mail para [email protected].
A nota desta lista de exercícios, juntamente com outras, valerá 20% da nota da prática de ECOI02;
Você terá uma semana para resolver esta lista, que deverá ser apresentado no início da aula do dia 17 de março de 2015, para ser vistado;
Ao terminar os exercícios você deverá se retirar do laboratório;
Não é permitida a realização de atividades que não as relacionadas à disciplina, como o acesso a redes sociais (Facebook), execução de trabalhos de outras disciplinas, entre outras.
1) Quais valores das variáveis x, y e z do programa a seguir serão impressos na tela? Por quê? Digite o código do programa e escreva a resposta em seu caderno.
2) Altere o programa anterior para que as saídas das variáveis x, y e z sejam, respectivamente, 0, -1 e 2. Escreva em seu caderno apenas o trecho das atribuições, não sendo necessário escrever o programa inteiro.
3) Para que servem os comandos endl no programa do Exercício 1? Qual caracter especial você pode utilizar que possui o mesmo efeito do comando endl? Reescreva as linhas 8 e 9 do programa do Exercício 1 utilizando esse caracter. 4) Verifique a saída do seguinte programa. O que o comando sizeof() faz?
Compare o resultado com a tabela da Seção 2.2 (Tipos de Dados) da wikidot.
5) Qual a saída do programa a seguir? Por que na última linha impressão ocorreu um valor negativo? Dica: verifique a tabela da Seção 2.2 (Tipos de Dados) da wikidot.
6) Digite exatamente o seguinte código e compile-o. Anote a mensagem de erro que o compilador apresenta. Interprete essa mensagem e corrija o programa. Pesquise sobre o termo “case sensitive” e o que ele tem a ver com o erro detectado.
7) Quais são as regras para nomes de variáveis em C++? Quais dos seguintes nomes não são válidos para variáveis em C++? Justifique sua resposta. Faça um programa para verificar essas variáveis, anotando as mensagens de erros.
a) Num1 b) Num 5 c) 2num d) num@1 e) #op f) float g) media
8) Marque com um X as instruções que devem ter um ponto-e-vírgula no final: ( ) cout. Ex: cout << “Entre com um valor numérico: ” ( ) Declaração de variáveis. Ex: int a, b, c
( ) cin. Ex: cin >> a
( ) No começo da definição da função main. Ex: int main()
( ) Em cálculos aritméticos com atribuição à variáveis. Ex: a = b + c ( ) Na inclusão de bibliotecas. Ex: #include<iostream>
( ) return 0
9) Escreva a mensagem de erro apresentada pelo compilador quando se esquece algum ponto-e-vírgula obrigatório de algum comando.
10) Um problema muito comum no início da aprendizagem de programação é confundir os comandos cin e cout. Assim, digite o seguinte código, compile-o e execute-o. O que aconteceu? Como você pode corrigir o problema?
11) Altere o programa anterior para utilizar um único comando cin. Caso seja necessário, verifique como foi utilizado o comando cin no exemplo de http://bac004.wikidot.com/estruturascondicionais#toc5. Escreva em seu caderno apenas o comando cin.
12) Digite e compile o programa a seguir. Anote a mensagem de erro do compilador. Por que ocorreu erro? Dica: procure no Capítulo 2 da wikidot sobre constantes. Depois responda: o que é uma constante? Como se declara uma constante?
13) Assuma que todas as variáveis abaixo x, y, z, w e k sejam do tipo int. Preencha a tabela abaixo. Primeiro tente resolver cada item sem o uso do computador, apenas lembrando a precedência dos operadores aritméticos (caso não se lembre, acesse a Seção 3.2.1 da wikidot). Depois cheque a saída através de um programa. Lembrete: a divisão entre operandos inteiros resulta em quociente inteiro. Exemplo: 7/2 resulta em 3 e não em 3,5. Outro lembrete: 7 é um valor inteiro, mas 7.0 é um valor real. Assim, 7.0/2 resulta em 3,5. Caso uma variável inteira receba esse valor 3,5, resultará no valor inteiro 3; por outro lado, caso o tipo da variável que receba o valor seja real, o resultado será real também: 3,5.
a) x = (2+1)*6 b) y = 3*(5/2) c) z = 5+10%3/2
d) w = 3 + 4 * 5 / (6-4) % 4 + (18 % (5+1)) e) k = 3*(5.0/2)
Resultados sem o uso do computador Resultados através de um programa
x = x =
y = y =
z = z =
w = w =
k = k =
14) Um aluno fez o programa a seguir para calcular o quociente de uma divisão. Teste o programa digitando-o no CodeBlocks com os valores da tabela a seguir, completando-a. Ocorreu algum erro na execução do programa? Por quê? Corrija o programa se necessário. Dica: verifique a Seção 4.2 (Estruturas Condicionais) da wikidot. X y Z 10 3 15 5 0 7 5 0
15) O que são operadores relacionais? Quais são eles?
16) O que são operadores lógicos? Quais são eles? Escreva as tabelas-verdade de cada um deles.
17) Operandos de operadores lógicos são interpretados como booleano: verdadeiro ou falso. Na linguagem C++, o valor numérico zero (0) é interpretado como falso e qualquer coisa diferente de zero é interpretado como verdadeiro. Exemplo: o computador interpretará (3 && 10) como (verdadeiro && verdadeiro); o computador interpretará (0 && 8) como (falso && verdadeiro); o computador interpretará (“bom dia!” && 0) como (verdadeiro && falso). Sendo assim, qual o resultado de cada uma das expressões a seguir? Lembrete: o operador lógico && possui precedência sobre o operador lógico ||. Dica: você pode testar cada uma das expressões a seguir usando o comando cout. Assim: cout << (4 || 7 && 0); O computador imprimirá o valor 1 para representar verdadeiro e o valor 0 para o falso.
a) 4 || 7 && 0 b) 0 || 7 && 0 c) ‘0’ && 7 && 0
d) 1 && 1 && 1 && 1 && 1 && 0 e) 1 || 0 || 0 || 0 || 0 || 0
18) Uma diferença entre operadores relacionais e lógicos está na forma como o computador interpreta seus operandos. Operandos de operadores lógicos são interpretados como verdadeiro ou falso, sendo que operandos de operadores relacionais não. Exemplo: a expressão 3 > 2 possui operandos numéricos e são interpretados como números. Assim, o computador interpretará: “três é maior do que dois?”. Já a expressão (3 && 2) será interpretada como: “verdadeiro E verdadeiro”. Sendo assim, e verificando a tabela de precedência dos operadores aritméticos, lógicos e relacionais na Seção 3.7 da wikidot, qual o resultado da expressão: 3 + 1 > 0 && ‘f’ == ‘f’ || ‘f’ == ‘m’ ?
19) Comentários são recursos indispensáveis em programação que servem para dar informações adicionais ao próprio programador, tais como: informações do programa (nome do programador, descrição do programa, data de programação) e explicações sobre algum comando ou trecho de código. Os comentários são ignorados pelo compilador. Existem duas formas de inserir comentários em um programa, utilizando:
a) // comentários
Para comentários de apenas 1 linha
b) /* comentários */
Geralmente para comentários de mais de 1 linha
Digite o seguinte programa, verificando o uso dos dois tipos de comentários.
Após compilar seu programa, execute-o com os seguintes valores de variáveis, completando a tabela a seguir:
idade Sexo idade > 0 && sexo == ‘f’ || sexo == ‘m’ 10 ‘f’ 1 (Verdadeiro)
20 ‘m’
40 ‘w’
-2 ‘m’
Você verificou algo estranho com os resultados emitidos por seu programa? Se sim, verifique o porquê e corrija-o. Dica: verifique a precedência de operadores no Capítulo 3 de Operadores.
20) Simule a execução de cada um dos trechos de código a seguir, respondendo: quais os valores finais das variáveis? Quais as impressões na tela? Para isso, substitua os valores das variáveis pelos valores fornecidos. Primeiramente, resolva o exercício sem o uso do computador e depois confira fazendo um programa. Verifique o exemplo. A) Exemplo: int a, b; ... if (a != b-2) a = a + 1; a = a + b; cout << a << endl << b; i) Se a = 1 e b = 3
Memória Impressão na tela do usuário
a 1 4 b 3 4 3 ii) Se a = 5 e b = 2
Memória Impressão na tela do usuário
a ? b ? ? ?
B) int a, b; ... if (a == 1) { a = b + 1; b = 2 * b; } b = b – 1; cout << a << endl << b; i) Se a = 1 e b = 3 ii) Se a = 2 e b = 3 C) int a, b, c; ... if (a >= 2) a = a + 3; if (b != 5) a = a + b; if (c < 10) { a = a + 1; b = a; } a = a * 3; b = b * 2;
cout << a << endl << b << endl << c;
i) a = 2, b = 4 e c = 7 ii) a = 2, b = 5 e c = 10 iii) a = 1, b = 5 e c = 10
D) int a, b; ... if (a > 0 && b > 0) { a = a - 1; b = b + a; } else { a = a + 1; b = b - a; } cout << a << endl << b; i) Se a = 1 e b = 2 ii) Se a = 1 e b = 0 iii) Se a = 0 e b = 0 iv) Se a = 0 e b = 6 E) char s, t; ... if (s == ‘f’ || s == ‘m’) t = ‘s’; else { s = ‘i’; t = ‘n’; } cout << s << endl << t; i) s = ‘f’ e t = ‘i' ii) s = ‘f’ e t = ‘m' iii) s = ‘h’ e t = ‘m' iv) s = ‘k’ e t = ‘i'
F) int a, b; ... if (a < 0) b = -1; else if (a < 6) b = 1; else b = 0; a = a + b; cout << a << endl << b; i) a = -1 e b = 1000 ii) a = 6 e b = 200 iii) a = 5 e b = 0 G) int v, s, t; ... if (v + s > t) { cout << “X” << endl; v = v + 1; } else if (v + s == t) {
cout << “Y” << endl; v = v + 2;
} else
cout << “Z” << endl; v = v * v;
cout << v << endl << s << endl << t;
i) v = 10, s = 3, t = 20 ii) v = 2, s = 5 e t = 7 iii) v = 1, s = 4 e t = 1
H) int a; ... if (a > 0) { if (a < 15) a = a + 10; else if (a < 20) { a = a + 20; cout << “S” << endl; } else a = a + 1000; } else cout << “F” << endl; cout << a; i) a = 19 ii) a = -1 iii) a = 14 iv) a = 20
21) O programa a seguir não está correto. Teste com vários valores para a variável idade. Qual é o erro? Corrija seu programa e teste-o novamente.
22) O programa a seguir possui um erro na compilação. Escreva o erro em seu caderno. Corrija-o.
23) Digite e compile o programa abaixo. Faça vários testes. Complete a tabela a seguir.
Salário Porcentagem de Aumento
sal ≤ 0 Erro: “Salário Inválido”
0 < sal ≤ 600 10%
Considerações IMPORTANTES sobre o programa do exercício 23:
Como foi utilizado um encadeamento de if-else, caso o salário seja inválido, imprime-se a mensagem da linha 12 e a execução vai para a linha 20;
Caso o salário seja R$500,00, por exemplo, executa-se a instrução da linha 11, resultando em falso. Como em seguida há um else (senão, caso contrário), verifica-se o que há depois do else, que é um if, e 500 é menor que 600, sendo verdadeiro. Assim, executa-se a instrução da linha 14 e a execução vai para a linha 20.
Caso você utilize apenas ifs para resolver o problema, gastará mais processamento, pois independente da condição ser verdadeira ou não, verificará todas as condições dos ifs. Assim, como a linguagem disponibiliza a estrutura condicional composta (if-else), use-a!
Verifique que um número real deve ser escrito com o ponto no lugar da vírgula. Exemplo: 1.05 e não 1,05.
24) Digite o seguinte programa e execute-o com os valores da tabela a seguir. Idade Saída
10 -9 0
Explique o erro do programa e corrija-o.
25) A partir de 3 notas de um aluno fornecidas por um usuário, informe se o aluno foi aprovado, reprovado ou ficou de recuperação. O aluno estará aprovado se obteve, no mínimo, 7,0 de média; o aluno estará de recuperação caso sua média seja inferior a 7,0 mas no mínimo 5,0; o aluno estará reprovado caso sua média seja inferior a 5,0. Caso o aluno tenha ficado para recuperação, peça ao usuário a nota que o aluno tirou na recuperação, fazendo uma média aritmética desta nota com a
média anterior. Caso essa nova média seja no mínimo 5,0, o aluno passou; caso contrário, ficou reprovado.
Sendo assim, analise cada um dos algoritmos abaixo (5 propostas de solução) e dê um parecer sobre a sua corretude. Caso ele solucione o problema fale também a respeito do custo computacional (se o algoritmo está desperdiçando processamento). Em sua opinião, qual é a melhor solução? Ou caso não tenha gostado de uma solução, apresente a sua.
1a. Proposta: int main() {
float n1, n2, n3, media, notaRecuperacao; cout << “Entre com 3 notas: ”;
cin >> n1 >> n2 >> n3; media = (n1 + n2 + n3)/3; cout << “Média: ” << media; if (media>=7.0)
cout << “Aprovado!”; if (media>=5.0)
{
cout << “Recuperação!”;
cout << “Entre com a nota da recuperação: ”; cin >> notaRecuperacao;
media = (media + notaRecuperacao)/2; if (media>=5.0) cout << “Aprovado!”; else cout << “Reprovado!”; } else cout << “Reprovado!”; return 0; }
2a. Proposta: int main() {
float n1, n2, n3, media, notaRecuperacao;
cout << “Entre com 3 notas: ”; cin >> n1 >> n2 >> n3;
media = (n1 + n2 + n3)/3; cout << “Média: ” << media; if (media>=7.0)
cout << “Aprovado!”; if (media>=5.0 && media<7.0) {
cout << “Recuperação!”;
cout << “Entre com a nota da recuperação: ”; cin >> notaRecuperacao;
media = (media + notaRecuperacao)/2; if (media>=5.0) cout << “Aprovado!”; else cout << “Reprovado!”; } else cout << “Reprovado!”; return 0; }
3a. Proposta: int main() {
float n1, n2, n3, media, notaRecuperacao;
cout << “Entre com 3 notas: ”; cin >> n1 >> n2 >> n3;
media = (n1 + n2 + n3)/3; cout << “Média: ” << media; if (media>=7.0)
cout << “Aprovado!”; if (media>=5.0 && media<7.0) {
cout << “Recuperação!”;
cout << “Entre com a nota da recuperação: ”; cin >> notaRecuperacao;
media = (media + notaRecuperacao)/2; if (media>=5.0) cout << “Aprovado!”; else cout << “Reprovado!”; } if (media<5.0) cout << “Reprovado!”; return 0; }
4a. Proposta:
int main() {
float n1, n2, n3, media, notaRecuperacao;
cout << “Entre com 3 notas: ”; cin >> n1 >> n2 >> n3;
media = (n1 + n2 + n3)/3; cout << “Média: ” << media; if (media<5.0)
cout << “Reprovado!”; else if (media<7.0) {
cout << “Recuperação!”;
cout << “Entre com a nota da recuperação: ”; cin >> notaRecuperacao;
media = (media + notaRecuperacao)/2; if (media>=5.0) cout << “Aprovado!”; else cout << “Reprovado!”; } else cout << “Aprovado!”; return 0; }
5a. Proposta: int main() {
float n1, n2, n3, media, notaRecuperacao;
cout << “Entre com 3 notas: ”; cin >> n1 >> n2 >> n3;
media = (n1 + n2 + n3)/3; cout << “Média: ” << media; if (media>=7.0)
cout << “Aprovado!”; else if (media>=5.0) {
cout << “Recuperação!”;
cout << “Entre com a nota da recuperação: ”; cin >> notaRecuperacao;
media = (media + notaRecuperacao)/2; if (media>=5.0) cout << “Aprovado!”; else cout << “Reprovado!”; } else cout << “Reprovado!”; return 0; }