<!--
Introdução à entrada e saída de dados
Prof. Leônidas de Oliveira Brandão
Material didático para apoio aos cursos de Introdução à Programação
Direitos reservados
Pode ser usado mediante citação de autoria (Prof. Leônidas de Oliveira Brandão) e origem (https://www.ime.usp.br/~leo/mac2166/introducao/)
-->

 <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
  <meta name='keywords' content='mac0122, material, professores, leonidas de oliveira brandao'>
  <link rel='stylesheet' type='text/css' href='css_img_js_conf/all.css'>
  <link rel='stylesheet' type='text/css' href='css_img_js_conf/line_introducao_programacao.css'>
  <script src="css_img_js_conf/defineLInE.js"></script> <!-- para referencias 'a documentos internos -->
<div class="pagina">


<p class="secao">Introdução à entrada e saída de dados</a>

<!--
importancia
io_simples
ex_io_simples
io_composto
-->

<a name="algoritmo">
<p class="secao">O que é um algoritmo?</p>
</a>

<p>
Para entender o papel das <i>entradas</i> e <i>saídas</i> de dados é preciso estar claro quem atua sobre estes dados, quer dizer,
como é feito o processamento desses dados.
Quem faz isso é um <b style="color:#0000aa">algoritmo</b>, <i>uma sequência finita de passos, que ao ser aplicado sobre um conjunto
de dados (as <b>entradas</b>), deve produzir sempre as mesmas <b>saídas</b></i>.
Por exemplo, o algoritmo da divisão ao ser aplicado sobre valores fixados <i>a</i> e <i>b</i>, deve
produzir sempre o mesmo valor <i>d</i> (de tal forma que <i>d * b = a</i>).
</p>

<p>
Por outro lado, um <b style="color:#0000aa">programa</b>, nada mais é que a implementação de um <b>algoritmo</b> em uma linguagem específica
(como as linguagens <i>C</i> ou <i>Python</i>).
Desse modo, para este programa funcionar o <b style="color:#0000aa">usuário</b> (aquele que está executando) deve fornecer um
conjunto de <b style="color:#00aa00">dados de entrada</b>, na ordem adequada (pois <i>a/b</i> geralmente não é o mesmo que <i>b/a</i>),
para que o programa possa ser executado e produzir as <b style="color:#00aa00">saída</b> desejadas.
</p>

<p>
Por exemplo, para que a implementação de um algoritmo para a divisão de dois números reais seja adequadamente executado,
devem ser fornecidos os dois valores reais. Se o <i>usuário</i> digitar apenas um valor, o programa ficará parado até
que ele digite o segundo valor.
</p>

<center><img src="img/img_computador_io.png" title="ilustracao processamento entradas x saidas"/>
<br/><i>Fig. 1. Ilustração da existência de um algoritmo que aplicado sobre as entradas produz as respectivas saídas.</i>
</center>

<!--
https://en.wikipedia.org/wiki/Integer_%28computer_science%29
int = -32,768 to 32,767, from -(2^15) to 2^15-1 
https://en.wikipedia.org/wiki/Single-precision_floating-point_format
float = 32 bits
IEEE 754 single-precision binary floating-point format: binary32
Sign bit: 1 bit ; Exponent width: 8 bits ; Significand precision: 24 bits (23 explicitly stored)
float = 0/1 0.mantissa x 10^e
            24 bits      8
-->

<a name="importancia">
<p class="secao">Qual a importância da <i>entrada/leitura</i> e da <i>saída/impressão</i> de dados?</p>
</a>

<p>
A grande importância de mecanismos para <i>entrar</i> dados (ou realizar a <i>leitura</i>), para que um programa computacional os
processe, é possibilitar que determinado algoritmo implementado possa atuar sobre esses dados, produzindo resultados personalizados,
no sentido de serem do interesse do usuário.
Por exemplo, um usuário, que é professor, está interessado em saber quais as médias de cada um de seus alunos.
Então o programa implementa um algoritmo que computa as médias dos <i>dados personalizados</i>, que são todas as notas de todos
seus alunos. Esses são os <b style="color:#00aa00">dados de entrada</b>.
</p>

<p>
Por outro lado, o professor precisa receber de alguma os dados que foram gerados, no exemplo, as médias de seus alunos.
Então é preciso haver uma forma de apresentar os <b style="color:#00aa00">dados de saída</b>.
</p>

<p>
Portanto, sem um mecanismo para <i>entradas</i> de dados, um algoritmo não pode ser usado (exceto se for um algoritmo que produz
sempre a mesma coisa, como uma função constante).
De forma análoga, sem um mecanismo <i>saída</i> dos dados de resposta, o algoritmo é inútil.
</p>

<a name="mecanismos">
<p class="secao">Exemplo de mecanismos para "entradas de dados" e para "saídas de dados"</p>
</a>

<p>
Existem vários mecanismos para <i>entrada</i> e para a <i>saída</i> de dados.
Um dos primeiro exemplo de <i>dispositivo para entrada de dados</i> é o <i>teclado</i>, mas existem outros, como os <i>mouses</i>.
Por exemplo, se o usuário der um "clique" duplo em um ícone associado a um arquivo de texto
<img src="img/icn_editor_101.png" width="30" height="30" title="ícone de arquivo para editor de texto"/>, o sistema gráfico "sabe"
que deve abrir o <i>programa editor de texto</i> e, dentro dele, abrir o referido texto.
Mas se o "clique" for sobre o ícone de um arquivo associado à uma planilha eletrônica
<img src="img/icn_planilha_101.png" width="30" height="30" title="ícone de arquivo para planilha"/>, o sistema gráfico "sabe" que
deve abrir o <i>programa planilha eletrônica</i> e, dentro dele, abrir com os dados daquele aquivo (que, por simplicidade, nos
referimos como uma "planilha").
</p>

<p>
Quanto aos mecanismos para <i>saída</i> dos dados processados, o mais comum é a <i>tela</i> (<i>ecrã</i>).
Um outro exemplo interessante de mecanismo de saída são os alto-falantes, eles podem receber dados, produzindo sons.
Para um usuário que for cego, provavelmente este será o meio de saída mais usado.
</p>



<a name="exemplos">
<p class="secao">Exemplos de códigos em <i>C</i> e em <i>Python</i> com entradas/saídas</p>
</a>
<!-- ./introducao/codigos/testes/intr_entrada_saida.* -->

<p>
A tabela abaixo apresenta código para computar a média aritmética de valores a serem digitados pelo usuário.
</p>

<p>
<center><i>Tab. 1. Exemplo de códigos para entrada e saída de inteiros e "reais"</i><br/>
<table class="tableCd">
 <tr>
 <td></td><td bgcolor="8aaada"><i>C</i>: média de valores</td>
 <td bgcolor="8aaada"><i>Python</i>: média de valores</td></tr>
<tr><td><table class=""><tr class="trCd" valign="top"><td><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12</pre></td></tr></table></td>
  <td><table class=""><tr class="trCd" valign="top"><td><pre style="font-size: 0.8em;">//C: computa media
#include <stdio.h>
void main (void) {
int i, n; // declara variaveis
float nota, soma = 0.0; // declara variavel para soma
printf("Digite o numero de notas desse aluno: ");
scanf("%d", &n); // comando para entrada via teclado
for (i=0; i&lt;; i++) {
  printf("Digite valor %d: ", i); scanf("%f", &nota);
  soma = soma + nota; // acumule
  }
printf("A media desse aluno e': %f\n", soma/n);
}
</pre></td></tr></table></td>
<td><table class=""><tr class="trCd" valign="top"><td><pre style="font-size: 0.8em;"># Python: computa media
def main () :
soma = 0.0; # declara variavel para somar
print("Digite o numero de notas desse aluno: ");
n = int(input());
for i in range(n) :
  print("Digite valor %d: " % i);
  soma = soma + float(input()); # acumule
print("A media desse aluno e': %f" % (soma/n));

main();


</pre></td></tr></table></td></tr>
</table></center>
</p>

<p>  
Neste exemplo existem dois tipos de <i>dados para entrada</i>, um primeiro inteiro (variável <i>n</i> que será usada para
guardar o número de notas que cada "aluno" tem. Depois o <i>usuário</i> deve digitas nas <i>n</i> para o "aluno".
Note que foi necessário usar uma variável para acumular cada nota digitada, a variável <i>soma</i>.
Ao final, basta apresentar como <i>dado de saída</i> a média do referido "aluno".
</p>

<p>
<a href="https://www.ime.usp.br/~leo" target="_blank" title="seguir para a pagina do prof. Leônidas">Leônidas de Oliveira Brandão</a><br/>
<a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
</p>

<p class="rodape">
  <b>Alterações</b>:<br/>
    2020/08/19: pequenas correções<br/>
    2020/08/07: primeira versão
</p>

</div>