Especificação do trabalho T2 Conforme o plano de ensino, ao trabalho T2 será atribuída nota de acordo com as seguintes diretrizes e os critérios de avaliação abaixo: 1. Entrega de relatório O relatório do trabalho T2 deverá ser impresso e assinado pelos membros da equipe (no máximo 2 alunos) e entregue ao professor em aula expositiva ou de laboratório. Somente será atribuída nota aos alunos que assinarem o trabalho impresso. (Não serão aceitos trabalhos colocados em caixa de correspondência ou entregues fora do horário de aula). O último dia de entrega será 26/10/2007. Ao aluno que não entregar (ou não assinar) seu trabalho até essa data será atribuída nota zero. Os critérios de avaliação do relatório são os seguintes, onde o valor de cada item avaliado está entre parênteses: Forma (1,0): precisão técnica do texto, qualidade do documento impresso, separação em seções, uso correto de referências bibliográficas, de acordo com as melhores práticas de metolodogia científica, aderência às especificações do trabalho. Algoritmo em pseudo-código (1,0): o algoritmo deve ser escrito em pseudo-código procedural (sem orientação a objetos) e o mais independente possível de linguagem de programação. Para um exemplo de como escrever em pseudo-código, veja exemplos de algoritmos descritos em [1]. Será verificada a precisão formal da especificação do algoritmo. Cada linha do algoritmo deve ser numerada. Em seguida, deve constar uma descrição o algoritmo em linguagem natural, usando o número das linhas para explicar ao leitor como o algoritmo funciona através de uma visita guiada a cada linha do algoritmo. Código assembly (1,0): código em linguagem de montagem do MIPS R2000, podendo conter pseudo-instruções implementadas pelo SPIM. Cada linha do código assembly deve ser numerada e comentada. Mapeamento entre linhas do pseudo-código e linhas do código assembly (1,0): incluir uma tabela onde cada linha seja composta por um par (Lcódigo, Lalgoritmo), mostrando a correspondência entre cada linha do assembly e a respetiva linha do algoritmo. Conclusões (1,0): descreva os procedimentos experimentais (procedimentos de teste) adotados para verificar o correto funcionamento do código, e comente as otimizações realizadas no código e qual o seu impacto no desempenho e/ou no tamanho do código. 2. Demonstração em laboratório As datas das apresentações serão determinadas mediante sorteio. Apresentação (1,0): será premiada a didática da apresentação dos principais pontos do programa, desde a instrumentação para o procedimento de teste, passando pela execução, até a monitoração dos resultados. Todos os membros da equipe deverão estar preparados para fazer a apresentação. O professor escolherá na ocasião, qual aluno fará a apresentação. Arguição (2,0): serão feitas perguntas sobre o algoritmo e sobre o código, ou para esclarecer dúvidas do relatório. As perguntas serão feitas a quaisquer dos componentes da equipe. Execução correta (2,0): será verificada a correção do funcionamento, usando o procedimento de teste fornecido pelos autores, bem como outros procedimentos de teste solicitados pelo professor.
3. Estrutura e formato do relatório O relatório deve conter as seguintes seções: Capa (Título, identificação da disciplina, identificação da equipe) 1. Descrição do algoritmo (pseudo-código e sua descrição em linguagem natural) 2. Descrição do código em linguagem de montagem (código assembly e tabela de mapeamento algoritmo-código) 3. Conclusões 3.1 Descrição dos experimentos 3.2 Comentários sobre otimizações 4. Referências bibliográficas O texto deve ser formatado como segue: parágrafos descritivos em fonte Times New Roman 12, elementos do algoritmo e do código em Courier 12 (e.g. add $s1, $s2, $s3). Parágrafos alinhados ( justify ) à direita e à esquerda. O trabalho não deve exceder 6 páginas. 4. Temas Um tema diferente será atribuído a cada equipe. Os temas serão sorteados e o resultado informado por e-mail. Ao final deste documento está a lista de temas e uma especificação inicial em pseudo-código. As especificações aqui disponíveis muitas vezes não estão suficientemente formalizadas e servem apenas de referência para que os alunos reconheçam o algoritmo que implementarão. Favor consultar as referências disponibilizadas e a literatura especializada para melhorar a precisão do pseudo-código. Imagina-se que os alunos refinarão o pseudo-código aqui mostrado como referência, como parte de seu trabalho, em seus relatórios. Dúvidas remanescentes sobre a especificação do trabalho devem ser dirigidas a Alexandre Mendonça (mendonca@inf.ufsc.br), estagiário de docência da disciplina. Não é atribuição do estagiário de docência responder sobre dúvidas conceituais sobre os algoritmos em si ou sobre o código assembly, mas somente sobre a dúvidas quanto à especificação dos temas da lista abaixo. 5. Referência bibliográfica [1] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. (disponível na biblioteca universitária da UFSC).
1 - Ordenação pelo método Quick-Sort O Quicksort adota a estratégia de divisão e conquista. Os passos são: 1. Escolha um elemento da lista, denominado pivô; 2. Rearranje a lista de forma que todos os elementos anteriores ao pivô sejam menores ou iguais a ele, e todos os elementos posteriores ao pivô sejam maiores ou iguais a ele. Ao fim do processo o pivô estará em sua posição final. Essa operação é denominada partição; 3. Recursivamente ordene a sublista dos elementos menores e a sublista dos elementos maiores; A base da recursão são as listas de tamanho zero ou um, que estão sempre ordenadas. O processo é finito pois a cada iteração pelo menos um elemento é posto em sua posição final e não será mais manipulado na iteração seguinte. Pseudo-código do algoritmo: Quicksort(A,p,r) 1. if p<r then q = partition(a,p,r) 2. quicksort(a,p,q) 3. quicksort(a,q+1,r) Partition(A,p,r) 1. x=a[p] 2. i=p-1 3. j=r+1 4. while true 5. do repeat j=j-1 6. until A[j]<=x 7. repeat i=i+1 8. until A[i]>=x 9. if i<j the exchange A[i] <->A[j] 10. else return j [1] Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to Algorithms. MIT Press/McGraw-Hill, 1990. [2] http://pt.wikipedia.org/wiki/quick_sort [3] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts.
2 - Ordenação pelo método de selection sort O Selection Sort utiliza um o conceito de "selecionar o elemento mais apto". Ele seleciona o menor ou maior valor do vetor p.ex. e passa para a primeira (ou última posição dependendo da ordem requerida), depois o segundo menor para a segunda posição e assim sucessivamente com (n-1) elementos restantes até os dois últimos. Pseudo-código do algoritmo: 1. para i=0 até n-1 2. mínimo=i 3. para j=i+1 até N 4. se vetor[j]<vetor[mínimo] 5. mínimo=j 6. auxiliar=vetor[i] 7. vetor[i]=vetor[mínimo] 8. vetor[mínimo]=auxiliar Refêrencias: [1] http://pt.wikipedia.org/wiki/selection_sort [2] http://pt.wikibooks.org/wiki/estrutura_de_dados_i/algoritmos_de_ordenação [3] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts.
3 - Ordenação pelo método de Insertion sort Insertion sort, ou ordenação por inserção, é um simples algoritmo de ordenação, eficiente quando aplicado a um pequeno número de elementos. Em termos gerais, ele percorre um vetor de elementos da esquerda para a direita e à medida que avança vai deixando os elementos mais à esquerda ordenados. O algoritmo de inserção funciona da mesma maneira com que muitas pessoas ordenam cartas em um jogo de baralho como o pôquer. Pseudo-código do algoritmo: 1. insere(array vetor, int tamanho, valor) { 2. int i = tamanho - 1; 3. while (i >= 0 && vetor[i] > valor) { 4. vetor[i + 1] = vetor[i]; 5. i=i-1; 6. } 7. vetor[i + 1] = valor; 8. } 1. insertionsort(array vetor, int tamanho) { 2. for (int i = 1; i < tamanho; i++) 3. insere(vetor, i, vetor[i]); 4. } [1] http://pt.wikipedia.org/wiki/insertion_sort [2] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts.
4 - Ordenação pelo método de Counting sort O algoritmo de counting sort assume que cada um dos n elementos da entrada é um inteiro no intervalo [1,k] para um inteiro k. A idéia básica do algoritmo de counting sort é determinar, para cada elemento da entrada x, o número de elementos menores que x. Esta informação pode ser utilizada para posicionar o elemento x diretamente na sua posição no array de saída. Por exemplo, se existem 17 elementos menores que x, então x pertence a posição 18 no array de saída. Pseudo-Código: No algoritmo em pseudo-código assumimos que a entrada é o array A[] e portando tamanho de A[]=n. Necessitamos de outros 2 arrays o array B[] que contém a saída ordenada e um array temporário C[]. CountingSort(A,B,k) 1. for i=1 to k 2. do C[i]=0 3. for j=1 to lenght[a] 4. do C[A[j]]= C[A[j]]+1 # C agora contem o numero de elementos igual a i 5. for i=2 to k 6. do C[i]=C[i]+c[i-1] 7. #C agora contem o numero de elementos menor ou igual a i 8. for l=lenght[a] down to 1 9. do B[C[A[j]]]= A[j] 10. C[A[j]] = C[A[j]]-1 [1] Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to Algorithms. MIT Press/McGraw-Hill, 1990. [2] http://en.wikipedia.org/wiki/counting_sort [3] http://pt.wikipedia.org/wiki/counting_sort
5 - Ordenação pelo método de HeapSort O heapsort utiliza uma estrutura de dados chamada heap para ordenar os elementos a medida que os insere na estrutura. Assim, ao final das inserções, os elementos podem ser sucessivamente removidos da raiz da heap, na ordem desejada. Para uma ordenação crescente, deve ser construído um heap máximo (o maior elemento fica na raiz). 1. heapsort(int a[], int n){ 2. int i = n/2, pai, filho; 3. int t; 4. while true{ 5. if (i > 0){ 6. i=i-1; 7. t = a[i]; 8. }else{ 9. n=n-1; 10. if (n == 0) return; 11. t = a[n]; 12. a[n] = a[0]; 13. } 14. pai = i; 15. filho = i*2 + 1; 16. while (filho < n){ 17. if ((filho + 1 < n) && (a[filho + 1] > a[filho])) 18. filho=filho+1; 19. if (a[filho] > t){ 20. a[pai] = a[filho]; 21. pai = filho; 22. filho = pai*2 + 1; 23. } 24. else 25. break; 26. } 27. a[pai] = t; 28. } 29.} [1] Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to Algorithms. MIT Press/McGraw-Hill, 1990. [2] http://pt.wikipedia.org/wiki/heapsort [3] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts.
6 - Ordenação pelo método de CockTail Sort O Algoritmo de Cocktail sort é uma pequena variação do bubble sort. A diferença é que ao invés de percorrer a lista do fim para o início, ele passa alternadamente do fim para o início e então do início para o fim Algoritmo em Pseudo-Código: 1. cocktail_sort(list[], list_length){ 2. bottom = 0; 3. top = list_length - 1; 4. swapped = true; 5. while(swapped == true){ 6. swapped = false; 7. for(i = bottom; i < top; i = i + 1){ 8. if(list[i] > list[i + 1]){ 9. swap(list[i], list[i + 1]); 10. swapped = true; 11. } 12. } 13. top = top - 1; 14. for(i = top; i > bottom; i = i - 1){ 15. if(list[i] < list[i - 1]){ 16. swap(list[i], list[i - 1]); 17. swapped = true; 18. } 19. } 20. bottom = bottom + 1; 21. } 22.} [1] http://en.wikipedia.org/wiki/cocktail_sort
7 - Ordenação pelo método de Shell Sort O algoritmo Shell Sort é uma extensão do Insertion Sort com 2 observações: * Insertion Sort é eficiente se a entrada está quase ordenada * Insertion Sort é ineficiente, no caso geral, pois move valores de uma posição por vez O algoritmo de Shell Sort é similar ao de Insertion Sort, porém trabalha utilizando passos mais largos conforme ordena os valores, e vai diminuindo o valor do passo gradualmente ate que este se torne 1. No final, o shell sort faz um insertion sort comum, porém o array de dados é garantidamente quase ordenado. Algoritmo em Pseudo-Código: 1. shellsort(int a[], int l, int r){ 2. int i, j, k, h, v; 3. int incs[16] = { 1391376, 463792, 198768, 86961, 33936, 4. 13776, 4592, 1968, 861, 336, 5. 112, 48, 21, 7, 3, 1 }; 6. for ( k = 0; k < 16; k++) 7. for (h = incs[k], i = l+h; i <= r; i++){ 8. v = a[i]; j = i; 9. while (j >= h && a[j-h] > v){ 10. a[j] = a[j-h]; 11. j -= h; 12. } 13. a[j] = v; 14. } 15. } [1] Sedgewick, R. 1996. Analysis of Shellsort and Related Algorithms. In Proceedings of the Fourth Annual European Symposium on Algorithms (September 25-27, 1996). J. Díaz and M. J. Serna, Eds. Lecture Notes In Computer Science, vol. 1136. Springer-Verlag, London, 1-11. [2] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts. [3] http://www.cs.princeton.edu/~rs/shell/ [4] http://en.wikipedia.org/wiki/shell_sort
8 - Ordenação pelo método de Merge Sort O merge sort, ou ordenação por mistura, é um exemplo de algoritmo de ordenação do tipo dividirpara-conquistar. Sua idéia básica é que é muito fácil criar uma sequência ordenada a partir de duas outras também ordenadas. Para isso, ele divide a sequência original em pares de dados, ordena-as; depois as agrupa em sequências de quatro elementos, e assim por diante, até ter toda a sequência dividida em apenas duas partes. Os três passos úteis dos algoritmos dividir-para-conquistar, ou divide and conquer, que se aplicam ao merge sort são: 1. Dividir: Dividir os dados em subsequências pequenas; 2. Conquistar: Classificar as duas metades recursivamente aplicando o merge sort; 3. Combinar: Juntar as duas metades em um único conjunto já classificado. Algoritmo em Pseudo-Código: 1. function mergesort(m) 2. var list left, right, result 3. if length(m) = 1 4. return m 5. else 6. var middle = length(m) / 2 7. for each x in m up to middle 8. add x to left 9. for each x in m after middle 10. add x to right 11. left = mergesort(left) 12. right = mergesort(right) 13. result = merge(left, right) 14. return result 15. function merge(left,right) 16. var list result 17. while length(left) > 0 and length(right) > 0 18. if first(left) = first(right) 19. append first(left) to result 20. left = rest(left) 21. else 22. append first(right) to result 23. right = rest(right) 24. if length(left) > 0 25. append rest(left) to result 26. if length(right) > 0 27. append rest(right) to result 28. return result [1] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts. [2] http://en.wikipedia.org/wiki/merge_sort [3] http://pt.wikipedia.org/wiki/merge_sort
9 - Ordenação pelo método de Comb Sort É um algoritmo de ordenação simplístico, projetado por Stephen Lacey e Richard Box. É uma melhoria de algoritmos como o bubble sort em velocidade. A idéia básica é eliminar valores pequenos perto do final da lista, nos algoritmos tipo bubble sort estes valores diminuem a performance enormemente. No Bubble Sort, quando dois elementos são comparados, eles sempre tem gap (distância de um para outro) de 1. A idéia básica do comb sort é que o gap pode ser mais de 1. Algoritmo em Pseudo-Código: 1. function combsort11(array input) 2. gap := input.size 3. loop until gap = 1 and swaps = 0 4. if gap > 1 5. gap := gap / 1.3 6. if gap = 10 or gap = 9 7. gap := 11 8. end if 9. end if 10. i := 0 11. swaps := 0 12. loop until i + gap >= array.size 13. if array[i] > array[i+gap] 14. swap(array[i], array[i+gap]) 15. swaps := swaps + 1 16. end if 17. i := i + 1 18. end loop 19. end loop 20. end function [1] http://en.wikipedia.org/wiki/comb_sort
10 - Ordenação pelo método Gnome sort O algoritmo de ordenação conhecido como Gnome Sort foi inventado por Dick Grune, e em suas palavras é o algoritmo de ordenação mais simples. É basicamente um algoritmo de Bubble Sort com uma particularidade: é bi-direcional. Pseudo-código do algoritmo: 1. gnomesort(a[]) { 2. i = 1 3. j = 2 4. while i = size - 1 5. if a[i-1] = a[i] 6. i = j 7. j = j + 1 8. else 9. swap a[i-1] and a[i] 10. i = i - 1 11. if i = 0 12. i = 1 13. } [1] http://www.cs.vu.nl/~dick/gnomesort.html [2] http://en.wikipedia.org/wiki/gnome_sort [3] http://pt.wikipedia.org/wiki/gnome_sort
11 - Ordenação de Strings pelo método Bubble Sort (Ordem alfabética) Utilize o método de ordenação Bubble Sort para ordenar dados do tipo string Assuma que: os strings são todos em letras minúsculas contém valores no intervalo [a-z] tem tamanho fixo de 3 elementos exemplos ('aba','zoi','fui','etc') lembrando que um string com o conteúdo 'abc' do tipo.asciiz contém 4 elementos 'abc0' onde 0(zero) é o elemento que indica o término de um string (null), e cada caracter possui 1 byte para comparar se uma letra é alfabeticamente maior ou menor que a outra utilize a tabela ASCII [3] Algoritmo em Pseudo-Código: #retorna 1 se str1<str2 #retorna 0 se str1=str2 #retorna 2 se str1>str2 1. comparestring(str1,str2){ 2. i=0 3. enquanto i<3 faça 4. se str1[i]<str2[i]{ 5. retorne 1 6. break 7. } 8. senao se str1[i]>str2[i]{ 9. retorne 2 10. break 11. } 12. i=i+1 13. fimenquanto 14. retorne 0 15.} BUBBLESORT (V[], n) 1 houvetroca <- verdade 2 enquanto houvetroca for verdade faça 3 houvetroca <- falso 4 para i de 1 até n-1 faça 5 se CompareString(V[i],V[i+1])=2 6 então troque V[i] e V[i + 1] de lugar e 7 houvetroca <- verdade [1] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts. [2] http://pt.wikipedia.org/wiki/bubble_sort [3] http://pt.wikipedia.org/wiki/tabela_ascii
12 - Pesquisa Binária em um Array Ordenado A pesquisa ou busca binária é um algoritmo de busca em vetores que requer acesso aleatório aos elementos do mesmo. Ela parte do pressuposto de que o vetor está ordenado, e realiza sucessivas divisões do espaço de busca comparando o elemento buscado (chave) com o elemento no meio do vetor. Se o elemento do meio do vetor for a chave, a busca termina com sucesso. Caso contrário, se o elemento do meio vier antes do elemento buscado, então a busca continua na metade posterior do vetor. E finalmente, se o elemento do meio vier depois da chave, a busca continua na metade anterior do vetor. A complexidade desse algoritmo é da ordem de log2 n, onde n é o tamanho do vetor de busca. Como resultado do seu programa, ele deve devolver o índice no array, que o elemento foi encontrado. Pseudo-código do algoritmo: 1. BUSCA-BINÁRIA (V[], inicio, fim, valor} 2. i recebe o índice no meio de inicio e fim 3. se V[i] é igual a valor 4. então devolva o índice i # encontrei valor 5. senão se V[i] vem antes de valor 6. então faça a BUSCA-BINÁRIA(V, i+1, fim, valor) 7. senão faça a BUSCA-BINÁRIA(V, inicio, i-1, valor) [1] http://pt.wikipedia.org/wiki/pesquisa_binária [2] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts.
13 - Criação e operações simples em Listas Ligadas Uma lista ligada é uma estrutura de dados linear e dinâmica. Ela é composta por células que apontam para o próximo elemento da lista. Para "ter" uma lista ligada, basta guardar seu primeiro elemento, e seu último elemento aponta para uma célula nula. O esquema a seguir representa uma lista ligada com 5 elementos: Nodo 1 --> Nodo 2 --> Nodo 3 --> Nodo 4 --> Nodo 5 --> (Nulo) considere a lista contendo elementos do tipo inteiro, como a palavra do MIPS é de 4 bytes, considere a estrutura Nodo como sendo 8 bytes. Um ponteiro para um nodo é NULO ou aponta para outro nodo. Os nodos serão armazenados na pilha na ordem como: o primeiro nodo da lista contém o número mais recentemente inserido,e o último nodo contém o primeiro número inserido. Neste trabalho serão implementados 2 métodos relacionados com listas:? inserenodo: insere um nodo na lista, este nodo contém o valor a ser inserido, e deve ser inserido no início? printlist: imprime a lista no console do SPIM Para facilitar na implementação considere o atributo head, este aponta para o primeiro nodo da lista. Algoritmo em Pseudo-Código: 1. Estrutura Nodo 2. ponteiro para Nodo next 3. int valor 1. Nodo* head; 2. inserenodo(int valor) { 3. Estrutura nodo *temp = malloc(sizeof(struct node)); 4. temp->next = head; 5. temp->value = value; 6. head = temp; 7. } 8. printlist { 9. Estrutura nodo *ptr; 10. ptr = head; 11. while (ptr!=0) { 12. printf(ptr->value); 13. ptr = ptr->next; 14. } 15.} [1] Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to Algorithms. MIT Press/McGraw-Hill, 1990. [2] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts.
14 - Criação e operações simples em Filas As filas são estruturas baseadas no princípio FIFO (first in, first out), em que os elementos que foram inseridos no início são os primeiros a serem removidos. Uma fila possui duas funções básicas: ENQUEUE, que adiciona um elemento ao final da fila, e DEQUEUE, que remove o elemento no início da fila. A operação ENQUEUE sempre pode ser executada, uma vez que teoricamente uma fila não tem limite. A operação DEQUEUE só pode ser aplicado se a fila não estiver vazia, causando um erro de underflow ou fila vazia se esta operação for realizada nesta situação. Considere a fila contendo elementos do tipo inteiro, como a palavra do mips é de 4 bytes, considere a estrutura Element como sendo 8 bytes. Um ponteiro para um elemento é NULO ou aponta para outro elemento. Considere para meios de simplificação que só temos o método ENQUEUE, e outro método que imprime a fila no console. Algoritmo em Pseudo-Código: 1. Element 2. int value; 3. element* next; 4. Fila 5. int size; 6. element* head; 7. element* tail; 8. Enqueue(int ele){ 9. if(head==null){ 10. head=new element; 11. tail=head; 12. head->value=ele; 13. head->next=null; 14. }else{ 15. tail->next=new element; 16. tail->next->value=ele; 17. tail->next->next=null; 18. tail=tail->next; 19. } 20. size=size+1; 21.} 22. printqueueelements{ 23. element* curr2; 24. curr2= head; 25. while(curr2!=null){ 26. imprime(curr2->value); 27. curr2=curr2->next; 28. } 29. } [1] Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to Algorithms. MIT Press/McGraw-Hill, 1990. [2] Sedgewick, R. (1988) Algorithms. Addison-Wesley, Reading, Massachusetts.
15 - Multiplicação de matrizes Em matemática, o produto de duas matrizes é definido somente quando o número de colunas da primeira matriz é igual ao número de linhas da segunda matriz. Se A é uma matriz m-por-n e B é uma matriz n-por-p, então seu produto é uma matriz m-por-p definida como AB (ou por A B). O produto é dado por: para cada par i e j com 1 = i = m e 1 = j = p. Algoritmo em Pseudo-Código: 1. programa multiplica_matrizes; 2. matriz mat1, mat2, mat3; 3. inteiro linha, coluna, i, acumula; 4. "verifique se mat1 é compativel com mat2"; 5. para linha de 1 até "numero de linhas de mat1" faça 6. para coluna de 1 até "numero de colunas de mat2" faça 7. acumula=0; 8. para i de 1 até "numero de colunas de mat1" faça 9. acumula=acumula+mat1[linha][i]*mat2[i][coluna]; 10. fimpara; 11. mat3[linha][coluna]=acumula; 12. fimpara; 13. fimpara; 14. imprima mat3; 15. fim programa; [1] http://pt.wikipedia.org/wiki/produto_de_matrizes [2] http://pt.wikibooks.org/wiki/matem%c3%a1tica_elementar:_matrizes