Diagramas de Execução Prof. Marcelo Diagramas de Execução Consiste em uma simulação da execução de um programa de maneira sistemática Serve para mostrar a relação entre o código-fonte e a execução dinâmica Trata-se de uma notação que torna a semântica da LP mais clara, em especial as regras de escopo as chamadas de procedimentos a passagem de parâmetros Diagramas de Execução Sua finalidade é melhorar a compreensão dos conceitos Nenhuma definição formal é dada para os diagramas de execução É possível desenvolver um formalismo adequado para a notação e relacioná-la com a sintaxe, obtendo-se um método para especificar a semântica de uma LP As simulações podem ser programadas para computador Diagramas de Execução Um código-fonte é um objeto que possui uma estrutura descrita pela árvore de derivação Está árvore de derivação é o resultado das construções sintáticas de uma LP O escopo de uma definição é a região onde esta definição se aplica. Em geral pode ser Global – acessada em qualquer ponto do programa Local – acessada apenas no ponto em que foi definida Diagramas de Execução A simulação de um programa na notação de diagramas de execução é feita por meio de retângulos encaixados Cada retângulo indica o início ou ativação de um procedimento Um retângulo só é completado quando encerrar-se a simulação da execução da ativação do procedimento Diagramas de Execução program exemplo(); var m, n, s: integer; begin read(m,n); s:= 0; while m <= n do begin s:= s+m*m; write(m,s); m:= m+1; end end. Diagramas de Execução Supondo que os valores lidos para m e n sejam, respectivamente, 5 e 6, temos o diagrama de execução a seguir Diagramas de Execução exemplo m: 5 n: 6 s: 0 m, n, s: integer / read(m,n) / s:= 0; Diagramas de Execução exemplo m: 5 n: 6 s: 0, 25 s:= s+m*m; Diagramas de Execução exemplo m: 5 n: 6 s: 0, 25 5, 25 write(m,s); Diagramas de Execução exemplo m: 5, 6 n: 6 s: 0, 25 5, 25 m:= m+1; Diagramas de Execução exemplo m: 5, 6 n: 6 s: 0, 25, 61 5, 25 s:= s+m*m; Diagramas de Execução exemplo m: 5, 6 n: 6 s: 0, 25, 61 5, 25 6, 61 write(m,s); Diagramas de Execução exemplo m: 5, 6, 7 n: 6 s: 0, 25, 61 5, 25 6, 61 m:= m+1; Diagramas de Execução exemplo m: 5, 6, 7 n: 6 s: 0, 25, 61 5, 25 6, 61 end. Diagramas de Execução A parte superior do retângulo contem os valores dos parâmetros e das variáveis locais Os valores sucessivos para cada parâmetro ou variável é o resultado da execução de comandos de atribuição e de E/S Se um procedimento q for chamado dentro de outro procedimento p, então o registro de ativação de q será encaixado no registro de p Diagramas de Execução program exemplo2(); var n, s, i: integer; procedure soma; var q: integer; begin q:= i*i; if (i div 2)*2 = i then s:= s+q else s:= s-q end begin read(n); s:= 0; i:= 0; while i <= n do begin soma; write(s); i:= i+1; end end. Diagramas de Execução Supondo que os valores lidos para n seja 2, temos o diagrama de execução a seguir Diagramas de Execução exemplo 2 s: 0 n: 2 i: 0 n, s, i: integer / read(n) / s:= 0; / i:= 0; Diagramas de Execução exemplo 2 s: 0, 0 n: 2 i: 0 soma q: 0 soma; Diagramas de Execução exemplo 2 s: 0, 0 n: 2 i: 0 soma q: 0 0 write(s); Diagramas de Execução exemplo 2 s: 0, 0 n: 2 i: 0, 1 soma q: 0 0 i:= i+1; Diagramas de Execução exemplo 2 s: 0, 0, -1 n: 2 i: 0, 1 soma q: 0 0 soma q: 1 soma; Diagramas de Execução exemplo 2 s: 0, 0, -1 n: 2 i: 0, 1 soma q: 0 0 soma q: 1 -1 write(s); Diagramas de Execução exemplo 2 s: 0, 0, -1 n: 2 i: 0, 1, 2 soma q: 0 0 soma q: 1 -1 i:= i+1; Diagramas de Execução exemplo 2 s: 0, 0, -1, 3 n: 2 i: 0, 1, 2 soma q: 0 0 soma q: 1 -1 soma q: 4 soma; Diagramas de Execução exemplo 2 s: 0, 0, -1, 3 n: 2 i: 0, 1, 2 soma q: 0 0 soma q: 1 -1 soma q: 4 write(s); 3 Diagramas de Execução exemplo 2 s: 0, 0, -1, 3 n: 2 i: 0, 1, 2, 3 soma q: 0 0 soma q: 1 -1 soma q: 4 i:= i+1; 3 Diagramas de Execução exemplo 2 s: 0, 0, -1, 3 n: 2 i: 0, 1, 2, 3 soma q: 0 0 soma q: 1 -1 soma q: 4 end. 3 Diagramas de Execução Monte um diagrama de execução para o programa a seguir Diagramas de Execução program exercicio(); var z, t: integer; procedure g(t: integer); var x: integer; begin t:= 2*t; x:= 2*t; z:= x+1; end begin z:= 3; t:= 4; g(t); write(z,t); g(z); write(z,t); g(z+t); write(z,t); g(7); write(z,t); end. Diagramas de Execução Quando em um programa, existem várias chamadas a um mesmo procedimento, costuma-se adotar uma das seguintes alternativas Numerar seqüencialmente cada diagrama de execução do procedimento chamado Indicar os valores dos parâmetros que estão sendo passados para o procedimento Diagramas de Execução s: 0, 0, -1 n: 2 i: 0, 1, 2 soma q: 0 (1) 0 soma q: 1 (2) -1 end. Diagramas de Execução Quando o mesmo procedimento for chamado em diversas partes do programa, costuma-se indicar, por meio de uma flecha, qual o registro de ativação (diagrama de execução) que realizou a chamada Ou então, utiliza-se uma flecha pontilhada indicando qual o escopo está sendo referenciado dentro da função Diagramas de Execução s: 0, 0, -1 n: 2 i: 0, 1, 2 soma q: 0 (1) 0 soma q: 1 (2) -1 end. Diagramas de Execução Faça o diagrama de execução para o programa a seguir Diagramas de Execução int z,x; void g(int t) { int y; y= t*t; z= z+x+y; cout << z; } void f(int y){ int t; t= z+x+y; g(t); z= t; } void h(int y) { int x; x= y+1; f(x); g(z+x); } void main() { z= 1; x= 3; h(x); g(x); cout << x,z; } Diagramas de Execução Para os parâmetros passados por referência, indica-se qual o registro de ativação que provém a variável passada como parâmetro efetivo por meio de uma flecha indicando QUAL VARIÁVEL está sendo referenciada O valor de retorno de uma função aparece ao lado do nome da função, separado por uma barra Diagramas de Execução int fat(int n) { if (n == 0) return 1; else return (n * fat(n-1)); } void main() { cout << “fat(3)= “ << fat(3); } Diagramas de Execução main fat(3)/ n: 3 fat(3)= Diagramas de Execução main fat(3)/ n: 3 fat(2)/ n: 2 fat(3)= Diagramas de Execução main fat(3)/ n: 3 fat(2)/ n: 2 fat(1)/ n: 1 fat(3)= Diagramas de Execução main fat(3)/ n: 3 fat(2)/ n: 2 fat(1)/ n: 1 fat(0)/1 n: 0 fat(3)= Diagramas de Execução main fat(3)/ n: 3 fat(2)/ n: 2 fat(1)/1 n: 1 fat(0)/1 n: 0 fat(3)= Diagramas de Execução main fat(3)/ n: 3 fat(2)/2 n: 2 fat(1)/1 n: 1 fat(0)/1 n: 0 fat(3)= Diagramas de Execução main fat(3)/6 n: 3 fat(2)/2 n: 2 fat(1)/1 n: 1 fat(0)/1 fat(3)= n: 0 fat(3)= 6