Exercícios Resolvidos de Analisando seu programa

Ver Teoria

Enunciado

Entre o programa abaixo no editor do MATLAB:

Lembre de adicionar os comandos c l e a r   a l l e c l c no começo do programa.

  1. Rode o programa e corrija os erros de sintaxe;
  2. Crie um breakpoint na linha: d i s p ( v a l u e s ) ;
  3. Debugue o programa avançando linha por linha do programa e observe o Workspace e o Command Window, procurando algum erro. Corrija os erros lógicos.
  4. Limpe o breakpoint da letra b e rode o programa corrigido, observando o Workspace e o Command Window.

Passo 1

O enunciado nos deu um código que contém alguns erros e pede para nos o corrigirmos. A intenção do código é mostrar cada elemento do vetor v a l u e s no Command Window.

Na letra a, é pedido para corrigirmos erros de sintaxe. Erros de sintaxe em programação são causados quando não seguimos as regras da linguagem que estamos utilizando, no nosso caso, o MATLAB. Os erros de sintaxe impedem a execução do programa.

A letra b pede para criarmos um breakpoint, para ajudar a responder a letra c. Na letra c, nos é pedido para corrigir erros lógicos. Em programação, erros lógicos não impedem a execução do programa. Eles levam a uma saída diferente da desejada e só podem ser detectados pelo programador ou pela programadora. O debugger do MATLAB nos ajuda a encontrar erros lógicos e a corrigi-los, por isso o usaremos para responder à letra c.

Finalmente, a letra d pede para tirarmos o breakpoint criado na letra b e para rodar o programa por completo.

Passo 2

Crie um script novo no MATLAB e copie o nele o programa do enunciado. Antes de rodarmos o programa e procurarmos eventuais erros, vamos ver o que cada linha significa e o que o programa faz, pelo menos na intenção:

Na linha 1, temos o comando c l e a r   a l l . Este comando limpa o Workspace do MATLAB cada vez que o programa é rodado. Como procuramos erros no código e teremos que rodá-lo várias vezes para ver se corrigimos alguma coisa, é importante limpar o Workspace a cada tentativa.

Na linha 2, o comando c l c limpa o Command Window do MATLAB cada vez que o programa é executado. Novamente, como vamos rodar o código diversas vezes, é importante limpar o Command Window a cada tentativa, para ficar mais fácil de ver qual erro foi corrigido e qual é o erro a ser corrigido na sequência, caso exista.

Na linha 4, criamos um vetor chamado v a l u e s , com 6 elementos.

Na linha 6, começamos um laço f o r , com a intenção de mostrar no Command Window cada elemento de v a l u e s , um de cada vez.

A linha 7 imprime no Command Window o elemento da iteração corrente.

Finalmente, a linha 8 encerra o laço f o r .

Resumindo, o programa deveria imprimir um elemento de v a l u e s a cada iteração do laço f o r .

Agora que já sabemos qual é a intenção do programa, vamos rodá-lo para identificar problemas de sintaxe e resolver a letra a.

Ao tentarmos executar o programa, aparece a seguinte mensagem de erro:

Ela diz que há um erro de sintaxe na linha 6 do programa, no início do laço f o r . Isto faz com que o programa nem seja executado.

Queremos que o MATLAB varra cada elemento de values usando o laço for. Para isto, devemos alterar a linha 6 para:

Na nova linha 6, criamos uma variável de controle i , que vai de 1 até o número de elementos de v a l u e s , isto é, 6. O número de elementos de v a l u e s é dado pela função l e n g t h ( ) , que dá o número de elementos de um vetor.

Rode o programa novamente. A saída no Command Window deve ter sido esta:

A correção que fizemos na linha 6 eliminou o erro de sintaxe e o MATLAB conseguiu rodar o programa. Portanto, a letra a está resolvida. Contudo, a saída não foi exatamente o que queríamos: o vetor v a l u e s foi impresso seis vezes, em vez de um elemento de v a l u e s ser impresso a cada iteração.

Passo 3

Para conseguirmos a saída que queremos, vamos começar pela letra b: criar um breakpoint na linha d i s p ( v a l u e s ) , isto é, na linha 7. Para criar o breakpoint, clique na barra cinza à esquerda do código, no Editor do MATLAB, na linha onde se deseja criá-lo:

Pronto, letra b feita :) Bora fazer a letra c.

Passo 4

A letra c pede para debugar o programa, avançando linha por linha. Enquanto executamos linha por linha, devemos observar o Workspace e o Command Window, para achar o erro no código.

Para ativar o modo debugger do MATLAB, mande rodar o programa. O programa vai ser executado até a linha 7, onde ele será interrompido. A linha onde o programa foi interrompido é indicada por uma flechinha verde:

Olhe o seu Workspace, ele deve estar assim:

Foi criada a variável de controle i e ela por enquanto é igual a 1.

Vamos executar o programa linha por linha como o enunciado mandou. Para isso, aperte o botão “Step” ou use o atalho do teclado F10. Com isto, a flechinha verde desceu para a linha 8, indicando que a linha 7 foi executada:

A execução da linha 7 fez com que a função d i s p ( ) exibisse o vetor values no Command Window:

Vamos continuar avançando linha por linha. Aperte F10 novamente ou o botão “Step”. Como iniciamos um laço f o r , a flechinha verde voltou para a linha 7.

Vamos ver novamente o Workspace:

Repare que o valor de i foi atualizado para 2, devido ao laço f o r .

Aperte F10 novamente ou o botão “Step”. A linha 7 é executada novamente e o vetor v a l u e s é impresso no Command Window pela segunda vez:

Percebeu o padrão? Cada vez que avançamos uma iteração no laço f o r , o valor de i é atualizado e o vetor v a l u e s é impresso novamente. Como neste laço f o r o i vai de 1 a 6, após debugarmos, i será igual a 6 e v a l u e s   será impresso seis vezes no Command Window.

Isto está longe do que queremos, que é imprimir um elemento de v a l u e s a cada iteração do laço f o r . Este é o erro lógico do programa.

Passo 5

Para corrigi-lo, altere a linha 7 para:

Em vez de d i s p ( v a l u e s ) , usamos d i s p ( v a l u e s ( i ) ) , para indicar o elemento de v a l u e s que deve ser impresso. Por exemplo, no laço f o r , inicialmente i   =   1 , logo, na primeira iteração, o comando da linha 7 será na prática d i s p ( v a l u e s ( 1 ) ) . Isto fará com que o primeiro elemento do vetor v a l u e s   , 23, seja impresso. Na iteração seguinte, i = 2 e o comando da da linha 7 será na prática d i s p ( v a l u e s ( 2 ) ) . Isto fará com que o número 17 seja impresso no Comand Window, pois ele é o segundo elemento de v a l u e s . Isto acontecerá para todos os elementos de v a l u e s até i = 6 .

Vamos visualizar este processo debugando. Repare que nem tinha apagado ainda o nosso breakpoint.

Rode o programa novamente para o MATLAB entrar em modo debugger:

Vamos ver o Workspace:

Temos i   =   1 . Vamos apertar F10 ou o botão “Step” para executar a linha 7. Ao fazermos isso, o Command Window imprime v a l u e s ( 1 ) :

Note que é o primeiro elemento de v a l u e s e ele foi impresso na primeira iteração do laço f o r .

Aperte F10 novamente ou o botão “Step” e repare no valor de i no Workspace:

Temos i = 2 . Ao executarmos a linha 7 novamente, o Command Window imprime v a l u e s ( 2 ) :

Que é o segundo elemento de v a l u e s , impresso na segunda iteração.

Percebeu a diferença entre d i s p ( v a l u e s ) e d i s p ( v a l u e s ( i ) ) ? Ao incluirmos o ( i ) , um elemento de v a l u e s é impresso a cada iteração do laço f o r . Sem o ( i ) , o vetor inteiro é impresso a cada iteração.

Após terminar de debugar, executando linha por linha, o resultado será todos os elementos de v a l u e s impressos no Command Window, sendo que um elemento é impresso por vez:

No Workspace, i estará igual 6:

O erro lógico está corrigido, portanto, a letra c está respondida.

Passo 6

A letra d para eliminar o breakpoint e rodar o programa normalmente. Ela pede também para ver o Command Window e o Workspace.

Apague o breakpoint clicando nele e rode o programa. O seu Command Window deve ter ficado assim:

E o Workspace, assim:

Eles estão da mesma forma que ficaram ao terminarmos de debugar. Isto ocorre pois não pedimos ao MATLAB para executar e avaliar linha por linha nosso código, nós pedimos para o MATLAB executá-lo de uma vez, chegando diretamente ao resultado final.

Resposta

Ei, a resposta está no passo a passo :)