Mandar um cafézinho para o programador:


Me ajude a transformar café em código!

Protótipo de Função - Como programar uma calculadora completa em C++

Neste tutorial de nosso curso de C++, vamos aprender como criar uma calculadora completa em C++, bem como entender o que são e para que servem os protótipos de funções.

Programando uma Calculadora em C++

Vamos agora programar uma calculadora, bem funcional e útil, usando os conhecimentos que aprendemos de C++:


As funções sum(), sub(), mult() e divis() fazem as operações de soma, subtração, multiplicação e divisão, respectivamente. Todas recebem dois dados, do tipo float, e retornam um resultado em float também.

Exceto pela função divis(), pois ela precisa testar se o denominador é diferente de 0.
Se for, retorna a divisão corretamente.
Se não for, retorna uma mensagem dizendo que não é possível dividir por 0, que é o correto a se fazer.

A função menu() é a responsável por mostrar as possíveis operações matemáticas que ele pode fazer.
O usuário digita um valor como opção.

Se essa opção for 0, o programa sai do looping DO WHILE da menu() e se encerra o programa.
Se digitar de qualquer outro número, pedimos os dois valores que ele vai querer calcular a operação e em seguida vai pro SWITCH, onde selecionamos a operação corretamente.

Passamos os números digitados pelo usuário pra respectiva função, ela retorna o resultado e o exibimos.

Por fim, o menu de opções é exibido novamente, para caso o usuário queira fazer outro cálculo.
Veja como fica nosso código:
#include <iostream>
using namespace std;

float sum(float a, float b)
{
    return a+b;
}

float sub(float a, float b)
{
    return a-b;
}

float mult(float a, float b)
{
    return a*b;
}

float divis(float a, float b)
{
    if(b!=0)
        return a/b;
    else
        cout<<"Não pode dividir por 0\n";
}

void menu()
{
    int op;
    float a, b;
    do{
        cout<<"0. Sair\n";
        cout<<"1. Somar\n";
        cout<<"2. Subtrair\n";
        cout<<"3. Multiplicar\n";
        cout<<"4. Dividir\n";
        cin >> op;

        if(op){
            cout<<"\nPrimeiro numero: ";
            cin >> a;

            cout<<"Segundo numero: ";
            cin >> b;

            switch(op){
                case 1:
                    cout<<"Soma: " << sum(a,b) << endl;
                    break;
                case 2:
                    cout<<"Diferença: " << sub(a,b) << endl;
                    break;
                case 3:
                    cout<<"Produto: " << mult(a,b) << endl;
                    break;
                case 4:
                    if(b)
                        cout<<"Divisão: " << divis(a,b) << endl;
                    else
                        divis(a,b);
                    break;
                default:
                    cout<<"Opção inválida\n";
            }
        }else
            cout<<"Saindo...\n";
        cout<<endl;
    }while(op);
}

int main()
{
    menu();
    return 0;
}
Na função main() nós simplesmente invocamos a função responsável por exibir o menu.
E só.

Veja, usamos funções, operações matemáticas, IF e ELSE, SWITCH e DO WHILE.
Basicamente, todo conhecimento que estudamos até aqui, em nosso curso de C++.

Agora faça um exercício.

Protótipos de funções em C++

Pegue a função main(), recorte ela do código e cole lá em cima, antes das funções das operações matemáticas. Agora rode seu código.

Deve dar algum erro do tipo 'sum() was not declared', dizendo que a função sum() não foi declarada.
Isso ocorre pois o compilador lê o código de cima pra baixo.

Quando ele entra na menu() e esta invoca a sum(), ele não sabe o que fazer, pois esta função ainda não foi declarada, ela está abaixo da menu(). Por isso, o correto é declarar primeiro as funções de operações matemáticas, e só depois invocar elas na menu().

Agora imagine num programa mais complexo e bem maior, como isso ficaria complicado.
Teríamos que ter cuidado com o que declarar antes de que, e o código antes da função principal main() ficaria gigantesco.

A solução pra isso é, lá em cima, declarar apenas os protótipos das funções.
O protótipo nada mais é que o cabeçalho da função, com os tipos de dados que recebe e o return correto, seguido de ponto-e-vírgula, sem o par de chaves e o código da função.

Veja agora como fica o código de nossa calculadora, usando os protótipos:
#include <iostream>
using namespace std;

void menu();
float sum(float a, float b);
float sub(float a, float b);
float mult(float a, float b);
float divis(float a, float b);

int main()
{
    menu();
    return 0;
}

void menu()
{
    int op;
    float a, b;
    do{
        cout<<"0. Sair\n";
        cout<<"1. Somar\n";
        cout<<"2. Subtrair\n";
        cout<<"3. Multiplicar\n";
        cout<<"4. Dividir\n";
        cin >> op;

        if(op){
            cout<<"\nPrimeiro numero: ";
            cin >> a;

            cout<<"Segundo numero: ";
            cin >> b;

            switch(op){
                case 1:
                    cout<<"Soma: " << sum(a,b) << endl;
                    break;
                case 2:
                    cout<<"Diferença: " << sub(a,b) << endl;
                    break;
                case 3:
                    cout<<"Produto: " << mult(a,b) << endl;
                    break;
                case 4:
                    if(b)
                        cout<<"Divisão: " << divis(a,b) << endl;
                    else
                        divis(a,b);
                    break;
                default:
                    cout<<"Opção inválida\n";
            }
        }else
            cout<<"Saindo...\n";
        cout<<endl;
    }while(op);
}

float sum(float a, float b)
{
    return a+b;
}

float sub(float a, float b)
{
    return a-b;
}

float mult(float a, float b)
{
    return a*b;
}

float divis(float a, float b)
{
    if(b!=0)
        return a/b;
    else
        cout<<"Não pode dividir por 0\n";
}
Bem mais bonito e organizado, não acha?
Aliás, o compilador só precisa saber o returno, o nome da função, quantos e que tipos de parâmetros a função tem, precisa nem do nome deles, você pode declarar assim também:
void menu();
float sum(float, float);
float sub(float, float);
float mult(float, float);
float divis(float, float);
Recomendamos sempre usar protótipos de funções, deixa seu código mais organizado e menos suscetível a erros e problemas

2 comentários:

  1. O compilador gcc não aceita "return" dentro de if-else. Dá mensagem "control reaches end of non-void function [Wreturn-type]".

    ResponderExcluir
  2. O meu compilador gcc não aceita "return" dentro de if-else. Dá a mensagem de erro "control reaches end of non-void function [Wreturn type]"

    ResponderExcluir

Ajude o C++ Progressivo

Que tal apoiar e fazer crescer o ensino da programação no Brasil ?

Ajudar nosso país a crescer e se desenvolver cada vez mais, tecnologicamente?

Clica abaixo pra saber mais!

Apoiar o Projeto Progressivo