<!DOCTYPE html> <html ng-app="ivprog"> <head> <title>iVProgH5 : Visual Programming (LInE-IME-USP)</title> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link href="css/bootstrap.min.css" rel="stylesheet" media="screen" /> <link href="css/font-awesome.css" rel="stylesheet" media="screen" /> <link href="css/bootstrap-editable.css" rel="stylesheet" media="screen" /> <link href="css/ivprog.css" rel="stylesheet" media="screen" /> </head> <body> <div class="header"> <h1><img src="img/logo_ivprog.png" title="iVProg" /></h1> </div> <div class="indent1"> <h2> iVProg : Visual Programming (LInE-IME-USP)</h2> <a href="http://www.usp.br/line" title="Uma das paginas do LInE">LInE</a>. <a href="https://github.com/LInE-IME-USP" title="LInE no GitHub">Software educacional livre</a>. <a href="http://www.usp.br/line/wp" title="Prototipo ambiente LInE">Interatividade na Internet para aprendizagem</a>. <script type='text/javascript'> //<![CDATA[ var strAnswer = ''; var evaluationResult = ''; var comment = ''; function resp () { // 'getEvaluation()' calls 'js/services.js : endTest function(index)' that calls 'getEvaluationCallback(apro/100);' window.frames.iLM.getEvaluation(); // in './mod/iassign/ilm/ivprog-html/js/services.js'; './mod/iassign/ilm/ivprog-html/main.html' // var comment = document.formEnvio.submission_comment.value; // iVProgH5 will call function 'getEvaluationCallback(...)': /var/www/html/ivprogh5/js/services.js } function getEvaluationCallback (evaluation) { // ./mod/iassign/ilm/ivprog-html/js/services.js : call this to define the variable 'evaluationResult' evaluationResult = evaluation; strAnswer = window.frames.iLM.getAnswer(); comment = document.formEnvio.submission_comment.value; if ((strAnswer==null || strAnswer=='' || strAnswer==-1) && (comment==null || comment=='')) { // undefined alert('Atividade enviada sem conteúdo.'); return false; // error... } else { //alert('getEvaluationCallback: enviando evaluationResult=' + evaluation + ', strAnswer=' + strAnswer); alert('getEvaluationCallback: ' + document.formEnvio. iLM_PARAM_ArchiveContent.value); document.formEnvio. iLM_PARAM_ArchiveContent.value = strAnswer; document.formEnvio.iLM_PARAM_ActivityEvaluation.value = evaluationResult; document.formEnvio.submit(); return true; // success } } //]]> </script> <!-- <div class="ladoalado"> <div id="ladoesquerdo"> </div> <div id="ladodireito"> </div> </div><!-- class="ladoalado" --> <div class="bloco"> O <i>iVProgH</i> é mais um sistema educacional livre do <i>LInE</i>, implementado em <i>HTML5</i> (usa fortemente <i>JavaScript</i>), este destinado ao ensino e aprendizagem de algoritmos e programação. O <i>iVProgH</i> é uma nova implementação do <i><a href="http://www.matematica.br/ivprog2" title="veja a segunda versao do iVProg Java">iVProg</a></i> que é implementado em <i>Java</i>. Ambos <i>iVProg</i> dispõem de um esquema para avaliação automática de exercícios, experimente! <br/> Esses sistemas foram desenhados a partir de um <i>modelo visual</i> para programação, podendo ser utilizado desde o segundo ciclo do Ensino Fundamental. <br/> </div> <div class="bloco"> <div class="secao">1. Sobre a interface principal</div> <div class="ladoalado"> <div id="ladoesquerdo"> <p> A imagem 1 apresenta a interface inicial do <i>iVProgH</i> (quando configurado para não apresentar o gabarito do exercício). <br/> Abaixo são explicadas os cinco botões da interface principal e a área cinza inferior seguindo a ordem em que aparecem, de cima para baixo. </p> <ol> <li> <img src="imagens/botao_avaliar.png" title="botao para avaliar o codigo quando tratar-se de exercicio"/> Este botão deve ser utilizado para avaliar o código resposta a um exercícios; </li> <li> <img src="imagens/botao_variaveis.png" title="botao para criar variaveis"/> Este botão serve para criar novas variáveis (que nascem com nomes <tt>newVarN</tt>, se de um "clique" duplo sobre seu nome pode-se alterá-lo); </li> </ol> </p> </div> <div id="ladodireito"> <center> <img src="imagens/manual_interface_1.png" title="interface inicial"/> <br/> <i>Fig. 1</i>: Interface principal do <i>iVProgH</i>. </center> </div> <ol start="3"> <li> <img src="imagens/botao_comandos.png" title="botao para inserir no codigo comandos"/> Este botão serve para inserir no código novos comandos (vide abaixo "Sobre opções de comandos")); </li> <li> <img src="imagens/botao_rodar.png" title="botao para rodar o codigo atual"/> Este botão serve para "rodar" o código construído; </li> <li> <img src="imagens/botao_limpar_console.png" title="botao para limpar a area de saida de dados"/> Este botão serve para "limpar" o console de mensagens, ou seja, remove todas as mensagens previamente "impressas"; </li> <li> <img src="imagens/area_saidas.png" title="area para saida de dados"/> Esta é a área em que as mensagens aparecerão (as saídas de dados). </li> </ol> </div> </div> <div class="bloco"> <div class="secao">1. Sobre variáveis</div> <p> Em qualquer ambiente para codificar algoritmos, as variáveis são utilizadas para armazenar valores a serem utilizados no código. Um exemplo simples de sua utilidade é a obtenção do quadrado de um número a ser digitado pelo usuário. Ou seja, ao escrever o código o programador <b>não</b> sabe qual valor será digitado, assim tem que redigir seu código supondo um "local" especial para armazenar o valor a ser digitado, que é representado por uma variável. </p> <div class="subsecao">1.1 Sobre a criação de variáveis</div> <p> No <i>iVProgH</i>, para criar uma nova variável deve-se utilizar o botão <img src="imagens/botao_variaveis.png" title="botao para criar variaveis"/>. </p> <p> Inicialmente não existem variáveis disponíveis (como indicado na figura 1). Ao "clicar" a primeira vez no botão para criar variável, aparecerá uma nova variável (atualmente com nome inicial <tt>newVar0</tt>). Mas pod-se "clicar" sobre o nome da variável para alterar seu <i>nome</i>. </p> <p> Na imagem abaixo estão 3 passos para a criação e edição dos nomes de 2 variáveis, cronologicamente da esquerda para a direita.. Na esquerda resultado após criar as 2 variáveis, seguida da imagem indicando o início da alteração do nome da primeira variável e, mais à direita, o resultado após trocar os nomes das variáveis, respectivamente, para <tt>a</tt> e <tt>b</tt>. <br/> <center> <img src="imagens/var_img1.png" title="processo de criacao e alteraco de nomes em 3 passos: 1. criar var."/> <img src="imagens/var_img2.png" title="processo de criacao e alteraco de nomes em 3 passos: 2. alterar nome 1"/> <img src="imagens/var_img3.png" title="processo de criacao e alteraco de nomes em 3 passos: 3. nomes alterados"/> <br/> <i>Fig. 2</i>: Processo de criação e alteração de nomes de variáveis. </center> </p> <div class="subsecao">1.2 Sobre os tipos de variáveis</div> <p> Outra característica importante de variáveis é o espaço que cada uma ocupa e o formato de sua representação. Isso quer dizer que cada <i>tipo de variável</i> utiliza uma quantidade padrão de memória (isso costuma ser expresso em <i>bytes</i> - agrupamento de 8 <i>bits</i>). Esta questão não será aprofundada aqui, pois o foco deste manual é apresentar os rudimentos da programação e o funcionamento básico do <i>iVProgH</i>. </p> <p> Mas existe uma questão muito importante que precisa ser enfatizada: qualquer computador digital dispõe de uma quantidade finita de memória e por isso <b>não</b> consegue representar qualquer número. Se quiser entender a razão dessa impossibilidade, tente entender a frase seguinte, senão pule-a. <blockquote> Os números inteiros são infinitos, não existindo nem um maior inteiro e nem um menor inteiro, ou dito de outra forma, dado qualquer número inteiro sempre existe um outro maior que ele e também um outro menor que ele! <br/> Assim, suponha que cada dígito (que são: <i>0</i>, <i>1</i> até <i>9</i>) precise de <i>4</i> <i>bits</i> para ser representado e que o computador considerado tenha disponível um total de <i>N</i> <i>bits</i>. Então este computador poderia representar um número com até <i>N/4</i> dígitos. <br/> Por exemplo, um computador básico atual vem com no mínimo <i>2 giga-bytes</i> de espaço em memória (<i>RAM - Random Access Memory</i>), o que equivale a aproximadamente 2 bilhões de <i>bytes</i>, resultando em <i>2 x 8</i> bilhões de <i>bits</i>. Assim, o maior número inteiro positivo que caberia neste computador seria um número com <i>2 x 8 / 4 = 16</i> bilhões de dígitos. <br/> Note que um inteiro com <i>16</i> bilhões de dígitos é tremendamente maior que o inteiro 16 bilhões, pois esse último tem apenas <i>11</i> dígitos. <br/> Então, se representarmos esse número com <i>16</i> bilhões de dígitos por <i>X</i>, basta multiplicá-lo por 10 que resultaria em um número com <i>16</i> bilhões e <i>1</i> dígitos, o que <b>não</b> caberia na memória do computador considerado, o que resultaria em erro (que usualmente é denominado por <i>overflow</i>). </blockquote> </p> <p> Se estiver interessado em saber um pouquinho mais sobre esta questão de espaço-representação, <a href="https://www.ime.usp.br/~leo/mac2166/2017-1/introducao_var.html" title="sobre variaveis e expressoes aritmeticas">siga este apontador</a> e <a href="https://www.ime.usp.br/~leo/mac2166/2017-1/introducao_char_float.html" title="sobre caracteres e numeros simulando os reais">este apontador</a>. </p> <p> Do ponto de vista prático, no <i>iVProgH</i> estão disponíveis as variáveis inteiras, reais, textos e lógicas. Ao criar uma variável, como indicado na figura 2, esta "nasce" do tipo <i>inteira</i>. Para alterar seu tipo, pode-se "clicar" no ícone da <i>chave inglesa</i>, ao lado do nome da variável (e.g. <tt>newVar0</tt>) e escolhendo o tipo. </p> <p> Abaixo uma imagem ilustrando como alterar o tipo da variável de nome <i>x</i> de <i>inteiro</i> para <i>real</i>, em 3 passos. <center> <img style="vertical-align: top;" src="imagens/var_tipo_1.png" title="processo de alteraco de tipo: 1. tipo inicial (inteiro)."/> <img style="vertical-align: top;" src="imagens/var_tipo_2.png" title="processo de alteraco de tipo: 2. escolhendo novo tipo (real)."/> <img style="vertical-align: top;" src="imagens/var_tipo_3.png" title="processo de alteraco de tipo: 3. tipo final (real)."/> <br/> <i>Fig. 3</i>: Processo de alteração de tipo inteiro para real na variável <i>x</i>. </center> </p> <p> Note que na esquerda aparece <tt>x=1</tt>, enquanto na direita vê-se <tt>x=1.0000</tt>. Isso significa que a variável <tt>x</tt> será iniciada com a unidade e que o aparecimento de "ponto decimal" diferencia o tipo <i>inteiro</i> do tipo <i>real</i>, no primeiro aparece <tt>1</tt> e no último <tt>1.0000</tt>. O valor inicial da variável pode ser alterado de modo análogo à alteração de seu nome, basta "clicar" sobre o número e editá-lo. </p> </div> <div class="bloco"> <div class="secao">2. Sobre comandos</div> <p> Os <i>comandos</i> são as difentes instruções disponíveis na linguagem. Na atual versão do <i>iVProgH</i> existem seis (6) diferentes comandos, explicados abaixo. <br/> Em cada um dos 6 comando, apresentaremos uma versão sintética do comando, em uma linguagem que será apelidada de <b>Portugol</b>. Também será apresentado um exemplo em linguagem <b>C</b>. </p> <p> <ol> <li> <tt class="corDef">Atribuição</tt> Para atribuir valor a alguma variável. Obtém-se a imagem abaixo. <br/> <i class="corEx">Representação em "Portugol"</i>: <tt>x = x * x + x + 1;</tt>. Variável <tt>x</tt> receberá o valor resultante da expressão à direita (<tt>x * x + x + 1;</tt>). <br/> <i class="corEx">Representação em C</i>: <tt>x = x * x + x + 1;</tt>. <br/> <center> <img style="vertical-align: top;" src="imagens/com_attrib_1.png" title="comando de Atribuicao"/> <br/> <i>Fig. 4</i>: Comando de atribuição, situação inicial. </center> Nesse momento deve-se selecionar a variável (destacado em fundo amarelo) e depois construir a expressão aritmética que definirá a variável. Por exemplo, pode-se fazer <tt>i = i+1</tt>, significando a variável <b>receberá</b> o valor atual nela acrescido de uma unidade.<br/> Em programação a atribuição <tt>x = x*x + x + 2</tt> deve ser entendida como: cálcula-se primeiro o valor da expressão à direita, cujo resultado final é atribuido à variável à esquerda.</li> <li> <tt class="corDef">Se verdadeiro então</tt> Para executar comando de acordo com uma condição (<i>expressão lógica</i>). <br/> <i class="corEx">Representação em "Portugol"</i>: <tt>se (a < b) faça CMD1; senão CMD2</tt>. Se <tt>a</tt> for estritamente menor que <tt>b</tt>, execute comando <tt>CMD1</tt>, senão execute comando <tt>CMD2</tt>. <br/> <i class="corEx">Representação em C</i>: <tt>if (a < b) CMD1; else CMD2;</tt>. Sendo <tt>CMD1</tt> e <tt>CMD2</tt> qualquer comando válido de <tt>C</tt>. <br/> <center> <img style="vertical-align: top;" src="imagens/com_se_entao_1.png" title="comando Se-Entao"/> <br/> <i>Fig. 5</i>: Comando de <i>seleção</i>. </center> Nesse momento deve-se selecionar a variável (a versão corrente tem um erro: ao clicar no <tt>Selecione...</tt> deve-se pegar a opção <tt>Valor</tt> e não <tt>Variável</tt>) e seguir construindo a expressão lógica. <br/> <b>Atenção</b>, a decisão (execução do comando) ocorre durante sua execução, com os valores desse contexto. Durante a execução, a condição é avaliada, se resoltar verdadeiro o comando subordinado ao <tt>se</tt> será executado, senão será executado o comando sob o <tt>senão</tt>. Pode-se deixar qualquer um deles vazio. <br/> <br/> <i>Exemplo</i>: para a expressão <tt>a < b</tt> </li> <li> <tt class="corDef">Repita N vezes</tt> Repetir todos os comandos sobordinados (sob esse) <tt>N</tt> vezes. <br/> <i class="corEx">Representação em "Portugol"</i>: <tt>repetir N vezes { CMD1; ...; CMK; }</tt>. <br/> <i class="corEx">Representação em C</i>: <tt>for (i=0; i < N; i++) { CMD1; ...; CMK; }</tt>. <br/> <center> <img style="vertical-align: top;" src="imagens/com_for_1.png" title="comando de repeticao for"/> <br/> <img style="vertical-align: top;" src="imagens/com_for_2.png" title="comando de repeticao for"/> <br/> <i>Fig. 6</i>: comando para repetir um número fixo de vezes (dado por uma variável ou expressão). </center> Na parte de superior da figura 6 está a imagem obtida imediatamente após pegar comando <tt>Repita N vezes</tt>, na parte inferior após "clicar" no símbolo <img style="vertical-align: top;" src="imagens/com_for_3.png" title="trocar numero de repeticoes"/>. </li> <li> <tt class="corDef">Enquanto verdadeiro</tt> Outro comando de repetição, repetindo enquanto a condição for verdadeira. <br/> <i class="corEx">Representação em "Portugol"</i>: <tt>enquanto (CONDICAO) { CMD1; ...; CMK; }</tt>. <br/> <i class="corEx">Representação em C</i>: <tt>while (CONDICAO) { CMD1; ...; CMK; }</tt>. <br/> <center> <img style="vertical-align: top;" src="imagens/com_enquanto_1.png" title="comando de repeticao com condicao de entrada"/> <br/> <i>Fig. 7</i>: comando para repetir enquanto a condição resultar verdadeiro. </center> Nesse comando, o bloco subordinando será repetido até que a condição de entrada deixe de ser verdadeira. </li> <li> <tt class="corDef">Leitura de dados</tt> Comando para permitir que o usuário <i>entre</i> um <i>número/texto/Verdadeiro/Falso</i> para o programa. <br/> <i class="corEx">Representação em "Portugol"</i>: <tt>leia(x);</tt>. Ler um valor e armazenar em <tt>x</tt>. <br/> <i class="corEx">Representação em C</i>: <tt>scanf("%d", &x);</tt>. <br/> <center> <img style="vertical-align: top;" src="imagens/com_entrada_1.png" title="comando para entrada de dados (situacao inicial)"/> <br/> <img style="vertical-align: top;" src="imagens/com_entrada_2.png" title="comando para entrada de dado, a ser armazenado em x"/> <br/> <i>Fig. 8</i>: Comando para <i>entrada</i> de dados. Abaixo após definir a variável na qual o valor digitado será armazenado (<tt>x</tt>). </center> Nesse momento deve-se selecionar a variável (destacado em fundo amarelo) e depois </li> <li> <tt class="corDef">Escrita de dados</tt> Comando para permitir que o usuário receba uma <i>saída</i> do programa. <br/> <i class="corEx">Representação em "Portugol"</i>: <tt>escreva(x);</tt>. Escreva no dispositivo de saída padrão o valor armazenado em <tt>x</tt>. <br/> <i class="corEx">Representação em C</i>: <tt>printf("%d\n", x);</tt>. <br/> <center> <img style="vertical-align: top;" src="imagens/com_saida_1.png" title="comando para saida de dados (situacao inicial)"/> <br/> <img style="vertical-align: top;" src="imagens/com_saida_2.png" title="comando para saida de dados da variavel x"/> <br/> <i>Fig. 9</i>: Comando para <i>saída</i> de dados. Na imagem inferior após definir qual variável terá seu valor impresso. </center> Nesse momento deve-se selecionar a variável (destacado em fundo amarelo) e depois </li> </ol> </p> </div> <div class="bloco"> <div class="secao">3. Solução para o Exercício 1: somar 2 números digitados</div> <strong> Exercício 1: </strong> <i>Fazer um algoritmo que solicite que o usuário digite 2 valores (inteiros), depois compute a soma dos valores digitados e por último imprima esta soma. <br/> <strong>Solução para o Exercício 1: </strong> passos para obter o algoritmo/programa da figura 10.<br/> <ul> <li> Criar 3 variáveis e renomeá-las para nomes mais significativos. Eventualmente poderia-se dispensar a variável <tt>soma</tt> e acumular a soma em <tt>a</tt> ou em <tt>b</tt>, mas o código não ficaria tão claro; </li> <li> Criar o comando <tt>leia(a);</tt> e <tt>leia(b);</tt>, para capturar e armazenar os 2 valores a serem digitados pelo usuário (seria impossível usar apenas uma, perderia-se o primeiro valor que fosse digitado); </li> <li> Criar o comando de atribuição correspondente ao comando Porgugol <tt>soma = a+b;</tt>; </li> <li> Criar o comando para imprimir a resposto, correspondente ao comando Portugol <tt>escreva(soma);</tt>; </ul> <br/> <center> <img style="vertical-align: top;" src="imagens/sol_exerc1.png" title="programa solucao do exercicio 1"/> <br/> <i>Fig. 10</i>: Imagem do programa para receber 2 valores digitados e imprimir sua soma. </center> <br/> </div> <!-- Atencao e' preciso que existe PHP para mostrar a acao para gravar (via programa PHP 'gravar.php'. %3A : %2F / %3D = %26 & --> <center> <div class="bloco"> <div class="secao">4. <i>iVProgH</i> com o exercício 1 (da soma de 2 inteiros) para experimentar novamente.</div> <iframe frameborder="0" name="iLM" src="main.html?lang=pt_br&iLM_PARAM_Assignment=./exerc/exerc_ivprogh5_somar2inteiros_digitados.ivp&iLM_PARAM_SendAnswer=false" style="width: 800px; height: 600px;" id="iLM"> </iframe> <!-- /home/leo/projetos/iMA/ima/sobre_protocolo/sobre-protocolo-ima.txt Explicacoes sobre os parametros para configurar a carga do iVProgH - lang: "lang=pt_br" => carrega em Portugues; "lang=en" => carrega em Ingles - iLM_PARAM_Assignment: nome do arquivo a ser carregado, pode ser um exemplo (com codigo pronto) ou um gabarito (com dados de entradas x saidas) - iLM_PARAM_SendAnswer: se "false" => que NAO mostra o gabarito - para mostrar, eliminar "&iLM_PARAM_SendAnswer=false" ou deixar &iLM_PARAM_SendAnswer=true" --> <form name='formEnvio' id='formEnvio' method='post' action='gravar.php' enctype='multipart/form-data'> <!-- document.formEnvio.MA_POST_Archive.value document.formEnvio.MA_POST_Value.value --> <!-- document.formEnvio.iLM_PARAM_ArchiveContent.value document.formEnvio.iLM_PARAM_ActivityEvaluation.value--> <input type='hidden' name='iLM_PARAM_ArchiveContent' /> <input type='hidden' name='iLM_PARAM_ActivityEvaluation' /> <p><textarea rows='2' cols='60' name='submission_comment'></textarea></p> <input type=button value='Enviar resposta' onclick = 'javascript:window.resp();' title='clique aqui para enviar sua resposta' /> </form> </div><!-- class="bloco" --> </center> <!-- /var/www/html/ivprogh5/img/manual_interface_1.png /var/www/html/ivprogh5/js/app-i18n.js 'msg_testcases' : 'Casos de teste (para autoria de exercícios)', /var/www/html/ivprogh5/partials/create.html 'msg_testcases' : <div id="caseTests" ng-show="notSend"> = iLM_PARAM_SendAnswer=false& --> <div class="foot"><center> <a href="http://www.ime.usp.br/line">LInE</a> | <a href="http://www.matematica.br">iMática</a> | <a href="http://www.usp.br/line/mooc">MOOC</a> </center></div> </div><!-- class="indent1" --> </body> </html>