Mudanças entre as edições de "Sistemas Operacionais e Introdução a Programação (diário 2009-2) - Prova de Lógica de Programação"
(38 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 28: | Linha 28: | ||
===Resposta=== | ===Resposta=== | ||
+ | * Pseudocódigo | ||
+ | *# Leia o primeiro número e armazene em "numeroUm". | ||
+ | *# Enquanto "operador" for diferente de "=" faça | ||
+ | *## Apresente a lista de operadores possíveis (+, -, / e *). | ||
+ | *## Leia o operador e armazene em "operador". | ||
+ | *## Se "operador" é diferente de "=" então | ||
+ | *### Leia o segundo número e armazene em "numeroDois". | ||
+ | *### Aplique o operador "operador" sobre "numeroUm" e "numeroDois", nesta ordem, e armazene o resultado em "numeroUm". | ||
+ | *### Apresente na tela o resultado intermediário da operação - armazenado em "numeroUm". | ||
+ | *## Fim Se | ||
+ | *# Fim Enquanto | ||
+ | *# Apresente na tela o resultado final das operações - armazenado em "numeroUm". | ||
+ | * Diagrama de blocos | ||
+ | <graphviz> | ||
+ | digraph Questao1 | ||
+ | { | ||
+ | "Início" | ||
+ | "Leia numeroUm" [shape=invtrapezium] | ||
+ | "Enquanto: operador != =?" [shape=diamond] | ||
+ | "Escreva lista de operadores" [shape=trapezium] | ||
+ | "Leia operador" [shape=invtrapezium] | ||
+ | "Se: operador != =?" [shape=diamond] | ||
+ | "Leia numeroDois" [shape=record] | ||
+ | "numeroUm = numeroUm operador numeroDois" [shape=record] | ||
+ | "Escreva resultado int. numeroUm" [shape=trapezium] | ||
+ | "Escreva resultado final numeroUm" [shape=trapezium] | ||
+ | "Fim" | ||
+ | |||
+ | "Início" -> "Leia numeroUm" | ||
+ | "Leia numeroUm" -> "Enquanto: operador != =?" | ||
+ | "Enquanto: operador != =?" -> "Escreva resultado final numeroUm" [label="Não"] | ||
+ | "Escreva resultado final numeroUm" -> "Fim" | ||
+ | "Enquanto: operador != =?" -> "Escreva lista de operadores" [label="Sim"] | ||
+ | "Escreva lista de operadores" -> "Leia operador" | ||
+ | "Leia operador" -> "Se: operador != =?" | ||
+ | "Se: operador != =?" -> "Escreva resultado final numeroUm" [label="Não"] | ||
+ | "Se: operador != =?" -> "Leia numeroDois" [label="Sim"] | ||
+ | "Leia numeroDois" -> "numeroUm = numeroUm operador numeroDois" | ||
+ | "numeroUm = numeroUm operador numeroDois" -> "Escreva resultado int. numeroUm" | ||
+ | "Escreva resultado int. numeroUm" -> "Enquanto: operador != =?" | ||
+ | } | ||
+ | </graphviz> | ||
==Questão 2== | ==Questão 2== | ||
Linha 48: | Linha 90: | ||
Observação: já foi proposta em aula uma [[Sistemas Operacionais e Introdução a Programação (diário 2009-2)#21/09: Atividades com pseudocódigo e diagrama de blocos|atividade parecida]]. | Observação: já foi proposta em aula uma [[Sistemas Operacionais e Introdução a Programação (diário 2009-2)#21/09: Atividades com pseudocódigo e diagrama de blocos|atividade parecida]]. | ||
+ | |||
+ | ===Resposta=== | ||
+ | * '''Nota''': apesar de fazer parte do problema o cálculo dos ângulos para o desenho, o foco principal da avaliação desta questão é a interface com o usuário: lê-se um usuário e retorna uma lista de comandos a serem copiados para o programa Kturtle. Foi visto, em aula, o cálculo para estrelas de quantidade ímpar de pontas, perfazendo um intervalo curto: valores ímpares entre 5 e 15 (casos em que os ângulos das pontas se baseiam diretamente nos ângulos internos da figura), o qual será assumido como válido para esta questão. Esse cálculo, assim como outros, serão devidamente considerados na avaliação. | ||
+ | |||
+ | * Pseudocódigo | ||
+ | *# Leia quantidade de lados | ||
+ | *# Calcule o ângulo interno do polígono interno da estrela com a fórmula: (lados - 2) * 180 / lados | ||
+ | *# Calcule o ângulo interno do vértice com a fórmula: 180 - (2 * (180 - ângulo interno do polígono interno)) | ||
+ | *# Para vértice de 1 até lados faça | ||
+ | *## Escreva "forward 100" | ||
+ | *## Escreva "turnright" e a diferença entre 180 e o ângulo interno do triângulo | ||
+ | *# Fim Para | ||
+ | * Diagrama de blocos | ||
+ | <graphviz> | ||
+ | digraph Estrela | ||
+ | { | ||
+ | "Início" | ||
+ | "Leia qtde. de lados" [shape=invtrapezium] | ||
+ | "Calcule ang. int. polígono interno" [shape=record] | ||
+ | "Calcule ang. int. vértice" [shape=record] | ||
+ | "vértice = 1" | ||
+ | "Para: vértice > lados?" [shape=diamond] | ||
+ | "Escreva forward" [shape=trapezium] | ||
+ | "Escreva turnright ângulo" [shape=trapezium] | ||
+ | "vértice = vértice + 1" [shape=record] | ||
+ | "Fim" | ||
+ | |||
+ | "Início" -> "Leia qtde. de lados" | ||
+ | "Leia qtde. de lados" -> "Calcule ang. int. polígono interno" | ||
+ | "Calcule ang. int. polígono interno" -> "Calcule ang. int. vértice" | ||
+ | "Calcule ang. int. vértice" -> "vértice = 1" | ||
+ | "vértice = 1" -> "Para: vértice > lados?" | ||
+ | "Para: vértice > lados?" -> "Fim" [label="Sim"] | ||
+ | "Para: vértice > lados?" -> "Escreva forward" [label="Não"] | ||
+ | "Escreva forward" -> "Escreva turnright ângulo" | ||
+ | "Escreva turnright ângulo" -> "vértice = vértice + 1" | ||
+ | "vértice = vértice + 1" -> "Para: vértice > lados?" | ||
+ | } | ||
+ | </graphviz> | ||
==Questão 3== | ==Questão 3== | ||
Linha 53: | Linha 134: | ||
Observação: diferente da questão 2, já foi proposta em aula esta [[Sistemas Operacionais e Introdução a Programação (diário 2009-2)#21/09: Atividades com pseudocódigo e diagrama de blocos|mesma atividade]]. | Observação: diferente da questão 2, já foi proposta em aula esta [[Sistemas Operacionais e Introdução a Programação (diário 2009-2)#21/09: Atividades com pseudocódigo e diagrama de blocos|mesma atividade]]. | ||
+ | |||
+ | ===Resposta=== | ||
+ | * Pseudocódigo | ||
+ | *# Leia a | ||
+ | *# Leia b | ||
+ | *# Leia c | ||
+ | *# Calcule a fórmula e armazene na variável raiz: b * b - 4 * a * c | ||
+ | *# Se raiz < 0 então | ||
+ | *## Escreva raiz negativa, reposta não real | ||
+ | *# Senão | ||
+ | *## Calcule a raiz quadrada do valor armazenado em raiz e armazene de volta na mesma variável | ||
+ | *## Calcule a fórmula e armazene na variável respostaNegativo: (-b - raiz) / 2a | ||
+ | *## Calcule a fórmula e armazene na variável respostaPositivo: (-b + raiz) / 2a | ||
+ | *# Fim Se | ||
+ | *# Escreva as respostas respostaNegativo e respostaPositivo | ||
+ | * Diagrama de blocos | ||
+ | <graphviz> | ||
+ | digraph Bhaskara | ||
+ | { | ||
+ | "Início" | ||
+ | "Leia a" [shape=invtrapezium] | ||
+ | "Leia b" [shape=invtrapezium] | ||
+ | "Leia c" [shape=invtrapezium] | ||
+ | "Fim" | ||
+ | "Calcule raiz" [shape=record] | ||
+ | "Se: raiz < 0?" [shape=diamond] | ||
+ | "Escreva raiz negativa" [shape=record] | ||
+ | "raiz = raizQuadrada(raiz)" [shape=record] | ||
+ | "Calcule respostaNegativo" [shape=record] | ||
+ | "Calcule respostaPositivo" [shape=record] | ||
+ | "Escreva respostaNegativo e respostaPositivo" [shape=trapezium] | ||
+ | |||
+ | "Início" -> "Leia a" -> "Leia b" -> "Leia c" -> "Calcule raiz" -> "Se: raiz < 0?" | ||
+ | "Se: raiz < 0?" -> "Escreva raiz negativa" [label="Sim"] | ||
+ | "Escreva raiz negativa" -> "Fim" | ||
+ | "Se: raiz < 0?" -> "raiz = raizQuadrada(raiz)" [label="Não"] | ||
+ | "raiz = raizQuadrada(raiz)" -> "Calcule respostaNegativo" | ||
+ | "Calcule respostaNegativo" -> "Calcule respostaPositivo" | ||
+ | "Calcule respostaPositivo" -> "Escreva respostaNegativo e respostaPositivo" | ||
+ | "Escreva respostaNegativo e respostaPositivo" -> "Fim" | ||
+ | } | ||
+ | </graphviz> | ||
==Questão 4== | ==Questão 4== | ||
Linha 58: | Linha 181: | ||
Observação: é uma combinação de [[Sistemas Operacionais e Introdução a Programação (diário 2009-2)#Problema 4|atividades já propostas]]. | Observação: é uma combinação de [[Sistemas Operacionais e Introdução a Programação (diário 2009-2)#Problema 4|atividades já propostas]]. | ||
+ | |||
+ | ===Resposta=== | ||
+ | * Pseudocódigo | ||
+ | *# Leia o número e armazene na variável "número" | ||
+ | *# Atribua como valor inicial "número - 1" à variável "divisor" | ||
+ | *# Atribua como valor inicial 0 à variável "soma" | ||
+ | *# Enquanto "divisor" > 0 faça | ||
+ | *## Atribua à variável "resto" o resto da divisão entre "número" e "divisor" | ||
+ | *## Se "resto" = 0 então | ||
+ | *### Atribua o seguinte valor à variável "soma": "soma" + "divisor" | ||
+ | *## Fim Se | ||
+ | *## Diminua em 1 o valor em "divisor" | ||
+ | *# Fim Enquanto | ||
+ | *# Se "soma" = 1 então | ||
+ | *## Escreva que o número é primo | ||
+ | *# Senão | ||
+ | *## Se "soma" = "número" então | ||
+ | *### Escreva que o número é perfeito | ||
+ | *## Senão | ||
+ | *### Escreva que o número não é primo tampouco perfeito | ||
+ | *## Fim Se | ||
+ | *# Fim Se | ||
+ | * Diagrama de blocos | ||
+ | <graphviz> | ||
+ | digraph PrimoPerfeito | ||
+ | { | ||
+ | "Início" | ||
+ | "Leia número" [shape=record] | ||
+ | "divisor = número - 1" [shape=record] | ||
+ | "soma = 0" [shape=record] | ||
+ | "divisor > 0?" [shape=diamond] | ||
+ | "resto = numero mod divisor" [shape=record] | ||
+ | "resto = 0?" [shape=diamond] | ||
+ | "soma = soma + divisor" [shape=record] | ||
+ | "divisor = divisor - 1" [shape=record] | ||
+ | "soma = 1?" [shape=diamond] | ||
+ | "Escreva primo" [shape=record] | ||
+ | "soma = número?" [shape=diamond] | ||
+ | "Escreva perfeito" [shape=record] | ||
+ | "Escreva não primo/perfeito" [shape=record] | ||
+ | "Fim" | ||
+ | |||
+ | "Início" -> "Leia número" -> "divisor = número - 1" -> "soma = 0" -> "divisor > 0?" | ||
+ | "divisor > 0?" -> "resto = numero mod divisor" [label="Sim"] | ||
+ | "resto = numero mod divisor" -> "resto = 0?" | ||
+ | "resto = 0?" -> "soma = soma + divisor" [label="Sim"] | ||
+ | "resto = 0?" -> "divisor = divisor - 1" [label="Não"] | ||
+ | "soma = soma + divisor" -> "divisor = divisor - 1" -> "divisor > 0?" | ||
+ | |||
+ | "divisor > 0?" -> "soma = 1?" | ||
+ | "soma = 1?" -> "Escreva primo" [label="Sim"] | ||
+ | "soma = 1?" -> "soma = número?" [label="Não"] | ||
+ | "soma = número?" -> "Escreva perfeito" [label="Sim"] | ||
+ | "soma = número?" -> "Escreva não primo/perfeito" [label="Não"] | ||
+ | "Escreva primo" -> "Fim" | ||
+ | "Escreva perfeito" -> "Fim" | ||
+ | "Escreva não primo/perfeito" -> "Fim" | ||
+ | } | ||
+ | </graphviz> | ||
<center><small>[[Sistemas Operacionais e Introdução a Programação (diário 2009-2)|Diário da disciplina]]</small></center> | <center><small>[[Sistemas Operacionais e Introdução a Programação (diário 2009-2)|Diário da disciplina]]</small></center> |
Edição atual tal como às 15h20min de 18 de outubro de 2009
Cada questão deve contemplar:
- Pseudocódigo com entrada, processamento e saída de dados;
- Diagrama de blocos.
Questão 1
Monte uma calculadora simples, que utiliza as quatro operações básicas:
- +
- -
- /
- *
A calculadora deve pedir indefinidamente números e operadores enquanto não for digitado o símbolo "=". A cada par de números e uma operação, deve-se mostrar o resultado intermediário dos cálculos. Exemplo:
Digite o primeiro número: 42 Digite a operação: + Digite o segundo número: 7
Resultado intermediário: 49
Digite a próxima operação: / Digite o próximo número: 7
Resultado intermediário: 7
Digite a próxima operação: =
Resultado final: 7
Observação: esta questão estava disponível na lista de exercícios do Prof. Sobral.
Resposta
- Pseudocódigo
- Leia o primeiro número e armazene em "numeroUm".
- Enquanto "operador" for diferente de "=" faça
- Apresente a lista de operadores possíveis (+, -, / e *).
- Leia o operador e armazene em "operador".
- Se "operador" é diferente de "=" então
- Leia o segundo número e armazene em "numeroDois".
- Aplique o operador "operador" sobre "numeroUm" e "numeroDois", nesta ordem, e armazene o resultado em "numeroUm".
- Apresente na tela o resultado intermediário da operação - armazenado em "numeroUm".
- Fim Se
- Fim Enquanto
- Apresente na tela o resultado final das operações - armazenado em "numeroUm".
- Diagrama de blocos
<graphviz> digraph Questao1 { "Início" "Leia numeroUm" [shape=invtrapezium] "Enquanto: operador != =?" [shape=diamond] "Escreva lista de operadores" [shape=trapezium] "Leia operador" [shape=invtrapezium] "Se: operador != =?" [shape=diamond] "Leia numeroDois" [shape=record] "numeroUm = numeroUm operador numeroDois" [shape=record] "Escreva resultado int. numeroUm" [shape=trapezium] "Escreva resultado final numeroUm" [shape=trapezium] "Fim"
"Início" -> "Leia numeroUm" "Leia numeroUm" -> "Enquanto: operador != =?" "Enquanto: operador != =?" -> "Escreva resultado final numeroUm" [label="Não"] "Escreva resultado final numeroUm" -> "Fim" "Enquanto: operador != =?" -> "Escreva lista de operadores" [label="Sim"] "Escreva lista de operadores" -> "Leia operador" "Leia operador" -> "Se: operador != =?" "Se: operador != =?" -> "Escreva resultado final numeroUm" [label="Não"] "Se: operador != =?" -> "Leia numeroDois" [label="Sim"] "Leia numeroDois" -> "numeroUm = numeroUm operador numeroDois" "numeroUm = numeroUm operador numeroDois" -> "Escreva resultado int. numeroUm" "Escreva resultado int. numeroUm" -> "Enquanto: operador != =?" } </graphviz>
Questão 2
Construa um programa que gera código, automaticamente, para o programa Kturtle para desenhar estrelas de n pontas. Assuma os segmentos de reta com tamanho 100.
Para resolver o problema, bastam apenas duas instruções do Kturtle:
- forward
- turnleft ou turnright
Exemplo: para desenhar uma estrela de 5 pontas no Kturtle, é preciso o seguinte conjunto de instruções:
forward 100 turnleft 144 forward 100 turnleft 144 forward 100 turnleft 144 forward 100 turnleft 144 forward 100
Observação: já foi proposta em aula uma atividade parecida.
Resposta
- Nota: apesar de fazer parte do problema o cálculo dos ângulos para o desenho, o foco principal da avaliação desta questão é a interface com o usuário: lê-se um usuário e retorna uma lista de comandos a serem copiados para o programa Kturtle. Foi visto, em aula, o cálculo para estrelas de quantidade ímpar de pontas, perfazendo um intervalo curto: valores ímpares entre 5 e 15 (casos em que os ângulos das pontas se baseiam diretamente nos ângulos internos da figura), o qual será assumido como válido para esta questão. Esse cálculo, assim como outros, serão devidamente considerados na avaliação.
- Pseudocódigo
- Leia quantidade de lados
- Calcule o ângulo interno do polígono interno da estrela com a fórmula: (lados - 2) * 180 / lados
- Calcule o ângulo interno do vértice com a fórmula: 180 - (2 * (180 - ângulo interno do polígono interno))
- Para vértice de 1 até lados faça
- Escreva "forward 100"
- Escreva "turnright" e a diferença entre 180 e o ângulo interno do triângulo
- Fim Para
- Diagrama de blocos
<graphviz> digraph Estrela { "Início" "Leia qtde. de lados" [shape=invtrapezium] "Calcule ang. int. polígono interno" [shape=record] "Calcule ang. int. vértice" [shape=record] "vértice = 1" "Para: vértice > lados?" [shape=diamond] "Escreva forward" [shape=trapezium] "Escreva turnright ângulo" [shape=trapezium] "vértice = vértice + 1" [shape=record] "Fim"
"Início" -> "Leia qtde. de lados" "Leia qtde. de lados" -> "Calcule ang. int. polígono interno" "Calcule ang. int. polígono interno" -> "Calcule ang. int. vértice" "Calcule ang. int. vértice" -> "vértice = 1" "vértice = 1" -> "Para: vértice > lados?" "Para: vértice > lados?" -> "Fim" [label="Sim"] "Para: vértice > lados?" -> "Escreva forward" [label="Não"] "Escreva forward" -> "Escreva turnright ângulo" "Escreva turnright ângulo" -> "vértice = vértice + 1" "vértice = vértice + 1" -> "Para: vértice > lados?" } </graphviz>
Questão 3
Dada uma equação de 2º grau, leia os três números e aplique a fórmula de Bhaskara - para obter a(s) resposta(s).
Observação: diferente da questão 2, já foi proposta em aula esta mesma atividade.
Resposta
- Pseudocódigo
- Leia a
- Leia b
- Leia c
- Calcule a fórmula e armazene na variável raiz: b * b - 4 * a * c
- Se raiz < 0 então
- Escreva raiz negativa, reposta não real
- Senão
- Calcule a raiz quadrada do valor armazenado em raiz e armazene de volta na mesma variável
- Calcule a fórmula e armazene na variável respostaNegativo: (-b - raiz) / 2a
- Calcule a fórmula e armazene na variável respostaPositivo: (-b + raiz) / 2a
- Fim Se
- Escreva as respostas respostaNegativo e respostaPositivo
- Diagrama de blocos
<graphviz> digraph Bhaskara { "Início" "Leia a" [shape=invtrapezium] "Leia b" [shape=invtrapezium] "Leia c" [shape=invtrapezium] "Fim" "Calcule raiz" [shape=record] "Se: raiz < 0?" [shape=diamond] "Escreva raiz negativa" [shape=record] "raiz = raizQuadrada(raiz)" [shape=record] "Calcule respostaNegativo" [shape=record] "Calcule respostaPositivo" [shape=record] "Escreva respostaNegativo e respostaPositivo" [shape=trapezium]
"Início" -> "Leia a" -> "Leia b" -> "Leia c" -> "Calcule raiz" -> "Se: raiz < 0?" "Se: raiz < 0?" -> "Escreva raiz negativa" [label="Sim"] "Escreva raiz negativa" -> "Fim" "Se: raiz < 0?" -> "raiz = raizQuadrada(raiz)" [label="Não"] "raiz = raizQuadrada(raiz)" -> "Calcule respostaNegativo" "Calcule respostaNegativo" -> "Calcule respostaPositivo" "Calcule respostaPositivo" -> "Escreva respostaNegativo e respostaPositivo" "Escreva respostaNegativo e respostaPositivo" -> "Fim" } </graphviz>
Questão 4
Leia um número e, a partir do mesmo conjunto de instruções, identifique se o número é primo e/ou perfeito.
Observação: é uma combinação de atividades já propostas.
Resposta
- Pseudocódigo
- Leia o número e armazene na variável "número"
- Atribua como valor inicial "número - 1" à variável "divisor"
- Atribua como valor inicial 0 à variável "soma"
- Enquanto "divisor" > 0 faça
- Atribua à variável "resto" o resto da divisão entre "número" e "divisor"
- Se "resto" = 0 então
- Atribua o seguinte valor à variável "soma": "soma" + "divisor"
- Fim Se
- Diminua em 1 o valor em "divisor"
- Fim Enquanto
- Se "soma" = 1 então
- Escreva que o número é primo
- Senão
- Se "soma" = "número" então
- Escreva que o número é perfeito
- Senão
- Escreva que o número não é primo tampouco perfeito
- Fim Se
- Se "soma" = "número" então
- Fim Se
- Diagrama de blocos
<graphviz> digraph PrimoPerfeito { "Início" "Leia número" [shape=record] "divisor = número - 1" [shape=record] "soma = 0" [shape=record] "divisor > 0?" [shape=diamond] "resto = numero mod divisor" [shape=record] "resto = 0?" [shape=diamond] "soma = soma + divisor" [shape=record] "divisor = divisor - 1" [shape=record] "soma = 1?" [shape=diamond] "Escreva primo" [shape=record] "soma = número?" [shape=diamond] "Escreva perfeito" [shape=record] "Escreva não primo/perfeito" [shape=record] "Fim"
"Início" -> "Leia número" -> "divisor = número - 1" -> "soma = 0" -> "divisor > 0?" "divisor > 0?" -> "resto = numero mod divisor" [label="Sim"] "resto = numero mod divisor" -> "resto = 0?" "resto = 0?" -> "soma = soma + divisor" [label="Sim"] "resto = 0?" -> "divisor = divisor - 1" [label="Não"] "soma = soma + divisor" -> "divisor = divisor - 1" -> "divisor > 0?"
"divisor > 0?" -> "soma = 1?" "soma = 1?" -> "Escreva primo" [label="Sim"] "soma = 1?" -> "soma = número?" [label="Não"] "soma = número?" -> "Escreva perfeito" [label="Sim"] "soma = número?" -> "Escreva não primo/perfeito" [label="Não"] "Escreva primo" -> "Fim" "Escreva perfeito" -> "Fim" "Escreva não primo/perfeito" -> "Fim" } </graphviz>