123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409 |
- <!--
- Introdução à Programação - 2017 - Prof. Leoônidas de Oliveira Brandão
- Introdução aos vetores e listas
- LInE (Laboratory of Informatics in Education) - http://www.usp.br/line
- IME - USP
- Material didático
- Pode usar livrevemente este material para fins não comerciais, devendo sempre fazer referência à autoria.
- Sugestões/apontamento são bem vindos: leo@ime.usp.br (favor indicar no assunto "material de introducao 'a programacao")
- Prof. Leônidas de Oliveira Brandão
- http://www.ime.usp.br/~leo
- http://line.ime.usp.br
- http://www.matemtica.br
- -->
- <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 aos vetores e listas</p>
- <center><p>[
- <a href="#vetores" title="Vetores: sequência contígua de variáveis">Vetores</a> |
- <a href="#vetC" title="Vetores em C">Vetores em <i>C</i></a> |
- <a href="#vetpython" title="Vetores em Python">Vetores em <i>Python</i></a>
- ]</p>
- </center>
- <p>
- Nesta seção examinaremos resumidamente como utilizar vetores tanto em <em>C</em> quanto em <em>Python</em>,
- mas iniciamos com a questão essencial: por que usar vetor (ou lista, outro possível nome, apesar desse segundo
- poder implicar em operadores especiais).
- </p>
- <a name="porque"><span style="color: #0050A0;font-size:1.1em">Por que precisamos de vetores?</span></a>
- <p>
- Pense em um problema simples, muito comum, que é extrair informações sobre o comportamento médio de um "conjunto" de dados,
- mas apenas a média pode ser pouco informativo (e.g., metade tem valor <i>10</i> e a outra metade <i>0</i>).
- 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.
- <br/>
- Lembrando a definição de <i>desvio padrão (DP)</i>:
- <center>
- <tt>DP(v<sub>0</sub>, v<sub>1</sub>,... v<sub>n-1</sub>) =
- ((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>
- </center>
- <br/>
- 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
- 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>,
- <i>15</i> ou qualquer número fixo de valores; mesmo que "hoje" precisemos conhecer da informação apenas para este número fixo,
- podemos pensar em reaproveitar o <i>software</i> "amanhã".
- <br/>
- Mas suponhamos ainda que o responsável pelo desenvolvimento desconheça o conceito de <i>vetores</i> (algo improvável),
- 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:
- <center><table>
- <tr><td><tt>s:=0;</tt></td></tr>
- <tr><td><tt>repetir para i entre 0 e n { ler(x); s:=s+x; }</tt></td></tr>
- <tr><td><tt><verm>imprimir</verm>(s/n); <cyan>//# med = s/n</cyan></tt></td></tr></table>
- <tr><td><i>Algoritmo 1. Tentativa de obter a méida (sem guardar todos os dados).</i></td></tr></table>
- </center>
- Desse modo conseguiria a média (digamos na variável <tt>med</tt>), mas agora para obter o <i>desvio padrão</i> seria
- necessário obter uma soma do quadrado da distância entre cada valor à média!
- <br/>
- 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
- (em <tt>x</tt>).
- <br/>
- A saĩda é o conceito de <b>vetor</b>, que é implementado por todas as linguagens de programação de propósito geral,
- a ideia é reservar uma variável que tenha acesso à várias posições de memória, como exploraremos a seguir.
- Com o vetor podemos guardar todos os dados lidos no algoritmo 1, possibilitando o calculo do desvio padrão.
- </p>
- <a name="vetores"><span style="color: #0050A0;font-size:1.1em">Vetores: sequência contígua de variáveis</span></a>
- <p>
- Usualmente um <i>vetor</i> é um agregado de dados de um mesmo tipo básico ocupando posições consecutivas de memória.
- Isso significa que é possível pegar alternadamente o valor armazenado em qualquer das posições do vetor,
- Usualmente isso é implementado nas linguagens por uma <i>indexamentos</i>,
- ou seja, sendo <i>vet</i> o nome da variável agregada, pode-se pegar o primeiro elemento fazendo
- <i>vet[0]</i>, o segundo com <i>vet[1]</i> e assim por diante.
- </p>
- <center>
- <img src="img/img_vet_memoria.png" title="ilustracao de vetor em memoria" width="500px" />
- <br/>
- <i>Fig. 1. Representação da <i title="Read Only Memory">RAM</i> com um vetor de 4 posições.</i>.
- </center>
- <p>
- Na figura acima representamos a memória do computador com um vetor (agregado) de variáveis (usando 8 <i>bits</i> apenas) e de
- tamanho 4, ou seja, um vetor para armazenar 4 valores do tipo dado.
- </p>
- <p>
- Como citado na <a href="#" onclick="trocaPagina('introducao_funcoes.html#porque')" title="sobre funcoes">explicação sobre funções</a>,
- uma grande vantagem de ter um algoritmo implementado como uma função separada é que o código do programa fica
- mais organizado e pode-se invocar esse algoritmo (a partir da função) em qualquer outro trecho do programa.
- Por isso, alguns funções muito úteis são implementadas pelos desenvolvedores para ficarem disponíveis dentro
- dos ambientes de programação.
- </p>
- <p>
- 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,
- poderíamos implementar a função <tt>calcula_media</tt> e a função <tt>calcula_dp</tt>, como abaixo.
- </p>
- <center><div class="codigo"><pre><verm>inteiro</verm> calcula_media (vetor, n) { <cyan>//# declara funcao que devolve 'inteiro'</cyan>
- s := 0; <cyan>//# <b>atencao</b>, dependendo da linguagem, e' melhor declarar ser to tipo "real"</cyan>
- repetir para i entre 0 e n { s := s+vetor[i]; }
- devolve s/n; <cyan>//# a media - <b>atencao</b>, dependendo da linguagem precisa de alguma forma forcar tratar-se de "reais"</cyan>
- }</tt></td></tr>
- <verm>real</verm> calcula_dp (vetor, med, n) { <cyan>//# declara funcao que devolve 'real'</cyan>
- s := 0;
- repetir para i entre 0 e n {
- aux := med-vetor[i]; <cyan>//# pequeno truque para melhorar desempenho do algoritmo...</cyan>
- s := s + aux*aux; <cyan>//# nao precisa computar 2 vezes med-vetor[i]</cyan>
- }
- devolve raiz_quadrada(s); <cyan>//# raiz_quadrada(s) devolve s<sup>1/2</sup></cyan>
- }</pre></div><br/>
- <i>Algoritmo 2. Calcula média e desvio padrão em funções separadas.</i>
- </center>
- <p>
- Por exemplo, tanto em <i>C</i> quanto em <i>Python</i> existem implementações para funções matemáticas
- úteis, como <i>seno</i>, <i>cosseno</i> ou <i>raíz quadrada</i> (respectivamente, <tt>sin</tt>, <tt>cos</tt> e
- <tt>sqrt</tt>). Mas é preciso indicar ao ambiente que ele deve carregar essas funções, isso é feito com os
- comandos <tt>#include <math.h></tt> em <i>C</i> e <tt>import "math"</tt>.
- </p>
- <a name="vetC"><span style="color: #0050A0;font-size:1.1em">Vetores em <i>C</i></span></a>
- <p>
- 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.
- No exemplo abaixo ilustramos declaração e uso de vetores dos tipos básicos <i>int</i>, <i>char</i> e <i>float</i>.
- </p>
- <p><center>
- <table class="tbCodeLinCol">
- <tr><th colspan="3">Vetores em <i>C</i> </th> </tr>
- <tr>
- <th>Vetor de inteiros</th>
- <th>Vetor de caracteres</th>
- <th>Vetor de flutuantes</th></tr>
- <tr valign="top"><td><table class="tbCode">
- <tr><td><div class="codigo"><pre><tt class="def">#include</tt> <stdio.h>
- <tt class="def">#define<;tt> M 20 <cyan>// usado para constante</cyan></tt>
- <verm>int</verm> main (void) {
- <verm>int</verm> i; <cyan>// auxiliar, para indexar os vetores</cyan></tt>
- <verm>int</verm> nI; <cyan>// tamanho util dos vetores</cyan></tt>
- <verm>int</verm> vetI[M]; <cyan>// Vetor para inteiros (ate' M elementos)</cyan></tt>
- scanf("%d", &nI);
- <azul>for</azul> (i=0; i< nI; i++) <cyan>// "Ler" nI inteiros</cyan></tt>
- scanf("%d", &vetI[i]);
- <azul>for</azul> (i=0; i< nI; i++) <cyan>// "Imprimir" os elementos</cyan></tt>
- <tt class="fnc">printf</tt>("%d\n", vetI[i]);
- return 0;
- }</pre></div></td>
- </table></td>
- <td><div class="codigo"><pre><tt class="def">#include</tt> <stdio.h>
- #define M 20 <cyan>// usado para constante</cyan></tt>
- <verm>int</verm> main (void) {
- <verm>int</verm> i; <cyan>// auxiliar, para indexar os vetores</cyan></tt>
- <verm>int</verm> nC; <cyan>// tamanho util dos vetores</cyan></tt>
- char vetC[M]; <cyan>// Vetor para caracteres</cyan></tt>
- scanf("%d", &nC);
- <azul>for</azul> (i=0; i< nC; i++) <cyan>// ler nC caracteres</cyan></tt>
- scanf(" %c ", &vetC[i]); <cyan>// USAR branco antes de %c</cyan></tt>
- <azul>for</azul> (i=0; i< nC; i++)
- <tt class="fnc">printf</tt>("%c\n", vetC[i]);
- return 0;
- }</pre></div></td>
- <td><div class="codigo"><pre><tt class="def">#include</tt> <stdio.h>
- #define M 20 <cyan>// usado para constante</cyan></tt>
- <verm>int</verm> main (void) {
- <verm>int</verm> i; <cyan>// Auxiliar, para indexar os vetores</cyan></tt>
- <verm>int</verm> iF; <cyan>// Tamanho util dos vetores</cyan></tt>
- float vetF[M]; <cyan>// Vetor para flutuantes</cyan></tt>
- scanf("%d", &nF);
- <azul>for</azul> (i=0; i< nF; i++) <cyan>// "Ler" nF "floats"</cyan></tt>
- scanf("%f", &vetF[i]);
- <azul>for</azul> (i=0; i< nF; i++)
- <tt class="fnc">printf</tt>("%f4.1\n", vetF[i]); <cyan>// Usar 4 posicoes</cyan></tt>
- return 0; <cyan>// e 1 para pto dec.</cyan></tt>
- }</pre></div></td></tr>
- </table></td></tr>
- </table></center>
- </p>
- <p>
- <!--
- <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,
- -->
- Como já examinado, em <i>C</i> geralmente deve-se carregar a biblioteca <tt>stdio</tt>
- mas existem outras, como a <tt>stdlib.h</tt> que dispõe, entre outras, da função
- <tt>qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))</tt>
- que implementa o método ordenador eficiente denominado
- <a href="https://pt.wikipedia.org/wiki/Quicksort" title="explicacao na WikiPedia"><i>Quick Sort</i></a>
- (ou
- <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>).
- Veja um exemplo de código usando o <tt>qsort</tt>:
- <div class="codigo"><pre><tt class="def">#include</tt> <stdio.h> <cyan>// para funcao '<tt class="fnc">printf</tt>'</cyan></tt>
- <tt class="def">#include</tt> <stdlib.h> <cyan>// para a funcao 'qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))'</cyan></tt>
- <verm>int</verm> vetor[] = { 3, 9, 1, 7, 0, 4, 6, 5, 2, 8 }; <cyan>// por simplicidade usar globais e manter fixo</cyan></tt>
- <verm>int</verm> N = 10;
- void imprime (<verm>int</verm> vet[], <verm>int</verm> n) { <cyan>// funcao para imprimir em mesma linha</cyan></tt>
- <verm>int</verm> i;
- <azul>for</azul> (i=0; i<n; i++)
- <tt class="fnc">printf</tt>(" %d", vet[i]);
- <tt class="fnc">printf</tt>("\n");
- }
- <cyan>// Esta e' a funcao comparadora: pode-se comparar qualquer coisa, basta codificar seu comparador</cyan></tt>
- <verm>int</verm> comparador (const void *a, const void *b) { <cyan>// precisa de 2 parametros a serem depois comparados</cyan></tt>
- return ( *(int*)a - *(int*)b );
- }
- <verm>int</verm> main (void) {
- <tt class="fnc">printf</tt>("Testar 'qsort' da biblioteca 'stdlib'\n");
- <tt class="fnc">printf</tt>("Antes: ");
- imprime(vetor, N);
- <tt class="fnc">printf</tt>("Inicio: invocar 'qsort' da biblioteca 'stdlib'\n");
- <cyan>// Parametros para 'qsort': vetor de dados, numero de elementos no vetor, tamanho em bytes de cada elemento, endereco da funcao comparadora</cyan></tt>
- qsort(vetor, N, sizeof(int), &comparador);
- <tt class="fnc">printf</tt>("Ordenado: ");
- imprime(vetor, N);
- return 0;
- }</pre></div>
- </p>
- <p>
- <b>Atenção</b>.
- 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
- efetivo de posições a serem usadas, ou seja, <b>não</b> tente fazer algo como <tt>int n; float vetF[n];</tt>.
- A razão disso é que <i>C</i> é uma linguagem compilada e ao compilar deve-se reservar o espaço máximo a ser
- usado pelo vetor. Já a variável <tt>n</tt> só será conhecida durante a execução do programa.
- </p>
- <p>
- Apesar de algumas implementações de compiladores <i>C</i> permitirem, NÃO usem sob pena de seu programa não funcionar
- em outros compiladores.
- </p>
- <a name="vetpython"><span style="color: #0050A0;font-size:1.1em">Vetores/listas em <i>Python</i></span></a>
- <p>
- Geralmente, na literatura de <i>programação</i>, o termo <i>vetor</i> refere-se a um agregado de dados,
- 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
- termo <b>lista</b> (ou <b>tuple</b>).
- Por exemplo, pode-se declarar
- <tt>lista = (1, 2, "tres", "VI");</tt> ou <tt>tupla = [1, 2, "tres", "VI"];</tt>
- e alterar ou imprimir um elemento, como em:
- <tt>lista[3] = 3; tupla[3] = 3; <verm>print</verm>("lista=%s, tupla=%s, lista[3]=%d" % (lista,tupla, lista[3]);</tt>.
- </p>
- <p>
- Como citado na <a href="#" onclick="trocaPagina('introducao_funcoes.html#porque')" title="sobre funcoes">explicação sobre funções</a>,
- uma grande vantagem de ter um algoritmo genericamente implementado como uma função separada
- é que o código do programa fica mais organizado e pode-se invocar a função em qualquer outro trecho do programa.
- Por isso, alguns funções muito úteis acabam sendo implementadas pelos desenvolvedores nos ambientes
- de programação.
- </p>
- <p>
- Por exemplo, em <i>Python</i> existe a função <tt>sorted(.)</tt> que ordena listas (e tuplas),
- mas também existe um método sobre lista (não sobre tupla) que também ordena lista:
- <div class="codigo"><pre> lista = ["tres", "quatro", "um", "dois"];
- <verm>print</verm>("Ordenado via 'sorted': %s" % sorted(lista)); <cyan># ['dois', 'quatro', 'tres', 'um']</cyan></tt>
- lista.sort(); <cyan># nao tente imprimir direto "lista.sort()" senao aparece "None"</cyan></tt>
- <verm>print</verm>("Ordenado via 'lista.sort()': %s" % lista); <cyan># ['dois', 'quatro', 'tres', 'um']</cyan></tt></pre></div>
- Note que o resultado em <tt>lista</tt> será
- <tt>['dois', 'quatro', 'tres', 'um']</tt>, pois a ordem é lexicográfica (do dicionário).
- </p>
- <p>
- Outra observação importante, o método <i>sort()</i> <b>não</b> está definido para <i>tuplas</i>,
- ou seja, os comandos
- <tt>lista = ("tres", "quatro", "um", "dois"); lista.sort(); <verm>print</verm>(lista);</tt>
- resultaria erro (<tt>AttributeError: 'tuple' object has no attribute 'sort'</tt>).
- </p>
- <p>
- 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>.
- Nesses exemplos utilizamos uma técnica de pré-alocar todo o espaço para a lista, utilizando um valor máximo
- para o número de posições a serem utilizadas (o <tt>M = 20;</tt>).
- Depois solicitamos que o usuário digite o número de elementos que ele deseja inserir na lista
- (não fazemos um teste, mas nessa técnica esse valor <b>tem que ser menor que M</b>),
- então utilizamos um laço para solicitar a "entrada" de cada elemento, inserindo-o na posição adequada da lista.
- </p>
- <p><center>
- <table class="tbCodeLinCol">
- <tr><th colspan="3">Listas em <i>Python</i> com alocação inicial de todo o espaço à <i>priori</i></th> </tr>
- <tr>
- <th>Vetor de caracteres</th>
- <th>Vetor de inteiros</th>
- <th>Vetor de flutuantes</th></tr>
- <tr valign="top">
- <td><div class="codigo"><pre>M = 20 <cyan># usado para dimensionar os vetores</cyan></tt>
- <verm>def</verm> main () :
- vetC = list(range(0,M)); <cyan># Vetor para inteiros (M elementos)</cyan></tt>
- nC = <verm>int</verm>(input()); <cyan># Ler quem definira' tamanho</cyan></tt>
- <azul>for</azul> i in range(0, nC) : <cyan># Para ler nC caracteres</cyan></tt>
- vetI[i] = <verm>raw_input</verm>(); <cyan># no Python 3 usar 'input()'</cyan></tt>
- <azul>for</azul> i in range(0, nC) : <cyan># imprimir os elementos</cyan></tt>
- <verm>print</verm>(vetI[i]);</pre></div></td>
- <td><div class="codigo"><pre>M = 20 <cyan># usado para dimensionar vetores</cyan></tt>
- <verm>def</verm> main () :
- vetI = list(range(0,M)); <cyan># Vetor de inteiros (M elementos)</cyan></tt>
- nI = <verm>int</verm>(input()); <cyan># Ler quem definira' tamanho</cyan></tt>
- <azul>for</azul> i in range(0, nI) : <cyan># Para ler nI inteiros</cyan></tt>
- vetI[i] = <verm>int</verm>(input())
- <azul>for</azul> i in range(0, nI) : <cyan># Imprimir os elementos</cyan></tt>
- <verm>print</verm>(vetI[i]);</pre></div></td>
- <td><div class="codigo"><pre>M = 20 <cyan># Para dimensionar os vetores</cyan></tt>
- <verm>def</verm> main () :
- vetF = list(range(0,M)); <cyan># Vetor para inteiros (M elementos)</cyan></tt>
- nF = <verm>int</verm>(input()); <cyan># Ler quem definira' tamanho</cyan></tt>
- <azul>for</azul> i in range(0, nF) : <cyan># Para ler nF inteiros</cyan></tt>
- vetI[i] = float(input());
- <azul>for</azul> i in range(0, nI) : <cyan># Imprimir os elementos</cyan></tt>
- <verm>print</verm>(vetI[i]);</pre></div></td>
- </tr>
- </table></td></tr>
- </table></center>
- </p>
- <p>
- Vale notar que, como em <i>Python</i> o espaço para o vetor é reservado durante a execução, não é necessário
- pré-dimensionar o espaço para o "vetor" como nos 3 códigos acima, e pode-se usar como linhas 3 e 4:
- <tt>nI = <verm>int</verm>(input()); vetI = list(range(0,nI));</tt>.
- </p>
- <p>
- Por fim, vale destacar um detalhe a respeito de como "digitar" os dados usando o comando <i>input</i>.
- No <i>Python 2</i>,
- Nos códigos acima, se o usuário digitar
- <tt>SyntaxError: invalid syntax</tt>.
- </p>
- <p>
- Podemos adotar outra técnica para registro dos dados na lista, desta vez não usando alocação <i>a priori</i>
- de espaço e sim estendendo a lista a cada novo elemento digitado. Mas ainda usando a técnica que obriga o usuário
- a digitar um único valor por vez (que dizer, digitar um inteiro e teclar <tt>ENTER</tt>).
- Esse exemplo está à esquerda da tabela abaixo.
- </p>
- <p>
- Na coluna da direita da tabela mostramos um exemplo distinto, no qual não é necessário digitar <i>a priori</i>
- o número de inteiros que comporão a lista. O usuário deverá digitar todos os dados em uma mesma linha, com um
- único <tt>ENTER</tt> ao final, e o código decompõe a "string" digitada, utilizando como separadores
- <i>espaço em branco</i> para deduzir quais são os inteiros.
- </p>
- <p><center>
- <table class="tbCodeLinCol">
- <tr><th colspan="3">Listas em <i>Python</i> com alocação dinâmica de espaço e tipos de digitação</th> </tr>
- <tr>
- <th>Digitando um elemento por vez</th>
- <th>Digitando todos os elementos de uma vez</th></tr>
- <tr valign="top">
- <td><div class="codigo"><pre><verm>def</verm> alocacaodinamica1por_linha () :
- vetI = []; <cyan># Aloca um "vetor" vazio</cyan></tt>
- <cyan># nI = <verm>int</verm>(input());</cyan></tt>
- nI = M;
- <azul>for</azul> i in range(0, nI) : <cyan># ler nI inteiro</cyan></tt>
- vetI.append(<verm>int</verm>(input())); <cyan># le novo elemento e estende a lista</cyan></tt>
- <verm>print</verm>("Lista: ", end=""); <cyan># imprimir sem mudar de linha</cyan></tt>
- <azul>for</azul> i in range(0, nI) : <cyan># imprimir os elementos</cyan></tt>
- <verm>print</verm>("%d " % vetI[i], end=""); <cyan># imprimir sem mudar de linha</cyan></tt>
- <verm>print</verm>(); <cyan># quebrar a linha ao final</pre></div></td></cyan></tt>
- <td><div class="codigo"><pre><verm>def</verm> alocacaodinamica_varios_por_linha () :
- <cyan># como leremos por linha, pode-se deduzir depois o tamanho da lista</cyan></tt>
- linha = <verm>raw_input</verm>(); <cyan># ler como caracteres para poder pegar uma linha inteira - no Python 3 usar 'input()'</cyan></tt>
- vetI = map(<verm>int</verm>, linha.split()); <cyan># decomponha a linha em itens e faz um mapeamento, passando cada item para inteiro</cyan></tt>
- nI = len(vetI); <cyan># pegar tamanho da lista digitada</cyan></tt>
- <verm>print</verm>("Lista: ", end=""); <cyan># imprimir sem mudar de linha</cyan></tt>
- <azul>for</azul> i in range(0, nI) : <cyan># imprimir os elementos</cyan></tt>
- <verm>print</verm>("%d " % vetI[i], end=""); <cyan># imprimir sem mudar de linha</cyan></tt>
- <verm>print</verm>(); <cyan># quebrar a linha ao final</cyan></tt></pre></div></td>
- </tr>
- </table></td></tr>
- </table></center>
- </p>
- <p class="autoria">
- <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/20: acertos no formato<br/>
- 2020/08/11: acerto formato, pequenos acertos no texto<br/>
- 2020/05/05: acrescentada subseção <i>Por que precisamos de vetores?</i><br/>
- 2019/06/11: detalhes de forma;<br/>
- 2019/06/04: revisão geral.
- </p>
- </div>
|