introducao_vetores.html 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. <!--
  2. Introdução à Programação - 2017 - Prof. Leoônidas de Oliveira Brandão
  3. Introdução aos vetores e listas
  4. LInE (Laboratory of Informatics in Education) - http://www.usp.br/line
  5. IME - USP
  6. Material didático
  7. Pode usar livrevemente este material para fins não comerciais, devendo sempre fazer referência à autoria.
  8. Sugestões/apontamento são bem vindos: leo@ime.usp.br (favor indicar no assunto "material de introducao 'a programacao")
  9. Prof. Leônidas de Oliveira Brandão
  10. http://www.ime.usp.br/~leo
  11. http://line.ime.usp.br
  12. http://www.matemtica.br
  13. -->
  14. <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
  15. <meta name='keywords' content='mac0122, material, professores, leonidas de oliveira brandao'>
  16. <link rel='stylesheet' type='text/css' href='css_img_js_conf/all.css'>
  17. <link rel='stylesheet' type='text/css' href='css_img_js_conf/line_introducao_programacao.css'>
  18. <script src="css_img_js_conf/defineLInE.js"></script> <!-- para referencias 'a documentos internos -->
  19. <div class="pagina">
  20. <p class="secao">Introdução aos vetores e listas</p>
  21. <center><p>[
  22. <a href="#vetores" title="Vetores: sequência contígua de variáveis">Vetores</a> &nbsp; | &nbsp;
  23. <a href="#vetC" title="Vetores em C">Vetores em <i>C</i></a> &nbsp; | &nbsp;
  24. <a href="#vetpython" title="Vetores em Python">Vetores em <i>Python</i></a> &nbsp;
  25. ]</p>
  26. </center>
  27. <p>
  28. Nesta seção examinaremos resumidamente como utilizar vetores tanto em <em>C</em> quanto em <em>Python</em>,
  29. mas iniciamos com a questão essencial: por que usar vetor (ou lista, outro possível nome, apesar desse segundo
  30. poder implicar em operadores especiais).
  31. </p>
  32. <a name="porque"><span style="color: #0050A0;font-size:1.1em">Por que precisamos de vetores?</span></a>
  33. <p>
  34. Pense em um problema simples, muito comum, que é extrair informações sobre o comportamento médio de um "conjunto" de dados,
  35. mas apenas a média pode ser pouco informativo (e.g., metade tem valor <i>10</i> e a outra metade <i>0</i>).
  36. Assim, estamos interessados em um <i>software</i> que compute a <i>média</i> e o <i>desvio padrão</i> de um "conunto" de dados.
  37. <br/>
  38. Lembrando a definição de <i>desvio padrão (DP)</i>:
  39. <center>
  40. <tt>DP(v<sub>0</sub>, v<sub>1</sub>,... v<sub>n-1</sub>) =
  41. ((v<sub>0</sub>-med)<sup>2</sup>+(v<sub>1</sub>-med)<sup>2</sup>+(v<sub>n-1</sub>-med)<sup>2</sup>)<sup>1/2</sup></tt>
  42. </center>
  43. <br/>
  44. Então não é viável usar variáveis "simples", pois não sabemos <i>a priori</i> quantos dados o sistema receberá, além disso
  45. não parece razoável investir tempo para desenvolver um sistema que compute a média e desvio padrão para apenas <i>5</i>,
  46. <i>15</i> ou qualquer número fixo de valores; mesmo que "hoje" precisemos conhecer da informação apenas para este número fixo,
  47. podemos pensar em reaproveitar o <i>software</i> "amanhã".
  48. <br/>
  49. Mas suponhamos ainda que o responsável pelo desenvolvimento desconheça o conceito de <i>vetores</i> (algo improvável),
  50. neste caso, ele poderia tentar ler <i>n</i> e depois, em um laço, os <i>n</i> valores para computar a média:
  51. <center><table>
  52. <tr><td><tt>s:=0;</tt></td></tr>
  53. <tr><td><tt>repetir para i entre 0 e n { ler(x); s:=s+x; }</tt></td></tr>
  54. <tr><td><tt><verm>imprimir</verm>(s/n); <cyan>//# med = s/n</cyan></tt></td></tr></table>
  55. <tr><td><i>Algoritmo 1. Tentativa de obter a méida (sem guardar todos os dados).</i></td></tr></table>
  56. </center>
  57. Desse modo conseguiria a média (digamos na variável <tt>med</tt>), mas agora para obter o <i>desvio padrão</i> seria
  58. necessário obter uma soma do quadrado da distância entre cada valor à média!
  59. <br/>
  60. Mas no algoritmo 1 os dados foram lidos, um a um, usados para computar a soma e ao final, teríamos apenas o último valor lido
  61. (em <tt>x</tt>).
  62. <br/>
  63. A saĩda é o conceito de <b>vetor</b>, que é implementado por todas as linguagens de programação de propósito geral,
  64. a ideia é reservar uma variável que tenha acesso à várias posições de memória, como exploraremos a seguir.
  65. Com o vetor podemos guardar todos os dados lidos no algoritmo 1, possibilitando o calculo do desvio padrão.
  66. </p>
  67. <a name="vetores"><span style="color: #0050A0;font-size:1.1em">Vetores: sequência contígua de variáveis</span></a>
  68. <p>
  69. Usualmente um <i>vetor</i> é um agregado de dados de um mesmo tipo básico ocupando posições consecutivas de memória.
  70. Isso significa que é possível pegar alternadamente o valor armazenado em qualquer das posições do vetor,
  71. Usualmente isso é implementado nas linguagens por uma <i>indexamentos</i>,
  72. ou seja, sendo <i>vet</i> o nome da variável agregada, pode-se pegar o primeiro elemento fazendo
  73. <i>vet[0]</i>, o segundo com <i>vet[1]</i> e assim por diante.
  74. </p>
  75. <center>
  76. <img src="img/img_vet_memoria.png" title="ilustracao de vetor em memoria" width="500px" />
  77. <br/>
  78. <i>Fig. 1. Representação da <i title="Read Only Memory">RAM</i> com um vetor de 4 posições.</i>.
  79. </center>
  80. <p>
  81. Na figura acima representamos a memória do computador com um vetor (agregado) de variáveis (usando 8 <i>bits</i> apenas) e de
  82. tamanho 4, ou seja, um vetor para armazenar 4 valores do tipo dado.
  83. </p>
  84. <p>
  85. Como citado na <a href="#" onclick="trocaPagina('introducao_funcoes.html#porque')" title="sobre funcoes">explicação sobre funções</a>,
  86. uma grande vantagem de ter um algoritmo implementado como uma função separada é que o código do programa fica
  87. mais organizado e pode-se invocar esse algoritmo (a partir da função) em qualquer outro trecho do programa.
  88. Por isso, alguns funções muito úteis são implementadas pelos desenvolvedores para ficarem disponíveis dentro
  89. dos ambientes de programação.
  90. </p>
  91. <p>
  92. Retomando o exemplo do cálculo da <i>média aritmética</i> e do <i>desvio padrão</i> de <i>n</i> valores,
  93. poderíamos implementar a função <tt>calcula_media</tt> e a função <tt>calcula_dp</tt>, como abaixo.
  94. </p>
  95. <center><div class="codigo"><pre><verm>inteiro</verm> calcula_media (vetor, n) { <cyan>//# declara funcao que devolve 'inteiro'</cyan>
  96. s := 0; <cyan>//# <b>atencao</b>, dependendo da linguagem, e' melhor declarar ser to tipo "real"</cyan>
  97. repetir para i entre 0 e n { s := s+vetor[i]; }
  98. devolve s/n; <cyan>//# a media - <b>atencao</b>, dependendo da linguagem precisa de alguma forma forcar tratar-se de "reais"</cyan>
  99. }</tt></td></tr>
  100. <verm>real</verm> calcula_dp (vetor, med, n) { <cyan>//# declara funcao que devolve 'real'</cyan>
  101. s := 0;
  102. repetir para i entre 0 e n {
  103. aux := med-vetor[i]; <cyan>//# pequeno truque para melhorar desempenho do algoritmo...</cyan>
  104. s := s + aux*aux; <cyan>//# nao precisa computar 2 vezes med-vetor[i]</cyan>
  105. }
  106. devolve raiz_quadrada(s); <cyan>//# raiz_quadrada(s) devolve s<sup>1/2</sup></cyan>
  107. }</pre></div><br/>
  108. <i>Algoritmo 2. Calcula média e desvio padrão em funções separadas.</i>
  109. </center>
  110. <p>
  111. Por exemplo, tanto em <i>C</i> quanto em <i>Python</i> existem implementações para funções matemáticas
  112. úteis, como <i>seno</i>, <i>cosseno</i> ou <i>raíz quadrada</i> (respectivamente, <tt>sin</tt>, <tt>cos</tt> e
  113. <tt>sqrt</tt>). Mas é preciso indicar ao ambiente que ele deve carregar essas funções, isso é feito com os
  114. comandos <tt>#include &lt;math.h&gt;</tt> em <i>C</i> e <tt>import "math"</tt>.
  115. </p>
  116. <a name="vetC"><span style="color: #0050A0;font-size:1.1em">Vetores em <i>C</i></span></a>
  117. <p>
  118. Como em <i>C</i> deve-se sempre declarar o tipo da variável, no caso de vetor deve-se declarar seu tipo e seu tamanho.
  119. No exemplo abaixo ilustramos declaração e uso de vetores dos tipos básicos <i>int</i>, <i>char</i> e <i>float</i>.
  120. </p>
  121. <p><center>
  122. <table class="tbCodeLinCol">
  123. <tr><th colspan="3">Vetores em <i>C</i> </th> </tr>
  124. <tr>
  125. <th>Vetor de inteiros</th>
  126. <th>Vetor de caracteres</th>
  127. <th>Vetor de flutuantes</th></tr>
  128. <tr valign="top"><td><table class="tbCode">
  129. <tr><td><div class="codigo"><pre><tt class="def">#include</tt> &lt;stdio.h&gt;
  130. <tt class="def">#define<;tt> M 20 <cyan>// usado para constante</cyan></tt>
  131. <verm>int</verm> main (void) {
  132. <verm>int</verm> i; <cyan>// auxiliar, para indexar os vetores</cyan></tt>
  133. <verm>int</verm> nI; <cyan>// tamanho util dos vetores</cyan></tt>
  134. <verm>int</verm> vetI[M]; <cyan>// Vetor para inteiros (ate' M elementos)</cyan></tt>
  135. scanf("%d", &nI);
  136. <azul>for</azul> (i=0; i&lt; nI; i++) <cyan>// "Ler" nI inteiros</cyan></tt>
  137. scanf("%d", &vetI[i]);
  138. <azul>for</azul> (i=0; i&lt; nI; i++) <cyan>// "Imprimir" os elementos</cyan></tt>
  139. <tt class="fnc">printf</tt>("%d\n", vetI[i]);
  140. return 0;
  141. }</pre></div></td>
  142. </table></td>
  143. <td><div class="codigo"><pre><tt class="def">#include</tt> &lt;stdio.h&gt;
  144. #define M 20 <cyan>// usado para constante</cyan></tt>
  145. <verm>int</verm> main (void) {
  146. <verm>int</verm> i; <cyan>// auxiliar, para indexar os vetores</cyan></tt>
  147. <verm>int</verm> nC; <cyan>// tamanho util dos vetores</cyan></tt>
  148. char vetC[M]; <cyan>// Vetor para caracteres</cyan></tt>
  149. scanf("%d", &nC);
  150. <azul>for</azul> (i=0; i&lt; nC; i++) <cyan>// ler nC caracteres</cyan></tt>
  151. scanf(" %c ", &vetC[i]); <cyan>// USAR branco antes de %c</cyan></tt>
  152. <azul>for</azul> (i=0; i&lt; nC; i++)
  153. <tt class="fnc">printf</tt>("%c\n", vetC[i]);
  154. return 0;
  155. }</pre></div></td>
  156. <td><div class="codigo"><pre><tt class="def">#include</tt> &lt;stdio.h&gt;
  157. #define M 20 <cyan>// usado para constante</cyan></tt>
  158. <verm>int</verm> main (void) {
  159. <verm>int</verm> i; <cyan>// Auxiliar, para indexar os vetores</cyan></tt>
  160. <verm>int</verm> iF; <cyan>// Tamanho util dos vetores</cyan></tt>
  161. float vetF[M]; <cyan>// Vetor para flutuantes</cyan></tt>
  162. scanf("%d", &nF);
  163. <azul>for</azul> (i=0; i&lt; nF; i++) <cyan>// "Ler" nF "floats"</cyan></tt>
  164. scanf("%f", &vetF[i]);
  165. <azul>for</azul> (i=0; i&lt; nF; i++)
  166. <tt class="fnc">printf</tt>("%f4.1\n", vetF[i]); <cyan>// Usar 4 posicoes</cyan></tt>
  167. return 0; <cyan>// e 1 para pto dec.</cyan></tt>
  168. }</pre></div></td></tr>
  169. </table></td></tr>
  170. </table></center>
  171. </p>
  172. <p>
  173. <!--
  174. <tt>stdio.h</tt> que tem as funções onipresente para entrada (<tt>scanf</tt>) e para saída (<tt><tt class="fnc">printf</tt></tt>) de dados,
  175. -->
  176. Como já examinado, em <i>C</i> geralmente deve-se carregar a biblioteca <tt>stdio</tt>
  177. mas existem outras, como a <tt>stdlib.h</tt> que dispõe, entre outras, da função
  178. <tt>qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))</tt>
  179. que implementa o método ordenador eficiente denominado
  180. <a href="https://pt.wikipedia.org/wiki/Quicksort" title="explicacao na WikiPedia"><i>Quick Sort</i></a>
  181. (ou
  182. <a href="http://www.ime.usp.br/~leo/mac/mac122/ordena_rapido.html" title="ver uma implementacao em C"><i>Ordenador Rápido</i></a>).
  183. Veja um exemplo de código usando o <tt>qsort</tt>:
  184. <div class="codigo"><pre><tt class="def">#include</tt> &lt;stdio.h&gt; <cyan>// para funcao '<tt class="fnc">printf</tt>'</cyan></tt>
  185. <tt class="def">#include</tt> &lt;stdlib.h&gt; <cyan>// para a funcao 'qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))'</cyan></tt>
  186. <verm>int</verm> vetor[] = { 3, 9, 1, 7, 0, 4, 6, 5, 2, 8 }; <cyan>// por simplicidade usar globais e manter fixo</cyan></tt>
  187. <verm>int</verm> N = 10;
  188. void imprime (<verm>int</verm> vet[], <verm>int</verm> n) { <cyan>// funcao para imprimir em mesma linha</cyan></tt>
  189. <verm>int</verm> i;
  190. <azul>for</azul> (i=0; i&lt;n; i++)
  191. <tt class="fnc">printf</tt>(" %d", vet[i]);
  192. <tt class="fnc">printf</tt>("\n");
  193. }
  194. <cyan>// Esta e' a funcao comparadora: pode-se comparar qualquer coisa, basta codificar seu comparador</cyan></tt>
  195. <verm>int</verm> comparador (const void *a, const void *b) { <cyan>// precisa de 2 parametros a serem depois comparados</cyan></tt>
  196. return ( *(int*)a - *(int*)b );
  197. }
  198. <verm>int</verm> main (void) {
  199. <tt class="fnc">printf</tt>("Testar 'qsort' da biblioteca 'stdlib'\n");
  200. <tt class="fnc">printf</tt>("Antes: ");
  201. imprime(vetor, N);
  202. <tt class="fnc">printf</tt>("Inicio: invocar 'qsort' da biblioteca 'stdlib'\n");
  203. <cyan>// Parametros para 'qsort': vetor de dados, numero de elementos no vetor, tamanho em bytes de cada elemento, endereco da funcao comparadora</cyan></tt>
  204. qsort(vetor, N, sizeof(int), &comparador);
  205. <tt class="fnc">printf</tt>("Ordenado: ");
  206. imprime(vetor, N);
  207. return 0;
  208. }</pre></div>
  209. </p>
  210. <p>
  211. <b>Atenção</b>.
  212. No <i>C</i> padrão NÃO é possível declarar o vetor usando a variável que será usada para informar o número
  213. efetivo de posições a serem usadas, ou seja, <b>não</b> tente fazer algo como <tt>int n; float vetF[n];</tt>.
  214. A razão disso é que <i>C</i> é uma linguagem compilada e ao compilar deve-se reservar o espaço máximo a ser
  215. usado pelo vetor. Já a variável <tt>n</tt> só será conhecida durante a execução do programa.
  216. </p>
  217. <p>
  218. Apesar de algumas implementações de compiladores <i>C</i> permitirem, NÃO usem sob pena de seu programa não funcionar
  219. em outros compiladores.
  220. </p>
  221. <a name="vetpython"><span style="color: #0050A0;font-size:1.1em">Vetores/listas em <i>Python</i></span></a>
  222. <p>
  223. Geralmente, na literatura de <i>programação</i>, o termo <i>vetor</i> refere-se a um agregado de dados,
  224. de mesmo tipo e em posições consecutivas de memória. Como em <i>Python</i>, pode-se misturar tipos, então usa-se o
  225. termo <b>lista</b> (ou <b>tuple</b>).
  226. Por exemplo, pode-se declarar
  227. <tt>lista = (1, 2, "tres", "VI");</tt> ou <tt>tupla = [1, 2, "tres", "VI"];</tt>
  228. e alterar ou imprimir um elemento, como em:
  229. <tt>lista[3] = 3; tupla[3] = 3; <verm>print</verm>("lista=%s, tupla=%s, lista[3]=%d" % (lista,tupla, lista[3]);</tt>.
  230. </p>
  231. <p>
  232. Como citado na <a href="#" onclick="trocaPagina('introducao_funcoes.html#porque')" title="sobre funcoes">explicação sobre funções</a>,
  233. uma grande vantagem de ter um algoritmo genericamente implementado como uma função separada
  234. é que o código do programa fica mais organizado e pode-se invocar a função em qualquer outro trecho do programa.
  235. Por isso, alguns funções muito úteis acabam sendo implementadas pelos desenvolvedores nos ambientes
  236. de programação.
  237. </p>
  238. <p>
  239. Por exemplo, em <i>Python</i> existe a função <tt>sorted(.)</tt> que ordena listas (e tuplas),
  240. mas também existe um método sobre lista (não sobre tupla) que também ordena lista:
  241. <div class="codigo"><pre> lista = ["tres", "quatro", "um", "dois"];
  242. <verm>print</verm>("Ordenado via 'sorted': %s" % sorted(lista)); <cyan># ['dois', 'quatro', 'tres', 'um']</cyan></tt>
  243. lista.sort(); <cyan># nao tente imprimir direto "lista.sort()" senao aparece "None"</cyan></tt>
  244. <verm>print</verm>("Ordenado via 'lista.sort()': %s" % lista); <cyan># ['dois', 'quatro', 'tres', 'um']</cyan></tt></pre></div>
  245. Note que o resultado em <tt>lista</tt> será
  246. <tt>['dois', 'quatro', 'tres', 'um']</tt>, pois a ordem é lexicográfica (do dicionário).
  247. </p>
  248. <p>
  249. Outra observação importante, o método <i>sort()</i> <b>não</b> está definido para <i>tuplas</i>,
  250. ou seja, os comandos
  251. <tt>lista = ("tres", "quatro", "um", "dois"); lista.sort(); <verm>print</verm>(lista);</tt>
  252. resultaria erro (<tt>AttributeError: 'tuple' object has no attribute 'sort'</tt>).
  253. </p>
  254. <p>
  255. No exemplo abaixo ilustramos a declaração e uso de <i>listas</i> dos tipos básicos <i>int</i>, <i>char</i> e <i>float</i>.
  256. Nesses exemplos utilizamos uma técnica de pré-alocar todo o espaço para a lista, utilizando um valor máximo
  257. para o número de posições a serem utilizadas (o <tt>M = 20;</tt>).
  258. Depois solicitamos que o usuário digite o número de elementos que ele deseja inserir na lista
  259. (não fazemos um teste, mas nessa técnica esse valor <b>tem que ser menor que M</b>),
  260. então utilizamos um laço para solicitar a "entrada" de cada elemento, inserindo-o na posição adequada da lista.
  261. </p>
  262. <p><center>
  263. <table class="tbCodeLinCol">
  264. <tr><th colspan="3">Listas em <i>Python</i> com alocação inicial de todo o espaço à <i>priori</i></th> </tr>
  265. <tr>
  266. <th>Vetor de caracteres</th>
  267. <th>Vetor de inteiros</th>
  268. <th>Vetor de flutuantes</th></tr>
  269. <tr valign="top">
  270. <td><div class="codigo"><pre>M = 20 <cyan># usado para dimensionar os vetores</cyan></tt>
  271. <verm>def</verm> main () :
  272. vetC = list(range(0,M)); <cyan># Vetor para inteiros (M elementos)</cyan></tt>
  273. nC = <verm>int</verm>(input()); <cyan># Ler quem definira' tamanho</cyan></tt>
  274. <azul>for</azul> i in range(0, nC) : <cyan># Para ler nC caracteres</cyan></tt>
  275. vetI[i] = <verm>raw_input</verm>(); <cyan># no Python 3 usar 'input()'</cyan></tt>
  276. <azul>for</azul> i in range(0, nC) : <cyan># imprimir os elementos</cyan></tt>
  277. <verm>print</verm>(vetI[i]);</pre></div></td>
  278. <td><div class="codigo"><pre>M = 20 <cyan># usado para dimensionar vetores</cyan></tt>
  279. <verm>def</verm> main () :
  280. vetI = list(range(0,M)); <cyan># Vetor de inteiros (M elementos)</cyan></tt>
  281. nI = <verm>int</verm>(input()); <cyan># Ler quem definira' tamanho</cyan></tt>
  282. <azul>for</azul> i in range(0, nI) : <cyan># Para ler nI inteiros</cyan></tt>
  283. vetI[i] = <verm>int</verm>(input())
  284. <azul>for</azul> i in range(0, nI) : <cyan># Imprimir os elementos</cyan></tt>
  285. <verm>print</verm>(vetI[i]);</pre></div></td>
  286. <td><div class="codigo"><pre>M = 20 <cyan># Para dimensionar os vetores</cyan></tt>
  287. <verm>def</verm> main () :
  288. vetF = list(range(0,M)); <cyan># Vetor para inteiros (M elementos)</cyan></tt>
  289. nF = <verm>int</verm>(input()); <cyan># Ler quem definira' tamanho</cyan></tt>
  290. <azul>for</azul> i in range(0, nF) : <cyan># Para ler nF inteiros</cyan></tt>
  291. vetI[i] = float(input());
  292. <azul>for</azul> i in range(0, nI) : <cyan># Imprimir os elementos</cyan></tt>
  293. <verm>print</verm>(vetI[i]);</pre></div></td>
  294. </tr>
  295. </table></td></tr>
  296. </table></center>
  297. </p>
  298. <p>
  299. Vale notar que, como em <i>Python</i> o espaço para o vetor é reservado durante a execução, não é necessário
  300. pré-dimensionar o espaço para o "vetor" como nos 3 códigos acima, e pode-se usar como linhas 3 e 4:
  301. <tt>nI = <verm>int</verm>(input()); vetI = list(range(0,nI));</tt>.
  302. </p>
  303. <p>
  304. Por fim, vale destacar um detalhe a respeito de como "digitar" os dados usando o comando <i>input</i>.
  305. No <i>Python 2</i>,
  306. Nos códigos acima, se o usuário digitar
  307. <tt>SyntaxError: invalid syntax</tt>.
  308. </p>
  309. <p>
  310. Podemos adotar outra técnica para registro dos dados na lista, desta vez não usando alocação <i>a priori</i>
  311. de espaço e sim estendendo a lista a cada novo elemento digitado. Mas ainda usando a técnica que obriga o usuário
  312. a digitar um único valor por vez (que dizer, digitar um inteiro e teclar <tt>ENTER</tt>).
  313. Esse exemplo está à esquerda da tabela abaixo.
  314. </p>
  315. <p>
  316. Na coluna da direita da tabela mostramos um exemplo distinto, no qual não é necessário digitar <i>a priori</i>
  317. o número de inteiros que comporão a lista. O usuário deverá digitar todos os dados em uma mesma linha, com um
  318. único <tt>ENTER</tt> ao final, e o código decompõe a "string" digitada, utilizando como separadores
  319. <i>espaço em branco</i> para deduzir quais são os inteiros.
  320. </p>
  321. <p><center>
  322. <table class="tbCodeLinCol">
  323. <tr><th colspan="3">Listas em <i>Python</i> com alocação dinâmica de espaço e tipos de digitação</th> </tr>
  324. <tr>
  325. <th>Digitando um elemento por vez</th>
  326. <th>Digitando todos os elementos de uma vez</th></tr>
  327. <tr valign="top">
  328. <td><div class="codigo"><pre><verm>def</verm> alocacaodinamica1por_linha () :
  329. vetI = []; <cyan># Aloca um "vetor" vazio</cyan></tt>
  330. <cyan># nI = <verm>int</verm>(input());</cyan></tt>
  331. nI = M;
  332. <azul>for</azul> i in range(0, nI) : <cyan># ler nI inteiro</cyan></tt>
  333. vetI.append(<verm>int</verm>(input())); <cyan># le novo elemento e estende a lista</cyan></tt>
  334. <verm>print</verm>("Lista: ", end=""); <cyan># imprimir sem mudar de linha</cyan></tt>
  335. <azul>for</azul> i in range(0, nI) : <cyan># imprimir os elementos</cyan></tt>
  336. <verm>print</verm>("%d " % vetI[i], end=""); <cyan># imprimir sem mudar de linha</cyan></tt>
  337. <verm>print</verm>(); <cyan># quebrar a linha ao final</pre></div></td></cyan></tt>
  338. <td><div class="codigo"><pre><verm>def</verm> alocacaodinamica_varios_por_linha () :
  339. <cyan># como leremos por linha, pode-se deduzir depois o tamanho da lista</cyan></tt>
  340. linha = <verm>raw_input</verm>(); <cyan># ler como caracteres para poder pegar uma linha inteira - no Python 3 usar 'input()'</cyan></tt>
  341. vetI = map(<verm>int</verm>, linha.split()); <cyan># decomponha a linha em itens e faz um mapeamento, passando cada item para inteiro</cyan></tt>
  342. nI = len(vetI); <cyan># pegar tamanho da lista digitada</cyan></tt>
  343. <verm>print</verm>("Lista: ", end=""); <cyan># imprimir sem mudar de linha</cyan></tt>
  344. <azul>for</azul> i in range(0, nI) : <cyan># imprimir os elementos</cyan></tt>
  345. <verm>print</verm>("%d " % vetI[i], end=""); <cyan># imprimir sem mudar de linha</cyan></tt>
  346. <verm>print</verm>(); <cyan># quebrar a linha ao final</cyan></tt></pre></div></td>
  347. </tr>
  348. </table></td></tr>
  349. </table></center>
  350. </p>
  351. <p class="autoria">
  352. <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/>
  353. <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
  354. </p>
  355. <p class="rodape">
  356. <b>Alterações</b>:<br/>
  357. 2020/08/20: acertos no formato<br/>
  358. 2020/08/11: acerto formato, pequenos acertos no texto<br/>
  359. 2020/05/05: acrescentada subseção <i>Por que precisamos de vetores?</i><br/>
  360. 2019/06/11: detalhes de forma;<br/>
  361. 2019/06/04: revisão geral.
  362. </p>
  363. </div>