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

10 de agosto de 2012

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.

0 comentários:

Postar um comentário

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