Fundamentos da Programação
aula 01: Programando computadores
1 Introdução
Abaixo nós temos um esquema da arquitetura de um computador
Os 3 elementos da figura são: o processador, a memória e o programa.
E claro, a coisa mais importante é o processador — (o bonequinho ...)
Quer dizer, é ele quem faz tudo acontecer.
E sem ele nada acontece.
Mas o pobre ...
Ele não é lá muito esperto.
Só entende instruções muito simples.
Não lembra onde ele coloca as coisas.
E não enxerga muito bem ...
Daı́ que, para as coisas funcionarem a gente precisa explicar tudo bem direitinho.
Quer dizer, a explicação que a gente dá é o programa.
Ali a gente diz:
- faça isso
- faça aquilo
- guarde isso aqui
- pergunte o valor do x
- faça essa conta e coloque o resultado acolá
- depois escreva isso na tela
e por aı́ vai ...
Vejamos como a coisa funciona.
1
2 Programando computadores
A primeira coisa que nós vamos fazer é um programa que imprime alguma coisa na tela.
Na linguagem C, a coisa é feita assim
1. #include <stdio.h>
2. #include <stdlib.h>
3. int main()
{
4. printf ("oi! to aqui ...");
}
Quer dizer, printf é o comando que imprime uma mensagem na tela.
Mas o engraçado é que o printf não é um comando da linguagem C.
Quer dizer, o comando printf faz parte da biblioteca stdio.h.
E é por isso que no inı́cio do programa a gente precisa escrever
#include <stdio.h>
E daı́, como stdlib.h é outra biblioteca que contém um monte de coisas úteis, a gente costuma
incluir ela em nossos programas também.
Legal.
Mas esse nosso programa ainda não faz nada de útil ...
A coisa útil mais simples que existe é uma pequena continha.
Então, o próximo programa vai calcular uma operação aritmética e imprimir o resultado na tela.
A coisa fica assim
1. #include <stdio.h>
2. #include <stdlib.h>
3. int main()
{
4. int x;
5. x = 1 + 1;
6. printf ("o resultado é: %d", x);
}
A primeira novidade aqui aparece nas linhas 4 e 5.
Quer dizer, na linha 4 nós dizemos que o programa vai utilizar a porção de memória x, para armazenar
números inteiros.
Falando mais tecnicamente, nós dizemos que x é uma variável do tipo inteiro.
2
E daı́, na linha 5, nós armazenamos o resultado de uma continha na variável x.
A segunda novidade aparece na linha 6, onde nós vemos como o comando printf imprime o valor de
uma variável.
Quer dizer, a mensagem entre aspas continua lá.
Mas agora, nós colocamos o marcador %d para indicar o lugar da mensagem onde o valor de x deve
aparecer.
A coisa fica assim
printf ("o resultado é: %d", x);
mas também poderia ser assim
printf ("%d foi o resultado", x);
ou assim
printf ("deu %d a continha que eu fiz ...", x);
A seguir, nós vamos ver mais exemplos de programas de computador.
Exemplos
a. Lendo coisas do teclado
O programa que nós acabamos de fazer não tem muita graça.
Quer dizer, se a gente executar ele 3 vezes, ele vai fazer a mesma coisa 3 vezes ...
Para que o programa faça coisas diferentes em execuções diferentes, ele pode perguntar alguma
coisa pra gente.
Por exemplo, a coisa pode ficar assim
1. #include <stdio.h>
2. #include <stdlib.h>
3. int main()
{
4. int x, y, soma;
5. printf ("digite o primeiro número: ");
6. scanf ("%d", &x);
7. printf ("\n");
8. printf ("digite o segundo número: ");
9. scanf ("%d", &y);
10. soma = x + y;
11. printf ("a soma de %d e %d é igual a %d", x, y, soma);
}
3
A novidade aqui é o comando
scanf ("%d", &x);
que é semelhante ao printf, mas funciona ao contrário.
Quer dizer, o comando indica que
- o programa vai ler um número inteiro do teclado: “%d”
- para ser colocado dentro da variável x: &x
Outra pequena novidade aparece na linha 7
printf ("\n");
Quer dizer, essa é a maneira de indicar que nós queremos pular para a próxima linha, antes de
imprimir a mensagem
printf ("digite o segundo número: ");
Mas a coisa também pode ser feita de uma só vez, da seguinte maneira
printf ("\n digite o segundo número: ");
b. O comando if-else
Legal.
Agora está na hora de colocar um pouco de inteligência no nosso programa.
Quer dizer, inteligência é a capacidade de fazer coisas diferentes em situações diferentes.
E para detectar situações diferentes, nós precisamos testar se as coisas são assim ou assado.
Na linguagem C, isso é feito com o comando if-else.
A coisa fica assim
1. #include <stdio.h>
2. #include <stdlib.h>
3. int main()
{
4. int nota1, nota2;
5. float media;
6. printf ("digite a primeira nota: ");
7. scanf ("%d", &x);
8. printf ("\n digite a segunda nota: ");
9. scanf ("%d", &y);
10. media = ( nota1 + nota2 ) / 2;
11. if ( media >= 5 )
12. printf ("média = %f ==> Aprovado", media);
13 else
14. printf ("média = %f ==> Reprovado", media);
}
4
A primeira novidade desse programa aparece nas linhas 5 e 10
5. float media;
( . . . )
10. media = ( nota1 + nota2 ) / 2;
Quer dizer, na linha 5 nós indicamos que a variável media vai armazenar números fracionários
(ou do tipo float), porque a conta da linha 10 não precisa dar um número inteiro.
A segunda novidade é o uso do comando if-else nas linhas 11 − 14, que implementa a seguinte
lógica
Se ( a média é maior ou igual a 5 )
Imprime ("Aprovado")
Sen~
ao
Imprime ("Reprovado")
c. Múltiplos if’s
Mas, nem sempre um único comando if é suficiente.
Quer dizer, imagine que apenas os estudantes com média ≥ 7 são aprovados direto.
E que os estudantes com média entre 4 e 7 devem fazer a prova final.
Então, a parte final do programa ficaria assim
( . . . )
10. media = ( nota1 + nota2 ) / 2;
11. if ( media >= 7 )
12. printf ("média = %f ==> Aprovado", media);
13 else if ( media >= 4 )
14. printf ("média = %f ==> Prova final", media);
15. else
16. printf ("média = %f ==> Reprovado", media);
}
Quer dizer, a ideia é que se a primeira condição não é verdadeira, então nós testamos a segunda
condição.
Se a segunda condição for verdadeira o programa imprime: Prova final.
E se a segunda condição for falsa o programa imprime: Reprovado.
d. As raı́zes da equação quadrática
Considere a equação abaixo
x2 + 2x − 3 = 0
5
Todo mundo sabe que a solução dessa equação é calculada assim
p
−2 ± 22 − 4 · 1 · (−3)
x = ⇒ x1 = 1 e x2 = −3
2
Agora, nós vamos programar o computador para que ele faça esse cálculo.
Quer dizer, a forma geral da equação quadrática é assim
ax2 + bx + c = 0
e a fórmula que dá a solução é essa aqui
√
−b ± b2 − 4 · a · c
x =
2
Mas, essa fórmula só pode ser usada quando o valor dentro da raiz quadrada não é negativo.
Daı́ que, nós vamos fazer a coisa em duas etapas
- primeiro nós vamos calcular o valor dentro da raiz
- e depois nós testamos esse valor, e calculamos a solução quando isso for possı́vel
A coisa fica assim
1. #include <stdio.h>
2. #include <stdlib.h>
3. #include <math.h>
4. int main()
{
5. float a = 1, b = 2, c = -3;
6. float delta;
7. float x1, x2;
8. delta = b * b - 4 * a * c;
11. if ( delta < 0 )
12. printf ("a equaç~
ao n~
ao tem soluç~
ao");
13. if ( delta = 0 )
{
14. x1 = -b / ( 2 * a );
15. printf ("a única soluç~
ao da equaç~
ao é: %f", x1);
}
16. if ( delta = 0 )
{
17. x1 = ( -b + sqrt ( delta ) ) / ( 2 * a );
17. x2 = ( -b - sqrt ( delta ) ) / ( 2 * a );
19. printf ("as soluç~
oes da equaç~
ao s~
ao: %f e %f", x1, x2);
}
}
6
A primeira novidade desse programa aparece logo na linha 3
#include <math.h>
Quer dizer, aqui a gente está incluindo a biblioteca matemática para poder utilizar o comando
sqrt() mais abaixo, que calcula a raiz quadrada.
A segunda novidade aparece na linha 5
float a = 1, b = 2, c = -3;
Quer dizer, aqui nós estamos atribuindo valores às variáveis a, b, c já no momento da sua declaração,
para evitar ter que escrever um monte de printf’s e scanf’s para obter os seus valores.
e. Imprimindo em ordem crescente
Agora imagine que o nosso programa vai ler 3 números do teclado: a, b, c.
E a tarefa consiste em
→ Imprimir os números em ordem crescente de valor
Quer dizer, a ideia aqui é praticar a lógica da programação.
Raciocinando um pouquinho, a gente vê que existem 6 casos possı́veis
• a < b < c • b < a < c • c < a < b
• a < b < c • b < c < a • c < b < a
Daı́ que, o programa pode ser feito assim
( . . . )
10. if ( a < b && b < c )
11. printf ("%d < %d < %d", a, b, c);
12. if ( a < c && c < b )
13. printf ("%d < %d < %d", a, c, b);
14. if ( b < a && a < c )
15. printf ("%d < %d < %d", b, a, c);
16. if ( b < c && c < a )
17. printf ("%d < %d < %d", b, c, a);
18. if ( c < a && a < b )
19. printf ("%d < %d < %d", c, a, b);
20. if ( c < b && b < a )
21. printf ("%d < %d < %d", c, b, a);
A novidade aqui são os comandos if que testam múltiplas condições, por meio do operador &&
— (i.e., o E lógico)
Mas, a gente pode ser um pouquinho mais esperto — (para diminuir o número de comparações
que o programa realiza)
7
Quer dizer, note que as variáveis a e b são comparadas nas linhas 10, 14, 18 e 19.
Mas, a gente só precisa fazer essa comparação 1 vez
if ( a < b )
{
// raciocı́nio p/ o caso em que a < b
( . . . )
}
else
{
// raciocı́nio p/ o caso em que b < a
( . . . )
}
Certo.
Imagine que a gente já sabe que a é menor que b.
Daı́, se a gente descobrir que c é menor do que a, então a gente já vai ter a ordem completa:
c < a < b
if ( a < b )
{
if ( c < a )
printf ("%d < %d < %d", c, a, b);
( . . . )
}
else
{
// raciocı́nio p/ o caso em que b < a
( . . . )
}
Por outro lado, se isso não é verdade (i.e., se a é menor do que c), então a gente descobriu que a
é o menor de todos.
E agora, basta comparar os outros dois para saber a ordem completa
if ( a < b )
{
if ( c < a )
printf ("%d < %d < %d", c, a, b);
else
{
if ( b < c )
printf ("%d < %d < %d", a, b, c);
else
printf ("%d < %d < %d", a, c, b);
}
}
else
{
// raciocı́nio p/ o caso em que b < a
( . . . )
}
8
Daı́, raciocinando da mesma maneira no outro caso, nós chegamos ao seguinte programa completo
1. #include <stdio.h>
2. #include <stdlib.h>
3. int main()
{
4. int a, b, c;
5. printf ("digite o primeiro número:");
6. scanf ("%d", &a);
7. printf ("digite o segundo número:");
8. scanf ("%d", &b);
9. printf ("digite o terceiro número:");
10. scanf ("%d", &c);
11. if ( a < b )
{
12. if ( c < a )
13. printf ("%d < %d < %d", c, a, b);
14. else
{
15. if ( b < c )
16. printf ("%d < %d < %d", a, b, c);
17. else
18. printf ("%d < %d < %d", a, c, b);
}
}
19. else
{
20. if ( c < b )
21. printf ("%d < %d < %d", c, b, a);
22. else
{
23. if ( a < c )
24. printf ("%d < %d < %d", b, a, c);
25. else
26. printf ("%d < %d < %d", b, c, a);
}
}
}
que realiza apenas 6 comparações.
Legal, não é?