Você está na página 1de 10

Disciplina: Introdução a programação

Atividades da Semana 7

Observações:
1. A solução correta e entrega até a data de entrega resulta em 2.0
pontos para composição da nota do 1º EE (exercício escolar) do
estudante.
2. Entrega de solução da atividade fora do prazo não será pontuada
para fins da composição da média.

Atividades de avaliação
[1.0 ponto] A1 – Considere o código A1.

#include <iostream>
using namespace std;
int main() {
int i;
int a[5] = {A, B, C, D, E};
for(i = 0; i < 4; i++){
while(a[i] != a[i+1]) {
if(a[i] > a[i+1])
a[i] = a[i]- a[i+1];
else
a[i+1] = a[i+1] - a[i];
} // fim do whlle
} // fim do for
cout << a[i] << "\n";
} // fim do main()
Código A1

Assuma que o usuário pode atribuir qualquer número inteiro n, onde 20 <= n <= 9980,
a quaisquer dos elementos A, B, C, D e E do array a[]. Note que n pode ser qualquer
número no intervalo [20, 9980].
Todos os estudantes foram convidados a realizar testes com o programa, explorando
todas possíveis situações permitidas e solicitados, em seguida, a dar uma resposta
sobre código A1. Cinco estudantes apresentaram suas respostas. Sua tarefa é examinar
cada resposta e descobrir se verdadeira ou falsa. Cada resposta correta resulta em
0.2 ponto. Assinale V (verdadeiro) ou F (falso) nas seguintes alternativas:
i. ( ) O primeiro estudante constatou que, após executar o programa para
todas as possíveis combinações de valores que podem ser atribuídos aos
elementos A, B, C, D e E do array a[], o cout (última instrução antes do } da
função main() ) do programa nunca exibe valores no intervalo de 1 até 19.

ii. ( ) O segundo estudante constatou que, após executar o programa para


todas as possíveis combinações de valores que podem ser atribuídos aos
elementos A, B, C, D e E do array a[], o cout (última instrução antes do }
da função main() ) do programa pode exibir 2, ao menos, duas vezes.

iii. ( ) O terceiro estudante constatou que, após executar o programa para todas
as possíveis combinações de valores que podem ser atribuídos aos
elementos A, B, C, D e E do array a[], o cout (última instrução antes do }
da função main() ) do programa pode exibir 1 mais de 2 vezes.

iv. ( ) O quarto estudante constatou que, após executar o programa para todas
as possíveis combinações de valores que podem ser atribuídos aos
elementos A, B, C, D e E do array a[], o cout (última instrução antes do } da
função main() ) do programa exibia apenas números no intervalo de 20 até
9980.

v. ( ) O quinto estudante constatou que, após executar o programa para todas


as possíveis combinações de valores que podem ser atribuídos aos
elementos A, B, C, D e E do array a[], o cout (última instrução antes do } da
função main() ) do programa pode exibir 2, ao menos, 9 vezes.
[0.5 ponto] A2 – O professor de programação solicitou os estudantes elaborarem um
programa, fazendo uso da função rand() e srand(), para gerar 2000 números inteiros
aleatórios no intervalo de -999 até 999. O programa deve ainda descobrir o menor inteiro
dentre os 2000 números inteiros aleatórios gerados. Em menos de 5min, um estudante
apresentou o código A2 (vide código). O professor, então, solicitou os demais
estudantes analisarem o código A2 apresentado.
Sua tarefa é examinar o código A2 e responder se atende ao enunciado do professor,
assinalando V (verdadeiro) se correto ou F (falso) caso contrário. Se, eventualmente, o
código A2 tiver erro, então você deve informar em uma única linha qual erro identificado
e, no máximo, modificar uma linha do código A2.

1. #include <iostream>
2. #include <cstdlib>
3. #include <ctime>
4. using namespace std;
5. int main() {
6. srand(time(0));
7. int i = 1, n;
8. int menor = -999;
9. for(i = 2; i < 2000; i++){
10. n = -999 + rand()%1999;
11. if(n < menor)
12. menor = n;
13. } // fim do for
14. } // fim do main()
Código A2
[0.5 ponto] A3 – O professor de programação apresentou três programas (códigos
A3a, A3b e A4c) e solicitou os estudantes examinarem se eles estavam corretos, isto é,
sem erros. Vide informação sobre erros de programação nas páginas 7 a 10.
1. #include <iostream>
2. #include <cstdlib>
3. #include <ctime>
4. using namespace std;
5. int main(){
6. srand(time(0));
7. int a[10], n, soma = 0, i;
8. n = rand()%20;
9. for(i = 0; i <= n; i=i+2){
10. a[i] = rand()%11;
11. soma = soma + a[i];
12. } //fim do for
13. } //fim do main()
Código A3a

1. #include <iostream>
2. #include <cstdlib>
3. #include <ctime>
4. using namespace std;
5. int main(){
6. srand(time(0));
7. int a[10], n, soma = 0, i;
8. n = rand()%11;
9. for(i = 0; i <= n; i++){
10. a[i] = rand()%11;
11. soma = soma + a[i];
12. } //fim do for
13. } //fim do main()
Código A3b

1. #include <iostream>
2. #include <cstdlib>
3. #include <ctime>
4. using namespace std;
5. int main(){
6. srand(time(0));
7. int a[10], n, soma = 0, i;
8. n = rand()%11;
9. for(i = 0; i < n; i=i+2){
10. a[i] = rand()%11;
11. soma = soma + a[i];
12. } //fim do for
13. } //fim do main()
Código A3c
Após examinar os três códigos, observa-se que:
a) Apenas o código A3a está sem erro
b) Apenas o código A3b está sem erro
c) Apenas o código A3c está sem erro
d) Apenas os códigos A3a e A3b estão sem erro
e) Todos os códigos estão sem erro
Disciplina: Introdução a programação

Erros de programação

Definições
Inicialmente, define-se erro como a causa de uma ocorrência ou falha. Portanto,
erro é a causa, enquanto que falha é o efeito observável (após a compilação ou
execução de um programa).

Erros de programação (também denominados de bugs) podem ocorrer durante


o desenvolvimento de um programa, resultando em:
1. Falha de compilação, quando o compilador não consegue compilar código fonte
e gerar o código executável;
2. Falha de execução, quando o código fonte é compilado, mas durante a
execução, observa-se que:
i. O programa executa, mas o resultado produzido é incorreto;
ii. O programa entra em loop, permanece em execução indefinidamente;
iii. O programa está incompleto (na solução), não tratando todos possíveis
valores como extrapolar intervalos numéricos ou tentar operações não
permitidas como, por exemplo, a divisão por 0 (zero).

Um conjunto de erros de programação é apresentado.

i) Erro de sintaxe - quando a sintaxe da linguagem de não é corretamente


usada no código fonte. Erros comuns são:
a. Esquecer o ponto-e-vírgula (;) ao final de uma instrução

x=a+b

b. Esquecer o fecha parêntesis) numa condição

if (a >= b

c. Esquecer o fecha chaves } em uma estrutura de controle

if (a >= b) {
a++;
...
// falta fecha chaves }

d. Esquecer de declarar variáveis

int a = 10, b = 20;


x = a + b; // tentar usar uma variável não declarada
e. Esquecer de declarar uma biblioteca

#include <iostream>
// falta declaração de cmath ou math.h
using namespace std;
int main() {

double raiz, x = 25;

raiz = sqrt(x); //biblioteca cmath não declarada


...
}

ii) Erro operacional – Pode ocorrer, por exemplo, quando o valor de uma
variável excede limite numérico de seu tipo de dado ou quando se tenta
realizar operação ou acesso a elemento (ou posição) inexistente ou não
inicializada de um array.

Vale lembrar que na declaração de variáveis, o projetista deve atentar em escolher o


tipo de dado mais apropriado para a variável em mãos. Nesse sentido, a Tabela 4-1
(apresentada na semana 4 e reproduzida aqui), contém os tipos de dados suportados
pela linguagem com as respectivas quantidade de bytes para armazenar cada dos tipos
de dados e respectivos intervalos numéricos. O mesmo pode ocorrer se os limites
numéricos dos outros tipos não forem utilizados corretamente pelo projetista.

Tipos de dados Bytes ocupados Intervalo numérico

short int 2 -32.768 a 32.767


signed int
signed short int

int 4 -2.147.483.648 até 2.147.483.647


long int

char 1 -128 a 127

true ou false
bool 1

float 4 -1.2e-38 a 3.4e+38


double 8 -2.2e-308 a 1.8e+308
long float

Tabela 4-1: Tipos de dados primitivos


Considere o exemplo do código 1 e respectiva saída na Figura 1. Note o
valor incorreto na soma dos valores de a e b, pois excede o maior valor
numérico para inteiros. O mesmo ocorre quando os valores de a e b são
subtraídos de y, uma vez que o resultado excede o limite numérico inferior
para o tipo int. Portanto, embora o programa esteja sintaticamente correto,
há 2 erros operacionais, resultando em falha de execução.

#include <iostream>
using namespace std;
int main() {
int a = 2e9;
int b = 2e9;
int x = 1e6;
int y = 0;
cout << a + b << endl;
cout << a + x << endl;
cout << b - x << endl;
cout << y - a - b << endl;
}
Código 1

Figura 1
iii) Erro de loop – Pode ocorrer, por exemplo, quando o programa permanece
em execução por tempo indeterminado. Esse tipo de erro decorre do uso
incorreto das estruturas de controle de fluxos ou especificação incorreta de
condições (destas estruturas de controle) usadas na solução. No exemplo do
código 2, o usuário digita o valor 11, atribuído a variável x, resultando que a
condição do while é sempre verdadeira e, consequentemente, fica em
execução permanente ou em loop, uma vez que o projetista não adicionou
uma instrução, por exemplo, para decrementar x ou outra condição de
parada para a estrutura de controle. No exemplo do código 2, uma instrução
sleep() e biblioteca unistd.h foram adicionadas para visualizar a execução de
modo lento.

#include <iostream>
#include <unistd.h>
using namespace std;
int main() {
int a = 10;
int x;
cout << "Digite x: ";
cin >> x;
while(x > a){
cout << x << endl;
sleep(1);
// falta decremento de x, por exemplo
}
cout << "Nao chega aqui!\n";
}
Código 2

Figura 2

Erro de lógica -- Pode ocorrer quando o programa não realiza a funcionalidade


especificada no enunciado do problema. Isso pode acontecer por desatenção do
projetista ou alta complexidade do problema tratado.

Você também pode gostar