quarta-feira, 13 de novembro de 2013

Funções, vamos declarar!

Até agora, todos os programas foram simples e pequenos, onde tudo cabia no mesmo lugar.
Programas grandes e complexo precisam ser feitos de outra forma, para isso, vamos utilizar funções.

Existe vários motivos para dividir problemas complexos em funções. O principal, é a reutilização do código.
Já fizemos alguns programas com funções matemáticas básica, imagine como seria bacana, utilizar cada função que foi escrita no mesmo programa!?

Escrever e utilizar uma função segue o seguinte fluxo:

void NomeDaFuncao()
{
 // código aqui...
 return;
}
int mains(int nNumberofArgs, char* pszArgs[])
{
 //código do programa...
//agora, vamos chamar a função NomeDaFuncao()
NomeDaFuncao();

//aqui o controle retorna
}

1- A declaração:
A primeira coisa é a declaração da função, com um nome e o tipo à frente, seguido por um conjunto de parenteses de abertura e fechamento.

2- A definição:
A declaração é seguida da definição do que ela faz. Este é o corpo da função que sempre começa com uma chave de abertura e uma chave de fechamento.

3- O retorno:
O corpo da função contem zero ou mais declarações de retorno. O retorno faz o controle voltar para imediatamente depois do ponto onde a função foi chamada.

4- A chamada:
A função é chamada invocando o nome da função seguida por parênteses de abertura e fechamento.

Retorno da Função.
As funções retornam um valor a quem chama.
Para retornar um valor de uma função, é necessário fazer duas alterações:

1°. Substituir void pelo tipo de valor que vc deseja retornar.
2°. Colocar o valor a retornar depois da palavra-chave return. C++ não permite vc retornar sem nada de uma função se o tipo de retorno for diferente de void.

Vamos ver um exemplo:
A função somaSequencia() é chamada repetidamente para somar uma série de números fornecidos pelo usuário, até que o usuário forneça uma sequência de comprimento zero.

------------------------------------------------------------------------------------------------------------
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;

int somaSequencia()
{
 //criamos a variavel que vai armazenar os dados digitados.
 int nAcumulador = 0;

 //lendo os valores digitados
 for(;;)
 {
  int nValor;
  cout << "Proximo: ";
  cin >> nValor;

  //saindo do loop quando o valor de alvo for digitado
  if(nValor < 0)
  {
   break;
  }

  //agora, passamos o valor para o acumulador
  nAcumulador += nValor;
 }

 //aqui retornamos o valor chamado para o acumulador
 return nAcumulador;
}

int main(int nNumberofArgs, char* pszArgs[])
{
 cout << "Entre com a sequencia de numeros\n"
      << "Numero negativo encerra o programa\n" ;
for(;;)
{
 int nSoma = somaSequencia();
 if(nSoma == 0)
 {
  break;
 }
 cout << "Soma = " << nSoma << endl;
}
system("pause");
return 0;    
}
------------------------------------------------------------------------------------------------------------
Como Passar Argumentos para Funções. 
Quando a função apenas retorna valor, elas são de valor limitado e a comunicação é de uma via - da função para o chamador. Vamos ver agora a comunicação de duas vias, argumentos de função.

Um argumento de função é uma variável, cujo valor é passado para a função durante a chamada. Vamos converter a operação fatorial do estudo anterior em uma função:

------------------------------------------------------------------------------------------------------------
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;

int fatorial(int nAlvo)
{
 //Vamos inicializa o acumulador com 1.
 int nAcumulador = 1;
 for(int nValor = 1; nValor <= nAlvo; nValor++)
 {
  nAcumulador *= nValor;
 }
 return nAcumulador;
}
int main(int nNumberofArgs, char* pszArgs[])
{
 cout << "Programa para calculo de fator\n"
      << "Digite um numero negativo para encerrar o programa" << endl;
for(;;)
{
 int nValor;
 cout << "Digite o numero: ";
 cin >> nValor;
 if(nValor < 0)
 {
  break;
 }
 int nFatorial = fatorial(nValor);
 cout << nValor << " o fator e " << nFatorial << endl;
                
}
system("pause");
return 0;
}
------------------------------------------------------------------------------------------------------------

Uma função pode ter múltiplos argumentos separados por vírgulas. Ex:.
int produto(int nValor1, int nValor2)
{
 retorno nValor1 * nValor2;

------------------------------------------------------------------------------------------------------------
A palavra-chave main() do nosso gabarito é uma função. Mesmo com alguns argumentos estranhos ;)
C++ permite designar o mesmo nome a duas ou mais funções, se puderem ser distinguidas pelo nome ou pelo tipo de argumento. Isso é chamado de sobrecarga de funções.




sexta-feira, 6 de setembro de 2013

Seja Bem Vindo!

E aqui iniciamos nossa jornada, e o mais exitante do inicio, é que não sabemos qual será o fim !
<a href="https://plus.google.com/117007923951383177992" rel="publisher">Google+</a>

domingo, 19 de maio de 2013

#Errata

Peço desculpas pelo meu erro em não perceber que a clausula #include esta cortada :(

Atualizei todas as postagens inserindo a clausula completa como abaixo:


#include<cstdio>
#include<cstdlib>
#include<iostream>

Vale lembrar que, caso esteja no computador do trabalho ou de um amigo que não tenha os copiladores como o DevC++ ou CodeBlock, basta digitar o código no bloco de notas e salva com a extensão .exe

Assim, pode ver seu programa em execução sem instalar nada.
Agora sim, garanto que vai funcionar ;)

Vamos em frente...

Loop For

O loop for não é tão flexível quanto o loop while, porém, é o mais popular.
A maioria dos loops tem 4 partes essenciais.

- A configuração:
Envolve declarar e iniciar uma variável increment.

- O teste de expressão:
A expressão que levará o programa a executar o loop ou sair dele. Normalmente acontece entre os parentes.

- O corpo:
O código dentro das chaves.

- O incremento:
É onde a variável é incrementada. Normalmente no final do corpo.

O loop for incorpora as quatro partes em uma única estrutura. Ex.:

for(setup; teste de expressão; incremento)
{
  Corpo;
}

Uma vez que o setup é executado, o controle vai para o teste da expressão.
O teste da expressão sendo verdadeiro, ou true, o controle passa para o corpo de loop for.
Se o teste da expressão passa a ser falso, ou false, o controle passa para a próxima declaração após a chave de fechamento.
Quando o controle tiver passado pelo corpo do loop for, é forçado a executar a seção de incremento do loop. Depois, o controle volta a testar a expressão.

Vamos refazer o programa fatorial utilizando o loop for para exemplificar e fixar.
------------------------------------------------------------------------------------------------------------


#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{
   
    int nAlvo;
    cout << "Entre com o numero para calcular seu fator: ";
    cin  >> nAlvo;

   
    int nAcumulador = 1;
    for(int nValor = 1; nValor <= nAlvo; nValor++)
    {
        cout << nAcumulador << " * "
             << nValor << " igual ";
        nAcumulador = nAcumulador * nValor;
        cout << nAcumulador << endl;
    }

   
    cout << nAlvo << " O fator e: "
         << nAcumulador << endl;

    system("PAUSE");
    return 0;
}
------------------------------------------------------------------------------------------------------------

Há um operador que não foi mencionado, a virgula (,).
Vamos escrever um programa para ver o operador virgula(,) em ação.  Este programa é apenas ilustrativos, vamos entrar numa prática mais aplicada para o operador virgula(,) quanto chegar os arrays, e eu espero chegar lá ;)

------------------------------------------------------------------------------------------------------------


#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{
 int nAlvo;
 cout << "Entre com o valor maximo: ";
 cin >> nAlvo;

 for(int nMinuscula = 1, nMaiuscula = nAlvo;
 nMinuscula <= nAlvo; nMinuscula++, nMaiuscula--)
 {
  cout << nMinuscula << " * "
       << nMaiuscula << " e igual "
       << nMinuscula * nMaiuscula << endl;
 }

 system("pause");
 return 0;
}
------------------------------------------------------------------------------------------------------------
Desta vez, nós queremos não apenas incrementar uma variável de 1 até o nAlvo, mas também, decrementar a segunda variável de nAlvo até 1.






sábado, 18 de maio de 2013

While Rodando em Círculos.

Outro recurso importante é a habilidade de fazer um loop.
Construção do loop while(enquanto) no C++.

Formato:
while(expressão)
{
  //Aqui vai o codigo.
}
//Aqui continua o código após o loop.

Quando o programa encontra o loop while, ele avalia a expressão entre parênteses.
Se a expressão for verdadeira, true, ele passa o controle para a primeira linha dentro de {. Quando o controle chegar a }, o programa volta para a expressão e recomeça.
O controle continua a circular entre as chaves até que a expressão passe para falsa, false, ou até que outra coisa rompa o loop.
Vamos avaliar com um programa:

------------------------------------------------------------------------------------------------------------


#include<cstdio>
#include<cstdlib>
#include<iostream>

using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{
    int nAlvo;
    cout << "Este programa calcula os fatores.\n"
         << "Entre com o numero.";
    cin  >> nAlvo;
 
    int nAcumulador = 1;
    int nValor = 1;
    while(nValor <= nAlvo)
    {
      cout << nAcumulador << " * "
           << nValor << " igual ";
      nAcumulador = nAcumulador * nValor;
      cout << nAcumulador << endl;
      nValor++;
    }
    //Imprimindo o resultado.
    cout << nAlvo << " Fator = "
    << nAcumulador << endl;
 
    system("PAUSE");
    return 0;
}
------------------------------------------------------------------------------------------------------------
Após solicitar o valor para o usuário, o programa coloca o valor em nAlvo e já inicia nAcumulador e nValor para 1.

O programa compara o nValor com nAlvo. Caso tenha digitado o valor 5, surge o primeiro loop com a seguinte questão: 1 é menor ou igual a 5? Como a resposta é true, verdadeira, o loop continua.

Antes de multiplicar, o programa imprime os valores de nAcumulador e nValor, ambos igual a 1.
Feito isto, o programa multiplica nAcumulador por nValor e atribui o resultado da multiplicação para nAcumulador, que passa de 1 para 2.

Em seguida, o loop recomeça com a seguinte pergunta: 2 é menor ou igual a 5? Como a resposta ainda é true, verdadeira, o loop continua.

O loop continua até que nValor chegue a 6, deixando de ser menor ou igual a 5 digitado pelo usuário.
Desta forma, o controle passa para a primeira declaração feita após a chave de fechamento } e imprime o resultado final.

Caso usuário digite 0, o controle vai direto para a instrução após a chave de fechamento } e o loop não será executado nenhuma vez. Isto por que, nValor é menor ou igual a 0 e a declaração foi falsa. 

Para interromper um loop em execução, o C++ oferece dois comandos de controle:

Break: sai imediatamente do interior do loop.
Continue: retorna o controle para o inicio do loop.

Vamos ver os dois exemplos em um programa que multiplica valores positivos fornecidos pelo usurário, até que seja digitado um número negativo. O programa ignora zero.
------------------------------------------------------------------------------------------------------------


#include<cstdio>
#include<cstdlib>
#include<iostream>

using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{
    cout <<"Programa para multiplicar os numeros digitados\n\n"
         <<"Para parar o programa, digite um numero negativo\n\n"
         <<"O programa iguinora zero\n\n"
         << endl;
       
         int nProduto = 1;
         while(true)
         {
          int nValor;
          cout << "Digie o numero para multiplicar: ";
          cin >> nValor;
       
          if(nValor < 0)
          {
           cout << "Saindo. Tchau!\n\n" << endl;
           break;      
          }
          if(nValor == 0)
          {
           cout << "O programa iguinora zero. Por gentileza, digite um numero positivo.\n\n" << endl;
           continue;
          }
       
          //Multiplicando e imprimindo o resultado no console.
          cout << nProduto << " * " << nValor;
          nProduto *= nValor;
          cout << " igual " << nProduto << endl;
         }
 
system("PAUSE");
return 0;
}
------------------------------------------------------------------------------------------------------------
O programa começa com o valor inicial de 1 no produto. Depois, avalia a expressão lógica true. Como true é verdadeiro, o programa entra no loop e continua solicitando ao usuário outro número para multiplicação.

Caso um valor negativo seja digitado, o programa envia a frase de despedida antes de executar o break, que passa o controle para fora do loop.

Caso o valor digitado seja zero, o programa notifica o usuário e retorna o controle para continue assim, o usuário pode continuar digitando.

Loops Aninhados.

O corpo de um loop ponde conter outro loop que é conhecido como nested loops ou loop alinhado.

O lopo alinhado deve executar totalmente através do loop externo.

Vamos escrever um programa que utiliza o loop alinhado para criar uma tabela de multiplicação.
Cada posição da tabela sera apenas a fileira de número, vezes a coluna de número.

------------------------------------------------------------------------------------------------------------


#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{
 //Mostrando a coluna
 int nColuna = 0;
 cout << " ";
 while(nColuna < 0)
 {
  cout.width(2);           //Setando uma constante para imprimir no console dois caracteres ou dois digitos.
  cout << nColuna << " "; // Agora, imprimindo as colunas
  nColuna++;              //Incrementa para a proxima coluna
 }
 cout << endl;
 //Agora, o loop para percorrer as linhas
 int nLinha = 0;
 while(nLinha < 10)
 {
  cout << nLinha << " - "; //Começando com o valor das linhas.
  nColuna = 0;            //Agora para cada linha, iniciamos a coluna 0 e vamos para a coluna 9.
  while(nColuna < 10)
  {
   cout.width(2);       //Imprimindo o produto de coluna * linha usando 2 caracteres mesmo quando temos apenas 1 digito.
   cout << nLinha * nColuna << " ";
   nColuna++;  //Indo para a proxima coluna
  }
  nLinha++;    //Indo para a proxima linha
  cout << endl;
  
 }
system("PAUSE");
return 0;
}
------------------------------------------------------------------------------------------------------------
A expressão cout.width(2) ajusta a largura da exibição para duas colunas - C++ coloca um espaço a esquerda em números com apenas 1 digito.



sábado, 11 de maio de 2013

Muitos caminhos

Vamos ver o que o C++ oferece quando o programa precisa decidir entre muitas entradas.
C++ oferece um mecanismo de controle conveniente para selecionar uma série de opções. A declaração switch.

Fluxo e formato da declaração:

switch(expressão)
{
case const1:
//aqui vai a expressão  correspondente == const1
break;

case const2:
//aqui vai a expressão  correspondente == const2
break;

case const3:
//aqui vai a expressão  correspondente == const3
break;

default:
//aqui vai a expressão final
}

Quando encontra a declaração switch, C++ avalia a expressão. Feito isto, ele passa o controle para o comando da expressão do mesmo valor correspondente e continua até encontrar break. O break transfere o controle para } no final da declaração switch.
Se nenhum dos comando combinar, o controle é passado para o comando default por padrão.
O controle default padrão é opcional, mas é uma boa pratica utiliza-lo. #FicaAdica.

Uma declaração switch é diferente de uma série de declarações if. Apenas constantes são permitidas após a palavra chave case, ou expressões que possam ser avaliadas na montagem. Não é possível fornecer uma expressão depois de um comando, pois o valor não é conhecido até o programa ser executado.

Vale lembrar, que o break também é opcional, porém, sem ele, o controle "pula" de um comando para o outro. Seria útil não utilizar a declaração break quando dois ou mais comandos são tratados da mesma maneira.

Para fixar, vamos criar uma calculadora simples implementada com switch.

------------------------------------------------------------------------------------------------------------


#include<cstdio>
#include<cstdlib>
#include<iostream>


using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{
    int nOperador1;
    int nOperador2;
    char cOperador;
    cout << "Entre com o primeiro e o segundo valor\n"
    << "As operacoes permitidas sao: +, -, *, / ou %." << endl;
    cin >> nOperador1 >> cOperador >> nOperador2;
 
    cout << nOperador1 << "  "
         << cOperador  << "  "
         << nOperador2 << " = ";
 
    switch(cOperador)
    {
     case'+':
     cout << nOperador1 + nOperador2;
     break;
     case'-':
     cout << nOperador1 - nOperador2;
     break;
     case'*':
     case'x':
     case'X':
     cout << nOperador1 * nOperador2;
     break;
     case'/':
     cout << nOperador1 / nOperador2;
     break;
     case'%':
     cout << nOperador1 % nOperador2;
     break;
     default:
     cout << "Operacao Invalida";
    }
    cout << endl;
 
    system("PAUSE");
    return 0;
}
------------------------------------------------------------------------------------------------------------
Perceba que o programa inicia repetindo o que foi digitado. Repetir o que foi digitado é uma boa prática de programação, pois garante ao usuário que ele digitou correto, ou não.

Os comandos: x e X foram incluídos pois são símbolos comuns da multiplicação. Do contrário, o comando entraria no default retornando como operação inválida.

quarta-feira, 1 de maio de 2013

Tomar Decisões.

Tomar Decisões.
Todas as linguagens de computador oferecem algum tipo de capacidade de tomada de decisão. Em C++ isso é tratado pela declaração if.
O formato da declaração if é direto. Ex:

if (m > n) // Se m é maior do que n...
{
   //Aqui o codigo....
}

Ao encontrar if, C++ executa a expressão logica contida nos parenteses. Caso a expressão condicional se m for maior que n. Se verdadeiro, o comando é passado para o codigo entre as chaves. Quando a expressão deixa de ser verdadeira, e passa a falsa, o controle passa para a próxima linha após o fechamento das chaves.

Vamos ver os operadores de comparação e seu significado.

= =  Igualdade. Verdade se o argumento do lado esquerdo  tiver o mesmo valor que a expressão do lado direito.
!=   Desigualdade. Oposto de igualdade.
>    Maior que. Verdadeiro se o argumento do lado esquerdo for maior que o do lado direito direito.
<    Menor que. Verdade se o argumento do lado esquerdo for menor que o do lado direito.
>=  Maior que ou igual a. Verdadeiro se o argumento esquerdo esquerdo for maior ou igual ao direito.
<=  Menor ou igual a. Verdade se o argumento esquerdo for menor ou igual ao direito.

#Dica. Não confunda o operador de igualdade = = com o de designação =.
Vamos ver os operadores em um programa.

------------------------------------------------------------------------------------------------------------


#include<cstdio>
#include<cstdlib>
#include<iostream>

using namespace std;

int main (int nNumberofArgs, char* pszArgs[])
{
    //Entrando com o operador1 e operador2
    int nOperador1;
    int nOperador2;
    cout << "\nEntre com o argumento 1: ";
    cin >> nOperador1;
 
    cout << "\nEntre com o argumento 2: ";
    cin >> nOperador2;
 
 
    //Agora, imprimindo os resultados
    if (nOperador1 > nOperador2 )
    {
      cout << "\nO argumento 1 e maior do que o argumento 2." << endl;
    }
    if (nOperador1 < nOperador2)
    {
      cout << "\nO argumento 2 e maior do que o argumento 1." << endl;
    }
    if (nOperador1 == nOperador2)
    {
      cout << "\nOs argumentos sao iguais." << endl;
    }
system("pause");
return 0;
}
------------------------------------------------------------------------------------------------------------

O programa declara duas variáveis int chamadas nOperador1 e nOperador2.
Após solicitar ao usuário que digite os argumentos, o programa executa três comparações:

Se nOperador1 é maior do que nOperador2
Se nOperador1 é menor do que nOperador2

Se nOperador1 é igual a nOperador2

Feita a comparação o programa exibe o resultado.
Mesmo não sendo necessário utilizar as chaves {} quando temos apenas uma declaração if, o uso é recomendado para evitar qq tipo de erro. #Ficaadica.

Podemos usar também a clausua else (caso contrário, se não) a expressão entre as chaves após o else serão será executada, caso a expressão condicional seja falsa. Ex:

if (m > n)
{
 //Aqui vai o código...
}
else
{
//Aqui vai o comando que deve ser executado caso a expressão seja falsa...
}
Vale lembrar que a cláusula else deve aparecer imediatamente após a chave de fechamento do if.

As chaves da cláusula if ou else podem conter  uma outra declaração if. Desta forma, teremos uma declaração if alinhada ou nested. Vamos ver um programa:

------------------------------------------------------------------------------------------------------------


#include<cstdio>
#include<cstdlib>
#include<iostream>


using namespace std;

int main (int nNumberofArgs, char* pszArgs[])
{
 //Digite o dia de seu aniversario
 int nAno;
 cout << "\nDigite em que nasceu. ";
 cin >> nAno;

 //Agora, vamos determinar o século
 if (nAno > 2000)
 {
  cout << "\nVc nasceu no seculo 21" << endl;
 }
 else
 {
  cout << "Vc nasceu ";
  if (nAno < 1950)
  {
   cout << "na primeira metade do seculo ";
  }
  else
  {
   cout << "na segunda metade do seculo ";
  }
  cout << "21" << endl;
 }

system("pause");
return 0;
}
------------------------------------------------------------------------------------------------------------
Para praticar, vc pode utilizar if alinhado no programa operador1 e operador2. #Valeapratica.
#Dica. Não é necessário o teste de igualdade. Se o operador1 não for menor ou maior que operador2, então ele deve ser igual.

Expressões condicionais compostas.

Os três operadores lógicos que podem ser usados para criar expressões condicionais compostas são:

&& AND (e) Verdadeiro, se o argumento do lado esquerdo e direito forem verdadeiros, do contrário, falso.

|| OR (ou) Verdadeiro, se qq dos argumentos, da esquerda ou da direita forem verdadeiros, do contrário, falso.

! NOT (não) Verdadeiro, se o argumento da direita for falso, do contrário, falso.

Numa expressão condicional composta, o programador esta fazendo uma ou mais perguntas, veja o exemplo no trecho de código:

if (m < nArgumento && nArgumento < 5)

Este teste não inclui as extremidades, isto é, este teste falhará se nArgumento for igual a m ou n. Use o operador de comparação <= se vc quiser incluir extremidades.