Informática e Computação - Ficha de Trabalho nº10 - Exercício 1 - Proposta de resolução Program totoloto; {Calcula chaves do Totoloto e apresenta-as ordenadas} uses wincrt; var vector:array [1..7] of integer; aleatorio,n:integer; sorteados_validos:integer; existe:boolean; procedure inserir_ordenadamente_no_vector(num:integer); var n,posicao_de_insercao:integer; begin {encontra a posicao de insercao correcta} posicao_de_insercao:=1; while ((num>vector[posicao_de_insercao]) and (vector[posicao_de_insercao]<>0)) do inc(posicao_de_insercao); {desloca uma celula os valores existentes para alocar espaco para a nova insercao} for n:=6 downto posicao_de_insercao do vector[n]:=vector[n-1]; vector[posicao_de_insercao]:=num; end; {inicio do programa principal} BEGIN {inicializa o motor de geração de nºs aleatórios} randomize; repeat {Gera uma numero aleatrio entre 1 e 49} aleatorio:=random(49)+1; if (sorteados_validos=0) then begin vector[1]:=aleatorio; sorteados_validos:=sorteados_validos+1; end else begin existe:=false; for n:=1 to 6 do if (vector[n]=aleatorio) then existe:=true; if (existe=false) then begin if (sorteados_validos=6) then vector[7]:=aleatorio else inserir_ordenadamente_no_vector(aleatorio); sorteados_validos:=sorteados_validos+1; end; end; until (sorteados_validos=7); {visuaizar a chave} for n:=1 to 6 do write(' ',vector[n]); writeln(' Suplementar:',vector[7]); END. © 2003 Grupo de Informática da ESAB Informática e Computação - Ficha de Trabalho nº11 - Exercício 2 - Proposta de resolução Program quadrado_magico; {Procura encontrar aleatoriamente quadrados mágicos} uses wincrt; const DIM=3; {dimensão do quadrado} var quadrado:array [1..DIM,1..DIM] of integer; encontrou, linhas_constantes, colunas_constantes, diagonais_constantes:boolean; n,linhas, colunas, linha, coluna, soma, soma_anterior:integer; contador:longint; Procedure preencher_quadrado_aleatoriamente; var n,lin,col:integer; begin for n:=1 to (DIM*DIM) do begin repeat lin:=random(DIM)+1; col:=random(DIM)+1; until (quadrado[lin, col]=0); quadrado[lin, col] := n; end; end; BEGIN randomize; encontrou:=false; repeat {inicializar matriz} for linhas:=1 to DIM do for colunas:= 1 to DIM do quadrado[linhas,colunas]:=0; preencher_quadrado_aleatoriamente; {testar se é mágico} {verificar colunas} colunas_constantes:=true; for colunas:= 1 to DIM do begin soma:=0; for linhas:= 1 to DIM do soma:=soma+quadrado[linhas,colunas]; if (colunas>1) then if (soma<>soma_anterior) then colunas_constantes:=false; soma_anterior:=soma; end; {verificar linhas} if (colunas_constantes=true) then begin linhas_constantes:=true; for linhas:= 1 to DIM do begin soma:=0; for colunas:= 1 to DIM do soma:=soma+quadrado[linhas,colunas]; if (soma<>soma_anterior) then linhas_constantes:=false; soma_anterior:=soma; end; © 2003 Grupo de Informática da ESAB end; {verificar diagonais} if (colunas_constantes=true) and (linhas_constantes=true) then begin soma:=0; diagonais_constantes:=true; for n:=1 to DIM do soma:=soma+quadrado[n,n]; if (soma<>soma_anterior) then diagonais_constantes:=false; soma:=0; for n:=1 to DIM do soma:=soma+quadrado[n,DIM+1-n]; if (soma<>soma_anterior) then diagonais_constantes:=false; end; {mostrar número de tentativas efectuadas de 10 mil em 10 mil} contador:=contador+1; if (contador mod 10000 = 0) then writeln('Tentativa nº ',contador); {se for quadrado mágico parar e mostrar, senão continuar a procurar} if((colunas_constantes=true) and (linhas_constantes=true) and (diagonais_constantes=true)) then begin encontrou:=true; for linhas:=1 to DIM do begin for colunas:=1 to DIM do write('|',quadrado[linhas, colunas]); writeln('|'); end; end; until (encontrou=true); writeln('Solução encontrada após ', contador, ' tentativas.'); END. © 2003 Grupo de Informática da ESAB