Profa. Dra. Milena Guessi Margarido
(milena@icmc.usp.br)
RESOLUÇÃO
EXERCÍCIOS
SSC 301 - INTRODUÇÃO À COMPUTAÇÃO PARA ENGENHARIA AMBIENTAL
PSEUDOCÓDIGO
algoritmo sequência de comandos fim algoritmo corpo principal repita se condição então interrompa fim se sequência de comandos fim repita repetição se condiçãoentão sequência de comandos fim se
condição
condição composta se condição
então sequência de comandos senão sequência de comandos fim se
declare identificador numérico declare identificador lógico declare identificador literal
declarações leia variável escreva nome comandos E/S e ou não {conjunção} {disjunção} {negação} operadores lógicos + × − ÷ 𝑣𝑎𝑟𝑖á𝑣𝑒𝑙𝑋 √ expressões aritméticas = ≠ > < ≥ ≤ igual a diferente de maior que menor que maior ou igual a menor ou igual a expressões lógicas identificador ← expressão comando de atribuição
OPERADORES LÓGICOS
Definições A conjunção (e - ∧)de duas proposições (ou seja, uma variável lógica, uma relação ou uma expressão lógica composta) é
verdadeira se e somente se ambas as proposições são verdadeiras
A disjunção (ou - ∨) de duas proposições é verdadeira se e somente se pelo menos uma delas for verdadeira
A negação (não - ¬) de uma proposição é verdadeira se e o somente se a proposição é falsa.
TABELA VERDADE
CONJUNÇÃO
𝑷
𝑸
𝑷 ∧ 𝑸
V
V
V
V
F
F
F
V
F
F
F
F
TABELA VERDADE
DISJUNÇÃO
𝑷
𝑸
𝑷 ∨ 𝑸
V
V
V
V
F
V
F
V
V
F
F
F
TABELA VERDADE
NEGAÇÃO
𝑷
¬𝑷
V
F
EXEMPLO
• Implemente um programa em C que preencha dois vetores, X e
Y, com dez números inteiros cada. Calcule e mostre os seguintes vetores resultantes.
a) A união de X e Y, com todos os elementos de X e Y sem
repetições
b) A diferença entre X e Y, ou seja, os elementos de X que não
existem em Y, sem repetições
c) A soma entre X e Y, ou seja, a soma de cada elemento de X
com o elemento o elemento correspondente de Y
d) O produto de X e Y, ou seja, a multiplicação de cada elemento
SOLUÇÃO A
• Para X e Y:
• União =
• O que podemos observar nesse exemplo?
• É preciso remover os números repetidos dentro do próprio
vetor
• O vetor resultado deve ter no máximo 20 posições (se tiver
apenas números únicos em X e Y)
• Preenchemos o vetor resultado primeiro com elementos do
SOLUÇÃO A
• Primeiro passo:
• Elaborar um algoritmo, semelhante a uma receita, sobre os
passos que o programa precisa executar para resolver o problema
• Exemplo:
• Criar um vetor resultado para guardar a união de X e Y
• Ler cada elemento do vetor X e adicionar no vetor resultado
apenas os elementos que ainda não existem no vetor união
• Ler cada elemento do vetor Y e adicionar no vetor resultado
apenas os elementos que ainda não existem no vetor união
SOLUÇÃO A
• Segundo passo:
• Escrever em linguagem de pseucódigo o algoritmo para
algoritmo
declare X[10], Y[10], RESULT[20], PROX, I, J numérico
PROX ← 1 {qual a próxima posição que pode ser usada em RESULT} I ← 1 repita se I > 10 então interrompa fim se leia X[I] J ← 1 repita
se J = PROX ou RESULT[J] = X[I] então interrompa
fim se
se RESULT[J] ≠ X[I] {enquanto não encontra X[I] em RESULT[J]} então J ← J + 1
fim se fim repita se J = PROX
então RESULT[J] ← X[I] PROX ← PROX + 1 fim se I ← I + 1 fim repita imprime RESULT[1]..RESULT[PROX] fim algoritmo repete para Y
Condição de parada: percorreu todos os
elementos do vetor resultado (então J=PROX) ou se x[i] foi encontrado (então J<PROX)
Se eu consegui percorrer todo o vetor resultado é porque o elemento x[i] ainda não se encontra nele, logo eu posso
inserir esse valor no fim do vetor resultado e atualizar o valor de prox
SOLUÇÃO A
• Terceiro passo: • Implementar!
#include <stdio.h> //biblioteca para E/S int main() {
int x[5]={}, y[5]={}, result[10]={}, prox, i, j; prox=0; //result começa sem nenhum elemento
for (i=0;i<5;i++) { printf("\nDigite x[%d]: ", i); scanf("%d",&x[i]); for (j=0;j<prox;j++) { if (x[i]==result[j]){ printf("encontrado"); break; } } if (j==prox) { printf("inserido"); result[prox]=x[i]; prox++; } } //Imprimir resultado
printf("\ni: %d, j: %d, prox: %d result: ", i, j, prox); for (i=0;i<prox;i++){ printf("%d,",result[i]); } return 0; } repete para Y
DISCUSSÃO DA SOLUÇÃO
• Existem variações para a resolução do exercício anterior! Você
consegue pensar em outras soluções?
• Ler o n-ésimo elemento de X e Y simultaneamente • Diferentes tipos de repetição (while ou do)
• Qual a melhor solução? Depende....
• Normalmente, preferimos a solução que precisa de menos
passos
• Ou podemos preferir a solução que é mais clara
SOLUÇÃO B
• Para X e Y:
• Diferença =
• O que podemos observar nesse exemplo?
• Preciso saber X e Y para poder determinar o vetor resultado • O vetor resultado pode ter no máximo 10 posições (se
algoritmo
declare X[10], Y[10], RESULT[20], PROX, I, J, R numérico
PROX ← 1 {qual a próxima posição que pode ser usada em RESULT} I ← 1 repita se I > 10 então interrompa fim se leia X[I] fim repita I ← 1 repita se I > 10 então interrompa fim se J ← 1 repita se X[I]=Y[I] então interrompa fim se J ← J + 1 fim repita .... I ← I + 1 fim repita imprime RESULT[1]..RESULT[PROX] fim algoritmo
Condição de parada: x[i] também existe em y
Se eu consigo percorrer todo o vetor y sem
encontrar x[i], então x[i] é diferente, mas antes de inserir x[i] no vetor resultado também preciso verificar se ele é único
repete para Y
Três iteradores porque estou percorrendo três vetores no
se J=10 então R ← 1 repita se R>PROX então interrompa fim se se RESULT[R] ≠ X[I] então R ← R + 1 fim repita
se R=PROX então RESULT[J] ← X[I] PROX ← PROX + 1
fim se fim se
Se x[i] não existe em y
Se eu também consigo percorrer todo o vetor resultado sem encontrar x[i], então eu posso inserir x[i] no vetor resultado e atualizar o valor de prox
Tente modificar a
implementação do
exemplo A com base
no pseudocódigo visto
#include <stdio.h> //biblioteca para E/S int main() {
int x[5]={}, y[5]={}, result[5]={}, prox, i, j, r; prox=0; //result começa sem nenhum elemento
for (i=0;i<5;i++) {
printf("Digite x[%d]: ", i); scanf("%d",&x[i]);
}
for (i=0;i<5;i++) {
printf("Digite y[%d]: ", i); scanf("%d",&y[i]); } for (i=0;i<5;i++){ for (j=0;j<5;j++) { if (x[i]==y[j]){ break; } } if (j==5) {
printf("x[%d] nao existe em y\n",i); for (r=0;r<prox;r++){ if (x[i]==result[r]){ break; } } if (r==prox){ printf("x[%d] inserido\n",i); result[prox]=x[i]; prox++; } } } //Imprimir resultado
printf("i: %d, j: %d, prox: %d result: ", i, j, prox); for (i=0;i<prox;i++){
printf("%d,",result[i]); }
return 0; }
SOLUÇÃO C
• Para X e Y:
• Soma =
• O que podemos observar nesse exemplo?
• Preciso saber X e Y para poder determinar o vetor resultado
algoritmo
declare X[10], Y[10], RESULT[10], I numérico I ← 1 repita se I > 10 então interrompa fim se leia X[I] fim repita I ← 1 repita se I > 10 então interrompa fim se leia Y[I]
RESULT[I] ← X[I] + Y[I] fim repita
imprime RESULT[1]..RESULT[10] fim algoritmo
Faça as alterações
necessárias na
implementação
anterior para o
pseudocódigo do
slide anterior
SOLUÇÃO D
• Para X e Y:
• Produto =
• O que podemos observar nesse exemplo? • Idem C
algoritmo
declare X[10], Y[10], RESULT[10], I numérico I ← 1 repita se I > 10 então interrompa fim se leia X[I] fim repita I ← 1 repita se I > 10 então interrompa fim se leia Y[I]
RESULT[I] ← X[I] × Y[I] fim repita
imprime RESULT[1]..RESULT[10] fim algoritmo
Faça as alterações
necessárias na
implementação
anterior para o
pseudocódigo do
slide anterior
EXERCÍCIO 1
• Escreva um programa que preencha uma matriz NOTAS de
dimensão 10x3 com as notas de 10 alunos em três provas de uma mesma disciplina. Determine em qual prova cada aluno
obteve a menor nota. Imprima um relatório informando em qual prova cada aluno obteve a menor nota e também o número
total de alunos que tiraram a sua menor nota na prova 1, na prova 2, ou na prova 3.
• Dica para declaração de matrizes:
• declare NOTAS [1:10,1:3] {linha,coluna} • int notas [10][3]={}
EXERCÍCIO 1
• Dica para declaração de matrizes:
• declare NOTAS [1:10,1:3] {linha,coluna} • int notas [10][3]={}
EXERCÍCIO 2
• A tabela dada a seguir contém vários itens que estão estocados em vários
armazéns de uma companhia e o custo de cada um dos produtos armazenados. Faça um programa que:
28 PRODUTO ARMAZÉM 1 2 3 1 (UNID.) 1200 3700 3737 2 (UNID.) 1400 4210 4224 3 (UNID.) 2000 2240 2444 CUSTO ($) 260,00 420,00 330,00 • Lê o estoque inicial
• Determine e imprime quantos
itens estão armazenados em cada armazém
• Determina qual armazém tem
o maior estoque do produto 2
• Calcula o custo total de:
• Cada produto em cada
armazém
• Estoque de cada armazém
• Cada produto em todos os
EXERCÍCIO 3
• Em um frigorífico existem 90 bois. Cada boi traz preso em seu
pescoço um cartão contendo seu número de identificação e seu peso.
• Desenvolva o código em C de um programa que escreve o
número e peso do boi mais gordo e do boi mais magro.