<!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>