Cursos de Informática Grátis www.megainforcursos.com

10 de agosto de 2012

Defini��o de tipos (Aula 8)

Defini��o de tipos
(Aula 8)
At� agora temos usado apenas os tipos de dados b�sicos definidos pela linguagem, tais como integer, real, char e boolean. Por�m a linguagem Pascal nos permite tamb�m definir nossos proprios tipos e usar na declara��o de vari�veis. Por exemplo, se o tipo string ainda n�o esta definido em alguns compiladores de Pascal nos poderiamos definir o tipo string como um vetor de caracteres da seguinte forma.
TYPE string = array[1..255] of char;
Neste caso, a palavra TYPE informa ao computador que neste campo ser�o definidos os tipos adicionais que ser�o usados no programa. Agora, se desejamos declarar uma vari�vel para armazenar por exemplo o nome de uma pessoa, podemos faz�-lo da seguinte forma:
VAR nome: string;
Neste caso o nome pode ter at� 255 caracteres. Agora imagine que desejamos armazenar num vetor o nome dos alunos da turma, tratado no problema da aula anterior. Neste caso, podemos declarar um vetor da seguinte forma:
Var nome_aluno: array [1..10] of string;
Ou seja, os tipos definidos por n�s podem ser usados como qualquer outro tipo definido pela linguagem Pascal. A vantagem de definir novos tipos � para simplificar a declara��o de vari�veis. Vejamos por exemplo, como seria a declara��o da vari�vel nome_aluno sem a defini��o do tipo string.
VAR nome_aluno: array[1..10] of array[1..255] of char;
A defini��o de tipos � principalmente �til quando trabalhamos com registros.
REGISTROS
Nas duas aula anteriores vimos como declarar uma vari�vel (usando arrays) para armazenar um conjunto de dados do mesmo tipo. Neste aula vamos aprender como agrupar v�rios conjuntos de dados inclusive de tipo diferentes. Em Pascal, utilizamos a paravra record (registro) para declarar uma vari�vel contendo v�rios conjuntos de dados. Por exemplo, vejamos a seguinte declara��o:
Var aluno: record
nome: string;
idade: integer;
sexo: char;
notas: array[1..5] of real;
end
Nesta declara��o podemos observar que em uma �nica vari�vel est�o armazenadas v�rios tipos de dados, inclusive temos um vetor que cont�m as notas do aluno em v�rias disciplinas. Se vamos utilizar a mesma declara��o para outras vari�veis, seria melhor declarar como um tipo, especialmente se pretendemos declarar um vetor de alunos, para guardar a informa��o de todos os alunos. A declara��o do tipoaluno seria a seguinte:
Type tipoaluno=record
nome: string;
idade: integer;
sexo: char;
notas: array[1..5] of real;
end
Para declarar um vetor de alunos utilizariamos o tipoaluno.
Var alunos: array[1..100] of tipoaluno;
Vejamos num exemplo como utilizar estes conceitos na solu��o de um problema.
Problema
Utilizando registros, escrever um programa que l� os dados de um aluno e imprime na tela do computador.
Programa
PROGRAM dadosaluno;
TYPE tipoaluno=RECORD
nome: string;
idade: integer;
notas: array[1..5] of real;
END;
VAR aluno: tipoaluno;
soma,media: real;
i: integer;
BEGIN
READLN(aluno.nome);
READLN(aluno.idade);
FOR i:=1 TO 5 DO BEGIN
READLN(aluno.notas[i]);
END;
soma:=0;
FOR i:=1 TO 5 DO BEGIN
soma:=soma+aluno.notas[i];
END;
media:=soma/5;
WRITELN(aluno.nome);
WRITELN(aluno.idade);
WRITELN(media);
END
Observando o programa vemos que para acessar aos campos de um registro utilizamos um ponto. Agora vejamos um outro exemplo interessante.
Problema: Estagio
Voc� conseguiu um est�gio para trabalhar como programador na secretaria da sua escola. Como primeira tarefa, Dona Vilma, a coordenadora, solicitou que voc� aprimore um programa que foi desenvolvido pelo estagi�rio anterior. Este programa tem como entrada uma lista de nomes e de m�dias finais dos alunos de uma turma, e determina o aluno com a maior m�dia na turma. Dona Vilma pretende utilizar o programa para premiar o melhor aluno de cada turma da escola. O programa feito pelo estagi�rio anterior � mostrado a seguir.
Programa
Program estagio;

Const MAX_ALUNOS = 1000;
Type aluno = record
codigo, media: integer;
end;
Var i, indice_melhor, n: integer;
turma: integer;
alunos: array [1..MAX_ALUNOS] of aluno;

Begin
readln(n);
turma:=1;
while n > 0 do begin
{ le dados dos alunos }
for i := 1 to n do
readln(alunos[i].codigo, alunos[i].media)
{ procura aluno de maior media }
indice_melhor = 1;
for i := 2 to n do
if alunos[i].media > alunos[indice_melhor].media then
indice_melhor = i;
turma:=turma+1;
{ escreve resposta }
writeln('Turma ', turma);
writeln(alunos[indice_melhor].codigo);
{ le numero de alunos da proxima turma }
readln(n);
end;
End.
Como voc� pode verificar, o programa na forma atual tem uma imperfei��o: em caso de haver alunos empatados com a melhor m�dia na turma, ele imprime apenas o primeiro aluno que aparece na lista.
Tarefa
Dona Vilma deseja que voc� altere o programa para que ele produza uma lista com todos os alunos da turma que obtiveram a maior m�dia, e n�o apenas um deles. Voc� consegue ajud�-la nesta tarefa?
Entrada
A entrada � constitu�da da seguinde v�rios conjuntos de teste, representando v�rias turmas. A primeira linha de um conjunto de testes cont�m um n�mero inteiro N (1 ≤ N ≤ 1000) que indica o total de alunos na turma. As N linhas seguintes cont�m, cada uma, um par de n�meros inteiros C (1 ≤ C ≤ 20000) e M (0 ≤ M ≤ 100), indicando respectivamente o c�digo e a m�dia de um aluno. O final da entrada � indicado por uma turma com N = 0.
Exemplo de Entrada
3
1 85
2 91
3 73
5
12300 81
12601 99
98012 76
10111 99
212 99
Sa�da
Para cada turma da entrada seu programa deve produzir tr�s linhas na sa�da. A primeira linha deve conter um identificador do conjunto de teste, no formato "Turma n", onde n � numerado a partir de 1. A segunda linha deve conter os c�digos dos alunos que obtiveram a maior m�dia da turma, separados por um espa�o em branco. Os c�digos dos alunos devem aparecer na mesma ordem da entrada, e cada um deve ser seguido de um espa�o em branco. A terceira linha deve ser deixada em branco. O formato mostrado no exemplo de sa�da abaixo deve ser seguido rigorosamente.
Exemplo de Sa�da

Turma 1
2

Turma 2
12601 10111 212

(esta sa�da corresponde ao exemplo de entrada acima)
Restri��es
0 ≤ N ≤ 1000 (N = 0 apenas para indicar o fim da entrada)
1 ≤ C ≤ 20000
0 ≤ M ≤ 100
Solu��o
Em primeiro lugar vamos esclarecer um novo termo que aparece na segunda linha do programa. Quando queremos definir vari�veis constantes utilizamos a palabra const. Neste caso o valor da vari�vel n�o pode ser alterado no programa. As constantes s�o �teis por exemplo, para limitar as dimens�es dos arrays. No programa MAX_ALUNOS define o n�mero maximo de alunos.
Para determinar todos os alunos que tem a maior nota, vamos achar em primeiro lugar o valor da maior nota. Logo depois comparamos a nota dos alunos com a maior nota. Para todos os alunos que tiverem a nota igual � maior nota vamos mostrar o seu codigo na tela do computador.
Programa
Program estagio;

Const MAX_ALUNOS = 1000;
Type aluno = record
codigo, media: integer;
end;
Var i, indice_melhor, n: integer;
turma: integer;
alunos: array [1..MAX_ALUNOS] of aluno;
max: integer;

Begin
readln(n);
turma:=1;
while n > 0 do begin
{ le dados dos alunos }
for i := 1 to n do
readln(alunos[i].codigo, alunos[i].media)
{ procura a maior media }
max:=0;
for i := 1 to n do begin
if alunos[i].media > max then
max=alunos[i].media;
end
turma:=turma+1;
{ escreve resposta }
writeln('Turma ', turma);
{procura alunos com a maior m�dia}
for i:=1 to n do begin
if(alunos[i].media=max then
write(alunos[i].codigo);
end
writeln;
{ le numero de alunos da proxima turma }
readln(n);
end;
End.
Exerc�cios
Biblioteca
A diretora da escola quer agora informatizar a biblioteca. Para come�ar ela quer que todos os livros que est�o nos estandes sejam cadastrados no computador. Depois de uma consulta como um especialista em banco de dados, ela decideu que as seguintes informa��es de cada livro deveram ser armazenadas no computador:
codigo, titulo, autor, ano de edi��o e quantidade. O codigo � um identificador un�co de cada livro e consta de 5 carateres.
Tarefa
Foi dado para voce a tarefa de montar a estrutura de dados e fazer um programa que testa se um livro ja esta armazenado no computador.
Entrada
Como entrada o programa recebe o n�mero de livros para armazenar, depois em cada linha entram o titulo, autor e ano de edi��o. Em seguida encontrase a entrada de consulta: um n�mero indicando o quantidade de consultas e a continua��o os codigos de livros que precisam ser consultados
Exemplo de Entrada
4
140DR
programando em Pascal
Douglas Riddle
1991
132NW
Algorithms + Data Structures = Programs
Niklaus Wirth
1975
182YP
Matematica Recreativa
Yakov Perelman
1938
183YP
Fisica Recreativa
Yakov Perelman
1938
2
182YP
143NW
Sa�da
Na sa�da o programa deve imprimir se os livros consultados ja est�o cadastrados ou n�o no compurador.
Exemplo de sa�da
Cadastrado
N�o cadastrado
Lista Ordenada
No final de anho, para selecionar os primeiros 3 alunos que tiveram a melhor media na turma, a diretora pede para voce fazer uma lista ordenada de todos os alunos segundo o valor da media em ordem decrecente. Essa ordena��o � importante, ja que o premio para os primeiros 3 alunos � uma viagem de ferias com tudo pago.
Tarefa
Sua tarefa � fazer um programa que ordene a lista de acordo com a nota media em forma descrecente. A lista tem o formato similar ao problema do estagio, porem em vez de codigo, fue substituido pelo nome, ja que n�o tem nomes repetidos na turma. Portanto o tipo aluno pode ser definido da seguinte forma:
type aluno = record
nome: string;
media: real;
end;
Voce j� aprendeu como determinar o valor m�ximo de um vetor. Como voce pode resolver este problema aproveitando seus conhecimentos adquiridos sobre programa��o?.
Entrada
A primeira entrada � o numero de alunos da turma, nas seguintes linhas s�o fornecidos os nomes e as medias de todos os alunos em forma sequencial.
Exemplo de entrada
10
Jo�nzinho
8.5
Pedrino
8.4
Pablito
10
Ritza
9.5
Jorginho
7.5
Julinho
6.5
verushka
7.0
Gisele
9.3
Paulinho
8.2
Robertinho
6.0
Sa�da
Na sa�da o programa deve imprimir a lista ordenada
Exemplo de sa�da
Pablito
Ritza
Gisele
Jo�nzinho
Pedrinho
Paulinho
Jorginho
Verushka
Julinho
Robertinho
Escaner
O aparelho para escanear imagenes em branco e preto funciona da seguinte forma. Os 4 sensores presentes no escaner barren a imagem em varios passos sucessivos. O primeiro escanea horizontalmente linea por linea, o segundo diagonalmente para direita, o terceiro verticalmente e o quarto em forma diagonal para a esquerda, como mostra a figura abaixo. Em cada barredura os sensores contam os quadradinhos (celulas) que contem algum peda�o da figura.


Tarefa
Fa�a um programa que dado as informa��es lidas pelos sensores, imprima na tela a figura escaneada. O tamanho do escaner � 10 pontos de largura e 15 de comprimento.
Entrada
A entrada contem 4 lineas com 10, 24, 15 e 24 n�meros inteiros represetando os dados dos 4 sensores coletados em cada barredura.
Exemplo de entrada
11 14 12 8 8 8 8 13 14 12
4 10 10 10 10 10 4 7 8 19 19 6 6 6 5 2
1 2 2 3 4 5 5 4 8 9 9 9 9 8 5 4 2 3 3 3 3 3 2 0
1 2 2 3 4 5 5 4 8 9 9 9 9 9 6 5 3 3 3 3 4 2 0 0
Sa�da
O programa deve imprimir uma matriz de 10x15 celulas. Para indicar que uma celula representa parte do objeto imprimir o caractere (#) por celula e para indicar que a celula n�o representa parte do objeto, impirmir o ponto (.)
Exemplo de Sa�da
######..#####..
######.#######.
.####..#######.
.####.####.....
.####.####.....
.####.####.....
.####.####.....
.####.#########
######.########
######..######.

as solu��es voce encontra aqui

Matrizes (Aula 7)

Matrizes
(Aula 7)
Uma matriz � um array de duas dimens�es. Uma matriz � �til por exemplo para armazenar tabelas, fazer calculos matem�ticos, fazer desenhos, resolver problemas, etc. Imagina que desejamos guardar no computador a lista dos alunos com suas respetivas notas em todas as disciplinas cursadas durante o ano. Por exemplo a seguinte tabela mostra a lista de 10 alunos e as notas em 8 disciplinas.

Alunos notas Media
1 2 3 4 5 6 7 8
Jo�ozinho 7 7 8 9 5 6 6 9
Pedrinho 4 5 5 7 8 9 6 6
Gabriela 8 8 7 5 7 8 9 7
Roberto 4 5 6 7 5 6 7 3
Paulo 5 4 5 4 6 5 5 3
Gisele 6 7 7 8 5 9 8 9
Vera 7 7 8 8 6 6 8 9
Jorginho 6 4 5 4 6 5 5 6
Paulinho 6 4 5 4 6 5 5 6
Flavio 7 7 8 6 8 9 8 9
Gostariamos fazer um programa para armazenar essa tabela no computador e depois poder calcular por exemplo a media de todas as notas de todos os alunos. Inclusive para saber o desempenho da turma inteira poderiamos calcular a media das medias.

Bom, para come�ar vamos pensar apenas em como armazenar as notas na memoria do computador. Para isso vamos utilizar uma matriz. Em Pascal, uma matriz � definida em forma muito similar a um vetor, da seguinte forma:
Var notas : array [1..10,1..8] of real;
Onde o n�mero 10 indica o n�mero maximo de linhas da matriz e o n�mero 8 indica o n�mero maximo de colunas. Se n�o sabemos com antecedencia qual ser� o tamanho de nossa matriz podemos reservar um n�mero grande como foi feito com vetores.

Para manter a informa��o completa da tabela no computador, poderiamos armazenar tamb�m os nomes dos alunos num vetor de string e as medias dos alunos num vetor de n�meros reias.
Vejamos como trabalhar com matrizes, analisando o seguinte programa que le as notas dos alunos, calcula as medias, guarda num vetor e imprime os resultados na tela do computador.
Programa
Program Turma;
Var notas: array [1..10,1..8] of real;
Media: array [1..8] of real;
Soma: real;
i,j,N,M: integer;
Begin
{Entrada de Dados}
Readln(N); {ler o n�mero de alunos}
Readln(M); {ler o n�mero de disciplina}
For i:=1 to N do Begin
For j:=1 to M do Begin
{ler as notas dos alunos em cada disciplina}
Read (notas[i][j]);
End;
End;
{Processamento de Dados}
For i:=1 to N do Begin
Soma:=0; {zerar a soma das notas do aluno i}
For j:=1 to M do Begin
{acrecentar a soma as notas da disciplina j}
Soma:=Soma + notas[i][j]
End;
Media[i]:=Soma/M;
End;
{Sa�da de Resultados}
For i:=1 to N do Begin
Writeln('a nota media aluno ',i,' : ',Media[i]);
End;
End.
Para acessar aos elementos de uma matriz utilizamos dois �ndices: o primeiro para definir a linha e o segundo para definir a coluna. No programa observamos que precisamos sempre de dois la�os para percorrer todos os elementos de uma matriz. Quando um la�o est� dentro de outro la�o, estes s�o chamados de la�os aninhados. � muito comum encontrar em programas la�os anhinhados, especialmente quando se trabalha com vetores e matrizes. Os vetores e matrizes s�o bastante usados em c�lculos matem�ticos. Vejamos agora um outro exemplo de opera��es com matrizes.
Problema
Fazer um programa que dada duas matrizes A e B, determinar a soma de A e B.

A soma de duas matrizes � bastante simples, apenas precisamos somar os elementos correspondentes de cada matriz e o resultado colocar em uma outra matriz. Veja o seguinte exemplo de soma de dois matrizes A e B de tamanho 3x3:
A B C
| 1 4 2 | | 1 2 3 | | 2 6 5 |
| 0 5 1 | + | 1 0 1 | = | 1 5 2 |
| 2 2 8 | | 2 3 2 | | 4 5 10|

Solu��o
Vamos escrever um programa que le os elementos da matriz, depois faz a soma de seus elementos e finalmente imprime a matriz resultante. A primeira entrada s�o as dimens�es da matriz. Para poder somar duas matrizes, elas devem ter as mesmas dimens�es. Os elementos de cada linha devem ser digitados deixando um espaco, como mostra o seguinte exemplo:
Exemplo de entrada:
digite as dimens�es das matrizes:
3
3
digite os elementos da matriz A:
1 4 2
0 5 1
2 2 8
digite os elementos da matriz B:
1 2 3
1 0 1
2 3 2
Programa
Program soma_matrizes;
Var A,B,C: array[1..100,1..100] of integer;
i,j: integer;
M,N: integer;
Begin
Writeln('digite as dimens�es das matrizes:');
Readln(N,M);
Writeln('digite os elementos da matriz A:');
For i:=1 to N do Begin
For j:=1 to M do Begin
Read(A[i,j]);
End;
Readln;
end;
Writeln('digite os elementos da matriz B:');
For i:=1 to N do Begin
For j:=1 to M do Begin
Read(B[i,j]);
End;
Readln;
end;
{calcular a soma de A + B}
For i:=1 to N do Begin
For j:=1 to M do Begin
C[i,j]:=A[i,j]+B[i,j];
End;
End;
{imprimir o resultado}
Writeln('O resultado da soma de A+B:');
For i:=1 to N do Begin
For j:=1 to M do Begin
Write(C[i,j],' '); {deixar espa�o entre n�meros}
End;
Writeln; { quebra linha }
End;
End.
Problema: Aeroporto
A crescente utiliza��o do transporte a�reo preocupa os especialistas, que prev�em que o congestionamento em aeroportos poder� se tornar um grande problema no futuro. Os n�meros atuais j� s�o alarmantes: relat�rios oficiais demonstram que na Europa, em junho de 2001, houve uma m�dia de 7.000 atrasos de v�os por dia. Preocupada com a previs�o dos seus especialistas em tr�fego a�reo, a Associa��o de Transporte A�reo Internacional (ATAI) est� come�ando um estudo para descobrir quais s�o os aeroportos onde o tr�fego a�reo pode vir a ser mais problem�tico no futuro.
Tarefa
Como programador rec�m contratado pela ATAI voc� foi encarregado de escrever um programa para determinar, a partir de uma listagem de aeroportos e v�os, qual aeroporto possui maior probabilidade de congestionamento no futuro. Como medida da probabilidade de congestionamento ser� utilizado neste estudo o n�mero total de v�os que chegam ou que partem de cada aeroporto.
Entrada
A primeira linha de entrada cont�m dois n�meros inteiros A e V, que indicam respectivamente o n�mero de aeroportos e o n�mero de v�os. Os aeroportos s�o identificados por inteiros de 1 a A. As V linhas seguintes cont�m cada uma a informa��o de um v�o, representada por um par de n�meros inteiros positivos X e Y, indicando que h� um v�o do aeroporto X para o aeroporto Y.
Exemplo de Entrada
5 7
1 3
2 1
3 2
3 4
4 5
3 5
2 5
Restri��es
0 ≤ A ≤ 100
0 ≤ V ≤ 10000
1 ≤ X ≤ A
1 ≤ Y ≤ A
X ≠ Y
Solu��o
Para resolver este problema vamos usar matrizes. Os indices de cada elemento da matriz vai indicar o origem e o destino do v�o, por exemplo 1,3 indica que tem v�o do aeroporto 1 ao aeroporto 3. Em cada elemento da matriz vamos armazenar o n�mero de v�os, por exemplo mat[1][3] vamos colocar um 1 indicando que existe um v�o entre estes dois aeroportos. A tabela ou matriz para armazenar os dados de acima seria uma matriz quadrada de tamanho igual ao n�mero de aeroportos.
1 2 3 4 5
1 0 0 1 0 0
2 1 0 0 0 1
3 0 1 0 1 1
4 0 0 0 0 1
5 0 0 0 0 0
A partir desta tabela podemos determinar os aeroportos mas congestionados, contando os v�os que chegam e os v�os que saem. Para isso vamos somar as linhas e as colunas de forma similar como foi feito com a tabela das notas. Estes ser�o armazenados em vetores para depois fazer a soma e finalmente procurar os aeroportos mais congestionados. Vejamos o programa:
Programa
PROGRAM aeroporto;
VAR mat: array [1..100,1..100] of integer;
total,sai,cheg: array[1..100] of integer;
A,V:integer;
i,j:integer;
x,y:integer;
max: integer;
BEGIN
WRITELN('digite o n�mero de aeroportos e o n�mero de v�os');
READ(A); {ler numero de aeroportos}
READLN(V); {ler n�mero de v�os}
{zerar a matriz mat}
FOR i:=1 TO A DO BEGIN
FOR j:=1 TO A DO BEGIN
mat[i][j]:=0;
END;
END;
{ler x, y e acrecentar 1 na matriz se existir v�o de x para y}
Writeln('para cada v�o digite o origem e o destino na mesma linha');
FOR i:=1 to V DO BEGIN
READLN(x,y);
mat[x][y]:=mat[x][y]+1;
END;

{somar as saidas do aeroporto i}
FOR i:=1 TO A DO BEGIN
sai[i]:=0;
FOR j:=1 TO A DO BEGIN
sai[i]:=sai[i]+mat[i][j];
END;
END;

{somar as chegadas ao aeroporto j}
FOR j:=1 TO A DO BEGIN
cheg[j]:=0;
FOR i:=1 TO A DO BEGIN
cheg[j]:=cheg[j]+mat[i][j];
END;
END;
{procurar o valor maximo da soma de chegadas e saidas}
max:=0;
FOR i:=1 TO A DO BEGIN
total[i]:=cheg[i]+sai[i];
IF(total[i]>max) THEN max:=total[i];
END;
{imprimir os aeroportos congestionados}
WRITELN(' Os aeroportos congestionados:');
FOR i:=1 TO A DO BEGIN
IF(max=total[i]) THEN WRITE(i, ' ');
END;
WRITELN; {quebra linha}
END.
Exerc�cios
O jogo de xadrez, al�m de ser um jogo que exige bastante racioc�nio, � uma �tima fonte de quebra-cabe�as. Este problema trata de um destes quebra-cabe�as, envolvendo os movimentos de uma de suas pe�as, o cavalo. Os movimentos do cavalo s�o ditos em 'L', pois ele sempre deve andar duas casas em uma dire��o e uma casa na dire��o perpendicular.



A figura acima ilustra os poss�veis movimentos do cavalo, onde o caractere 'C' indica a posi��o inicial e o caractere '•' representa as poss�veis finais. � importante notar que o cavalo � a unica pe�a que pode saltar sobre outras pe�as do xadrez. Note ainda que na representa��o que usamos n�o desting�imos casas brancas de casas pretas no tabuleiro.
Tarefa
Usando os movimentos do cavalo, voce deve fazer um programa para determinar qual o n�mero m�nimo de movimentos do cavalo para ir de uma casa Inicio at� uma casa Final, sendo proibido que o cavalo para sobre algumas casas especificadas com X durante a seq��ncia de movimentos.



Entrada
Como entrada ser�o fornecidas LI e CI indicando a posi��o (coluna e linea) inicial do cavalos no tabuleiro, a posi��o final LF e CF, o n�mero de casas proibidas e a sequencia de LX e CX indicando a posi��o das casas proibidas.
Exemplo de entrada:
4 3
7 8
13
3 5
4 4
4 5
5 3
5 4
5 5
5 6
5 7
6 2
6 3
6 4
8 5
8 6
Sa�da
O programa deve mostrar o minimo n�mero de movimentos que o cavalo deve fazer para ir da posi��o inicial ate a posi��o final. Por exemplo, a sa�da para os dados de acima �: 6.
Quebracabe�a
Este � um jogo antigo bem popular entre crian�as que consiste de uma matriz de 5x5 contendo 25 quadradinho todos de igual tamanho. Em cada quadradinho esta escrito uma unica letra do alfabeto, por�m um quadradinho esta vazio, como mostra a figura abaixo.



Um quadradinho pode ser movido para o espa�o vazio se este estiver a direita, esquerda, acima ou abaixo imediato. O objetivo da quebracabe�a � mover os quadradinho no espa�o vazio de forma que todas as letras aparecem em ordem alfabetico.
Tarefa
Escreva um programa que mostre o quebracabe�a resultante depois de uma seq��ncia de movimentos dada a posi��o inicial.
Entrada
A entrada consiste da configura��o inicial da quebracabe�a, e a sequencia de movimentos. As primeiras 5 linhas descreve a configura��o inicial, a linha seguinte contem a seq��ncia de movimentos, definidos pelas letras A,B,E,D. Onde cada letra tem o seguinte significado
A --- O movimento � para abaixo, a letra que esta acima do espa�o vazio ser� movido
B --- O movimento � para acima, a letra que esta abaixo do espa�o vazio ser� moviemdo
E -- O movimento � para esquerda, a letra que esta � direita do espa�o vazio ser� movida
D -- O movimento � para a direita, a letra que esta � esqueda do espa�o vazio ser� movida
Caso exista algum movimento n�o permitido, imprimir que a quebracabe�a n�o tem configura��o final.
Exemplo de entrada
TRGSJ
XDOKI
M VLN
WPABE
UQHCF
AEEBBR
S�ida
A s�ida � a configura��o final da quebracabe�a depois da seq��ncia de movimentos, as letras devem ser imprimidas deixando um espa�o, como mostra o exemplo:
Exemplo de sa�da
T R G S J
X O K L I
M D V B N
W P A E
U Q H C F
Sensor do escaner
Uma imagem em branco e preto pode ser considerado como uma matriz de pontos brancos e pretos. Onde os pontos pretos representam o objeto e o branco o fundo. Quando desejamos guardar no computador uma imagem, utilizamos um escaner. O escaner � um aparelho que tem v�rios sensores que detecta os pontos brancos e pretos quando passa pela imagem e depois reconstrui a imagem colocando numa matriz de zeros e unos. Um dos sensores do escaner barre a imagem em forma diagonal, como mostra a figura abaixo. Em cada diagonal conta o n�mero de pontos pretos.


Tarefa
Fa�a um programa que conte o n�mero de pontos pretos em cada diagonal da imagem.
Dados de entrada
A entrada � composta de M e N que indica o tamanho da imagem e de uma matriz de 1s e 0s que representa a imagem.

Ejemplo de entrada
5 7
0 0 0 0 0 1 0
1 1 0 1 0 0 0
0 0 1 0 0 1 0
0 1 0 1 0 0 0
0 0 0 1 0 1 0
Sa�da
Na sa�da o programa deve imprimir o n�mero de pontos pretos em cada diagonal.
Exemplo de sa�da
0 1 1 0 3 1 1 2 0 1 0
As solu��es voce encontra aqui.

Vetores (Aula 6)

Vetores
(Aula 6)
Nas aulas anteriores j� vimos como armazenar alguns tipos de dados na mem�ria do computador. Como fazer para armazenar um conjunto de dados do mesmo tipo? Nesta aula vamos tratar deste problema.
Em Pascal, para declarar uma vari�vel que armazena um conjunto de dados do mesmo tipo � utilizado a palavra array. Vamos supor que desejamos declarar uma vari�vel para armazenar o nome de uma pessoa. Sabemos que um nome � constituido de caracteres, portanto a declara��o seria:
Var nome: array [1..100] of char
Esta declara��o informa ao computador para reservar 100 caxinhas do tipo char para armazenar o nome de uma pessoa. Na declara��o entre parenteses � colocado o n�mero m�ximo de elementos do array, neste caso, como n�o sabemos antecipadamente qual vai ser o tamanho do nome, colocamos um n�mero grande. Vamos resolver um problema aplicando arrays.
Problema:
Dado o nome de uma pessoa, determinar o n�mero de vogais contidos no nome.
Solu��o
Para determinar o n�mero de vogais vamos utilizar um contador. A cada passo vamos comparando os caracteres um por um e quando achar uma vogal vamos acrescentar 1 ao contador. Para acessar cada caractere dentro do array, vamos tamb�m precisar de um contador. Vejamos como seria o algoritmo.
Algoritmo
Inicializar o contador=0;
Inicializar o indice: i=1;
Ler o nome
Enquanto indice<=100 se nome[i] for igual a 'a' acrecentar o contador se nome[i] for igual a 'e' acrecentar o contador se nome[i] for igual a 'i' acrecentar o contador se nome[i] for igual a 'o' acrecentar o contador se nome[i] for igual a 'u' acrecentar o contador acrecentar o indice i Fim enquanto Programa Program Vogais; Var nome : array [1..100] of char; contador, i : integer; Begin contador:= 0; i:= 1; Readln (nome); While (i <=100) do Begin if (nome[i] = 'a') then contador:=contador + 1; if (nome[i] = 'e') then contador:=contador + 1; if (nome[i] = 'i') then contador:=contador + 1; if (nome[i] = 'o') then contador:=contador + 1; if (nome[i] = 'u') then contador:=contador + 1; i:=i+1; End; Writeln ('O n�mero de vogais presentes no nome �:', contador); end. Alguns compiladores de Pascal j� incluem o tipo string definido como um array de carateres. Portanto o a vari�vel nome pode ser declarado tamb�m da seguinte forma: Var nome:string[100]; Como um vetor � uma pilha de caixas, para acessar a uma determinada caixa precisamos de um �ndice. O �ndice � um n�mero que vai de 1 at� o n�mero de elementos do vetor. Se quisermos acessar a todas as caixas vamos alterando em cada passo o valor do �ndice, como mostra o programa. Para ler ou alterar o conte�do da caixa i de um vetor, simplemente escrevemos o nome seguido do �ndice entre chaves. Por exemplo, no programa a linha If (nome[i]='a') contador:=contador+1; indica que vamos comparar o conte�do da caixa i no vetor nome com o caractere 'a' e se forem iguais acrecentamos o contador. Usando o comando FOR Temos visto que em muitos casos conhecemos o n�mero de repeti��es de um bloco de comandos, para tanto temos usado o comando while juntament com um contador. Por exemplo, no programa anterior o bloco dentro do comando while � repitido enquanto o indice i � menor ou igual a 100 e em cada passo acrecentamos o valor do indice. Para estas situa��es em Pascal existe o comando FOR que deixa o trabalho mais simples. O formato do comando � o seguinte: FOR i:=valor inicial TO valor final DO BEGIN comandos END Este comando pode ser utilizado somente se i for declarado como n�mero inteiro e conhecermos seus valores inicial e final. Vejamos como seria o programa anterior usando o comando FOR. Programa Program Vogais; Var nome : string[100]; contador, i : integer; Begin contador:= 0; Readln (nome); For i:=1 to 100 do Begin if (nome[i] = 'a') then contador:=contador + 1; if (nome[i] = 'e') then contador:=contador + 1; if (nome[i] = 'i') then contador:=contador + 1; if (nome[i] = 'o') then contador:=contador + 1; if (nome[i] = 'u') then contador:=contador + 1; End; Writeln ('O n�mero de vogais presentes no nome �:', contador); end. O comando for � bastante usado principalmente para acessar aos elementos de um vetor. Problema: Temperatura Lunar Sem as prote��es da atmosfera e do cintur�o magn�tico que existem na Terra, a Lua fica exposta ao ataque do Sol, que � um astro em constante explos�o at�mica. As explos�es do Sol emitem ondas letais de part�culas. Uma pessoa que ficasse desprotegida na superf�cie da Lua, num lugar onde o Sol incidisse diretamente, sofreria um bombardeio radioativo t�o intenso quanto se estivesse nas imedia��es da usina russa de Chernobyl no momento do acidente que matou 31 pessoas em 1986. Al�m da radia��o solar, outro efeito desta falta de prote��o contra o Sol que existe na Lua � a enorme varia��o de temperatura. Nas regi�es pr�ximas do equador lunar, a varia��o de temperatura � brutal, passando de cerca de 130 graus positivos durante o dia a 129 graus negativos � noite. Para estudar com mais precis�o as varia��es de temperatura na superf�cie da Lua, a NASA enviou � Lua uma sonda com um sensor que mede a temperatura de 1 em 1 minuto. Um dado importante que os pesquisadores desejam descobrir � como se comporta a m�dia da temperatura, considerada em intervalos de uma dada dura��o (uma hora, meia hora, oito horas, etc.). Por exemplo, para a seq��ncia de medi��es 8, 20, 30, 50, 40, 20, -10, e intervalos de quatro minutos, as m�dias s�o respectivamente 108/4=27, 140/4=35, 140/4=35 e 100/4=25. Tarefa Voc� foi recentemente contratado pela NASA, e sua primeira tarefa �, a partir de algumas seq��ncias de temperaturas medidas pelo sensor e do tamanho do intervalo, informar qual a maior e qual a menor temperatura m�dia observadas, considerando o tamanho do intervalo dado. Dados de entrada e sa�da Os dados de entrada tem o seguinte formato A primeira linha cont�m dois n�meros inteiros positivos N e M, que indicam respectivamente o n�mero total de medi��es de temperatura de uma seq��ncia obtida pelo sensor, e o tamanho dos intervalos, em minutos, em que as m�dias devem ser calculadas. As N linhas seguintes cont�m um n�mero inteiro cada, representando a seq��ncia de medidas do sensor. Exemplo de entrada de dados: 4 2 -5 -12 0 6 o resultado de sa�da para o teste de entrada -8 3 Solu��o Como n�o sabemos com anteced�ncia o n�mero m�ximo de medi��es vamos reservar um n�mero bem grande de caixas para o vetor (por exemplo, 100). As medi��es vamos lendo e armazenando no vetor. Em primeiro lugar devemos calcular a m�dia a cada M medi��es e guardar em outro vetor TM. Depois, no vetor de medias TM vamos procurar qual � o maior e o menor valor. Vejamos como seria o algoritmo inicial. Algoritmo Ler o n�mero de medi��es N Ler o tamanho do intervalo M Para i=1 at� i=N repetir Ler a medi��o i e guardar em T[i] Fim Para Calcular a media a cada intervalo Calcular o valor m�ximo do vetor Calcular o valor m�nimo do vetor Mostrar resultados Para calcular a m�dia a cada M medi��es podemos fazer o seguinte: Vamos utilizar um la�o para ler cada elemento do vetor e vamos ir sumando os valores em uma variavel S. Um contador dentro do la�o sera utilizado para contar o n�mero de leituras. Quando o contador chegar a M vamos calcular a m�dia, guardar o resultado no vetor TM e zerar o contador. Vejamos como fica o algoritmo. Algoritmo Ler o n�mero de medi��es N Ler o tamanho do intervalo M Para i=1 at� i=N repetir Ler a medi��o i e guardar em T[i] Fim Para Inicializar: S=0,contador=0,j=1 Para i=1 at� i=N repetir acrecentar o contador somar a medi��o i: S=S+T[i] Se contador = M Entao Calcular a media: TM[j]=S/M acrecentar j zerar o contador zerar a soma Fim Se Fim Para Calcular o valor m�ximo do vetor Calcular o valor m�nimo do vetor Mostrar resultados O m�todo mais simples de calcular o valor m�ximo de um vetor � inicialmente considerar o primeiro valor como m�ximo e logo ir comparando com os demais valores, caso encontrar alguem maior, o valor do maximo sera substitutido pelo novo maior valor, assim sucessivamente at� chegar ate o final do vetor. O valor m�nimo do vetor pode ser calculado de forma similar. Vejamos como fica o algoritmo final. Algoritmo Ler o n�mero de medi��es N Ler o tamanho do intervalo M Para i=1 at� i=N repetir Ler a medi��o i e guardar em T[i] Fim Para Inicializar: S=0,contador=0,j=1 Para i=1 at� i=N repetir acrecentar o contador somar a medi��o i: S=S+T[i] Se contador = M Entao calcular a media: TM[j]=S/M acrecentar j zerar o contador zerar a soma Fim Se Fim Para Max=TM[1], Min=TM[i] Para i=2 at� i=j-1 fazer Se (TM[i] > Max) Entao Max = TM[i]
Se (TM < Min) Entao Min = TM[i] Fim Para Mostrar Max e Min Programa Program Temp; Var T: array [100] of integer TM: array [100] of integer M,N: integer i,j,contador: integer S,Max,Min: integer Begin Readln(N); Readln(M); For i=1 to N do Begin Readln(T[i]); End S:=0;contador:=0;j:=0; For i=1 to N do Begin contador=contador+1; S=S+T[i]; if(contador=M) Begin j:=j+1; TM[j]:=S/M; contador:=0; S:=0; End End Max=TM[1]; Min=TM[1]; For i=1 to i=j do Begin If(TM[i]>Max) Max:=TM[i];
If(TM[] End
Writeln(Max, Min);
End.
Exerc�cios
Um CPF tem nove d�gitos e mais dois para verifica��o. A verifica��o se d� da seguint forma: Primeiro, multiplicamos cada um dos nove d�gitos por um peso:
d1 d2 d3 d4 d5 d6 d7 d8 d9 <--- digitos
x 10 9 8 7 6 5 4 3 2 <--- pesos
--------------------------
a1 a2 a3 a4 a5 a6 a7 a8 a9
E depois calculamos S1, a soma de todos os n�meros resultantes. O d�cimo d�gito, d10, ser� [ 11-(resto de S1/11) ] (ou zero, se esta conta der mais que nove). Para calcular d11, fazemos como antes, mas levamos em conta tamb�m d10:
d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 <--- digitos
x 11 10 9 8 7 6 5 4 3 2 <--- pesos
------------------------------
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
Somamos agora todos os n�meros obtidos. O d�gito d11 ser� [ 11-(resto de S2/11) ], ou zero se esta conta der mais que nove.
Fa�a um programa que verifique se um CFP est� correto.

Temos um vetor com 20 n�meros. Queremos reorganizar o vetor de forma que dois n�meros pares n�o sejam vizinhos. Fa�a um programa que reorganize o vetor desta forma, ou diga que n�o � poss�vel.
Palindromes
Uma cadeia de caracteres � dita pal�ndrome se a seq��ncia dos caracteres da cadeia de esquerda para direita � igual a seq��ncia de caracteres da direita para esquerda. Por exemplo as seguintes cadeias de caracteres s�o pal�ndromes: ARARA, RADAR, AKASAKA, ANNA. Fa�a um programa que reconhe�a se uma cadeia de caracteres � palindrome. Use a fun��o Length(s) para saber o tamanho da cadeia s.
Quermesse.
Os alunos do �ltimo ano resolveram organizar uma quermesse para arrecadar fundos para a festa de formatura. A festa prometia ser um sucesso, pois o pai de um dos formandos, Te�filo, dono de uma loja de inform�tica, decidiu doar um computador para ser sorteado entre os que comparecessem. Os alunos prepararam barracas de quent�o, pipoca, doces, ensaiaram a quadrilha e colocaram � venda ingressos numerados sequencialmente a partir de 1. O n�mero do ingresso serviria para o sorteio do computador. Ficou acertado que Te�filo decidiria o m�todo de sorteio; em princ�pio o sorteio seria, claro, computadorizado.

O local escolhido para a festa foi o gin�sio da escola. A entrada dos participantes foi pela porta principal, que possui uma roleta, onde passa uma pessoa por vez. Na entrada, um funcion�rio inseriu, em uma lista no computador da escola, o n�mero do ingresso, na ordem de chegada dos participantes. Depois da entrada de todos os participantes, Te�filo come�ou a trabalhar no computador para preparar o sorteio. Verificando a lista de presentes, notou uma caracter�stica not�vel: havia apenas um caso, em toda a lista, em que o participante que possuia o ingresso numerado com i, havia sido a i-�sima pessoa a entrar no gin�sio. Te�filo ficou t�o encantado com a coincid�ncia que decidiu que o sorteio n�o seria necess�rio: esta pessoa seria o ganhador do computador.
Tarefa
Conhecendo a lista de participantes, por ordem de chegada, sua tarefa � determinar o n�mero do ingresso premiado, sabendo que o ganhador � o �nico participante que tem o n�mero do ingresso igual � sua posi��o de entrada na festa.
Entrada
como entrada o programa recebe o n�mero de participantes N (N<=1000), e a seq��ncia, em ordem de entrada, dos N ingressos das pessoas que participaram da festa.
ejemplo de entrada:
8
3 5 9 4 6 2 10 1
Sa�da
4
Sorvete
Jo�ozinho � um menino que costuma ir � praia todos os finais de semana com seus pais. Eles freq�entam sempre a mesma praia, mas cada semana o pai de Jo�ozinho estaciona o carro em um local diferente ao longo da praia, e instala sua fam�lia em um ponto na praia em frente ao carro. Jo�ozinho � muito comil�o, e adora de tomar sorvete na praia. Contudo, alguns dias acontece de nenhum sorveteiro passar pelo local onde eles est�o. Intrigado com isto, e n�o querendo mais ficar sem tomar seu sorvete semanal, Jo�ozinho foi at� a Associa��o dos Sorveteiros da Praia (ASP), onde ficou sabendo que cada sorveteiro passa o dia percorrendo uma mesma regi�o da praia, indo e voltando. Al�m disto, cada sorveteiro percorre todos os dias a mesma regi�o. J�aozinho conseguiu ainda a informa��o dos pontos de in�cio e fim da regi�o percorrida por cada um dos sorveteiros.

Com base nestes dados, Jo�ozinho quer descobrir os locais da praia onde o pai dele deve parar o carro, de forma que pelo menos um sorveteiro passe naquele local. S� que o volume de dados � muito grande, e Jo�ozinho est� pensando se seria poss�vel utilizar o computador para ajud�-lo nesta tarefa. No entanto Jo�ozinho n�o sabe programar, e est� pedindo a sua ajuda.
Tarefa
Voc� deve escrever um programa que leia os dados obtidos pelo Jo�ozinho e imprima uma lista de intervalos da praia por onde passa pelo menos um sorveteiro.
Entrada
Seu programa deve ler v�rios conjuntos de teste. A primeira linha de um conjunto de teste cont�m dois inteiros n�o negativos, P e S, que indicam respectivamente o comprimento em metros da praia e o n�mero de sorveteiros. Seguem-se S linhas, cada uma contendo dois n�meros inteiros U e V que descrevem o intervalo de trabalho de cada um dos sorveteiros, em metros contados a partir do in�cio da praia (U < V, 0 ≤U ≤P e 0≤V ≤ P). O final da entrada � indicado por S=0 e P=0.
Exemplo de entrada
200 2
0 21
110 180
1000 3
10 400
80 200
400 1000
10 2
1 4
5 6
0 0
Sa�da
Para cada conjunto de teste da entrada seu programa deve produzir uma lista dos intervalos da praia que s�o servidos por pelo menos um sorveteiro. A lista deve ser precedida de uma linha que identifica o conjunto de teste, no formato "Teste n", onde n � numerado a partir de 1. Cada intervalo da lista deve aparecer em uma linha separada, sendo descrito por dois n�meros inteiros U e V, representando respectivamente o in�cio e o final do intervalo (U < V). O final da lista de intervalos deve ser indicado por uma linha em branco. A grafia mostrada no Exemplo de Sa�da, abaixo, deve ser seguida rigorosamente.
Exemplo de sa�da
Teste 1
0 21
110 180

Teste 2
10 1000

Teste 3
1 4
5 6
A solu��o dos exercicios voce encontra aqui.

Resolvendo problemas

Resolvendo problemas
(Aula 5)
Nesta aula vamos nos dedicar a resolver problemas interessantes e escrever programas utilizando os comandos da linguagem Pascal aprendidos nas aulas anteriores. A melhor forma de aprender as coisas � praticando e com a programa��o n�o � nada diferente. Por isso, neste curso voc� vai encontrar muitos exemplos e exerc�cios para treinar.
Problema 1: Roland Garros
No torneio de Roland Garros, um dos mais tradicionais torneios de t�nis do mundo, realizado em Paris, participaram 128 tenistas. Em cada partida, participam dois jogadores, sendo que o vencedor passa para a pr�xima fase, e o perdedor � eliminado do torneio. A cada rodada, os tenistas que ainda continuam no torneio participam de exatamente uma partida. Qual o n�mero total de partidas deste torneio?
Solu��o
Como h� 128 participantes, na primeira rodada acontecem 64 jogos. Portanto na segunda rodada tem apenas 32 jogos, depois 16 e assim sucessivamente at� ficar apenas um jogo na final. Como podemos perceber, a cada rodada temos a metade de jogos da rodada anterior. Portanto, somando o n�mero de partidas a cada rodada teremos a resposta para o problema. Ou seja, 64 + 32 + 16 + 8 + 4 + 2 + 1 = 127
Se quisermos resolver este problema no computador, qual seria o algoritmo? Vamos supor que N � o n�mero de participantes (inicialmente N=128), P o n�mero de partidas em cada rodada e S a soma total de partidas. Vejamos o que acontece com o valor de cada uma destas vari�veis.
O n�mero de partidas em cada rodada e igual a metade do numero de participantes, ou seja P=N/2
O n�mero total de rodadas � calculado acrecentando as partidas jogadas em cada rodada da seguinte forma S=S+P
No final de cada rodada ficam apenas a metade do n�mero de participantes, ou seja N=N/2
A cada rodada os c�lculos se repetem, e isso acontece enquanto o n�mero de participantes for maior que 1. Levando em conta estas considera��es o algoritmo para este problema seria o seguinte:
Algoritmo
1. Inicializar N: N = 128
2. Repetir enquanto N > 1
3. Calcular P: P = N/2
4. Atualizar S: S = S + P
5. Atualizar N: N = N/2
6 Fim da repeti��o
7. Mostrar S

O programa correspondente a este algoritmo � o seguinte:
Programa
Program PartidasTenis;
Var N,P,S: Real;
Begin
N:=128;
While(N>1) do
Begin
P:=N/2;
S:=S+P;
N:=N/2;
End;
Writeln('O n�mero total de partidas �: ',S);
End.
Problema 2: Calculando
A dissemina��o dos computadores se deve principalmente � capacidade de eles se comportarem como outras m�quinas, vindo a substituir muitas destas. Esta flexibilidade � poss�vel porque podemos alterar a funcionalidade de um computador, de modo que ele opere da forma que desejarmos: essa � a base do que chamamos programa��o.
Tarefa
Sua tarefa � escrever um programa que fa�a com que o computador opere como uma calculadora simples. O seu programa deve ler express�es aritm�ticas e produzir como sa�da o valor dessas express�es, como uma calculadora faria. O programa deve implementar apenas um subconjunto reduzido das opera��es dispon�veis em uma calculadora: somas e subtra��es.
Entrada
A entrada � composta de um n�mero inteiro m (1 ≤ m ≤ 100), indicando o n�mero de operandos da express�o a ser avaliada, uma seq��ncia de n�mero, simbolo e n�mero, indicando o operando, opera��o e operando, no seguinte formato:
X1
s1
X2
s2
...
Xm-1
sm-1
Xm

onde
Xi , 1 ≤ i ≤ m, � um operando (0 ≤ Xi ≤ 100);
sj, 1 ≤ j < m, � um operador, representado pelos s�mbolos `+' ou `-'; Exemplo de Entrada 3 4 + 7 - 22 Exemplo de Sa�da -11 Solu��o Seja m o n�mero de operandos, x o operando, s o operador e res o resultado do c�lculo. Inicialmente, lemos o valor de m, depois o primeiro operando e inicializamos o valor res com o primeiro operando. Para saber o n�mero de operandos lidos vamos usar um contador i. Um poss�vel algoritmo para este problema seria: Algoritmo 1. Ler m 2. Iniciar o contador: i=1 3. Ler x 4. Iniciar o resultado: res=x 5. Enquanto i < m fazer 6. Ler s 7. Ler x 8. Se s='+' ent�o 9. res=res+x 10. Se s='-' ent�o 11. res=res-x 12. Atualizar o contador: i=i+1 13. Fim enquanto 14. Mostrar res Programa Programa Program calculadora; Var i,m: integer; x,res: real; s: char; Begin Readln(m); i:=1; Readln(x); res:=x; While(i

Programa indentado corretamente
Program calculadora;
Var m: integer;
x,res: real;
s: char;
Begin
Readln(m);
i:=1;
Readln(x);
res:=x;
While(i Begin
Readln(s);
Readln(x);
If (s = '+') Then
res:=res+x;
If (s = '-') Then
res:=res-x;
i:=i+1;
End;
Writeln(res);
End.

Exerc�cios
Jogo de adivinhar
Fa�a um programa para voc� jogar com o computador. O computador escolhe um n�mero inteiro entre 1 e 1000 e voc� o adivinha. Se voc� acertar o n�mero em menos de 10 tentativas, voc� ganha o jogo. A cada tentativa o computador informa se o n�mero esta acima ou abaixo do n�mero chutado. Utilize o comando random do Pascal para o computador gerar um n�mero aleat�rio.
exemplo de como usar random:
x:=random; {o computador gera um n�mero real aleat�rio entre 0 e 1}
use o round para converter um n�mero real em um n�mero inteiro, exemplo:
n:=round(x);
Bits Trocados
As Ilhas Weblands formam um reino independente nos mares do Pac�fico. Como � um reino recente, a sociedade � muito influenciada pela inform�tica. A moeda oficial � o Bit; existem notas de B$ 50,00, B$10,00, B$5,00 e B$1,00. Voc� foi contratado(a) para ajudar na programa��o dos caixas autom�ticos de um grande banco das Ilhas Weblands.
tarefa
Os caixas eletr�nicos das Ilhas Weblands operam com todos os tipos de notas dispon�veis, mantendo um estoque de c�dulas para cada valor (B$ 50,00, B$10,00, B$5,00 e B$1,00). Os clientes do banco utilizam os caixas eletr�nicos para efetuar retiradas de um certo n�mero inteiro de Bits.

Sua tarefa � escrever um programa que, dado o valor de Bits desejado pelo cliente, determine o n�mero de cada uma das notas necess�rio para totalizar esse valor, de modo a minimizar a quantidade de c�dulas entregues. Por exemplo, se o cliente deseja retirar B$50,00, basta entregar uma �nica nota de cinquenta Bits. Se o cliente deseja retirar B$72,00, � necess�rio entregar uma nota de B$50,00, duas de B$10,00 e duas de B$1,00.
exemplo de entrada
72
exemplo de sa�da
1 2 0 2

Numeros bin�rios
Voc� sabia que o computador internamente trabalha apenas con os n�meros 0 e 1?. Quando nos escrevemos o programa em pascal, o compilador ainda precisa transformar o programa num codigo que contem apenas os digitos 0 e 1. Os n�mero compostos apenas por estes dois digitos s�o chamados de n�meros binarios, e cada digito � chamado de bit. Os n�meros que estamos acostumados usar contem digitos de 0 at� 9 e s�o chamados de n�meros em base 10. Como faz o compilador para tranformar um n�mero base 10 num n�mero bin�rio?. Vejamos alguns exemplo de convers�o em n�meros bin�rios.
52 = 110100
20 = 10100
10 = 1010
Um n�mero X em base 10 pode ser expresso em termos de um n�mero bin�rio com os digitos ...b5b4b3b2b1b0. Da seguinte forma:
X = b0*20 + b1*21 + b2*22 + b3*23 + b4*24 + ...
por exemplo, o n�mero 20 pode ser expresso em n�mero bin�rio como:
20 = 1 0 1 0 0
| | | | |
b4 b3 b2 b1 b0
20 = 1*24 + 0*23 + 1*22 + 0*21 + 0*20
Tarefa
Escreva um programa que l� um n�mero N, correspondente ao n�mero de entradas. E para cada entrada X (X<256), que corresponde a um n�mero inteiro, o programa deve imprimir a representa��o em n�mero bin�rio com 8 digitos (8 bits).
Exemplo de Entrada
3
5 10 25
Exemplo de sa�da
00000101
00001010
00011001
A solu��o dos exerc�cios voc� encontra aqui.

Repetiçoes (Aula 4)


Repetiçõeses
(Aula 4)
Uma das grandes vantagens da programa��o � que podemos agrupar c�lculos repetidos e informar ao computador atrav�s da linguagem de programa��o que trechos deve repetir, quantas vezes ou em que condi��es. Para entender melhor vamos resolver o seguinte problema.
Problema
Calcular e mostrar o quadrado de todos os n�mero inteiros de 1 at� 100
Solu��o
O problema de calcular o quadrado de um n�mero j� vimos na segunda aula. Seja N o n�mero e Q o seu quadrado, portanto Q=N*N.
Como seria a seq��ncia de procedimentos para calcular o quadrado dos primeiros 100 n�meros inteiros? Uma solu��o simples seria trocar o valor de N em todo momento, como mostra o algoritmo 1. Em vez de atribuir o valor de N em todo momento tamb�m podemos calcular somando 1 a seu valor anterior, como mostra o algoritmo 2.
Algoritmo 1
1. Atribuir  N = 1
     2. Calcular  Q = N*N
     3. Mostrar  Q 
	
     4. Atribuir  N = 2
     5. Calcular  Q = N*N
     6. Mostrar  Q 
	
     7. Atribuir  N = 3
     8. Calcular  Q = N*N
     9. Mostrar  Q 
	
    10. Atribuir  N = 4
    11. Calcular  Q = N*N
    12. Mostrar  Q 
	
    ..............
    
---> 
  
Algoritmo 2
1. Atribuir  N=1
     2. Calcular  Q=N*N
     3. Mostrar  Q 
	
     4. Adicionar 1 a N
     5. Calcular  Q=N*N
     6. Mostrar  Q 
	
     7. Adicionar 1 a N
     8. Calcular  Q=N*N
     9. Mostrar  Q 
	
    10. Adicionar 1 a N
    11. Calcular  Q=N*N
    12. Mostrar  Q   
	
    ..............
	
Olhando os dois algoritmos vemos que o programa seria muito longo para calcular o quadrado dos 100 n�meros. Existe uma forma mais curta de dizer ao computador para resolver este problema? Olhando o algorimo 2 percebemos que a partir da linha 4 os comandos se repetem a cada tr�s linhas. Portanto pedimos ao computador simplesmente para repetir o seguinte trecho:
Adicionar 1 a N
        Calcular  Q=N*N
        Mostrar  Q 
Como resultado temos o algortimo 3 mostrado abaixo. Por�m existe um problema, precisamos indicar ao computador quantas vezes deve repetir o trecho. Uma forma de fazer isso � colocando uma condi��o. Neste caso a condi��o seria: repetir o trecho enquanto N for menor ou igual a 100 como est� escrito no algoritmo 4.
Algoritmo 3
1. Atribuir  N = 1
   2. Calcular  Q = N*N
   3. Mostrar  Q 
   4. Repetir o seguinte trecho
   5.    Adicionar 1 a N
   6.    Calcular  Q = N*N
   7.    Mostrar  Q 
	
---> 
  
Algoritmo 4
1. Atribuir  N=1
    2. Calcular  Q=N*N
    3. Mostrar  Q 
    4. Repetir enquando N <= 100
    5.    Adicionar 1 a N
    6.    Calcular  Q=N*N
    7.    Mostrar  Q 	
	
Observando o algoritmo 4 notamos que ainda tem linhas repetidas. Ser� poss�vel fazer ainda mais curto este algoritmo? Em algumas situa��es � poss�vel reduzir ao m�ximo o n�mero de linhas do algoritmo ou programa. Para isso vamos precisar um pouco de nossa criatividade e muitas vezes mais da experi�ncia. Voc� mesmo perceber� isso quando fizermos mais exerc�cios. Voltando ao nosso algoritmo, podemos fazer uma pequena altera��o no valor de N e eliminar as linhas 2 e 3. Se Inicializamos o N com zero, o quadrado de 1 poder� ser calculado dentro do bloco de repiti��o e teremos um algoritmo reduzido.
Algoritmo
1. Atribuir  N=0
         2. Repetir enquando N <= 100
         3.     Adicionar 1 a N
         4.     Calcular  Q=N*N
         5.     Mostrar  Q 	  
No Pascal utilizamos Comando WHILE...DO para indicar ao computador que vamos repetir um trecho do programa enquanto uma condi��o for satisfeita. Vejamos como fica o algoritmo na linguagem Pascal.
Programa
Program quadrados;
     Var   N,Q: Integer;
     Begin
         N:=0;
         While(N <=100) do 
         Begin
             N:=N+1;
             Q:=N*N;
             Writeln('o quadrado de ', N, 'eh', Q);
         End;
     End.
	
Observando o programa vemos que al�m do While...Do aparecem outras duas palavras reservadas da linguagem que j� conhecemos: o Begin...End. Neste caso, estas palavras s�o utilizadas para informar ao computador onde come�a e acaba o trecho do programa que precisa ser repetido. O formato geral do comando WHILE � o seguinte:
WHILE condi��o DO 
BEGIN
   blocos de comandos
END;
Entrada de dados
At� agora vimos uma forma de entrada de dados usando apenas atribu��o. Nesta aula vamos aprender uma outra forma de entrada de dados bastante utilizada. � muito trabalhoso ter que ir ao programa e mudar os valores dos dados cada vez que desejamos fazer c�lculos com novos dados. Por exemplo, no programa da m�dia temos que alterar os valores de N1, N2 e N3 se quisermos calcular a m�dia das notas de outro aluno. Ficaria mais f�cil se pud�ssemos informar isso durante a execu��o do programa. Cada vez que o programa precisar dos dados n�s fornecer�amos atrav�s do teclado. Para fazer isso em Pascal existe o comando chamadoReadln.
Este comando l� os dados do teclado quando n�s digitamos as letras e os n�meros. Por exemplo, se desejamos que o computador leia o valor de N1 do teclado, n�s escrevemos a seguinte linha:
Readln(N1);
Neste caso, o computador vai esperar que n�s digitemos o n�mero e apertemos a tecla ENTER para ler o n�mero.
Como seria o programa da m�dia que l� as notas do teclado?
Para saber a resposta vamos alterar o programa da m�dia da aula anterior.
Programa
Program resultado;
     Var N1,N2,N3 : Real;
             S, M : Real;
     Begin
         Readln(N1);
         Readln(N2);
         Readln(N3);
         S:=N1+N2+N3;
         M:=S/3;
         If(M >= 5) Then
             Writeln('aprovado')
         Else
             Writeln('reprovado');
     End.
Para treinar o que foi aprendido nesta aula vamos resolver um outro problema
Problema
A Bolsa de Valores de S�o Paulo tem um �ndice que mede o quanto a maioria das a��es vale, levando em conta a import�ncia relativa de cada empresa na bolsa. Esse �ndice e atualizado todos os dias.
O �ndice pode mudar devagar (1,5% ao dia, por exemplo) ou muito r�pido (3% ao dia seria muito r�pido). Voc� quer saber se o �ndice costuma "cair r�pido" mais do que "subir r�pido".
Fa�a um algoritmo que leia os percentuais de cada dia, e apenas para os dias em que o �ndice variou mais de 1%, conte ou "mais uma subida" ou "mais uma queda". O algoritmo termina quando o usu�rio entrar "-100".
Ao final da execu��o, o algoritmo deve mostrar o n�mero de subidas e quedas bruscas.
Resposta:
Vamos supor que V seja o valor percentual das subidas ou quedas. Este valor vamos informar ao computador cada dia. Depois de v�rios dias, quando desejamos saber quantas quedas e subidas acima de 1% teve a bolsa, digitamos -100. Portanto o -100 � a condi��o para finalizar o c�lculo. Tamb�m precisamos guardar o n�mero de subidas e quedas, para tanto vamos utilizar as vari�veis Subidas e Quedas. O algoritmo seria o seguinte.
Algoritmo
Subidas=0
       Quedas=0
       Leia V
       Enquanto V n�o for -100
           Se V maior 1 ent�o
               Adicione 1 a Subidas
           Se V menor que -1 
               Adicione 1 a Quedas
           Leia V
       FimEnquanto
O programa correspondente ao algoritmo � o seguinte:
Programa
Program bolsa;
  Var V: real;
      Subidas, Quedas: integer; 
  Begin
     Subidas := 0;
     Quedas := 0;
     While (V <> -100) do
     Begin
        Readln (v);
        If (V > 1) Then
           Subidas := Subidas + 1;
        If (V < -1) Then
           Quedas := Quedas + 1;
     End;
     writeln ('Dias em que o indice subiu: ', subidas);
     writeln ('Dias em que o indice caiu: ', quedas);
  end.
Exerc�cios
  1. Voc� n�o ficou contente com o algoritmo para analisar o �ndice da bolsa de valores. Agora voc� quer saber tamb�m quanto, na m�dia, foi o percentual das mudan�as repentinas no �ndice. Modifique o programa anterior para que ele mostre o seguinte:
    �ndice subiu muito : NNN vezes (em m�dia NN% a cada subida brusca)
    �ndice caiu muito : NNN vezes (em m�dia NN% a cada queda brusca)
  2. n�meros primos: se dice que um n�mero � primo se este � divisivel apenas por 1 e ele mesmo, por exemplo, 17 � um n�mero primo, enquanto o 15 n�o � primo, ja que � divisivel por 3 e 5. Os n�meros primos tem sido bastante usados na criptografia, por exemplo, para a transmiss�o mais segura de informa��es secretas. Imagina, por exemplo que desejamos transmitir pela internet uma mensagem contendo senha de acesso � conta do um banco, se enviamos sem codificar, existe a posibilidade de alguem interceptar a nossa mensagem e ficar sabendo nossa senha. Os n�meros primos s�o usados justamente para codificar uma mensagem e transmitir pela internet sem que outros possam desifrar o conteudo da mensagem. A vantagem de usar os n�meros primos se deve ao fato que � dif�cil saber se um n�mero grande (mais de 100 d�gitos) � primo ou n�o. Fa�a um algoritmo que tenha como entrada um n�mero N, e mostre os n�meros primos at� esse n�mero.
  3. Fa�a agora um algoritmo que, dados n�meros de zero at� um m�ximo, mostre a soma de todos os n�o-primos, subtra�da da soma dos primos.
  4. O fatorial de um n�mero N � o produto de todos os n�meros de 1 at� N. Por exemplo, o fatorial de 4 � 4x3x2x1 = 20. O computador sabe fazer as opera��es b�sicas, porem n�o sabe como calcular o fatorial de um n�mero. Fa�a um programa para o computador calcular o fatorial de N=10.
  5. Na aula anteior j� vimos como determinar se um n�mero � divisivel por outro. Fa�a um programa para calcular a soma de todos os n�meros inteiros menores que 100 e que n�o sejam divis�veis por 3.
As solu��es voce encontra aqui.
Algumas considera��es
  • Os comandos IF e While podem ter mais de uma condi��o, unidos por OR ou AND. Por exemplo:
    WHILE (N >0 AND N <100 ......="......" begin="begin" do="do" end="end" pre="pre">Isso significa que o bloco dentro do While sera repetido enquando o N for maior que 0 E menor que 100.
  • Em um mesmo comando Readln podemos ler mais de um dado, por exemplo a leitura de dados no programa da media pode ser escrito ainda como:
    Readln(N1,N2,N3);
      
  • como calcular o resto de uma divis�o? No pascal existe um operador chamado mod, que calcula o resto de uma divis�o. Por exemplo:
    10 mod 3 � igual a 1

    O operador mod � util para saber se um n�mero � divisivel por outro. Por exemplo para saber se 50 � divisivel por 4, calculamos o 50 mod 4. Como o resultado e igual a 2, conclu�mos que 50 n�o � divisivel por 4. Para um n�mero ser divis�vel por outro, o resto da divis�o deve ser igual a zero

Tomando decis�es (Aula 3)


Tomando decis�es
(Aula 3)

Em todo momento sempre estamos tomando decis�es de acordo com as condi��es que v�o surgindo em nossa vida. Por exemplo, quando sa�mos de casa temos que levar guarda-chuva se estiver chovendo. Dependendo do tempo, se est� fazendo frio ou calor, temos que decidir que roupa vamos vestir. Da mesma forma, para resolver problemas, temos que levar em considera��o as condi��es, e de acordo a cada situa��o temos que tomar decis�es.
Vejamos o problema da m�dia da aula anterior. Vamos supor que agora gostar�amos que o computador nos informasse de acordo com o resultado da m�dia se fomos aprovados ou n�o na disciplina de matem�tica. Para tanto, elaboramos o seguinte algoritmo.
Algoritmo
1. Atribuir os valores a  N1, N2, N3

  2. Calcular a soma:  S = N1 + N2 + N3

  3. Calcular a m�dia:  M = S/3

  4. Se a m�dia for maior ou igual a 5: informar aprovado

  5. Caso contr�rio: informar reprovado

O programa correspondente a este algoritmo seria:
Programa
Program resultado;
     Var N1,N2,N3 : Real;
             S, M : Real;
     Begin
         N1:=7.5;
         N2:=5.5;
         N3:=4.5;
         S:=N1+N2+N3;
         M:=S/3;
         If (M >= 5) Then
             Writeln('aprovado')
         Else
             Writeln('reprovado');
     End.
Analisando o programa observamos que uma condi��o � traduzida em Pascal usando os comandos IF... ELSE e a estrutura geral � a seguinte
IF condi��o THEN
  fazer tarefa 1
ELSE
  fazer tarefa 2 ;
Dependendo do resultado da condi��o o computador realiza apenas uma das tarefas. Se resultado da condi��o for verdadeiro o computador executa a tarefa 1, e se for falso ele realiza a tarefa 2.
Existem situa��es em que devemos fazer apenas uma tarefa; nesse caso n�o utilizamos o ELSE
IF condi��o THEN
    fazer tarefa;
Que acontece se existem mais de um comando a ser executado para cada condi��o? Para o computador saber que comandos ou tarefas fazem parte de uma condi��o, vamos usar blocos. Um bloco � uma seq��ncia de comandos que come�a com BEGIN e termina com END. Portanto a estrutura de IF usando bloco seria:
IF condi��o  THEN
BEGIN
      comando1;
      comando2;
      comando3;
      ......
 END;
De forma similar para o ELSE tamb�m podemos usar o bloco quando for necess�rio.
Tipo de dados boolean
Na aula anterior j� vimos alguns tipos de dados que o computador utiliza, como Integer para n�mero inteiros, Real para n�meros reais e Char para caracteres.

Nesta aula vamos aprender um novo tipo que � o boolean. O computador utiliza vari�veis de tipo boolean para saber o resultado de uma condi��o ou compara��o. Portanto uma vari�vel de tipo boolean pode ter apenas dois valores: FALSO ou VERDADEIRO, em Pascal isso significa, FALSE ou TRUE.

Vejamos um exemplo de como usar as vari�veis de tipo boolean. No exemplo anterior, suponha que precisamos guardar em uma vari�vel o resultado (se estamos aprovados ou n�o). Logo, o programa modificado seria:
Programa modificado
Program resultado;
     Var N1,N2,N3 : Real;
             S, M : Real;
    Result : Boolean;
     Begin
         N1:=7.5;
         N2:=5.5;
         N3:=4.5;
         S:=N1+N2+N3;
         M:=S/3;
         If (M >= 5) Then
             Result:=True
         Else
             Result:=False;
     End.
Dentro de uma condi��o podem existir outras condi��es, como veremos no pr�ximo exemplo.
Problema
Fa�a um programa que dados tr�s n�meros, mostre qual � o maior deles.
Solu��o
Sejam N1, N2 e N3 os tr�s n�meros. Vamos comparar primeiro N1 e N2. Se N1 for maior, vamos comparar ele com N3. Em caso contr�rio vamos comparar N2 com N3. Dependendo do resultado dessas compara��es saberemos quem � o maior.
Algoritmo
N1 = 3 
   N2 = 9
   N3 = 1
   Se N1 > N2 entao
        Se N1 > N3 entao
                Diga que N1 � o maior
        Senao
                Diga que N3 � o maior
        FimSe
   Senao
        Se N2 > N3
                Diga que N2 � o maior
        Senao
                Diga que N3 � o maior
        FimSe
  FimSe
Vemos que o algoritmo ficou um pouco diferente mas ainda assim podemos entender o que faz cada linha. Voc� pode escrever seu algoritmo como melhor achar, mas sempre escreva suas id�ias em um algoritmo antes de programar. Passar esse algorimo para um programa ficou mais f�cil.
Programa
Program maior;
  Var n1, n2, n3: real;
  Begin
        N1 := 3;
        N2 := 9;
        N3 := 1;
        If (N1>N2) Then
              If (N1>N3) Then
                   writeln ('N1 e o maior')
              Else
                   writeln ('N3 e o maior')
        Else
              If (N2>N3) then
                   writeln ('N2 e o maior')
              Else
                   writeln ('N3 e o maior');
  End.
Exercicios
  1. Dois alunos fizeram tr�s provas cada um (P1, P2 e P3), e voc� tem a nota de cada prova de cada aluno. Mostre um algoritmo que diga qual deles tem a maior m�dia. Depois, transforme seu algoritmo em programa Pascal.
  2. Teorema de Pit�goras: Uma importante descoberta de Pit�goras foi o teorema que leva seu nome, ensinado hoje em escolas de todo o mundo. Ao observar os tri�ngulos ret�ngulos (que t�m um �ngulo de 90 graus, chamado �ngulo reto), o fil�sofo notou que eles obedecem a uma lei matem�tica: a soma dos quadrados dos catetos (lados menores do tri�ngulo) � igual ao quadrado da hipotenusa (lado maior). Veja a figura:
     a2 + b2 = c2
    Fa�a um programa que, dados os tr�s lados de um tri�ngulo, determine ele � um tri�ngulo ret�ngulo ou n�o.
  3. Na aula anterior aprendemos como calcular o �ndice de massa corp�rea (IMC) de uma pessoa. Fa�a um programa para que o computador nos informe se estamos magros, normais ou obesos, de acordo com a seguinte condi��o: Se o IMC � menor que 20 estamos magros, precisamos nos alimentar melhor. Se o IMC est� acima de 25 estamos obesos, devemos comer menos e fazer mais exerc�cios f�sicos. Se o IMC estiver entre 20 e 25 estamos normais, ou seja, nossas alimenta��o e atividades f�sicas est�o balanceadas.
  4. Execute o seguinte programa (isto �, simule o que o computador faria ao execut�-lo). Indique o que ser� mostrado na tela do computador.
    Program p;
    Var a,b,c,aux: integer;
    Begin
       a:=5; b:=3; c:=9;
       If (a>b) Then Begin
          aux:=a; a:=b; b:=aux;
       End;
       If(b>c) Then Begin
          aux:=b; b:=c; c:=aux;
       End;
       If(c>a) Then Begin
          aux:=c; c:=a; a:=c;
       End;
       Writeln(a,b,c);
    End.
    
As solu��es dos exerc�cios voce encontra aqui, por�m recomendamos que voce tente resolver antes de olhar a resposta.
Algumas considera��es
  • A linguagem Pascal permite escrever muitos comandos na mesma linha, porem � recomendado que seja escrito apenas um comando por linha para facilitar o entendimento do programa e apenas em casos de comandos simples (por exemplo, atribui��es) usar mais de um comando por linha.
  • Apenas com um comando Writeln podemos mostrar varios resultados. Neste caso as vari�veis devem ser separadas por um  ,  . Tamb�m podemos incluir textos dentro do Writeln usando duas aspas ( ' ), como mostra o seguinte exemplo:
    Writeln('o valor de a � : ' , a, ' e o valor de b �: ', b)
      
  • N�o coloque o ; no comando anterior a ELSE, inclusive no comando END

Nosso primeiro programa (Aula 2)


Nosso primeiro programa
(Aula 2)
Para escrever nosso primeiro programa vamos voltar ao problema da primeira aula. Vamos passar o algoritmo que foi escrito para a linguagem Pascal.
O algoritmo que elaboramos foi o seguinte:
Algoritmo
1. Atribuir os valores   N1 = 5.5
                           N2 = 7.0
                           N3 = 4.5 

  2. Calcular a soma:    S = N1 + N2 + N3

  3. Calcular a m�dia:    M = S/3

  4. Mostrar o resultado    M
  
S� para lembrar: N1, N2 e N3 cont�m as notas, S guarda o resultado da soma e M guarda o resultado da m�dia.
Como converter este algoritmo para a linguagem Pascal?
Antes de passar o algoritmo para a linguagem Pascal vamos ver como � a estrutura de um programa em Pascal
Program nome;
              declara��es {variaveis, tipos, etc.}
        Begin
              comandos {corpo do programa}
        End.

A estrutura do programa em Pascal consta de dois componentes: cabe�a e corpo. Na primeira parte s�o declarados os tipos e vari�veis. Mais para frente explicaremos o significado desta parte. No momento vamos nos concentrar na segunda parte que � o corpo do programa. Como podemos observar o corpo do programa come�a com a palavra Begin e acaba com End.
As palavras Program, Begin e End s�o palavras reservadas da linguagem Pascal e sempre estar�o presentes em todos os programas. Agora vamos passar o nosso algoritmo da m�dia para um programa em Pascal.
Programa
    Program Media;
    Var N1,N2,N3: Real;
             S,M: Real;
Begin
     N1:=5.5; {entrada na primeira nota}
     N2:=7.0; {entrada da segunda nota}
     N3:=4.5; {entrada da terceira nota}
     S:=N1+N2+N3; {c�lculo da soma das notas}
     M:=S/3;  {c�lculo da m�dia}
     Writeln(M); {mostrar o resultado}
    End.

Vemos que o algoritmo inteiro foi passado para o corpo do programa. Vemos tamb�m que na cabe�a aparece a declara��o de N1, N2, N3, S e M. Em breve explicaremos porque s�o importantes as declara��es.
O corpo do programa consta geralmente de tr�s partes principais: entrada de dados, processamento ou c�lculo e sa�da dos resultados, como mostra a seguinte figura:
N1:=5.5;
  N2:=7.0;
  N3:=4.5;
  
S:=N1+N2+N3;
  M:=S/3;
  
Writeln('O resultado �:',M);
   
Entrada de dados
Na entrada de dados n�s fornecemos ao computador os dados que ele precisa para trabalhar. Uma forma simples de fazer isso � atribuindo valores. Por exemplo, no programa anterior quando escrevemos N1:=5.5, estamos indicando ao computador que o valor de N1 � 5,5. Aprenderemos outras formas de entrada de dados ao longo do curso.
Sa�da de dados
Na sa�da visualisamos os resultados dos c�lculos. No Pascal existe o comando Writeln que � utilizado para mostrar os dados. No exemplo anterior a linha:
Writeln('o resultado da media �: ',M)
  
Mostra na tela do computador a seguinte mensagem
o resultado da media �: 5,666
 
Processamento de dados
Este � o lugar onde acontecem todo tipo de c�lculos e onde os resultados s�o gerados. Este � tambem o lugar onde as decis�es s�o tomadas de acordo com o resultado dos c�lculos. Como as decis�es s�o tomadas aprenderemos na pr�xima aula.
No exemplo anterior a linha:
S:=N1+N2+N3;
indica que primeiro s�o somados os valores de N1, N2 e N3, depois o resultado � guardado no lugar do S
Declara��o de vari�veis
No exemplo anterior utilizamos N1, N2 e N3 para identificar as notas das provas. Na linguagem de programa��o estes nomes s�o chamados de vari�veis. O computador utiliza as vari�veis para guardar em sua mem�ria os valores de entrada ou os resultados dos c�lculos. Portanto as vari�veis s�o nomes que damos a lugares quando desejamos guardar alguma coisa na mem�ria do computador -- por exemplo o resultado da m�dia. Imagine a mem�ria do computador como uma pilha de caixas vazias. Se desejamos guardar alguma coisa nas caixas colocamos una etiqueta para identificar, por exemplo, caixa10. Al�m disso anotamos o que estamos guardando. Por exemplo, se usamos a caixa para guardar livros nos escrevemos: caixa10:livros. � exatamente isso que o computador faz quando n�s escrevemos na cabe�a do programa a seguinte linha:
  Var   N1,N2,N3 : Real 
Neste caso, o computador procura 3 caixas vazias e coloca a etiqueta N1:Real, N2:Real e N3:Real indicando que as caixas guardam n�meros reais.� importante avisar ao computador o que vamos guardar nas caixas para ele procurar caixas de tamanho adequado. Este processo chamamos de declara��o de vari�veis. Na cabe�a do programa escrevemos a palavra Var para avisar ao computador que nessa parte est�o as declara��es. O nome das vari�veis pode ser qualquer palavra, letra ou combina��o de letras com n�meros, come�ando sempre com uma letra como no exemplo anterior. Por�m, nao podemos usar como nome de vari�vel as palavras reservadas da linguagem.
Al�m de n�meros que outras coisas posso guardar na mem�ria do computador?
Geralmente, o computador trabalha bastante com n�meros reais e inteiros, mas tamb�m pode guardar outros tipos de dados, como por exemplo, caracteres (um caractere � uma letra, s�mbolo ou d�gito), da seguinte forma:
  Var letra : char 
Como fa�o para que o computador guarde meu nome em sua mem�ria?
Isso saberemos mais tarde. Por enquanto vamos treinar o que j� aprendemos. Por exemplo, vamos fazer um programa para o computador calcular o quadrado de um n�mero N=16.
Solu��o
Vamos supor que N seja o n�mero e Q o quadrado deste n�mero. Para calcular o quadrado multiplicamos o n�mero por ele mesmo.
Algoritmo
1. Atribuir  N=16

 2. Calcular  Q=N*N

 3. Mostrar  Q 
 
Programa
Program quadrado;
     Var N,Q : Integer;
     Begin
           N:=16;
           Q:=N*N;
           Writeln(Q);
     End.
    
Exerc�cios
  1. N�s constru�mos uma caixa d'�gua que tem a forma de um paralel�pedo (veja figura), e gostar�amos de saber quanto de �gua vamos armazenar nesta caixa. Fa�a um programa que calcule o volume da caixa dadas as suas dimens�es: altura=3, largura=5 e comprimento=8.5.
  2. Para saber quando de material foi gasto na constru��o da caixa em forma de paralel�pedo, precisamos saber a �rea externa da caixa. Modifique o programa que calcula o volume da caixa, para que ele calcule toda a �rea externa ao inv�s do volume. Considere que a caixa deve ser fechada.
  3. O �ndice da massa corp�rea (IMC) � usado pelos nutricionistas para determinar se estamos magros ou gordos. Fa�a um programa que calcule o IMC de uma pessoa, dada sua altura e peso. O IMC � calculado como peso em kg, dividido pelo quadrado da altura, em metros:
As solu��es dos exerc�cios voc� encontra aqui, por�m recomendamos que voc� tente resolver antes de olhar as respostas.
Algumas considera��es
A linguagem Pascal tem algumas regras que sempre devemos considerar quando escrevemos programas.
  • Todos os comandos tem um   ;   no final (com algumas exce��es)
  • Para alterar o conte�do de uma caixa ou vari�vel utilizamos um := e n�o um = como nos algoritmos
  • Para Pascal n�o existe diferen�a entre letras maiusculas e minusculas, portanto voce pode escrever os comandos e os nomes de vari�veis com qualquer letra.
  • Os coment�rios dentro do programa n�o s�o considerados pelo computador, por�m sempre � recomendavel escrever os coment�rios explicando o que faz cada linha ou bloco do programa. Isso nos ajudar�, por exemplo, a entender o que faz o programa quando quisermos voltar a us�-lo depois de alguns meses. Para escrever coment�rios dentro do programa voc� pode usar o *( e *) ou { e }

Aprendendo a programar (Aula 1)


Aprendendo a programar
(Aula 1)

Introdu��o
Neste curso vamos conhecer o maravilhoso mundo da programa��o. Programar consiste em dar uma seq��ncia de comandos ao computador para resolver um determinado problema. Em primeiro lugar, precisamos aprender a definir os passos que nos levam � solu��o do problema. Este � o processo mais importante da programa��o, que exige nossa habilidade de entender o problema e propor uma solu��o criativa, simples e correta. Esta seq��ncia de passos visando a solu��o de um determinado problema � chamada de algoritmo.
Algoritmo
Um algoritmo � uma seq��ncia de passos para realizar um tarefa ou resolver um problema. Em nosso dia a dia utilizamos algoritmos para realizar nossas atividades, definindo a seq��ncia de a��es que devemos fazer para atingir um objetivo. Essas seq��ncias de passos geralmente s�o guardadas em nossa mem�ria. Por exemplo, quando marcamos um encontro com algu�m, a seq��ncia de procedimientos para esta situa��o seria:
  • tomar banho
  • vestir roupa bonita
  • levar guarda-chuva se estiver chovendo
  • pegar �nibus
  • ...
Esta seq��ncia de procedimentos n�o anotamos no papel, por que s�o coisas simples ou que fazemos com bastante freq��ncia. Por�m, para resolver problemas mais complexos, precisamos anotar no papel os passos, principalmente quando queremos escrever um programa. Existem diferentes formas de escrever um algoritmo. Neste curso vamos escrever os algoritmos em uma linguagem intermedi�ria entre a linguagem falada e a linguagem de programa��o. A id�ia � usar termos simples por�m claros e objetivos. Para ilustrar melhor o que foi falado nesta introdu��o vamos come�ar resolvendo um simples problema.
Exemplo de um problema:
Na disciplina de matem�tica tivemos tr�s provas e as notas foram as seguintes:N1 = 5.5
N2 = 7.0
N3 = 4.5
Gostar�amos saber qual foi a m�dia das tr�s notas. Qual seria a seq��ncia de opera��es que o computador precisa para fazer este simples c�lculo?.
Solu��o
Para calcular a m�dia, em primeiro lugar precisamos informar ao computador quais s�o os valores das notas. Depois, pedimos para ele somar as notas e dividir por 3. O resultado deve ser guardado em algum lugar, para depois mostrar na tela do computador. Esta seq��ncia podemos escrever em um algoritmo da seguinte forma:
Algoritmo
1. Atribuir os valores   N1 = 5.5
                           N2 = 7.0
                           N3 = 4.5

  2. Calcular a soma:    S = N1 + N2 + N3

  3. Calcular a m�dia:   M = S/3

  4. Mostrar o resultado   M
  

Para fazer os c�lculos, o computador precisa guardar os dados em algum lugar de sua mem�ria. Para entender melhor como isso funciona, vamos imaginar que esses lugares sejam caixas vazias. Portanto N1, N2 e N3 s�o caixas onde vamos guardar o valor das notas. Por exemplo, quando fazemos N1 = 5.5 no algoritmo, estamos informando ao computador que deve guardar o valor 5.5 na caixa N1. De forma similiar quando escrevemos:
 S = N1 + N2 + N3 , 
o computador deve fazer a soma dos valores que est�o nas caixa N1,N2 e N3 e o resultado deve guardado na caixa S. A caixa M vamos utilizar para guardar o valor deS dividido por 3. Finalmente quando quesirmos ver o resultado do c�lculo, pedimos ao computador mostrar o conte�do da caixa MEm qualquer momento podemos alterar o conte�do das caixas utilizando o simbolo = , nesse caso o valor anterior da caixa ser� apagado e sempre guardar� apenas o �ltimo valor. Agora imaginemos que temos poucas caixas vazias e para economizar vamos pedir ao computador que guarde o resultado da m�dia no mesmo lugar onde estava a soma, j� que a soma n�o ser� mais usada. Para isso o comando seria o seguinte:
 S = S/3 
Neste caso, o computador vai dividir o conte�do da caixa S por 3 e o resultado vai guardar na mesma caixa S, apagando o resultado anterior. Este tipo de procedimento podemos fazer quando n�o precisamos guardar os valores anteriores.Para colocar o nome das caixas nos algoritmos podemos utilizar qualquer letra ou palavra, mas sempre � recomed�vel usar palavras ou letras associadas ao conte�do. Por exemplo, para guardar a m�dia n�s colocamos a letra M, poderiamos usar tamb�m: Media, med, MEDIA, etc.
Linguagem de programa��o
Para que possamos passar ao computador uma solu��o em forma de algoritmo de forma clara e precisa necessitamos de uma linguagem de programa��o. Neste curso vamos aprender a linguagem Pascal. Uma linguagem de programa��o � apenas uma ferramenta de comunica��o para que o computador possa fazer o que n�s pedimos. Em outras palavras, o computador � um auxiliar para resolver nossos problemas, j� que tem capacidade de processar r�pido uma grande quantidade de comandos, e a linguagem Pascal � uma das linguas que nosso auxiliar entende.
Uma das vantagens de utilizar programas para fazer c�lculos ou resolver problemas � que podemos executar quantas vezes seja necess�rio, alterando apenas alguns dados. No exemplo anterior, suponha que queremos saber a m�dia das notas de outro aluno ou de uma outra disciplina. Usando o programa n�o precisamos fazer nenhum c�lculo adicional. Apenas alteramos os valores de N1, N2 e N3 e obteremos o resultado do novo c�lculo.
Linguagem Pascal
Nas pr�ximas aulas vamos explicar os comandos b�sicos da linguagem Pascal, que utilizaremos para programar e resolver problemas com a ajuda do computador. Por enquanto � importante lembrar que um algoritmo nos ajuda a organizar nossas id�ias para resolver o problema antes de passar para a linguagem do computador. Este m�todo � util especialmente para programas longos e complexos. Geralmente, depois que um algoritmo est� muito bem descrito a passagem para uma linguagem � relativamente f�cil.
Exercicios
  1. O computador sabe fazer as opera��es b�sica como a multiplica��o, divis�o, soma e substra��o. Fa�a um algoritmo para o computador calcular o quadrado de um n�mero.
  2. Como seria o algoritmo para o computador determinar o valor m�ximo entre dois n�mero A e B ?.
  3. Pensa um pouco sobre o problema da m�dia. Imagina agora que temos a nota final de todos os alunos da classe (20 alunos). Como faria o computador para calcular a m�dia da classe?
Algumas considera��es
  1. Este curso foi preparado com o objetivo de ensinar como resolver problemas usando os comandos b�sicos da linguagem Pascal. Com a base dada neste curso voc� estar� em condi��es de explorar todos os comandos da linguagem Pascal e aprender outras linguagens de programa��o.
  2. Para acompanhar o curso e testar seus programas, voces v�o precisar de um compilador. O compilador � um programa que verifica se seu programa esta escrito corretamente e o prepara para executar. Aqui voc� encontra os detalhes de como instalar e usar um compilador de Pascal.
  3. A programa��o s� se aprende praticando, por isso � imprescind�vel fazer os exerc�cios para poder acompanhar o curso.

 
Design by Wordpress Theme | Bloggerized by Free Blogger Templates | coupon codes