Você está na página 1de 36

Universidade Estadual Paulista

Campus de Guaratinguetá

PROGRAMAÇÃO DE COMPUTADORES I

Prof. Edson Luiz França Senne


Departamento de Matemática
edson.senne@unesp.br
www.feg.unesp.br/senne/

© ELFS 1
Raciocício Lógico

Problema Algoritmo

Programação

Execução

Solução Programa

Computador
© ELFS 2
• Nem sempre é fácil obter um algoritmo!
• É necessário reduzir a solução do problema a uma
sequência de operações elementares.
• Exemplo: a construção de uma casa.
• Vamos supor que as operações elementares são:
• instalar portas e janelas
• levantar paredes
• construir telhado
• Algoritmo de solução do problema:
1) Levantar paredes;
2) Construir telhado;
3) Instalar portas e janelas.

• Este algoritmo é unico?

© ELFS 3
• Algoritmo: sequência lógica e ordenada de operações
elementares para a solução de um problema.
• Nem sempre é único. Existem algoritmos que são
melhores do que outros.
• Exemplo: trocar uma lâmpada queimada
• Operações elementares:
buscar uma escada
subir na escada
descer da escada
posicionar a escada
buscar uma lâmpada
retirar uma lâmpada do soquete
colocar uma lâmpada no soquete

© ELFS 4
Um algoritmo:
1) buscar uma escada
2) posicionar a escada
3) buscar uma lâmpada (nova)
4) subir na escada
5) retirar a lâmpada (velha) do soquete
6) colocar a lâmpada (nova) no soquete

Outro algoritmo:
1) buscar uma lâmpada (nova)
2) buscar uma escada
3) posicionar a escada
4) subir na escada
5) retirar a lâmpada (velha) do soquete
6) colocar a lâmpada (nova) no soquete

© ELFS 5
• Vamos supor que desejamos trocar somente
lâmpadas queimadas. Isso é lógico, não?
• Vamos precisar de mais uma operação elementar:
• testar se uma lâmpada está queimada

• Algoritmo
1) buscar uma escada
2) posicionar a escada
3) buscar uma lâmpada (nova)
4) se a lâmpada (no soquete) está queimada,
então:
5) subir na escada
6) retirar a lâmpada (velha) do soquete
7) colocar a lâmpada (nova) no soquete
© ELFS 6
Outro algoritmo (melhor?)
1) se a lâmpada (no soquete) está queimada,
então:
2) buscar uma escada
3) posicionar a escada
4) buscar uma lâmpada (nova)
5) subir na escada
6) retirar a lâmpada (velha) do soquete
7) colocar a lâmpada (nova) no soquete

• Os passos 2 a 7 só serão executados se a lâmpada estiver


queimada.
• O algoritmo estabelece que se a lâmpada não estiver
queimada, nada será feito. Isto é lógico, não?

© ELFS 7
• Vamos usar um pequeno jogo de adivinhação para que
vocês tenham uma ideia melhor sobre algoritmos.
• Você vai escolher um valor de N e o computador vai
selecionar aleatoriamente um número inteiro entre 1 e
N. Você deve fazer escolhas até advinhar o número que o
computador escolheu. Enquanto você não acertar, o
computador vai dizer se o número que ele selecionou é
maior ou menor do que a sua escolha.
• Para resolver esse problema, você precisa de um algoritmo.
Qual algoritmo? Um algoritmo bem simples é tentar 1, 2, 3,
4 e assim por diante, até chegar ao número correto. Esse
algoritmo é conhecido como busca linear.
• Vamos testar?

• O algoritmo funciona? Resolve o problema? Mas quantas


tentativas você pode precisar? Existe um algoritmo melhor?
© ELFS 8
• Existe um outro algoritmo?
• Sim! a busca binária. Imagine 200 números. Se você não
acertar, o computador vai dizer se o número que ele
selecionou é maior ou menor do que a sua escolha, certo?
• Então você pode começar tentando o 100. Se o
computador disser que o número que ele selecionou é
maior do que 100, então você pode desconsiderar todos
os números de 0 a 100, certo?
• E se a escolha do computador for menor que 100, o que
você pode desconsiderar?
• Ou seja, a cada passo, ou você acerta ou elimina quase a
metade dos números. Vamos testar?

• Com 200 números quantas tentativas, no máximo, você vai


precisar usando o algoritmo de busca binária?
© ELFS 9
• E como se constrói um algoritmo?
• O que você precisa para construir um algoritmo?
• Precisamos usar o raciocínio lógico!
• Para ilustrar, vamos considerar o MiniSudoku, um jogo de
tabuleiro 6 x 6, dividido em 6 retângulos 2 x 3, onde são
usados números de 1 a 6 com a seguinte restrição: linhas,
colunas e retângulos não podem conter números repetidos.
• Vamos jogar?

• O que você usou para completar o jogo?


• O raciocínio lógico!
• Isso, todos vocês já tem! Para construir algoritmos
precisamos apenas colocar em prática o raciocínio lógico.

© ELFS 10
Desafios de Raciocínio Lógico
1. Que número está faltando?

2. Coloque os sinais + ou – em
cada círculo para obter os
resultados indicados na figura.

3. Preencha os quadrados em
branco. A sequência lógica em
cada um dos lados é diferente.
As setas indicam números
idênticos.
© ELFS 11
• Como informar o computador sobre o algoritmo a ser
usado para resolver um problema?
• Você precisa implementar o algoritmo como um
programa de computador. Isso significa que você vai
precisar escrever os passos do algoritmo usando uma
linguagem de programação.
• O algoritmo escrito assim é conhecido como programa.
• Podem acreditar: escrever o programa é a parte mais fácil!
A parte mais difícil é construir o algoritmo.
• Neste curso, vamos usar a linguagem C e o ambiente de
desenvolvimento CETUS.
• O ambiente CETUS contém:
• Editor (usado para escrever o texto do programa)
• Compilador
© ELFS 12
• O compilador é necessário para verificar se o texto
obedece à sintaxe da linguagem de programação e, caso
isto ocorra, traduzir o texto para uma sequência de
instruções em linguagem de máquina.
• Um texto escrito em uma linguagem de programação se
chama programa fonte.
• Por que o compilador precisa traduzir o programa fonte
para a linguagem de máquina?
• Porque os computadores atuais só conseguem executar
instruções que estejam escritas na forma de códigos
binários.
• Um programa em linguagem de máquina é chamado de
programa executável.

© ELFS 13
• O processo de compilação, na verdade, se dá em duas
etapas:
• Fase de tradução: o programa fonte é transformado em
um programa objeto.
• Fase de ligação: o programa objeto é juntado às
bibliotecas necessárias para produzir o programa
executável.

Programa Programa Programa


Compilador Ligador Executável
Fonte Objeto

• Para simplificar, vamos considerar:

Programa Processo de Programa


Fonte Compilação Executável

© ELFS 14
• Para os computadores, quais são as operações
elementares disponíveis?
• É surpreendente, mas as operações são poucas e muito
simples:
• atribuição de valores a variáveis (A = 3)
• operações aritméticas (+, -, *, /, ...)
• comparação (A > B ?)
• Entretanto, para construir um algoritmo essas operações
simples podem ser usadas em 3 estruturas, que podem
ser combinadas da forma que for necessária para resolver
o problema.
• Estas estruturas são: sequência, condição e repetição.
• A programação de computadores usando estas 3
estruturas é conhecida como programação estruturada.

© ELFS 15
• Uma forma de representação de algoritmos por meio
destas estruturas é conhecida como fluxograma (ou
diagrama de blocos).
• A sequência é representada por:
Dentro de um retângulo as operações
são sempre atribuições, que podem
conter operações aritméticas.

• A condição é representada por:

sim não sim não

Dentro de um losango a operação é


sempre uma comparação.
© ELFS 16
• Outras figuras usadas em fluxogramas são:

para representar Início ou Fim do algoritmo.

para representar o fornecimento de dados.

para representar a saída de resultados.

• Exemplo: Dados os valores da base (b) e da altura (h),


calcular a área (A) de um triângulo.
• Observe, nesse caso, que os valores de b e h são dados,
ou seja, devem ser fornecidos.
• O valor de A é um resultado, ou seja, uma saída produzida
pelo algoritmo.
© ELFS 17
• Fluxograma:

início

b, h Observe que este fluxograma


só utiliza a estrutura de
A = (b * h) / 2 sequência.

fim

• Exemplo: Dados dois valores A e B, determinar qual é o


maior.
• Nesse caso, quais são os dados de entrada?
• E o resultado de saída?
© ELFS 18
• Fluxograma:

início

A, B

sim não
A > B? Observe que este algoritmo já
utiliza as estruturas: sequência
M=A M=B e condição.

fim

• Como transformar um fluxograma em um programa-fonte?


© ELFS 19
• Utilizaremos a linguagem C: para cada bloco do
fluxograma há uma instrução adequada da linguagem.

início #include <stdio.h>


#include <stdlib.h>
b, h
int main()
{
A = (b * h) / 2 float b,h,A;
scanf("%f %f",&b,&h);
A A = (b*h)/2;
printf("A = %f",A);
return 0;
fim
}

© ELFS 20
Fluxograma Programa-fonte C

início #include <stdio.h>


#include <stdlib.h>
A, B
int main()
{
sim não
A > B? float A,B,M;
scanf("%f %f",&A,&B);
M=A M=B if (A > B)
M = A;
else
M = B;
M
printf("M = %f",M);
return 0;
fim }

© ELFS 21
Exercícios
1. Dados o consumo médio (km/litro), o tempo gasto numa
viagem (hora) e a velocidade média de um automóvel
(km/hora), determinar a distância percorrida pelo
automóvel (km) e a quantidade de combustível usada
(litro).
2. Dado uma temperatura em graus centígrados (C),
apresentá-la em graus Farenheit (F). A fórmula de
conversão é: F = (9C + 160) / 5.
3. Dados os valores das variáveis A e B, efetuar a troca dos
valores de forma que a variável A passe a possuir o valor
da variável B e que a variável B passe a possuir o valor
da variável A. Apresentar os valores finais de A e B.

© ELFS 22
Seja o seguinte problema:
• Determinar o valor de y = seno(1.5)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
float y;
y = sin(1.5);
printf("y = %f",y);
printf("\n");
return 0;
}

• Existem diferenças desse programa para os anteriores?

© ELFS 23
Erros de Sintaxe
• A primeira tarefa do compilador é verificar se existem erros
de sintaxe no programa.
• O programa executável só será gerado se o texto do
programa não contiver erros de sintaxe. Certo?
• Exemplo: considere um string, ou seja, uma sequência de
caracteres delimitada por aspas (").
• Se tivéssemos escrito:
printf("y = %f,y);

o compilador iria apontar um erro de sintaxe (ou uma


advertência) nesta linha do programa e exibir uma
mensagem como:

missing terminating '"' character


© ELFS 24
• Um erro de sintaxe muito comum é esquecer de colocar o
ponto-e-vírgula ao final de cada instrução.
• Por exemplo:
y = sin(1.5)

• Não havendo erros de sintaxe, o compilador irá gerar o


programa executável.
• Se o nome do programa é p1.c, o nome do programa
executável será p1.exe.
• Executando-se o programa p1.exe, o resultado será:

y = 0.997495

© ELFS 25
Erros de Lógica
• Obtido o programa executável, o problema está resolvido?
• Nem sempre! Será que o programa está correto?
• Se em vez de escrever:

y = sin(1.5);

tivéssemos escrito:

y = sin(2.5);

o compilador também produziria o programa p1.exe, que


executado, iria produzir:

y = 0.598472

© ELFS 26
Erros de Lógica
• Embora um resultado tenha sido obtido, ele não é correto.
• Se um programa executável não produz os resultados
corretos, é porque ele contém erros de lógica (bugs).
• O processo de identificação e correção de erros de lógica é
denominado depuração (debug).
• O processo de depuração nem sempre é fácil como no
caso dos erros de sintaxe, em que o próprio compilador
aponta a linha da programa que contém o erro.
• No caso de erros de lógica, a identificação da causa do
erro cabe ao programador.

© ELFS 27
Arquivos de Cabeçalho
• Note que o programa-fonte p1.c começa com as linhas:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

• Todo programa-fonte em linguagem C começa com linhas


deste tipo. O que elas indicam?
• Elas indicam ao compilador que o programa-fonte vai
utilizar alguns recursos, disponíveis em bibliotecas e que
estão descritas em arquivos de cabeçalho (.h, de header).
• Lembra da fase de ligação do processo de compilação?
• Um programa C requer, ao menos, a biblioteca stdio e,
muitas vezes, a biblioteca stdlib. O programa p1.c precisa
também da biblioteca math porque utiliza a função sin().
© ELFS 28
Arquivos de Cabeçalho
• A biblioteca stdio.h define alguns tipos de variável e várias
funções para ações de entrada e saída, como: getchar(),
gets(), printf(), puts(), remove(), rename() e scanf().
• A biblioteca stdlib.h define alguns tipos de variável e várias
funções de propósito geral, como: abs(), calloc(), exit(),
free(), rand(), srand() e system().
• A biblioteca math.h define várias funções matemáticas.
Todas as funções disponíveis nessa biblioteca recebem
parâmetros do tipo double e retornam um resultado do
tipo double. Algumas funções disponíveis: acos(), asin(),
atan(), cos(), exp(), fabs(), log(), log10(), pow(), sin() e
sqrt().
• Notar a diferença: int abs(int x) e float fabs(float x).
© ELFS 29
Função main()
• A próxima linha do programa é:
int main()
• Esta linha corresponde ao cabeçalho da função main
(função principal).
• Um programa-fonte em linguagem C pode conter muitas
funções e sempre deverá conter a função main().
• Observar que int corresponde ao tipo do valor produzido
pela função: a função main deve sempre retornar um
valor inteiro.
• Observar também que o nome da função deve ser seguido
por (). Os parênteses são obrigatórios e irão conter os
parâmetros da função, caso necessário.

© ELFS 30
Função main()

• A linguagem C faz distinção entre letras maiúsculas e letras


minúsculas.
• Atenção! O nome da função principal deve ser escrito com
letras minúsculas: main.
• Main ou MAIN, por exemplo, provocam erros de sintaxe.
• Da mesma forma, as palavras int e char, devem ser
escritas com letras minúsculas.
• Reforçando: após o nome da função deve aparecer a sua
lista de parâmetros, entre parênteses. Mesmo que a
função não tenha parâmetros, os parênteses são
obrigatórios.

© ELFS 31
Exercícios: Escrever o algoritmo na forma de um fluxograma e
codificar o algoritmo como um programa C.

1. Escreva um programa que leia as medidas dos lados de


um triângulo e escreva se ele é:
• Equilátero: possui os 3 lados iguais.
• Isósceles: possui 2 lados iguais.
• Escaleno: possui 3 lados diferentes.

2. Escreva um programa que leia o valor dos ângulos de um


triângulo e escreva se ele é:
• Retângulo: possui 1 ângulo reto (igual a 90º)
• Obtusângulo: possui 1 ângulo obtuso (maior que 90º)
• Acutângulo: possui 3 ângulos agudos (menor que 90º)

© ELFS 32
3. Fazer um programa que, dados os lados A, B e C de um
triângulo, calcula a área do triângulo, sabendo que:
A +B+C
AREA = S × (S − A) × (S − B) × (S − C) e S=
2
O programa deverá verificar se os valores dos lados são
estritamente positivos.
€ €
4. Uma reta é definida pelos valores (float) dos coeficientes
a, b e c de sua equação geral: ax + by + c = 0. Escreva
um programa que, dados os valores dos coeficientes a1,
b1, c1 e a2, b2, c2, de duas retas, mostra se essas retas
são:
• paralelas: se a1/a2 ≠ b1/b2;
• concorrentes: se a1/a2 = b1/b2 ≠ c1/c2;
• coincidentes: se a1/a2 = b1/b2 = c1/c2.
© ELFS 33
• O Jogo das Máquinas consiste em um painel com botões
numerados. Associado a cada botão existe uma chave
que conecta uma máquina a uma outra. Por exemplo:

• Neste caso, a máquina A está conectada à máquina B por


meio da chave associada ao botão 1. A máquina A
também está conectada à máquina C por meio da chave
associada ao botão 2, e assim por diante.

• Então, se a máquina A estiver ligada e o botão 1 for


apertado, a máquina B também estará ligada.
© ELFS 34
• Suponha que os estados dos botões podem ser
representados pelos valores 0 (não pressionado) e 1
(pressionado).

5. Considerando que a máquina A está ligada, construir


programa que, dados os valores dos botões, determina:

a) Se a máquina D está ligada ou não.

b) Se a máquina H está ligada ou não.

© ELFS 35
6. O número 3025 possui a seguinte característica:
30 + 25 = 55 e 55² = 3025
Fazer um programa que, dado um número de 4 dígitos
verifica se este número possui essa característica.

7. Fazer um programa que, dados os valores dos


coeficientes a, b, c, calcule e mostre as raízes reais da
equação ax2 + bx + c = 0.

8. Escrever um programa para ler os valores de dia, mes,


ano, referentes a uma data (dia/mes/ano) e mostrar qual
é a data do dia seguinte. Considerar que fevereiro tem
sempre 28 dias. Por exemplo:
dia = 7, mes = 2, ano = 2019 08/02/2019
dia = 30, mes = 6, ano = 2018 01/07/2018
dia = 31, mes = 12, ano = 2018 01/01/2019
© ELFS 36

Você também pode gostar