sexta-feira, 31 de maio de 2013

Estruturas de repetição (1)


       Olá! Boa noite! Hoje darei início aos posts abordando também as estruturas de repetição. Elas podem ser o For(para), While (Enquanto) e Do-While(Faça-Enquanto). Basicamente a diferença entre o For e as estruturas While, é que o primeiro é geralmente usado para problemas em que se sabe quantas iterações (repetições) serão realizadas, e que a realização dessas não depende de outra condição inicial. Já as estruturas While são usadas para quando se quer uma contagem indefinida, por exemplo procurar uma solução de equação ou problema de Programação Linear*. Ou seja, quando uma solução é encontrada o While pára automaticamente.

       As estruturas tem as seguintes "caras":
              
              For(Inicialização;Limite;Incremento){Comandos;}
          
              While(Condição){Comandos;}

              Do{Comandos;}While(Condiçao);

       Há ainda a diferença entre While e Do-While que é o seguinte: o While só executa se a condição for atendida. O Do-While executa pelo menos uma vez, ainda que sua condição não esteja satisfeita, e então, se for este o caso, pára. Ou seja:


Programa 2: While e Do-While em C

  1.               #include<stdio.h>
  2.               
  3.               int main(){

  4.                                int i=6;

  5.                                while(i==2){
  6.                                                    i=i*3;
  7.                                                    printf("\n\n%d\n\n",i);
  8.                                                   }//Este loop nunca irá rodar

  9.                                do{
  10.                                       i=i*5;
  11.                                       printf("\n\n%d\n\n",i);
  12.                                      }while(i==2); // Este loop será executado e trará resposta 30 na tela.
  13.                                
  14.                                system("pause");
  15.                                return 0;
  16.                               
  17.                               }

      Entretanto, pensei esse post para falar mais do For, na sequência lançar outros sobre While/Do-While e mais tarde mais aplicações dos três...
    O For, como já foi dito, tem a seguinte "cara": For(Inicialização;Limite;Incremento){Comandos;}. A inicialização, é de onde partirá a "contagem", o limite é até onde ela vai, e o incremento de qual valore ela vai ser acrescida ou decrescida a cada repetição. Imagine o seguinte, um algoritmo que diga para subir uma escada de 30 degraus, um a um. Logo, você parte do primeiro degrau ( 0 ), chega ao último degrau (29) e sobe de um em um (i++). Seria algo mais ou menos assim:

Programa 3: For básico em C
  1.               #include<stdio.h>
  2.               
  3.               int main(){

  4.                                int i=0;

  5.                                for(i=0;i<30;i++){//(Inicialização;Limite;Incremento)
  6.                                                              printf("\n\n%d\n\n",i);
  7.                                                             }//Este loop executa 30 passos, do 0 ao 29.

  8.                                
  9.                                system("pause");
  10.                                return 0;
  11.                               
  12.                               }
    Note que o a variável de repetição, i, na linguagem C tem que ser declarada antes da estrutura For. Também é bom notar que o limite imposto NUNCA é atingido. Por exemplo, se o limite é 30, os loops vão até i = 29! Parece óbvio, pois olhando o sinal, o limite é menor que 30. Entretanto essa é uma característica do For que pode trazer resultados errados ao seu programa, se você se esquecer dela. 
      Há também o For usado com decremento, ou seja diminuindo. Imagine agora, que você quer descer a mesma escada que acabou de subir, o programa fica quase igual, exceto pela linha 7:

      7.                                for(i=30;i>0;i--){//(Inicialização;Limite;Incremento)

    Nesse For, o i começa de fato em 30, decresce um a um, chega em 1 e pára. É o chamado For Backward (de trás pra frente). O anterior é o For Foward.
      Na maior parte das vezes, usa-se o for para contagens, para adicionar dados a algum problema, para realizar testes nos programas, etc... A seguir um exemplo simples:

Programa 4: Fatorial com For em C
  1.               #include<stdio.h>
  2.               
  3.               int main(){

  4.                                int i=0,s=1;

  5.                                for(i=1;i<11;i++){//(Inicialização;Limite;Incremento)
  6.                                                            s*=i; // A cada repetição, s é multiplicada por i.
  7.                                                             }//Este loop executa 10 passos, do 1 ao 10.

  8.                                printf("\n\n%d\n\n",i);//Saída 3628800

  9.                                
  10.                                system("pause");
  11.                                return 0;
  12.                               
  13.                               }
Observações:

    Programação Linear é uma área da otimização, que utiliza uma função objetivo, e restrições lineares. Ou seja, problemas do tipo maximizar lucro de uma fábrica que possui "x" funcionários e precisa produzir "y".
    
    Os sinais "++","--" são alternativos para "i=i+1" e "i=i-1". Já " s*=i " é o mesmo que " s=s*i ". Isso funciona da mesma forma para " s+=i ", " s-=i "...

    A seguir alguns bons livros sobre C/C++:

      Introdução à programação. 500 Algoritmos resolvidos. Por Anita Lopes e Guto Garcia.
      Guia C++ para Iniciantes por Herbet Schildt.
      C Completo e Total por Herbert Schildt.

Proposta: Tente, usando o For, resolver o seguinte problema de Programação Linear.

    A Capitão Caverna S.A., localizada em Pedra Lascada, aluga 3 tipos de barcos para passeios marítimos: jangadas, super-canoas e arcas com cabine. A companhia fornece juntamente com o barco um capitão para navegá-lo e uma tripulação que varia de acordo com a embarcação: uma para jangadas, duas para super-canoas e três para arcas. 
    A companhia tem 4 jangadas, 8 super-canoas e 3 arcas; e em seu corpo de funcionários: 10 capitães e 18 tripulantes.
    O aluguel é por diárias e a Capitão Caverna lucra $50 por jangada, $70 por super-canoa e $100 por arca.

    Objetivo: Maximizar o lucro obedecendo as restrições impostas.
(Resposta 4 jangadas, 4 super-canoas, 2 arcas, lucro $ 680)
Solução: Programa 5 - Barcos Otimização


Bom fim de semana à todos!

terça-feira, 28 de maio de 2013

Um pouco sobre C/C++, Linhas Condicionais.

       Bom dia! Me chamo Rodrigo. Atualmente sou estudante de Engenharia Elétrica da UFJF, tendo começado o curso de    engenharia no IFET-Sudeste.. De agora em diante serei colaborador do blog e vou postar alguns tópicos de estudo sobre C, C++, posteriormente aplicações nas áreas de modelagem computacional (basicamente a implementação de problemas reais), curiosidades, desafios... Enfim, será uma série para estudos das linguagens C, C++ e sobre aplicações práticas da programação.
       Pra quem precise aprender para a faculdade é uma boa, pra quem gosta ou tem bolsa de pesquisa mais ainda. É uma área muito visada no meio da engenharia, pois muito da pesquisa que se faz em universidades se passa pela simulação computacional...
       Não farei aqui algum tipo de apostila ( pois na internet já existem várias), o que farei são postagens com programas já feitos e algumas discussões sobre seu funcionamento. Para iniciar (seguir) seus estudos, já foi recomendado aqui, o material do Prof. Jabour disponível em Apostila, na aba Ensino, é uma boa pedida pra quem nunca viu C... Também há vários bons livros sobre C e C++, que no próximo post irei recomendar aqui. Podem fazer perguntas e sugestões à vontade nos comentários!



Programa 1: Soma e Subtração básica em C



  1. #include <stdio.h>// biblioteca padrão em C

  2. int main ( ) {
  3.                   int a, b, soma, final; // Declaração das variáveis

  4.                   printf("\n Digite um valor:\n"); // Comando de impressão na tela

  5.                   scanf ("%d",&a); // Lê o que o usuário digitou no teclado

  6.                   printf("\n Digite um segundo valor:\n");

  7.                   scanf ("%d",&b);

  8.                   soma = a+b; // Soma os valores a e b e atribui o resultado à variável soma.

  9.                   if (soma>20) {
  10.                                          final = soma+8; } // Comando condicional
  11.     
  12.                   else {
  13.                            final = soma-5; } // Complemento do comando condicional
  14.                   
  15.                   printf ("\n O resultado e: %d", final);

  16.          
  17.                   system("pause") // Linha de comando para que se possa visualizar o resultado na tela
  18.                   return 0; } // Retorno da função main( )




       Bem, esse é um programa bem simples de ser entendido, mesmo por quem ainda está começando. São 26 linhas de código, o que é bem pouco. Na linha 1 temos a inclusão da biblioteca stdio.h, que faz parte da biblioteca padrão de C. Biblioteca é, basicamente, um conjunto de funções. Na linha 3 temos a declaração da função main ( ), que deve estar em qualquer programa em C. Por ela se dá a execução do código. Em seguida dois pares printf/scanf que servem para pedir que o usuário digite um valor e em seguida armazenam esse valor em variáveis int. Na linha 14 faz-se a soma dos valores que o usuário digitou. Logo vem o mais interessante desse programa, as linhas condicionais. Na linha 16 temos : Se a soma for maior que 20 faça isto ( soma + 8). Na sequência, na linha 19 temos o complemento: Senão faça isto (soma - 5). Ou seja, se a soma de 'a' e 'b' for menor ou igual a 20 ( note que a condição é >20) ele subtrai 5 e, somente se, for maior que 20 ele soma 8. O resultado é impresso e o código retorna 0 para main ( ).

Observações:
     
       //As linhas verdes, precedidas por // são apenas comentários! Não interferem no código e são muito úteis em qualquer programa... Lembre-se de que há programas complexos e extensos, e sem comentários é praticamente impossível entender seu funcionamento.

       Atente para a identação do código. Ou seja, os espaços antes de cada comando. O que pertence ao if, à frente do if, o que pertence ao else, à frente do else...

       A linha 25 serve somente para que a tela "congele" ao mostrar o resultado. É uma maneira de fazer isso, apesar de haver controversas, nunca tive problemas com ela. Mais adiante postarei uma alternativa.

       A linha 26 dá o retorno da função main ( ). É recomendado dar algum retorno para toda função que não seja do tipo void ( que não possui retorno ).

Proposta:

       Modifique o programa bastante. Mude as operações, faça com produtos( * ), divisões( / ), etc... Inclua printf para que mostre o resultado da operação antes de entrar nas linhas condicionais ( essa é uma ótima maneira de testar programas que dão errado, e achar o erro!), mude o else da linha 19 por outro if, e tente obter o mesmo resultado...

Boa semana à todos!