Forráskód Böngészése

Escrito até o fim da seção 3

bernardo 5 éve
szülő
commit
1bca8cc262
4 módosított fájl, 292 hozzáadás és 28 törlés
  1. 1 1
      comandos_Python.html
  2. 12 0
      css/style.css
  3. 6 8
      index.html
  4. 273 19
      perguntas_Basicas.html

+ 1 - 1
comandos_Python.html

@@ -27,7 +27,7 @@
       Y = 1.0 //cria a variável Y com tipo float com valor 1.0
       S = "MAC2166" //cria a variável S do tipo String com valor MAC2166
       Z = true //cria a variável Z do tipo bool com o valor true
-    </pre><br /><br />
+    </pre><br />
 
   <li><b>Atribuição:</b> Permite atribuirmos valores (fixo ou resultado de uma expressão aritmética) a variável, caso ela ainda não exista será
     declarada com o tipo correspondente ao resultado da expressão(EXPR).</li>

+ 12 - 0
css/style.css

@@ -0,0 +1,12 @@
+h1{
+  text-align: center;
+  margin-bottom: 2px;
+}
+
+br{
+  margin-bottom: 8px;
+}
+
+table, th, td{
+  border : 1px solid black;
+}

+ 6 - 8
index.html

@@ -7,11 +7,10 @@
   <body>
     <h1>1 - Introdução</h1>
     <p>
-      O objetivo desta apostila é introduzir o conceito de algoritmos(seção 2) e principalmente, apresentar algumas obre
-       como escrever um algoritmo a partir de um problema dado.  Para isto iremos introduzir comandos nas linguagens
+      O objetivo desta apostila é introduzir o conceito de algoritmos(seção 2) e principalmente, apresentar algumas dicas sobre
+       como deduzir um algoritmo que resolva um dado problema.  Para isto iremos introduzir comandos nas linguagens
        C e Python. Iremos deduzir algoritmos a partir de alguns problemas/exemplos.
-    </p>
-    <p>
+    <br />
       Esta dedução será construtiva: começaremos anaisando casos particulares e só então generalizaremos na forma de um algoritmo. E como uma técnica
       auxiliar, propomos ao programador iniciante que tente consturir seus algoritmos a partir de quatro questões básicas descritas na seção 3.
     </p>
@@ -19,12 +18,11 @@
     <h2>1.1 - O que é um algoritmo</h2>
     <p>
       Um algoritmo é uma sequência de passos elementares, executados um após o outro seguindo o fluxo de execução (de cima para baixo)
-      Em geral, um <b>algoritmo</b> deve ser <b>aplicado</b> sobre um conjunto de <b>valores</b> para produzir um conjunto de <b>valores</b> como resposta.
+      Em geral, um <b>algoritmo</b> deve ser <b>aplicado</b> sobre um conjunto de <b>valores</b> para produzir um outro conjunto de <b>valores</b> como resposta.
       Uma característica que um algoritmo deve apresentar é ser determinístico: sempre que este for aplicado sobre o mesmo conjunto de entradas
       deverá produzir sempre a mesma saida
-    </p>
-    <p>
-      Nos exemplos utilizaremos quatro classes de comandos:
+    <br />
+      Nos exemplos utilizaremos quatro tipos de conceitos:
     </p>
     <ul>
       <li>Variável: É utilizada para armazenar valores e resultados aritméticos;</li>

+ 273 - 19
perguntas_Basicas.html

@@ -2,6 +2,7 @@
 <html>
 <head>
   <meta charset="UTF-8"/>
+  <link href="css/style.css" rel="stylesheet">
   <title>Exemplos</title>
 </head>
 <body>
@@ -23,7 +24,7 @@
          <li><b>1ª Pergunta:</b> Quais variáveis são necessárias?</li>
          <li><b>2ª Pergunta:</b> Quais comandos devem apareceer dentro de um bloco de repetição?</li>
          <li><b>3ª Pergunta:</b> Qual a condição para que continue a repetição?</li>
-         <li><b>4ª Pergunta:</b> Quais os comandos neceessários antes e depois do bloco de repetição?</li>
+         <li><b>4ª Pergunta:</b> Quais os comandos necessários antes e depois do bloco de repetição?</li>
        </ul>
        <br />
 
@@ -34,29 +35,26 @@
        levadas em conta para cada novo bloco de repetição. No entanto, a experiência tem-nos mostrado que, pelo menos enquanto se esta comecando a  aprender  a
       descrever  processos  em  liguagens  estruturadas,  estas  perguntas  servem  como  um  bom  roteiro  ao programador iniciante.<br />
 
-      Veremos, a seguir, o desenvolvimento de programas para alguns problemas.
+      Veremos, a seguir, o desenvolvimento de programas para alguns problemas.<br />
+      Obs: Nos códigos em C só serão mostradas as partes centrais do código, para ter um código funcional você deverá importar as respectivas bibliotecas e adicionar o código
+      dentro da função main
     </p>
     <h2>3.1 - Como somar um número arbitrário de valores</h2>
     <p>
       <b>Problema: </b> Faça um programa que leia uma sequência de números inteiros, diferentes de zero, e calcule a sua soma.<br />
-      <br />
       Se a sequência de entrada tivesse um tamanho fixo conhecido, digamos 4, a descrição do processo não seria complicada, bastando escrever:
       <center>
-      <table border='1'>
+      <table>
        <tr>
          <th> C </th>
          <th>Python</th></tr>
        <tr>
          <td>
            <pre>
-#include < stdio.h> //inclui a biblioteca que lida com scanf e printf
-int main(){ //inicia a função principal
-  int n1, n2, n3, n4, soma; //cria as 5 variáveis que serão utilizadas
-  scanf("%d %d %d %d", &n1, &n2, &n3, &n4); //lê 4 inteiros
-  soma = n1+n2+n3+n4; //soma os 4 inteiros lidos
-  printf("%d", soma); //imprime o resultado da soma
-  return 0; //finaliza a função principal
-}
+int n1, n2, n3, n4, soma; //cria as 5 variáveis que serão utilizadas
+scanf("%d %d %d %d", &n1, &n2, &n3, &n4); //lê 4 inteiros
+soma = n1+n2+n3+n4; //soma os 4 inteiros lidos
+printf("%d", soma); //imprime o resultado da soma
            </pre>
          </td>
          <td>
@@ -75,8 +73,8 @@ print(soma) //imprime o resultado da soma
   <br />
      No entanto a solução muda radicalmente se desejamos escrever um algoritmo que funcione para um número arbitrário de valores de entrada (este número é
      definido pelo usuário durante a execução do algoritmo). Neste caso, a dificuldade reside no fato de o programa ser capaz de somar uma sequência de qualquer
-     tamanho.<br /><br />
-     Antes de continuar, reflita um pouco sobre esta questão e tente escrever um código que permita a soma de uma sequência de qualquer tamanho.<br /><br />
+     tamanho.<br />
+     Antes de continuar, reflita um pouco sobre esta questão e tente escrever um código que permita a soma de uma sequência de qualquer tamanho.<br />
      Duas possíveis soluções são:
      <ul>
        <li>Ao início da execução do algoritmo o usuário digitar qual o tamanho da sequência</li>
@@ -104,7 +102,7 @@ print(soma) //imprime o resultado da soma
     <h3>Quais variáveis são necessárias?</h3>
     Vemos a necessidades de 2 variáveis: uma para guardar o último número lido e outra para guardar a soma dos número já lidos. Então teremos:
     <center>
-    <table border='1'>
+    <table>
      <tr>
        <th> C </th>
        <th>Python</th></tr>
@@ -126,14 +124,14 @@ soma = 0</pre>
   Inicialmente, no código em C o valor das variáveis(quaisquer) está indefinido, já no código em Python está definido em 0 e portanto devemos cuidar das
   "inicializações" antes do primeiro teste <b>while (num !=0)</b>. Quanto deve valer a variável num neste momento inicial?<br />
   Uma solução possível é o tratamento do primeiro número da sequência como caso à parte, antes de entrarmos no comando de repetição. Deste modo, devemos ler
-  o primeiro número fora da repetição e já contabilizar na soma.<br />
+  o primeiro número fora da repetição e já contabilizar na soma.
   <br />
-  <b>Exercício 1</b> Tente elaborar outra solução, que não faça uma primeira leitura de num dentro do laço<br />
+  <b>Exercício 1:</b> <i>Tente elaborar outra solução, que não faça uma primeira leitura de num dentro do laço</i>
   <br />
   Após a repetição devemos imprimir o conteúdo da variável <b>soma</b>, que deverá conter a soma dos elementos da sequência de entrada.<br />
   Escrevendo o código temos:<br />
   <center>
-  <table border='1'>
+  <table>
    <tr>
      <th> C </th>
      <th>Python</th></tr>
@@ -169,7 +167,7 @@ o seu funcionamento. Na simulação de um algoritmo/programa devemos anotar toda
 conjunto de entrada<br />
 Melhor que muitas explicações complicadas é um bom exemplo. Vejamos a simulação do programa acima para o conjunto de entradas 10 3 4 0 no algoritmo em C:
 <center>
-  <table border='1'>
+  <table>
     <tr>
       <th>num</th>
       <th>soma</th>
@@ -256,6 +254,262 @@ Melhor que muitas explicações complicadas é um bom exemplo. Vejamos a simula
     </tr>
   </table>
 </center>
+<b>Saída do programa: 17</b>
+<br />
+Deve-se notar que após o programa "ler" o número 0(C: linha 5; Python: linha 4), ainda é executado o comando soma = soma + num antes do fluxo de execução
+voltar ao inicio do comando <b>while</b>. Mas isto não provoca qualquer erro, uma vez que o valor "lido"(0) não altera o valor da soma. No entanto, o que
+fazer se o programa consistisse em somar uma sequência de inteiros não negativos (positivos ou nulos), finalizada por um número negativo?<br />
+
+Antes de seguir com a leitura pense na questão<br />
+
+Uma primeira tentativa em responder à questão anterior é tentar aproveitar a versão anterior, trocando apenas a condição de parada do while de num != 0
+para num >= 0.<br />
+Porém isto não funcionaria, pois ao digitar um finalizador (número negativo), este será adicionado ao conteúdo de soma(C: linha 6; Python: linha 5), "estragando"
+o resultado final.<br />
+Se a solução do novo problema não pode ser tão semelhante à versão anterior, também não será radicalmente diferente. Basta efetuarmos uma mera inversão entre as
+linhas dentro do comando while(C: 5 com 6; Python: linha 4 com 5), além da troca da condição de parada acima citada.<br />
+<center>
+<table>
+ <tr>
+   <th> C </th>
+   <th>Python</th></tr>
+ <tr>
+   <td>
+     <pre>
+1  int num, soma;
+2  scanf("%d", &num);
+3  soma = num;
+4  while (num >= 0){
+5    soma = soma + num;
+6    scanf(%d, &num);
+7  }
+8  printf("%d",soma);
+     </pre>
+   </td>
+   <td>
+     <pre>
+1  num = input();
+2  soma = num;
+3  while num >= 0:
+4    soma = soma + num
+5    num = input()
+6  print(soma)
+     </pre>
+   </td>
+ </tr>
+</table>
+</center>
+Note também a diferença da inicialização da variável <b>soma</b>. Começando com zero ela ficará com o valor desejado após a primeira execução do comando <i>soma = soma + num</i>,
+ou seja, ela assumirá o valor do primeiro elemento da sequência (se este não for negativo). Note também que para uma sequência vazia, ou seja, para a entrada que já começa com um
+número negativo, o resultado escrito na saida será 0, que é o desejado.<br />
+<b>Exercício 2:</b><i>Fala a simulação deste programa para as entradas 10   3   4   -5 e veja as diferenças em relação à versão anterior do código, prestando atenção às linhas
+5 e 6 no C, 4 e 5 no Python. Note que após a leitura do número -5, não é executado o comando <b>soma = soma + num</b>, pois o teste do <b>while</b> fica falso e o programa para
+o comando de escrita (printf no C; print no Python) </i><br /><br />
+
+<b>Exercício 3: </b><i>Ainda considerando o enunciado do problmea 2, verifique o que há de errado com o programa a seguir:</i><br />
+<center>
+<table>
+ <tr>
+   <th> C </th>
+   <th>Python</th></tr>
+ <tr>
+   <td>
+     <pre>
+1  int num, soma;
+2  scanf("%d", &num);
+3  soma = 0;
+4  while(num!=0){
+5    scanf("%d", num);
+6    soma = soma + num;
+7  }
+8  printf("%d", soma);
+     </pre>
+   </td>
+   <td>
+     <pre>
+1  num = input();
+2  soma = 0
+3  while num != 0:
+4    num = input()
+5    soma = soma+num
+6  print(soma)
+     </pre>
+   </td>
+ </tr>
+</table>
+</center>
+</p>
+
+<h2>3.2 - Como computar uma potência de inteiros usando laço de repetição</h2>
+<p>
+  <b>Problema 3:</b><i>Dado X real e N natural, faça um programa que calcule X<sup>N</sup></i><br />
+  Novamente, se N fosse fixo, por exemplo n=3, bastaria fazer<br />
+  <center>
+    <table>
+     <tr>
+       <th> C </th>
+       <th>Python</th></tr>
+     <tr>
+       <td>
+         <pre>
+1  int x;
+2  scanf("%d", &x);
+3  printf("%d", x*x*x);
+         </pre>
+       </td>
+       <td>
+         <pre>
+1  x = input()
+2  print(x*x*x)
+         </pre>
+       </td>
+     </tr>
+    </table>
+  </center>
+Portanto a dificuldade deste problema se encontra na repetição arbitrária: repetir a operação de multiplicação um número variável de vezes, dependente da vontade do usuário.<br />
+Novamente, vamos iniciar o processo de resolução examinando um exemplo, x=2 e n=7.<br />
+1. Multiplique X por X, guardando o resultado desta conta(4); <br />
+2. Multiplique por x o resultado guardado, guardando o novo resultado (8);<br />
+3. Repita o passo(2) outras 4 vezes (pois n=7 e x já entrou 3 vezes como fator de multiplicação) obtendo o resultado final, 128.<br />
+<h3>Quais são as variáveis necessárias?</h3>
+Claramente precisamos de variáveis para armazenar X e N. Além destas, será necessária outra variável (<b>result</b>) para armazenar o resultado das operações de potenciação de X,
+sem a qual não será possível guardar o resultado das multiplações executadas(reflita sobre isto!).<br />
+Neste problema, notamos uma novidade em relação ao anterior, precisamos contar quantas vezes já usamos o fator X (original). assim, vamos denotar esta variável pelo sugestivo nome de
+<b>cont</b>: a cada multiplicação somaremos 1 nessa variável. Assim, deveremos declarar as seguintes variáveis:<br />
+<center>
+  int x, n, result, cont;
+</center>
+<h3>Quais os comandos devem aparecer dentor do bloco de repetição?</h3>
+Podemos observar no esquema inicial, elaborado acima, que o passo (2) é a parte repetitiva do processo: multiplicar o resultado atual de <b>result</b> por X, guardando este produto
+novamente em <b>result</b>. Feito isto, devemos então somar 1 ao contador <b>cont</b>, para indicar que mais uma multiplicação foi efetuada.
+<center>
+<table>
+ <tr>
+   <th> C </th>
+   <th>Python</th></tr>
+ <tr>
+   <td>
+     <pre>
+while (condição){
+  result = result*x;
+  cont = cont+1;
+}
+     </pre>
+   </td>
+   <td>
+     <pre>
+while condição:
+  result = result*x
+  cont = cont+1
+     </pre>
+   </td>
+ </tr>
+</table>
+</center>
+<h3>Qual a condição para que continue a repetição?</h3>
+Já foi observado que a variável <b>cont</b> serve para contar quantas vezes o fator X já entrou no produto, assim devemos interromper o laço quando <b>cont==n</b>, ou de outro modo,
+devemos continuar enquanto <b>cont< n</b>.
+<center>
+<table>
+ <tr>
+   <th> C </th>
+   <th>Python</th></tr>
+ <tr>
+   <td>
+     <pre>
+while (<b>cont < n</b>){
+  result = result*x;
+  cont = cont+1;
+}
+     </pre>
+   </td>
+   <td>
+     <pre>
+while <b>cont < n</b>:
+  result = result*x
+  cont = cont+1
+     </pre>
+   </td>
+ </tr>
+</table>
+</center>
+<h3>O que deve vir antes da repetição?</h3>
+Em primeiro lugar, devemos ler os valores <b>x</b> e <b>n</b>. Precisamos também atribuir valores iniciais adequados às variáveis <B>cont</B> e <b>result</b>. Como <b>cont</b> totaliza
+quantos fatores <b>x</b> já entraram no produto, o valor inicial de <b>cont</b> é zero. Assim, após a primeira execução do comando <b>result = result*x</b>, gostariamos de obter o valor
+de <b>x</b> em <b>result</b> e por isto devemos impor que <b>result</b> comece com o valor 1.<br />
+Interrompido o laço, a resposta estará armazenada em <b>result</b>:
+<center>
+<table>
+ <tr>
+   <th> C </th>
+   <th>Python</th></tr>
+ <tr>
+   <td>
+     <pre>
+1  int x, n, result, cont;
+2  scanf("%d %d", &x, &n);
+3  cont = 0;
+4  result = 1;
+5  while (<b>cont < n</b>){
+6    result = result*x;
+7    cont = cont+1;
+8  }
+9  printf("%d", result);
+     </pre>
+   </td>
+   <td>
+     <pre>
+1  x = input()
+2  n = input()
+3  cont = 0
+4  result = 1
+5  while <b>cont < n</b>:
+6    result = result*x
+7    cont = cont+1
+8  print(result)
+     </pre>
+   </td>
+ </tr>
+</table>
+</center>
+<b>Exercício 4</b> <i>Repare que o programa dá a resposta correta quando n==0, porém quando x==0 e n==0 teriamos um resultado, mesmo que na matemática 0<sup>0</sup>
+  é indeterminado.</i><br />
+<b>Exercício 5</b> <i>Sugerimos como exercício a simulação deste programa, para alguns dados de entrada à escolha do leitor.</i><br />
+<b>Exercicio 6</b> <i>O programa abaixo foi proposto para calcular x<sup>n</sup>. Analise o algoritmo, ele está correto? Se não estiver o que há de errado?</i>
+<center>
+<table>
+ <tr>
+   <th> C </th>
+   <th>Python</th></tr>
+ <tr>
+   <td>
+     <pre>
+1  int x, n, cont;
+2  scanf("%d %d", &x, &n);
+3  cont = 0;
+4  while (cont < n){
+5    c = x*x;
+6    cont = cont+1;
+7  }
+8  printf("%d", x);
+     </pre>
+   </td>
+   <td>
+     <pre>
+1  x = input()
+2  n = input()
+3  cont = 0
+4  while cont < n:
+5    x = x*x
+6    cont = cont+1
+7  print(x)
+     </pre>
+   </td>
+ </tr>
+</table>
+</center>
+<b>Exercício 7</b> <i>É possível alterar o programa-solução do problema 3, dispensando a variável contadora <b>cont</b>? Isto é, tente deduzir uma outra versão para o
+referido problema, utilizando apenas três variáveis <b>x</b>, <b>n</b> e <b>result</b></i>.
 </p>
 </body>
 </html>