Exercícios Resolvidos de Analisando seu programa

Ver Teoria

Enunciado

Entre o programa abaixo no editor do MATLAB:

O programa pede ao usuário informar o número de transações a serem efetuadas. Em seguida, ele lê a entrada, em reais, de cada transação e controla o valor total das transações. Ao final, ele apresenta a soma, em reais, dos valores de cada transação.

Crie breakpoints onde achar necessário e debugue o programa, corrigindo erros de sintaxe e de lógica.

Passo 1

O enunciado nos passou um código que intencionalmente tem erros e nos pede para corrigi-lo. Existem no programa erros de sintaxe e de lógica.

Erros de sintaxe em programação são erros 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.

Em programação, erros lógicos não impedem a execução do programa. Eles levam a uma saída diferente da desejada (às vezes incorreta) 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 nos é pedido para criar breakpoints e para debugar o programa.

Passo 2

Crie um script novo no MATLAB e copie o nele o programa do enunciado. O enunciado nos informou o que este programa deve fazer: ele pede para o usuário entrar com o número de transações que ele deseja fazer, para pedir, em seguida, o valor de cada transação. O programa controla o valor total das transações e informa ao final o valor total das transações.

Antes de rodarmos o programa e procurarmos eventuais erros, vamos ver o que cada linha significa para ver o que o programa faz para atingir seu objetivo:

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.

Uma variável chamada t o t a l é criada na linha 4 e ela é igual a 0 .

Na linha 5, pedimos ao usuário para informar o número de transações, por meio do comando i n p u t ( ) . O número de transações é armazenado em n _ t r a n s a c o e s .

Na linha 7, se inicia um laço w h i l e . O bloco do laço w h i l e é executado enquanto a condição k   < =   n _ t r a n s a c o e s for verdadeira. k é uma variável de controle que conta quantas vezes o bloco do w h i l e foi executado, isto é, conta o número de iterações.

Na linha 8, é pedido ao usuário para informar o valor de uma transação, também usando o comando i n p u t ( ) . O valor da transação é armazenado na variável q t d e _ t r a n s a c a o .

Na linha 9, o valor total das transações é atualizado, utilizando a variável t o t a l criada na linha 4. A variável t o t a l é atualizada considerando o valor informado pelo usuário na linha 8.

Na linha 10, a variável de controle k é atualizada, adionando 1 ao valor que k tinha na iteração anterior.

A linha 11 indica que o bloco do w h i l e se encerra ali.

A linha 13 imprime no Command Window o resultado da soma das transações, usando a função d i s p ( ) .

Agora que já sabemos o que cada linha faz, vamos rodar o programa pela primeira vez. Apaecerá no Command Window a seguinte mensagem:

O MATLAB exibiu a string do comando i n p u t ( ) da linha 5, indicando que o programa foi executado. Isto significa que o programa não possui erros de sintaxe, já que o MATLAB conseguiu rodá-lo.

Passo 3

Vamos informar um número de transações para o programa continuar rodando, para vermos se não identificamos algum erro. Vou dizer que quero fazer duas transações, entrando o valor 2 no Command Window. Desta forma, fica mais fácil de eu verificar se o resultado final estará certo.

Ao entrar o valor 2 no Command Window, aparece a seguinte mensagem de erro:

O MATLAB nos informa que há um erro na linha 7, onde se inicia o w h i l e . Ele não reconheceu a variável k . Se olharmos o código atentamente de novo, percebemos que a variável k não foi definida antes da linha 7 e é por isso que o MATLAB não a reconhece.

Para corrigirmos este erro, vamos definir a variável k na linha 6 e dizer que ela é igual a 0 :

Fizemos k = 0 antes de iniciar o laço w h i l e porque ele serve para contar quantas vezes o bloco w h i l e foi executado. Perceba que na primeira iteração do while, k vai ficar igual a 1 ao passarmos pela linha 10, que diz que k = k + 1 . Na segunda iteração, k vai se transformar em 2 pois a execução da linha 10 adicionar 1 ao valor de k da iteração anterior. Esse processo acontece a cada iteração do w h i l e .

Passo 4

Vamos rodar o programa novamente para ver se achamos outro erro. Vamos informar novamente que queremos fazer 2 transações, isto é, n _ t r a n s a c o e s = 2 .

A mensagem de erro do passo anterior não aparece mais. O MATLAB nos pede o valor da transação, indicando que a linha 8 do código foi executada normalmente. Vamos dizer que queremos fazer uma transação de R $ 20,00 :

O MATLAB nos pede novamente para informar um valor de transação, já que pedimos para fazer duas transações. Vamos dizer que queremos fazer mais uma transação de R $ 30,00 :

Perceba que já há indícios que temos algum erro de lógica no código: o MATLAB pediu para entrarmos um terceiro valor de transação, sendo que nós dissemos que queríamos fazer somente duas transações. Vamos interromper a execução do código usando o atalho do teclado C t r l   +   C e criar um breakpoint para debugar o programa.

Crie um breakpoint na linha 10, onde a variável k é atualizada, clicando na barra cinza à esquerda do código, no Editor do MATLAB:

A bolinha vermelha que apareceu é o brekpoint que definimos. Vamos rodar o programa novamente e ativar o modo debugger do MATLAB. O programa é executado até a linha 9 e é interrompido na linha 10:

Note que eu informer novamente que queremos fazer duas transações e já informei que a primeira transação é de R $ 20,00 . Na janela do Editor, apareceu uma flechinha verde na linha onde foi criado o breakpoint, indicando a interrupção do programa:

Antes de executar o programa linha por linha para identificarmos o erro, vamos ver como está nosso Workspace:

Perceba que, por enquanto, k = 0 . Vamos executar a linha 10, usando o atalho do teclado F10 ou apertando o botão “Step”. Em seguida, olhe o Workspace novamente:

Agora, k   =   1 . Perceba que k   <   n _ t r a n s a c o e s , por isso o bloco do w h i l e   será executado novamente. Continue executando o programa linha por linha até chegar na linha 10 novamente. Neste momento, seu Command Window estará assim:

O MATLAB nos pediu para informar o valor da segunda transação, novamente eu disse que quero fazer uma transação de R $ 30,00 . Vamos ver como está o Workspace:

k ainda não foi atualizado e continua igual a 1 porque ainda não executamos a linha 10. Ao fazermos isto, ele se tornará igual a 2 :

Note que, neste momento, k = n _ t r a n s a c o e s e se continuarmos executando o programa linha por linha, o bloco w h i l e será rodado novamente, pois a condição dele é k < = n _ t r a n s a c o e s .

Contudo, não queremos que o bloco w h i l e seja executado mais uma vez, pois isso significa que estaremos fazendo uma terceira transação, sendo que só queremos fazer duas.

Aqui percebemos um erro de lógica no código: o laço w h i l e não pode ser executado quando k = n _ t r a n s a c o e s , para não fazermos uma transação a mais do que a gente pediu. Para corrigirmos este erro, interrompa o debugger apertando o botão “Quit debugging” e mude a condição do w h i l e na linha 7 para k   <   n _ t r a n s a c o e s :

Desta forma, o bloco do w h i l e não será executado quando k   =   n _ t r a n s a c o e s .

Vamos testar novamente? Apague o breakpoint da linha 10, clicando nele, rode o programa e peça para fazer duas transações, uma de R $ 20,00 e outra de R $ 30,00 .

O seu Command Window deve ter ficado assim. Perceba que o problema de o MATLAB fazer uma transação a mais do que o pedido foi corrigido, pois ele pediu para informarmos o valor de uma transação duas vezes. Contudo, apareceu outra mensagem de erro, que diz que há um erro na linha 13.

Passo 5

A mensagem de erro diz que o MATLAB não reconheceu a variável ou função ‘ d i d p ’ na linha 13. Se olharmos para o teclado de nossos computadores, descobrimos este erro se trata de um erro de digitação: quem escreveu o programa queria ter digitado d i s p em vez de d i d p , mas acabou apertando a tecla d   em vez da s , que estão lado a lado no teclado.

Na linha 13, substitua d i d p ( t o t a l ) por d i s p ( t o t a l ) e rode o programa novamente, para vermos se não há mais algum erro. Novamente, vamos entrar com n _ t r a n s a c o e s   =   2 e pedir que a primeira transação seja de R $ 20,00 e a segunda, de R $ 30,00 . Seu Command Window deve ter ficado assim:

Oba! Nenhuma mensagem de erro! O programa foi executado até o final sem problemas!

Pera, mas viu o valor total das transações que o MATLAB nos informou? Ele disse que o valor total das transações é de 30 , mas deveria ser de 50 , não? Isto quer dizer que ainda há um erro lógico em nosso programa.

Passo 6

É na linha 13 que o valor total das transações é impresso no Command Window:

Veja que ela imprime primeiro uma string e, em seguida, a variável t o t a l , que representa a soma de todas as transações.

Para identificar o erro, vamos ver o valor que t o t a l   assumiu ao final do programa:

Perceba que t o t a l está igual à q t d e _ t r a n s a c a o , qua assumiu ao final do programa o valor de 30 . Contudo, t o t a l   deveria ser a soma da primeira e da segunda transação, logo, t o t a l   deveria ser igual a 50 no final do programa.

O problema deve estar na linha 9, onde a variável t o t a l é atualizada dentro do bloco w h i l e . Vamos criar um breakpoint na linha 9 para vermos como a variável total está sendo atualizada. Para isto, clique na barra cinza à esquerda do código, na janela Editor do MATLAB, sobre a linha 9. O breakpoint aparece representado pela bolinha vermelha.

Vamos debugar o programa novamente. Rode-o e diga quer quer fazer duas transações novamente, sendo que a primeira é de R $ 20,00 . A execução do programa será interrompida na linha 9 e seu Command Window estará assim:

Vamos ver o Workspace? Por enquanto, t o t a l   =   0 pois a variável ainda não foi atualizada:

Vamos agora rodar o programa linha por linha. Execute a linha 9 apertando F10 ou o botão “Step” e veja o valor que t o t a l assumiu no Workspace:

Agora, t o t a l   =   20 , que é igual ao valor da primeira transação que fizemos, que foi armazenado na variável q t d e _ t r a n s a c a o . Por enquanto, está tudo certo.

Continue a executar o programa linha por linha, até atingir a linha 9 novamente. Não a execute ainda. Durante este processo, o MATLAB vai pedir o valor da segunda transação, de R $ 30,00 . Seu Command Window deve estar assim:

Vamos ver o Workspace:

A variável q t d e _ t r a n s a c a o foi atualizada para 30 e a variável t o t a l ainda não foi atualizada. Vamos executar a linha 9 e observar o Workspace:

O t o t a l ficou igual a q t d e _ t r a n s a c a o , em vez de somar 30 ao valor da primeira transação isto é, 20 . Temos um problema no cálculo da atualização da variável t o t a l .

Note que na linha 9, t o t a l é atualizado pelo comando:

Que diz que t o t a l   é igual a q t d e _ t r a n s a c a o . Mas não é isso que queremos, queremos que t o t a l armazene a soma das transações. Para que isso seja feito, altere a linha 9 para:

Desta forma, t o t a l é atualizada ao somar o valor que t o t a l tinha na iteração anterior com o valor que a variável q t d e _ t r a n s a c a o acabou de assumir.

Vamos ver se funcionou? Apague o breakpoint e rode o programa novamente.

Passo 7

De novo, diga que quer fazer duas transações, a primeira de R $ 20,00 e a segunda de R $ 30,00 . Seu Command Window deve estar assim:

Agora a soma dos valores das transações está correto: R $ 50,00 . Se olharmos o Wokspace, veremos que t o t a l está diferente de q t d e _ t r a n s a c a o e que t o t a l   =   50 :

Pronto! Programa corrigido! Se quiser, pode fazer mais alguns testes, mudando o número de transações e os valores das transações. Com as correções que fizemos, o programa vai rodar sem problemas.

Resposta

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