M02A06-Ex26 (Inicialização de variáveis)

Home Fóruns Programação Básica M02A06-Ex26 (Inicialização de variáveis)

Visualizando 4 respostas da discussão
  • Autor
    Posts
    • #68477
      Nuno Sousa
      Participante

      Boa noite.
      Estou com um pequeno problema que não estou a conseguir resolver e gostava de saber se alguém me poderia ajudar. O exercício a baixo está a dar-me o erro de que as variáveis n1 e n2 não foram inicializadas mas não percebo o por quê desse erro já que elas foram declaradas e dado o comando de leia.

      
      programa
      {
      	/*Exercício 26: Super Tabuada V1.0
      	Autor: Nuno Sousa*/
      	
      	funcao inicio()
      	{
      		//Declaração de Variáveis
      		caracter op
      		inteiro n1, n2
      		cadeia s, sub, m, d
      		//Entrada de dados
      		escreva("\n===========================")
      		escreva("\n+ 	Adição")
      		escreva("\n-	Subtração")
      		escreva("\n*	Multiplicação")
      		escreva("\n/	Divisão")
      		escreva("\n===========================")
      		escreva("\nDigite uma opção => ")
      		leia(op)
      		//Saída de dados
      		s = "SOMA"
      		sub = "SUBTRAÇÃO"
      		m = "MULTIPLICAÇÃO"
      		d = "DIVISÃO"
      		escolha(op){
      			caso '+': 
      			escreva("Você escolheu a operação [+]")
      			escreva("\n\nDigite o primeiro número: ")
      			leia(n1)
      			escreva("Digite o segundo número: ")
      			leia(n2)
      			pare
      			caso '-':
      			escreva("Você escolheu a operação [-]")
      			escreva("\n\nDigite o primeiro número: ")
      			leia(n1)
      			escreva("Digite o segundo número: ")
      			leia(n2)
      			pare
      			caso '*':
      			escreva("Você escolheu a operação [*]")
      			escreva("\n\nDigite o primeiro número: ")
      			leia(n1)
      			escreva("Digite o segundo número: ")
      			leia(n2)
      			pare
      			caso '/':
      			escreva("Você escolheu a operação [/]")
      			escreva("\n\nDigite o primeiro número: ")
      			leia(n1)
      			escreva("Digite o segudo número: ")
      			leia(n2)
      			pare
      		}
      		escreva("\n.....................................")
      		escreva("\nA calcular o valor de " + n1 + op + n2)
      		escreva("\n\n")
      	}
      }
      

      Obrigado.

    • #68543
      Tutora Mayla
      Mestre

      Nuno, o seu código está certo o problema aí é que as vezes o programa precisa ter certeza que a variável não está vazia, pois como todas são inicializadas em blocos condicionais caso não é possível saber se a execução entrará em um bloco e iniciará a variável. Para resolver isto basta na declaração das variáveis fazer inteiro n1=0, n2=0 pois assim elas terão sempre algum valor, mesmo que zero.

      Espero ter ajudado, quaisquer outras dúvidas estamos a disposição.

    • #68547
      Nuno Sousa
      Participante

      Boa noite.
      Obrigado pela ajuda já está resolvido!
      Acho que agora já percebi, quer dizer que sempre que tenha variáveis que vão trabalhar dentro de um qualquer bloco elas têm que inicializadas ao declarar?

      • #68647
        Tutora Mayla
        Mestre

        Nuno, na verdade depende de como o código está estruturado. O problema do código foi que não havia uma inicialização fora de um bloco condicional.
        Se houvesse um caso contrario no final também inicializando as variáveis esse problema não ocorreria, pois se não fossem nenhuma das condições entraria nele e as variáveis seriam inicializadas.
        Depende muito do problema a ser resolvido e de como o código está estruturado, deve-se prestar atenção e ver onde cabe ou não inicializar as variáveis na declaração.

        Alguns pontos sobre o seu código:

        • Perceba que a seguinte parte do código é repetida em todos os casos
          
          escreva("\n\nDigite o primeiro número: ")
          leia(n1)
          escreva("Digite o segundo número: ")
          leia(n2)
          

          Como essa parte ocorre sempre independente do caso, ela pode ser colocada antes do escolha para evitar a repetição desnecessária. Colocando esta parte fora do escolha, o erro de variáveis não inicializadas some, mesmo sem inicializar algum valor para elas na declaração, pois elas serão inicializadas sempre na leitura.

        • Outro ponto que percebi é que seu código não realiza as operações em si, apenas tem como saída que está calculando o valor.
          Em vez de colocar dentro do escolha a leitura de variáveis, que é padrão para todas as operações como eu mencionei anteriormente, dentro do escolha deverão ficar as operações matemáticas. Algo semelhante a:

          caso '+': 
          	res = n1 + n2
          	pare
           caso '-':
          	res = n1 - n2
          	pare
          

          E após a linha onde informa que o cálculo está sendo feito no final do código, basta acrescentar uma linha escrevendo o valor de res, ou seja, a variável responsável pelo valor resultado.
          É interessante aqui ter apenas uma variável para resposta pois assim podemos tornar a saída de resposta genérica, podendo escrever o valor apenas no final como res. Se tivéssemos uma variável responsável por armazenar a soma, uma pela subtração e assim por diante seria necessário ou escrever a resposta dentro do bloco escolha ou ainda realizar outro condicional para saber qual seria a resposta certa a escrever.

        • Notei também que as seguintes variáveis não estão sendo utilizadas, qual seria sua intenção com elas? Elas são mesmo necessárias?
          
          s = "SOMA"
          sub = "SUBTRAÇÃO"
          m = "MULTIPLICAÇÃO"
          d = "DIVISÃO"
          
        • Após ter feito essas alterações que sugeri no bloco escolha, uma forma de melhorar ainda mais o seu código seria tratar o erro onde foi digitada uma opção inválida, para isto basta adicionar um caso contrario no escolha onde seria escrito um erro informando opção incorreta, pois só entraria nele se não fosse nenhum dos valores que o programa aceita.

        Espero ter ajudado, se ainda houver dúvidas volte a entrar em contato que lhe ajudaremos.
        Continue se dedicando assim e será cada vez um programador melhor, bons estudos!

    • #68703
      Nuno Sousa
      Participante

      Boa tarde!
      Obrigado pelos conselhos, percebi melhor a questão das variáveis, também percebi que a repetição do código para digitar o valor era desnecessária e assim diminui bastante o tamanho do código colocando fora do escolha como me tinha dito. Em relação à realização dos cálculos, corrigi isso logo após ter feito o primeiro post, percebi que essa era a melhor opção. Neste momento o código encontra-se assim:

      
      programa
      {       /*Exercício 26: Super Tabuada V1.0
      	Autor: Nuno Sousa*/
      	inclua biblioteca Tipos --> t
      	funcao inicio()
      	{
      		//Declaração de Variáveis
      		caracter op
      		inteiro n1, n2, r
      		//Entrada de dados
      		escreva("\n===========================")
      		escreva("\n+ 	Adição")			    
      		escreva("\n-	Subtração")			
      		escreva("\n*	Multiplicação")
      		escreva("\n/	Divisão")
      		escreva("\n===========================")
      		escreva("\nDigite uma opção => ")
      		leia(op)
      		r = 0
      		n1 = 0
      		n2 = 0
      		//Saída de dados
      		escreva("\nDigite o primeiro número: ")
      		leia(n1)
      		escreva("Digite o segundo número: ")
      		leia(n2)
      		escolha(op){
      			caso '+': caso '1': 
      			escreva("Você escolheu a operação [+]")
      			r = (n1 + n2)
      				pare
      			caso '-': caso '2':
      			escreva("Você escolheu a operação [-]")
      			escreva("\n\nDigite o primeiro número: ")
      			r = (n1 - n2)
      				pare
      			caso '*': caso '4':
      			escreva("Você escolheu a operação [*]")
      			r = (n1 * n2)
      				pare
      			caso '/': caso '5':
      			escreva("Você escolheu a operação [/]")
      			r = t.inteiro_para_real(n1) / n2
      				pare
      			caso contrario:
      			escreva("Você digitou uma operação inválida!")
      				pare
      		}
      		escreva("\n...........................")
      		escreva("\nA calcular o valor de " + n1 + op + n2)
      		escreva("\nResultado da " +  + " = " + r)
      		escreva("\n\n")
      	}
      }
      

      Agora o meu problema é a conversão de um dos valores na divisão para dar um número real, conforme tenho o código agora dá-me um aviso de que a expressão (r = t.inteiro_para_real(n1) / n2) será truncada. Para finalizar em relação à minha ideia com as varáveis (s = “SOMA”, sub =”SUBTRAÇÃO”
      m = “MULTIPLICAÇÃO”, d = “DIVISÃO”) que não estavam a ser utilizadas era com o objetivo de integrar no caso e no final puxar esse nome para ser exibido o nome da operação realizada. Como por exemplo: escreva(“\nResultado da ” + SOMA + ” = ” + r).
      Neste momento são os dois únicos problemas que tenho para finalizar o programa.
      Obrigado pela ajuda!

      • #68835
        Tutora Mayla
        Mestre

        Nuno, uma dica sobre postagens de códigos no fórum é usar a configuração de texto “code”, após colar o código selecione ele todo e clique em code, assim ele ficará formatado na postagem e facilitará bastante a leitura.
        Alguns pontos sobre o seu código e suas dúvidas:

        • Um código menor não necessariamente significa um código melhor, tenha bastante cuidado com isso. Nessa questão aconteceu do melhor código ser menor, mas nem sempre será assim.
        • A inicialização das variáveis pode ser feita na declaração também, do jeito que está no seu código não está errado, só estou mostrando outra forma de fazer. inteiro n1=0, n2=0, r=0
        • No menu do programa, estão faltando os números das opções, já que a escolha da opção pode ser feita tanto por número quanto pelo símbolo da operação. Acredito que seria melhor escolher uma das duas formas, mas já que as duas estão sendo utilizadas seriam bom o menu estar com os números também, algo como:
          escreva("\n 1. + 	Adição")			    
          escreva("\n 2. -	Subtração")			
          escreva("\n 3. *	Multiplicação")
          escreva("\n 4./	Divisão")
        • No escolha, estão sendo testados os casos 1,2,4,5 não deveriam ser 1,2,3,4?
        • No caso 2, acredito que tenha sido esquecido um escreva que não pertence ali.
          caso '-': caso '2':
          escreva("Você escolheu a operação [-]")
          <strong>escreva("\n\nDigite o primeiro número: ")</strong>
          r = (n1 - n2)
        • Para que o resultado da divisão saia como real, é necessário que a variável que irá armazenar o valor seja real. Ou seja, a variável r tem que ser do tipo real em vez do tipo inteiro.
        • Quanto a escrever o tipo da operação na hora de mostrar o resultado, também pode ser feito de forma genérica utilizando o bloco escolha. Crie uma variável do tipo cadeia chamada tipoOp(por exemplo), em cada caso do escolha atribua a ela a cadeia referente ao nome da operação, e por fim escreva no final do programa escreva("\nResultado da " + tipoOp + " = " + r)
          Um exemplo de como ficaria no escolha:

          
          caso '+': caso '1': 
          escreva("Você escolheu a operação [+]")
          r = (n1 + n2)
          tipoOp = "SOMA"
          
        • Voltando ao ponto que mencionei sobre a escolha podendo ser feita por números ou pelo símbolo do operador, caso seja feita por números nessa linha escreva("\nA calcular o valor de " + n1 + op + n2) acontecerá um problema, veja qual a melhor forma de estruturar o programa para que não haja esse pequeno problema.

        Parabéns pela dedicação! Espero ter ajudado, quaisquer dúvidas basta entrar em contato.

    • #68844
      Nuno Sousa
      Participante

      Boa tarde.
      Peço desculpa pelo trabalho de editar os meus posts mas ainda não sabia como fazer a formatação do código como está no Portugol Studio.
      Segui todos os conselhos que me deu e funcionou tudo na perfeição, só a passagem da variável “r” para real gerou um problema nos resultados das outras operações mas penso que ficou bem resolvido com a conversão desses valores para real. Deixo aqui o resultado final para o caso de poder ajudar alguém:

      programa
      {	/*Exercício 26: Super Tabuada V1.0
      	Autor: Nuno Sousa*/
      	
      	inclua biblioteca Tipos --> t
      	funcao inicio()
      	{
      		//Declaração de Variáveis
      		caracter op
      		cadeia tipo = ""
      		inteiro n1 = 0, n2 = 0
      		real r = 0.0
      		//Entrada de dados
      		escreva("\n=========================")
      		escreva("\n + 	Adição")			    
      		escreva("\n -	Subtração")			
      		escreva("\n *	Multiplicação")
      		escreva("\n /	Divisão")
      		escreva("\n=========================")
      		escreva("\nDigite uma opção => ")
      		leia(op)
      		//Saída de dados
      		escreva("\nDigite o primeiro número: ")
      		leia(n1)
      		escreva("Digite o segundo número: ")
      		leia(n2)
      		escolha(op){
      			caso '+': 
      			escreva("Você escolheu a operação [+]")
      			r = t.inteiro_para_real(n1 + n2)
      			tipo = "SOMA"
      				pare
      			caso '-':
      			escreva("Você escolheu a operação [-]")
      			r = t.inteiro_para_real(n1 - n2)
      			tipo = "SUBTRAÇÃO"
      				pare
      			caso '*':
      			escreva("Você escolheu a operação [*]")
      			r = t.inteiro_para_real(n1 * n2)
      			tipo = "MULTIPLICAÇÃO"
      				pare
      			caso '/':
      			escreva("Você escolheu a operação [/]")
      			r = t.inteiro_para_real(n1 / n2)
      			tipo = "DIVISÃO"
      				pare
      			caso contrario:
      			escreva("Você digitou uma operação inválida!")
      				pare
      		}
      		escreva("\n...........................")
      		escreva("\nA calcular o valor de " + n1 + op + n2)
      		escreva("\nResultado da " + tipo + " = " + r)
      		escreva("\n\n")
      	}
      }

      Obrigado pela paciência e dedicação.

      • #68917
        Tutora Mayla
        Mestre

        Nuno, parabéns pela dedicação, seu código melhorou muito e tenho certeza de que aprendeu muito também!
        Uma última consideração sobre o seu código, para converter uma operação para real é necessário converter um operando e não a operação inteira.
        O certo seria assim r = t.inteiro_para_real(n1) / n2 como estava sendo feito anteriormente. Aqui o que acontece é que converte-se um operando e depois a operação é feita de forma real.
        Feito desse jeito r = t.inteiro_para_real(n1 / n2) o truncamento ainda existe, o que acontece aqui é que a operação é feita de forma inteira, e o resultado truncado é convertido para real.
        E quanto as operações de soma, subtração e multiplicação, estas não precisam da função inteiro_para_real pois como seu resultado sempre será inteiro e não haverá perda de valores (igual acontece na divisão se for feita de forma inteira) basta fazer a conta normalmente e atribuir a variável real que será convertida automaticamente adicionando o zero após o ponto.
        É possível atribuir valores inteiros a variáveis reais, o que acontecerá é que será adicionado o .0.
        É possível atribuir valores reais a variáveis inteiras, o que acontecerá é que o valor será truncado, ou seja, perderá o que há após o ponto. Isso emitirá um aviso que pode ser ignorado se for a intenção fazer isso, e para retirar o aviso basta converter para real.

        Espero ter ajudado, quaisquer outras dúvidas estamos a disposição.

Visualizando 4 respostas da discussão
  • Você deve fazer login para responder a este tópico.