Sum´
ario
1 L´ogica 2
1.1 M´etodo heur´ıstico . . . 2
1.2 Aplica¸c˜ao do m´etodo: sudoku . . . 4
2 Pr´atica de programa¸c˜ao 14 2.1 Regras da boa programa¸c˜ao . . . 14
2.2 Documenta¸c˜ao externa . . . 15
3 Pseudoc´odigo 18 3.1 Sudoku . . . 18
3.1.1 Contar c´elulas dispon´ıveis . . . 19
3.1.2 Processar submatrizes . . . 19
3.1.3 Processar linhas e colunas . . . 20
3.1.4 Contar c´elulas dispon´ıveis nas linhas e colunas . . . 20
3.1.5 Inserir valor candidato na matriz do jogo . . . 21
3.1.6 Desmarcar c´elulas . . . 21
M ´odulo
1
L´
ogica
Todos estamos habituados a organizar nossas tarefas di´arias segundo uma lista de coisas “para fazer”. Esta lista di´aria pode ser ordenada na forma de prioridades ou em uma ordem que fa¸ca sentido para o indiv´ıduo. O que se deseja ´e que, no final do dia, tudo tenha sido cumprido. Tamb´em ´e normal, na rotina de um trabalho ou estudo, deparar-se com tarefas que devem ser cumpridas, `as vezes numa mesma ordem, as vezes numa ordem diferente. Algumas rotinas permitem essa flexibilidade, outras n˜ao. Tˆem tarefas que podem ser realizadas simultaneamente, outras n˜ao.
Conforme o indiv´ıduo amadurece e adquire experiˆencia, percebe que algumas tarefas devem ser exe-cutadas numa determinada ordem para que as mesmas sejam conclu´ıdas satisfatoriamente. A experiˆencia ´e um instrumento muito valioso neste processo. Na ausˆencia de experiˆencia, devemos agir com sabedoria. O conhecimento, por vezes o cient´ıfico, se faz valer nestes momentos.
A l´ogica ´e o estudo formal sistem´atico dos princ´ıpios da inferˆencia v´alida e do pensamento correto. J´a que o pensamento ´e a manifesta¸c˜ao do conhecimento, e que o conhecimento busca estabelecer a verdade, ´e preciso a ado¸c˜ao de algumas regras para que essa meta possa ser atingida. Assim, a l´ogica ´e o ramo da filosofia que cuida das regras do bem pensar, ou do pensar correto, sendo, portanto, um instrumento do pensar. Mas a aprendizagem da l´ogica n˜ao constitui um fim em si.
A l´ogica s´o tem sentido enquanto meio de garantir que nosso pensamento proceda corretamente a fim de chegar a conhecimentos verdadeiros. Podemos, ent˜ao, dizer que a l´ogica trata dos argumentos e, consequentemente, das conclus˜oes a que chegamos atrav´es da apresenta¸c˜ao de evidˆencias que a sustentam. Mas qual m´etodo adotar? O desenvolvimento de algoritmos ´e tradicionalmente apresentado como l´ogica de programa¸c˜ao. Esta l´ogica possui caracter´ıstica do m´etodo dedutivo que parte de premissas assumidas como verdadeiras e que, a partir de um racioc´ınio l´ogico dedutivo, ´e capaz de gerar uma conclus˜ao v´alida, assumindo que o processo dedutivo ´e v´alido.
Entretanto, a estrutura formal do m´etodo dedutivo engessa em parte o processo de livre cria¸c˜ao se o indiv´ıduo n˜ao est´a familiarizado com a l´ogica dedutiva. Precede o processo de programa¸c˜ao o processo de cria¸c˜ao que, entre outros elementos, visa estabelecer as estrat´egias a serem usadas na elabora¸c˜ao da solu¸c˜ao do problema.
O contexto da cria¸c˜ao, a gˆenese, ´e o da elabora¸c˜ao mental, muitas vezes n˜ao-linear, mas que, com a experimenta¸c˜ao e a reflex˜ao, cria vieses mais definidos. Por vezes, o processo criativo conduz o de-senvolvedor “`a estaca zero” de onde ele parte novamente em busca de novas solu¸c˜oes. Neste aspecto, a heur´ıstica torna-se um ponto de partida adequado por revelar ao desenvolvedor mecanismos e estrat´egias que organizam seu processo de gˆenese sem esgotar sua capacidade inventiva.
1.1
M´
etodo heur´ıstico
Segundo Polya1apud Rosa e Orey2, a heur´ıstica pode ser compreendida como um conjunto de regras
e m´etodos que conduzem `a descoberta e `a inven¸c˜ao e que s˜ao utilizados na resolu¸c˜ao de problemas. Tem
1POLYA, G. A arte de resolver problemas: um novo aspecto do m´etodo matem´atico. Tradu¸c˜ao de Heitor Lisboa de Ara´ujo.
Rio de Janeiro:Interciˆencia, 1978. 196 p.
2ROSA, M.; OREY, D. C. De Pappus a Polya: da heur´ıstica grega `a resolu¸c˜ao de problemas. p. 12–27, In PLURES –
HUMANIDADES: Revista do Programa de P´os-Gradua¸c˜ao em Educa¸c˜ao - Mestrado, n. 11 – jan./jun. 2009. Ribeir˜ao Preto, SP: Centro Universit´ario Moura Lacerda. Departamento de Educa¸c˜ao e Programa de P´os-Gradua¸c˜ao em Educa¸c˜ao – Mestrado –14,5 x 21cm. 164 p.
por objetivo compreender as opera¸c˜oes mentais pr´oprias deste processo que se mostrem ´uteis.
Na logica, o m´etodo heur´ıstico antecede, por assim dizer, os m´etodos rigorosos de indu¸c˜ao e dedu¸c˜ao. Enquanto os ´ultimos s˜ao a base do processo de demonstra¸c˜ao e formula¸c˜ao de leis gerais, a heur´ıstica ´e por certo imprecisa e provis´oria e conta com dois elementos caracteristicamente humanos: a intui¸c˜ao e a criatividade. O m´etodo heur´ıstico ´e posto frequentemente como um m´etodo de “tentativa e erro”, que ´e um equ´ıvoco se for considerado que o indiv´ıduo que procura solucionar um problema parte naturalmente de conceitos, modelos e hip´oteses formulados em experiˆencias anteriores.
No entanto, mesmo que a heur´ıstica parta de bases consideradas n˜ao formais, reconhece-se estruturas de inferˆencia similares `as adotadas nos outros m´etodos: o processo de an´alise e de s´ıntese. Polya classifica estes processos segundo as fases do processo mental que o indiv´ıduo aplica na abordagem de um problema e na constru¸c˜ao de sua solu¸c˜ao. O processo de an´alise se divide em compreens˜ao do problema e elabora¸c˜ao de um plano, enquanto a s´ıntese se divide em execu¸c˜ao do plano e revis˜ao da resolu¸c˜ao. O ponto de partida da an´alise ´e o problema e o seu produto ´e o plano de a¸c˜ao. Na s´ıntese, o ponto de partida ´e o plano de a¸c˜ao e o resultado ´e solu¸c˜ao do problema.
Compreens˜ao do problema
A compreens˜ao do problema ´e est´a relacionada `a interpreta¸c˜ao do enunciado. E necess´´ ario a leitura cont´ınua do mesmo at´e que toda informa¸c˜ao poss´ıvel tenha sido identificada. O processo l´ogico se inicia, ent˜ao, com a an´alise da informa¸c˜ao adquirida, a partir da qual o desenvolvedor deve estabelecer suas metas, pois o problema pode ter implica¸c˜oes. ´E importante entender as causa do problema e os efeitos provocados por ela. Al´em disso, mudar o ponto de vista que ´e lan¸cado sobre o problema ajuda tamb´em na explora¸c˜ao dos aspectos mais gerais do problema. Algumas perguntas s˜ao ´uteis nesta epata: Qual ´e o problema? Que informa¸c˜oes tenho? O que est´a faltando? Onde devo chegar? As respostas a estas e outras perguntas n˜ao s˜ao a solu¸c˜ao, mas evidenciam o escopo de trabalho, seus limites e as dire¸c˜oes a serem tomadas. A compreens˜ao do problema deve estar impregnada de quest˜oes e respostas.
Elabora¸c˜ao de um plano
Na elabora¸c˜ao de um plano, o desenvolvedor, j´a de posse das informa¸c˜oes necess´arias at´e o presente momento, ´e capaz de idealizar uma solu¸c˜ao inicial. O processo pode ser longo, mas deve ser finito. Como em um processo de amadurecimento, o desenvolvedor conta com v´arios instrumentos para criar e avaliar poss´ıveis solu¸c˜oes. O uso de diagramas, desenhos, rascunhos e tabelas podem auxili´a-lo a visualizar o plano. Esta fase ´e de alta criatividade e ´e primordial que o desenvolvedor sinta-se livre para compor sua abordagem.
O passo inicial pode ser dif´ıcil, mas uma atitude de perseveran¸ca nesta busca ´e fundamental. A experiˆencia e o bom senso do desenvolvedor s˜ao um bom ponto de partida. Por analogia, compara¸c˜ao e transposi¸c˜ao, ele agrega seu conhecimento `a an´alise do problema e desenvolve uma solu¸c˜ao tempor´aria.
O plano em si ´e um conjunto de a¸c˜oes, sequencialmente organizado, e que dever´a ser executado, na ordem explicitada. ´E como uma receita – se um passo for ignorado, o resultado final poder´a ficar comprometido. Uma boa pr´atica ´e a elabora¸c˜ao das a¸c˜oes usando verbos no modo infinitivo e que cada a¸c˜ao corresponda a um verbo, ou seja, cada passo do plano ´e uma a¸c˜ao e cada a¸c˜ao ´e caracterizado por um verbo. Desta forma, as a¸c˜oes poder˜ao ser facilmente verificadas quanto ao seu efeito e sua validade.
Execu¸c˜ao do plano
A primeira fase da s´ıntese ´e a execu¸c˜ao do plano concebido. Esta etapa ´e menos mental e mais bra¸cal. O desenvolvedor deve seguir cada passo do plano elaborado e conferir se o resultado esperado foi realmente obtido. ´E comum, principalmente nas abordagens iniciais, deparar-se com a necessidade de alterar o plano haja vista alguma incoerˆencia entre os resultados e os objetivos.
Se for preciso, o desenvolvedor deve retornar para a etapa de compreens˜ao do problema e refazer todo o caminho at´e que o plano gere resultados coerentes com o esperado.
Revis˜ao da resolu¸c˜ao
Pela dinˆamica pr´opria do m´etodo heur´ıstico, a fase final de revis˜ao do processo como um todo propicia ao indiv´ıduo a oportunidade de aperfei¸coamento do plano, reiniciando cada uma das epatas.
Assim, o esquema geral da heur´ıstica se baseia no tr´ıplice conceito an´alise-s´ıntese-avalia¸c˜ao.
Deve se destacar que a heur´ıstica permite que o desenvolvedor retorne a qualquer uma das etapas no momento que isso se justificar. Mas deve ser claro tamb´em que ao voltar, as etapas, a partir do ponto de retorno, dever˜ao ser refeitas.
1.2
Aplica¸
c˜
ao do m´
etodo: sudoku
Muitos passatempos se baseiam na elabora¸c˜ao de processos l´ogicos para serem resolvidos. Um, muito interessante (do ponto de vista did´atico), ´e o quebra-cabe¸ca chamado Sudoku. Este jogo consiste em uma matriz 9 × 9 dividida em 9 submatrizes, cada uma de 3 × 3 elementos. A matriz total ´e preenchida parcialmente com n´umeros e o objetivo ´e complet´a-la com n´umeros seguindo as seguintes regras:
Regras
1. os n´umeros dispon´ıveis para preenchimento das submatrizes est˜ao restritos ao intervalo de n´umeros inteiros de 1 a 9;
2. n˜ao pode haver n´umero repetido dentro de uma submatriz espec´ıfica; 3. n˜ao pode haver n´umero repetido em uma coluna espec´ıfica;
4. n˜ao pode haver n´umero repetido em uma linha espec´ıfica. Aplicando a heur´ıstica, o primeiro passo ´e compreender o problema.
No Sudoku, o objetivo ´e encontrar que valor dever´a ser escrito em cada c´elula vazia da matriz de forma a n˜ao violar as regras estabelecidas. Cada exemplar de Sudoku admite somente uma solu¸c˜ao que fica determinada a partir dos n´umeros previamente lan¸cados na matriz como situa¸c˜ao inicial.
O maior dificultador na solu¸c˜ao do jogo est´a no foco da aten¸c˜ao do jogador. As c´elulas devem ser preenchidas com n´umeros no intervalo de 1 a 9 e a matriz de n´umeros apresenta uma quantidade de c´elulas n˜ao preenchidas que dificulta a visualiza¸c˜ao da solu¸c˜ao. Um n´umero candidato inserido na c´elula errada produz uma distribui¸c˜ao equivocada que pode n˜ao ser detectada de imediato. Logo, o jogador segue preenchendo as c´elulas at´e que as regras o impede de prosseguir. Nesta situa¸c˜ao, o jogador precisa voltar e identificar que n´umero foi encaixado erroneamente. Esse m´etodo se torna impratic´avel.
Analisando o problema, percebe-se duas vari´aveis: o n´umero candidato e a posi¸c˜ao onde dever´a ser inscrito. A inscri¸c˜ao de um candidato em uma determinada posi¸c˜ao interfere na distribui¸c˜ao seguinte.
Ent˜ao, para resolver o problema, ´e necess´ario uma estrat´egia que minimize o n´umero de combina¸c˜oes de vari´aveis, buscando, no processamento de cada candidato, determinar a sua posi¸c˜ao definitiva. S´o, ent˜ao, outro candidato poder´a ser processado.
Uma forma de reduzir a dimens˜ao do problema ´e n˜ao tratar todos os candidatos ao mesmo tempo e tirar proveito das regras a favor do jogador.
Primeiro, a partir da distribui¸c˜ao dos n´umeros j´a inscritos, cria-se um mapa de disponibilidades, ou seja, uma matriz onde as c´elulas j´a ocupadas por n´umeros na matriz de n´umeros ser˜ao preenchidas com algum s´ımbolo diferente, por exemplo, ‘X’. A matriz do jogo e o mapa s´o diferem pela presen¸ca de n´umeros e s´ımbolos. As posi¸c˜oes ocupadas em uma s˜ao as mesmas ocupadas na outra.
Depois, usando as regras 2, 3 e 4, o jogador pode marcar as c´elulas no mapa que n˜ao poder˜ao, de antem˜ao, receber o n´umero candidato. Cada n´umero candidato exigir´a um mapa de disponibilidade. Trabalhar com todos os mapas de disponibilidade ao mesmo tempo n˜ao resolve, pois ´e a mesma situa¸c˜ao identificada inicialmente. Ent˜ao, o jogador deve, sistematicamente, resolver cada candidato por vez sendo que o resultado de um processamento ´e o in´ıcio do processamento de outro candidato. No universo de 1 a 9, o jogador pode escolher qualquer n´umero para come¸car. Uma sugest˜ao ´e percorrer a sequˆencia
num´erica iniciando com o n´umero 1, depois o n´umero 2 e assim por diante.
Ent˜ao, para o n´umero 1, cria-se o mapa de disponibilidade inicial e aplica-se as regras j´a mencionadas. Toda submatriz que contiver o n´umero 1 ter´a suas c´elulas vazias marcadas com o ‘X’. Toda coluna que tiver o n´umero 1 presente ter´a suas c´elulas vazias tamb´em marcadas com o ‘X’. Idem para as linhas que tiverem o n´umero 1. O resultado ´e um mapa onde somente as c´elulas vazias para o n´umero 1 est˜ao dispon´ıveis. Da´ı o nome de mapa de disponibilidades.
O passo seguinte ´e identificar as linhas e as colunas onde h´a somente uma c´elula dispon´ıvel para a inser¸c˜ao do n´umero 1. Se h´a c´elulas dispon´ıveis nesta condi¸c˜ao, ent˜ao o n´umero deve ser inserido. Se n˜ao h´a c´elulas nesta condi¸c˜ao, ent˜ao parte-se para o pr´oximo n´umero candidato, isto ´e, o n´umero 2.
O tratamento para o n´umero 2 ´e idˆentico ao do n´umero 1. A diferen¸ca estar´a no mapa de disponibi-lidades inicial. O mapa para o n´umero 2 ´e gerado a partir da solu¸c˜ao para o n´umero 1 (com o n´umero 1 j´a inserido na matriz de n´umeros do jogo). A cada candidato novo, o mapa de disponibilidades inicial ser´a a solu¸c˜ao do candidato anterior.
Agora j´a ´e poss´ıvel vislumbrar-se um plano. O n´ucleo do processo ´e a an´alise de cada candidato por vez. Para cada candidato, um mapa de disponibilidade ser´a criado e atualizado. Dependendo do grau de dificuldade, ´e poss´ıvel que, ao se esgotar os n´umeros candidatos, ainda se observe c´elulas dispon´ıveis. Ent˜ao o plano deve prever a repeti¸c˜ao da an´alise dos candidatos continuamente. O crit´erio de parada ´e n˜ao haver mais c´elulas dispon´ıveis no momento da cria¸c˜ao do mapa de disponibilidade.
Veja o plano de uma forma mais estruturada:
O plano
Repetir
Para cada n´umero no intervalo de 1 a 9, Iniciar mapa com c´elulas dispon´ıveis
Marcar no mapa as c´elulas j´a ocupadas como indispon´ıveis Se n˜ao houver mais c´elulas dispon´ıveis,
Encerrar processo Sen˜ao
Marcar no mapa as c´elulas que perten¸cam a submatrizes que [j´a tenham o n´umero candidato como indispon´ıveis Marcar no mapa as c´elulas que perten¸cam a uma linha que j´a
[tenha o n´umero candidato como indispon´ıveis
Marcar no mapa as c´elulas que perten¸cam a uma coluna que j´a [tenha o n´umero candidato como indispon´ıveis
Para cada linha que tenha somente uma c´elula dispon´ıvel, Preencher a c´elula da matriz com o n´umero candidato Marcar a c´elula preenchida como indispon´ıvel
Para cada coluna que tenha somente uma c´elula dispon´ıvel, Preencher a c´elula da matriz com o n´umero candidato Marcar a c´elula preenchida como indispon´ıvel
Para examinar a aplica¸c˜ao do plano, considere o seguinte mapa de n´umeros:
7 9 1 3 8 3 4 2 7 1 6 2 5 6 8 2 3 2 4 6 9 2 1 7 5 7 8 7 3 2 6 2 7 6 4 9
passo ´e tornar indispon´ıvel cada c´elula do mapa de disponibilidade que corresponda a uma c´elula j´a ocupada por um n´umero na matriz do jogo. Para efeito de visualiza¸c˜ao do plano, as c´elulas dispon´ıveis ser˜ao deixadas em branco. As c´elulas indispon´ıveis ser˜ao marcadas com o caractere ‘X’.
7 9 1 3 8 3 4 2 7 1 6 2 5 6 8 2 3 2 4 6 9 2 1 7 5 7 8 7 3 2 6 2 7 6 4 9 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
Neste ponto, deve-se avaliar se h´a c´elulas dispon´ıveis no mapa. Se n˜ao houver, ´e porque o jogo terminou e todas as c´elulas na matriz de n´umeros j´a est˜ao preenchidas. Caso contr´ario, o processo continua.
Como h´a c´elulas dispon´ıveis neste exemplo, ent˜ao o quarto passo ser´a marcar como indispon´ıveis as c´elulas contidas em cada submatriz que contenha o n´umero candidato. Neste passo-a-passo, o primeiro n´umero avaliado ´e o 1, primeiro n´umero do intervalo de 1 a 9. As duas submatrizes superiores (central e da direita) e a submatriz central ser˜ao afetadas pela a¸c˜ao.
7 9 1 3 8 3 4 2 7 1 6 2 5 6 8 2 3 2 4 6 9 2 1 7 5 7 8 7 3 2 6 2 7 6 4 9 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
No quinto e sexto passos, buscam-se as linhas e colunas da matriz de n´umeros que contenham o n´umero avaliado. As linhas e colunas correspondentes no mapa de disponibilidade dever˜ao ter suas c´elulas dispon´ıveis alteradas para indispon´ıveis. Desta forma, a quarta, sexta e oitava colunas ficar˜ao totalmente indispon´ıveis. A primeira, segunda e sexta linhas, idem.
7 9 1 3 8 3 4 2 7 1 6 2 5 6 8 2 3 2 4 6 9 2 1 7 5 7 8 7 3 2 6 2 7 6 4 9 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
Agora, deve-se avaliar cada linha e cada coluna em busca de linhas e colunas onde no mapa haja somente uma c´elula dispon´ıvel. Uma vez identificadas, o n´umero candidato dever´a ser inscrito no corres-pondente destas c´elulas no mapa de n´umeros e o processo recome¸ca com o pr´oximo n´umero candidato.
Para este exemplo, somente a quinta c´elula da s´etima coluna do mapa de disponibilidade se encaixa na condi¸c˜ao acima. Logo, a quinta c´elula da s´etima coluna da matriz de n´umeros dever´a ser preenchida como o n´umero 1.
A terceira linha tem duas c´elulas dispon´ıveis, n˜ao ´e conclusivo. A quarta linha tamb´em tem duas c´elulas dispon´ıveis, n˜ao conclusivo. A quinta linha tem cinco c´elulas dispon´ıveis, a s´etima tem quatro, a oitava e a ´ultima tem trˆes respectivamente, todas inconclusivas.
Olhando para as colunas, a primeira tem cinco c´elulas dispon´ıveis, n˜ao conclusivo. A segunda tem quatro, a terceira tem trˆes, a quinta tem duas c´elulas dispon´ıveis e a ´ultima coluna tem quatro. Todas inconclusivas.
A matriz de n´umeros a seguir ´e o resultado da execu¸c˜ao inicial do plano. O n´umero 1 inserido est´a destacado em vermelho. 7 9 1 3 8 3 4 2 7 1 6 2 5 6 8 2 3 2 4 1 6 9 2 1 7 5 7 8 7 3 2 6 2 7 6 4 9
Para o n´umero 2, o segundo candidato, a sequˆencia de mapas de disponibilidade ser´a a seguinte: o mapa da esquerda ´e o mapa dos n´umeros j´a presentes; o central ´e o mapa com as submatrizes marcadas pela presen¸ca do n´umero 2; e o da direita ´e o mapa com as linhas e colunas marcadas pa presenta¸ca tamb´em do n´umero 2. X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 9 1 3 8 3 4 2 7 1 6 2 5 6 8 2 3 2 4 1 6 9 2 1 7 5 7 2 8 7 3 2 6 2 7 6 4 9
Pelo ´ultimo mapa de disponibilidade, somente a primeira c´elula da primeira linha e a ´ultima c´elula da s´etima linha se enquadram na condi¸c˜ao de ´unicas c´elulas dispon´ıveis nas linhas ou colunas. Logo, o n´umero 2 s´o poderia ser inscrito nestas c´elulas no mapa de n´umeros.
O passo seguinte ´e reiniciar o processo para o n´umero 3 com a constru¸c˜ao do mapa de disponibilidade (mapa da esquerda). Depois, o mapa ´e atualizado em fun¸c˜ao da regra 2 (mapa da direita).
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
Enfim, as linhas e colunas s˜ao atualizadas pelas regras 3 e 4 (mapa da esquerda). O resultado ´e a matriz de n´umeros (matriz da direita).
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 9 1 3 8 3 4 2 7 1 6 3 2 5 6 8 2 3 2 4 1 6 9 2 1 3 7 5 7 3 2 8 7 3 2 6 3 2 7 6 4 9
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
e para as regras 3 e 4 (esquerda). A matriz de n´umeros ´e exibida a direita com a inser¸c˜ao do n´umero 4.
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 9 1 3 8 4 3 4 2 7 1 6 3 2 5 6 8 2 3 2 4 1 6 9 2 1 3 4 7 5 4 7 3 2 8 7 3 2 6 3 2 7 6 4 9 O processamento do n´umero 5: X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 9 1 3 8 4 3 4 2 7 1 6 3 2 5 6 8 2 3 2 4 1 6 9 2 1 3 4 7 5 4 7 3 2 8 7 3 2 6 3 2 7 6 4 9
Para este caso, nenhuma das c´elulas dispon´ıveis se enquadrou no teste de isolamento. Logo, o n´umero 5 n˜ao altera a situa¸c˜ao e testa-se o pr´oximo candidato, o 6.
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 9 6 1 3 8 4 3 4 2 7 1 6 6 3 2 5 6 8 2 3 2 4 1 6 6 9 2 1 3 4 7 6 5 4 7 3 2 8 7 3 2 6 3 2 7 6 4 9 Para o n´umero 7:
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 9 6 1 3 8 4 3 4 2 7 1 6 6 3 2 7 5 7 6 8 2 3 7 2 4 1 6 6 9 2 1 3 4 7 6 5 4 7 3 2 8 7 3 2 6 3 2 7 6 4 9 Para o n´umero 8: X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 9 6 1 3 8 4 8 3 4 2 7 1 6 6 3 2 7 5 7 6 8 2 3 7 8 2 4 1 6 6 9 2 1 8 3 4 7 6 5 8 4 7 3 2 8 7 3 2 6 3 2 7 6 4 9 8
E, finalmente, para o n´umero 9: X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 9 6 1 3 8 4 8 3 4 2 7 9 1 6 6 3 2 7 5 9 7 6 8 2 3 7 8 2 4 1 6 6 9 2 1 8 3 4 7 6 5 8 4 7 3 2 9 8 7 3 2 6 3 2 7 6 4 9 8
Pelo plano, a lista de n´umeros candidatos deve ser percorrida novamente j´a que, ao se cumprir a primeira etapa, o mapa de disponibilidades n˜ao ficar´a totalmente preenchida. Ser´a deixado como exerc´ıcio montar o novo conjunto de mapas de disponibilidade para cada candidato at´e que a matriz de n´umeros tenha sido resolvida.
Quanto a reavalia¸c˜ao do plano, pode-se dizer que o plano como est´a j´a ´e uma solu¸c˜ao para o problema, pois resolve o jogo, determinando sistematicamente onde os candidatos dever˜ao ser preenchidos.
No entanto, pode ser melhorado. Nas etapas de an´alise das submatrizes, linhas e colunas, o objetivo ´e destacar quais c´elulas est˜ao isoladamente dispon´ıveis nas linhas e colunas. Pode ser que, ao se inserir o n´umero candidato, c´elulas que foram deixadas como dispon´ıveis se tornem indispon´ıveis pela aplica¸c˜ao da regra 2. Isto implica na elimina¸c˜ao de c´elulas dispon´ıveis dentro das submatrizes que receberam o n´umero candidato e um poss´ıvel isolamento de c´elulas dispon´ıveis em linhas e colunas que antes n˜ao era vis´ıvel.
O aperfei¸coamento no plano poderia ser, ent˜ao, a repeti¸c˜ao dos procedimentos a partir da segunda etapa para o mesmo candidato at´e que mais nenhuma c´elula dispon´ıvel ficasse isolada em uma linha ou coluna.
O plano
Repetir
Para cada n´umero no intervalo de 1 a 9, Iniciar mapa com c´elulas dispon´ıveis
Marcar no mapa as c´elulas j´a ocupadas como indispon´ıveis Se n˜ao houver mais c´elulas dispon´ıveis,
Encerrar processo Sen˜ao
Marcar no mapa as c´elulas que perten¸cam a submatrizes que [j´a tenham o n´umero candidato como indispon´ıveis Marcar no mapa as c´elulas que perten¸cam a uma linha que j´a
[tenha o n´umero candidato como indispon´ıveis
Marcar no mapa as c´elulas que perten¸cam a uma coluna que j´a [tenha o n´umero candidato como indispon´ıveis
Para cada linha que tenha somente uma c´elula dispon´ıvel, Preencher a c´elula da matriz com o n´umero candidato Marcar a c´elula preenchida como indispon´ıvel
Para cada coluna que tenha somente uma c´elula dispon´ıvel, Preencher a c´elula da matriz com o n´umero candidato Marcar a c´elula preenchida como indispon´ıvel
M ´odulo
2
Pr´
atica de programa¸c˜
ao
A boa experiˆencia de in´umeros profissionais da ´area de computa¸c˜ao1que foi sendo acumulada ao longo
do tempo ´e chamada de boa pr´atica de programa¸c˜ao. Esta cole¸c˜ao de normas e princ´ıpios passou a ser tratada com o tempo como um t´opico da teoria da ciˆencia da computa¸c˜ao.
Quais s˜ao as regras ou princ´ıpios? Quais s˜ao as boas pr´aticas de programa¸c˜ao?
2.1
Regras da boa programa¸
c˜
ao
Na rotina de programa¸c˜ao, existem duas etapas que consomem tempo: o desenvolvimento dos algo-ritmos2 e a valida¸c˜ao da l´ogica de programa¸c˜ao3 dos c´odigos-fonte de um programa. Portanto, ´e sempre interessante e proveitoso dispor de uma cole¸c˜ao de algoritmos e c´odigos-fonte previamente escritos, tes-tados, analisados e validados. Isto acaba sendo um processo quase natural que ocorre em fun¸c˜ao da acumula¸c˜ao de experiˆencia e a maturidade profissional com o passar do tempo.
Uma biblioteca de algoritmos e c´odigos, ou seja, de solu¸c˜oes, ´e sempre incrementada pela adi¸c˜ao de novas solu¸c˜oes para os mesmos ou novos problemas. As novas solu¸c˜oes, na maioria das vezes, s˜ao constru´ıdas tomando como base solu¸c˜oes pr´e-existentes, pr´atica esta reconhecida como sendo valiosa. O processo consiste em reusar, aproveitando, sempre que poss´ıvel, parte do que j´a est´a escrito e, portanto, j´a validado na constru¸c˜ao de uma nova solu¸c˜ao. Por este motivo o acervo de uma biblioteca tendem a formar uma base s´olida que poder´a ser utilizada para a solu¸c˜ao de novos problemas com um grau de confian¸ca cada vez mais elevado.
Sempre que uma solu¸c˜ao ou parte de uma solu¸c˜ao ´e reconhecida como valiosa, ela tende a ser usada e reusada ou adaptada na constru¸c˜ao de uma nova solu¸c˜ao. Um evento comum neste processo de rea-proveitamento ´e a necessidade de se fazer pequenas, ou at´e mesmo grandes modifica¸c˜oes, nas solu¸c˜oes j´a existes de forma a melhor´a-las ou adequ´a-las para lidar com as novas situa¸c˜oes e que n˜ao eram previstas nas antigas.
A partir deste fato, pode-se ver que, para n˜ao se perder o controle do processo de desenvolvimento como um todo, ´e essencial que se aplique o que hoje ´e entendido e chamado de boa pr´atica de programa¸c˜ao. No fundo, isto continua sendo aplica¸c˜ao da heur´ıstica.
De forma compacta, destaca-se as principais regras:
Clareza
Toda solu¸c˜ao deve ser bastante clara quanto aos seus objetivos e sua inten¸c˜ao, caso contr´ario ser´a dif´ıcil saber se ela est´a resolvendo o problema de forma correta ou n˜ao. Clareza est´a intimamente ligada `a corre¸c˜ao.
1N˜ao somente os cientista da computa¸c˜ao, mas todos que utilizam a computa¸c˜ao como meio ou fim de suas atividades.
Nisto incluem-se, principalmente, os profissionais de exatas e engenharias.
2Aplica¸c˜ao da l´ogica na programa¸c˜ao, isto ´e, a aplica¸c˜ao da heur´ıstica e a elabora¸c˜ao da l´ogica de programa¸c˜ao. 3Corre¸c˜ao ou depura¸c˜ao, verifica¸c˜ao e manuten¸c˜ao.
Legibilidade
Todo algoritmo elaborado como solu¸c˜ao de um problema deve ser leg´ıvel. Por isso ´e fundamental utilizar uma diagrama¸c˜ao que facilite sua leitura.
Documenta¸c˜ao interna
Todo algoritmo tem que ser documentado. A documenta¸c˜ao interna ´e important´ıssima e n˜ao opcional. O uso de um cabe¸calho ´e fundamental, al´em, claro, da identifica¸c˜ao funcional dos blocos de declara¸c˜oes utilizadas na l´ogica. O cabe¸calho deve conter:
• a descri¸c˜ao geral do plano; • a finalidade da solu¸c˜ao elaborada;
• copyright e outras informa¸c˜oes relevantes;
• deve sempre fazer uso de nomes que sejam os mais autoexplicativos poss´ıveis; • usar sempre coment´arios curtos para as mais diversas finalidades.
Modularidade
Um algoritmo deve, sempre que poss´ıvel, ser escrito de forma particionada, isto ´e, em planos menores.
Reusabilidade
Reusabilidade diz respeito a dois conceitos importantes:
• Generalidade: capacidade de se construir algoritmos que possam ser usados e reutilizados para fins similares;
• Flexibilidade: capacidade de lidar com diferentes tipos de informa¸c˜ao e diferentes tipos de procedimentos.
Manutenibilidade
Os algoritmos devem ser escritos de forma a facilitar a sua adequa¸c˜ao `as necessidades futuras.
Documenta¸c˜ao em tempo de execu¸c˜ao
Todo programa tem que orientar bem o usu´ario quanto `as escolhas e a forma dos dados que devem ser fornecidos no momento da sua utiliza¸c˜ao. A documenta¸c˜ao em tempo de execu¸c˜ao ´e important´ıssima e tamb´em n˜ao ´e opcional.
Defensibilidade
Todo programa deve ter meios de lidar com entradas e sa´ıdas erradas.
2.2
Documenta¸
c˜
ao externa
A documenta¸c˜ao de um programa ´e parte integrante e essencial dele, exercendo fun¸c˜ao primordial no processo de desenvolvimento e manuten¸c˜ao do programa.
A documenta¸c˜ao de cada unidade de programa deve ser cuidadosamente elaborada e realizada dentro de padr˜ao pr´e-estabelecido. A padroniza¸c˜ao ´e importante porque facilita o entendimento e o intercˆambio de informa¸c˜ao entre os diversos membros de uma equipe (quando se est´a trabalhando em equipe) que est´a desenvolvendo um sistema complexo, al´em de favorecer a compreens˜ao e o uso do programa por terceiros. Aqueles que n˜ao est˜ao trabalhando em equipe, isto ´e, est˜ao desenvolvendo e codificando o programa de forma independente ou isolada, tamb´em necessitam documentar os programas. Por quˆe? Porque ele mesmo, em algum momento, necessitar´a reler e/ou reutilizar os programas ou partes deles. Se n˜ao
documentou adequadamente o programa escrito, ir´a ter o dissabor de n˜ao mais compreendˆe-lo e, portanto n˜ao ter´a dom´ınio sobre o programa. Neste caso acabar´a tendo que utilizar um tempo grande e precioso para (re)entender o programa ou ent˜ao escrever um programa novo por incapacidade de reaproveitar o trabalho j´a feito. Desperd´ıcio de tempo (e dinheiro), n˜ao?
As regras e recomenda¸c˜oes que ser˜ao apresentadas sobre a documenta¸c˜ao de programas devem ser seguidas, mas n˜ao devem ser encaradas como regras absolutas. E poss´ıvel se adotar algumas regras´ diferentes, ou melhor, regras que implementem os mesmos conceitos e as mesmas boas pr´aticas de pro-grama¸c˜ao de uma forma que se ajuste melhor `as necessidades atuais do que as que est˜ao sendo indicadas aqui. Utilizar estas ou outras regras ´e quest˜ao de bom senso. Entretanto, uma vez adotado um conjunto de regras, estas dever˜ao ser seguidas at´e o fim.
A documenta¸c˜ao de um programa pode ser dividida em trˆes partes ou tipos: documenta¸c˜ao interna, documenta¸c˜ao em tempo de execu¸c˜ao e documenta¸c˜ao externa.
A documenta¸c˜ao externa diz respeito `a toda informa¸c˜ao complementar `a l´ogica desenvolvida como solu¸c˜ao de um problema analisado. Resgatando a proposta da heur´ıstica, de an´alise e s´ıntese, a do-cumenta¸c˜ao externa deve conter o plano elaborado em forma narrativa, produto da compreens˜ao do problema e da estrat´egia de solu¸c˜ao revisados. O plano estruturado em itens dar´a espa¸co ao algoritmo, escrito na forma de pseudoc´odigo, seguindo um gloss´ario e regras de sintaxe e semˆantica pr´oprios.
Vale destacar que as informa¸c˜oes complementares se referem `a autoria da solu¸c˜ao, datas, vers˜oes, prop´ositos, restri¸c˜oes, observa¸c˜oes e m´etodos. O item principal ´e o algoritmo. Outros itens podem ser inseridos.
Em linhas gerais, a documenta¸c˜ao externa possui os seguintes itens:
Modelo de documenta¸c˜ao externa
T´ıtulo: Data: Autor: Prop´osito:
Entradas e Sa´ıdas: Entradas: Sa´ıdas: M´etodo:
Observa¸c˜oes, Requisitos e Restri¸c˜oes: Algoritmo/Fim algoritmo
Exemplo Suponhamos que se deseje desenvolver um algoritmo que calcule as ra´ızes de uma equa¸c˜ao do segundo grau. A documenta¸c˜ao externa desse algoritmo seria (a menos da apresenta¸c˜ao do algoritmo propriamente dito):
Documenta¸c˜ao externa
T´ıtulo: Ra´ızes Reais de Polinˆomio de Segundo Grau
Data: 09/04/2013
Prop´osito: Calcular as ra´ızes reais de um polinˆomio de segundo grau caso elas existam.
Entradas e Sa´ıdas:
Entradas: Coeficientes a, b e c do polinˆomio Sa´ıdas: Ra´ızes reais x1 e x2
M´etodo: Aplicar o m´etodo de B´ascara para determina¸c˜ao das ra´ızes reais. Primeiro se calcula o valor do parˆametro ∆ (∆ = b2−4ac) e depois
se avalia o resultado. Se ∆ for maior que zero, ent˜ao o polinˆomio tem duas ra´ızes. Se ∆ for igual a zero, o polinˆomio tem raiz dupla. Se ∆ for negativo, o polinˆomio n˜ao tem raiz real. As ra´ızes reais s˜ao calculadas usando a express˜ao x = (−b ±√∆)/(2a).
Observa¸c˜oes, Requisitos e Restri¸c˜oes:
O m´etodo s´o funciona para polinˆomios com ra´ızes reais. No caso de polinˆomios com ra´ızes complexas, o m´etodo pode prever uma sa´ıda informando ao usu´ario que o polinˆomio n˜ao tem ra´ızes reais. Algoritmo
. . .
M ´odulo
3
Pseudoc´
odigo
3.1
Sudoku
Na primeira abordagem (se¸c˜ao 1.2), a an´alise do problema do jogo conduziu para uma estrat´egia (plano) que seguia a seguinte metodologia na essˆencia:
1. para cada n´umero candidato, um mapa de disponibilidade seria criado;
2. no mapa espec´ıfico para um determinado candidato, seriam marcadas as c´elulas correspondentes `as previamente preenchidas da matriz de valores;
3. as regras seriam aplicadas para as submatrizes, linhas e colunas, marcando c´elulas como indis-pon´ıveis;
4. as linhas e colunas seriam avaliadas na busca por c´elulas dispon´ıveis “solit´arias”; 5. para cada c´elula identificada nesta condi¸c˜ao, o valor candidato seria inserido no lugar.
O plano
Repetir
Para cada n´umero no intervalo de 1 a 9, Iniciar mapa com c´elulas dispon´ıveis
Marcar no mapa as c´elulas j´a ocupadas como indispon´ıveis Se n˜ao houver mais c´elulas dispon´ıveis,
Encerrar processo Sen˜ao
Repetir at´e que n˜ao haja c´elulas dispon´ıveis isoladas,
Marcar no mapa as c´elulas que perten¸cam a submatrizes que [j´a tenham o n´umero candidato como indispon´ıveis Marcar no mapa as c´elulas que perten¸cam a uma linha que j´a
[tenha o n´umero candidato como indispon´ıveis
Marcar no mapa as c´elulas que perten¸cam a uma coluna que j´a [tenha o n´umero candidato como indispon´ıveis
Para cada linha que tenha somente uma c´elula dispon´ıvel, Preencher a c´elula da matriz com o n´umero candidato Marcar a c´elula preenchida como indispon´ıvel
Para cada coluna que tenha somente uma c´elula dispon´ıvel, Preencher a c´elula da matriz com o n´umero candidato Marcar a c´elula preenchida como indispon´ıvel
O plano se insere muito bem na proposta da heur´ıstica, pois organiza a l´ogica a ser utilizada na solu¸c˜ao do problema. Entretanto, algumas a¸c˜oes compreendidas no plano podem revelar a necessidade de se expandir em outras a¸c˜oes. Por exemplo, para saber se ainda h´a c´elulas dispon´ıveis, faz-se necess´ario identific´a-las e cont´a-las. Outro exemplo, marcar no mapa as c´elulas que perten¸cam a submatrizes que contenham o valor candidato corresponde a v´arias a¸c˜oes, como compara¸c˜oes e atribui¸c˜oes. Logo, ´e
importante olhar o plano, separar as atividades e desdobr´a-las nas a¸c˜oes prim´arias necess´arias para que a atividade seja realizada.
Assim, ser˜ao apresentadas as atividades e os correspondentes comandos j´a na forma de pseudoc´odigo. Isso facilitar´a o processo de escrita do algoritmo.
3.1.1
Contar c´
elulas dispon´ıveis
A matriz do jogo ´e uma matriz num´erica 9 × 9 chamada mat. O total de c´elulas dispon´ıveis ser´a armazenado em uma vari´avel num´erica chamada disponiveis. O processo, em si, ´e idˆentico ao processo de somat´orio. A vari´avel disponiveis ser´a inicializada com 0 e os 81 elementos da matriz ser˜ao avaliados. Toda vez que o elemento avaliado corresponder a 0, a vari´avel disponiveis ser´a incrementada. Ao final do processo, a vari´avel disponiveis conter´a o total de c´elulas dispon´ıveis.
Para indexar os elementos da matriz, ser˜ao usadas duas vari´aveis contadoras, i, j. Pseudoc´odigo
1. disponiveis ← 0
2. para i de 1 at´e 9, fazer
3. | para j de 1 at´e 9, fazer
4. | | se (mat[i, j] = 0), ent˜ao
5. | | | disponiveis ← disponiveis + 1
6. | | fim se
7. | fim para
8. fim para Fim pseudoc´odigo
3.1.2
Processar submatrizes
Pela regra 2 do Sudoku, uma submatriz (3 × 3 elementos) que contenha o valor candidato deve ter suas c´elulas dispon´ıveis marcadas como indispon´ıveis. Novamente, a matriz do jogo deve ser analisada, s´o que desta vez a varredura deve seguir os elementos dentro de cada submatriz. O primeiro elemento (elemento superior esquerdo) de cada submatriz ´e identificado pelos seguintes ´ındices: (k − 1) ∗ 3 + i com k e i variando de 1 a 3 e (l − 1) ∗ 3 + j com l e j variando de 1 a 3. Os valores de k e l indexam as submatrizes e os valores de i e j servem para percorrer a submatriz. Ent˜ao s˜ao necess´arias mais duas vari´aveis: k e l.
O m´etodo ´e simples: varre-se a submatriz a procura do valor candidato; encontrando-o, percorre-se novamente a submatriz, buscando as c´elulas dispon´ıveis e marcando-as como indispon´ıveis. A marca¸c˜ao pode ser um valor fora da faixa utilizada at´e agora, isto ´e, um valor negativo ou maior que 9. Neste momento, a escolha ser´a pelo valor −1.
Durante a primeira varredura, usar-se-´a uma vari´avel l´ogica chamada marcar cujo valor inicial ser´a FALSO. Se o valor candidato estiver presente na submatriz, esta vari´avel receber´a o valor constante l´ogico VERDADEIRO e indicar´a que as c´elulas dispon´ıveis na submatriz dever˜ao ser marcadas.
Pseudoc´odigo
1. para k de 0 at´e 2, fazer
2. | para l de 0 at´e 2, fazer
3. | | marcar ←FALSO
4. | | para i de 1 at´e 3, fazer
5. | | | para j de 1 at´e 3, fazer
6. | | | | se (mat[k ∗ 3 + i, l ∗ 3 + j] = n), ent˜ao
7. | | | | | marcar ←VERDADEIRO
8. | | | | fim se
9. | | | fim para
10. | | fim para
11. | | se (marcar =VERDADEIRO), ent˜ao
12. | | | para i de 1 at´e 3, fazer
13. | | | | para j de 1 at´e 3, fazer
14. | | | | | se (mat[k ∗ 3 + i, l ∗ 3 + j] = 0), ent˜ao
16. | | | | | fim se 17. | | | | fim para 18. | | | fim para 19. | | fim se 20. | fim para 21. fim para Fim pseudoc´odigo
3.1.3
Processar linhas e colunas
Pseudoc´odigo
1. para i de 1 at´e 9, fazer
2. | marcar ←FALSO
3. | para j de 1 at´e 9, fazer
4. | | se (mat[i, j] = n), ent˜ao
5. | | | marcar ←VERDADEIRO
6. | | fim se
7. | fim para
8. | se (marcar =VERDADEIRO), ent˜ao
9. | | para j de 1 at´e 9, fazer
10. | | | se (mat[i, j] = 0), ent˜ao 11. | | | | mat[i, j] ← −1 12. | | | fim se 13. | | fim para 14. | fim se 15. fim para
16. para j de 1 at´e 9, fazer
17. | marcar ←FALSO
18. | para i de 1 at´e 9, fazer
19. | | se (mat[i, j] = n), ent˜ao
20. | | | marcar ←VERDADEIRO
21. | | fim se
22. | fim para
23. | se (marcar =VERDADEIRO), ent˜ao
24. | | para i de 1 at´e 9, fazer
25. | | | se (mat[i, j] = 0), ent˜ao 26. | | | | mat[i, j] ← −1 27. | | | fim se 28. | | fim para 29. | fim se 30. fim para Fim pseudoc´odigo
3.1.4
Contar c´
elulas dispon´ıveis nas linhas e colunas
Pseudoc´odigo
1. para i de 1 at´e 9, fazer
2. | linha[i, 1] ← 0
3. | coluna[i, 1] ← 0
4. | para j de 1 at´e 9, fazer
5. | | se (mat[i, j] = 0), ent˜ao 6. | | | linha[i, 1] ← linha[i, 1] + 1 7. | | | linha[i, 2] ← j 8. | | fim se 9. | | se (mat[j, i] = 0), ent˜ao 10. | | | coluna[i, 1] ← coluna[i, 1] + 1
11. | | | coluna[i, 2] ← j
12. | | fim se
13. | fim para
14. fim para Fim pseudoc´odigo
3.1.5
Inserir valor candidato na matriz do jogo
Pseudoc´odigo
1. ref azer ←FALSO
2. para i de 1 at´e 9, fazer
3. | se (linha[i, 1] = 1), ent˜ao
4. | | mat(i, linha[i, 2]) ← n
5. | | ref azer ←VERDADEIRO
6. | fim se
7. | se (coluna[i, 1] = 1), ent˜ao
8. | | mat(coluna[i, 2], i) ← n
9. | | ref azer ←VERDADEIRO
10. | fim se
11. fim para Fim pseudoc´odigo
3.1.6
Desmarcar c´
elulas
Pseudoc´odigo
1. para i de 1 at´e 9, fazer
2. | para j de 1 at´e 9, fazer
3. | | se (mat[i, j] = −1), ent˜ao
4. | | | mat[i, j] ← 0
5. | | fim se
6. | fim para
7. fim para Fim pseudoc´odigo
3.1.7
Documenta¸
c˜
ao externa
Documentac¸˜ao T´ıtulo
Solu¸c˜ao para o problema de l´ogica sudoku. Prop´osito
Resolver o problema de l´ogica sudoku atrav´es de mapas auxiliares. M´etodo ... Entradas ... Sa´ıdas ...
Observac¸ ˜oes, Restric¸ ˜oes, Requisitos ...
Algoritmo Soluc¸˜ao Sudoku declarar mat(9, 9) num´erico
declarar linha(9, 2), coluna(9, 2) num´ericos declarar i, j, k, l num´ericos
declarar n num´erico
declarar disponiveis num´erico declarar marcar, ref azer l´ogicos
{=== inicializar a matriz ===}
1. para i de 1 at´e 9, fazer
2. | para j de 1 at´e 9, fazer
3. | | mat[i, j] ← 0
4. | fim para
5. fim para
{=== atribuir valores `as c´elulas ===}
6. mat(1, 1) ← 1
{=== repetir processo at´e n˜ao ter mais c´elulas dispon´ıveis ===}
7. fazer
{=== para cada candidato n ===}
8. | para n de 1 at´e 9, fazer
{=== contar c´elulas dispon´ıveis ===}
9. | | disponiveis ← 0
10. | | para i de 1 at´e 9, fazer
11. | | | para j de 1 at´e 9, fazer
12. | | | | se (mat[i, j] = 0), ent˜ao 13. | | | | | disponiveis ← disponiveis + 1 14. | | | | fim se 15. | | | fim para 16. | | fim para {=== se h´a c´elulas dispon´ıveis ===} 17. | | se (disponiveis 6= 0), ent˜ao 18. | | | fazer
{=== processar cada submatriz ===}
19. | | | | para k de 0 at´e 2, fazer
20. | | | | | para l de 0 at´e 2, fazer
21. | | | | | | marcar ←FALSO
22. | | | | | | para i de 1 at´e 3, fazer
23. | | | | | | | para j de 1 at´e 3, fazer
24. | | | | | | | | se (mat[k ∗ 3 + i, l ∗ 3 + j] = n), ent˜ao
25. | | | | | | | | | marcar ←VERDADEIRO
26. | | | | | | | | fim se
27. | | | | | | | fim para
28. | | | | | | fim para
29. | | | | | | se (marcar =VERDADEIRO), ent˜ao
30. | | | | | | | para i de 1 at´e 3, fazer
31. | | | | | | | | para j de 1 at´e 3, fazer
32. | | | | | | | | | se (mat[k ∗ 3 + i, l ∗ 3 + j] = 0), ent˜ao
33. | | | | | | | | | | mat[k ∗ 3 + i, l ∗ 3 + j] ← −1
34. | | | | | | | | | fim se
36. | | | | | | | fim para
37. | | | | | | fim se
38. | | | | | fim para
39. | | | | fim para
{=== processar cada linha ===}
40. | | | | para i de 1 at´e 9, fazer
41. | | | | | marcar ←FALSO
42. | | | | | para j de 1 at´e 9, fazer
43. | | | | | | se (mat[i, j] = n), ent˜ao
44. | | | | | | | marcar ←VERDADEIRO
45. | | | | | | fim se
46. | | | | | fim para
47. | | | | | se (marcar =VERDADEIRO), ent˜ao
48. | | | | | | para j de 1 at´e 9, fazer
49. | | | | | | | se (mat[i, j] = 0), ent˜ao 50. | | | | | | | | mat[i, j] ← −1 51. | | | | | | | fim se 52. | | | | | | fim para 53. | | | | | fim se 54. | | | | fim para
{=== processar cada coluna ===}
55. | | | | para j de 1 at´e 9, fazer
56. | | | | | marcar ←FALSO
57. | | | | | para i de 1 at´e 9, fazer
58. | | | | | | se (mat[i, j] = n), ent˜ao
59. | | | | | | | marcar ←VERDADEIRO
60. | | | | | | fim se
61. | | | | | fim para
62. | | | | | se (marcar =VERDADEIRO), ent˜ao
63. | | | | | | para i de 1 at´e 9, fazer
64. | | | | | | | se (mat[i, j] = 0), ent˜ao 65. | | | | | | | | mat[i, j] ← −1 66. | | | | | | | fim se 67. | | | | | | fim para 68. | | | | | fim se 69. | | | | fim para
{=== identificar linhas e colunas com somente uma c´elula dispon´ıvel ===}
70. | | | | para i de 1 at´e 9, fazer
71. | | | | | linha[i, 1] ← 0
72. | | | | | coluna[i, 1] ← 0
73. | | | | | para j de 1 at´e 9, fazer
74. | | | | | | se (mat[i, j] = 0), ent˜ao 75. | | | | | | | linha[i, 1] ← linha[i, 1] + 1 76. | | | | | | | linha[i, 2] ← j 77. | | | | | | fim se 78. | | | | | | se (mat[j, i] = 0), ent˜ao 79. | | | | | | | coluna[i, 1] ← coluna[i, 1] + 1 80. | | | | | | | coluna[i, 2] ← j 81. | | | | | | fim se 82. | | | | | fim para 83. | | | | fim para {=== inserir candidato ===}
84. | | | | ref azer ←FALSO
85. | | | | para i de 1 at´e 9, fazer
86. | | | | | se (linha[i, 1] = 1), ent˜ao
87. | | | | | | mat(i, linha[i, 2]) ← n
88. | | | | | | ref azer ←VERDADEIRO
90. | | | | | se (coluna[i, 1] = 1), ent˜ao
91. | | | | | | mat(coluna[i, 2], i) ← n
92. | | | | | | ref azer ←VERDADEIRO
93. | | | | | fim se
94. | | | | fim para
95. | | | enquanto (ref azer =VERDADEIRO) {=== desmarcar c´elulas indispon´ıveis ===}
96. | | | para i de 1 at´e 9, fazer
97. | | | | para j de 1 at´e 9, fazer
98. | | | | | se (mat[i, j] = −1), ent˜ao 99. | | | | | | mat[i, j] ← 0 100. | | | | | fim se 101. | | | | fim para 102. | | | fim para 103. | | sen˜ao {=== se n˜ao h´a c´elulas dispon´ıveis ===} 104. | | | parar 105. | | fim se 106. | fim para 107. enquanto (disponiveis 6= 0) Fim algoritmo