Programa-Calculadora(simplissima, só está a ler 2 números para já) com ponteiros-C++

TheRieper

Power Member
Olá meus caros amigos programadores. Sou um aspirante a programador elite (daqui a uns anos chego lá:P) mas de momento foi-me mandado fazer uma calculadora simples. e a versão dessa calculadora com o uso de ponteiros. Estou a usar o DevC++ em casa e o MS Visual studio na escola. Não me recordo os erros que dá lá na escola mas aqui dá 4 que são os seguintes:
line 20 - implicit declaration of function 'int soma(...)'
line 28 - implicit declaration of function 'int sub(...)'
line 36 - implicit declaration of function 'int mult(...)'
line 44 - implicit declaration of function 'int divi(...)'.

o código é:
Código:
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
 
int i,n1,n2,result,op,sai;

int main()
{
do {
cout<<"Calculadora"<<endl<<"************"<<endl<<"1 - Somar;"<<endl<<"2 - Subtrair;"<<endl<<"3 - Multiplicar;"<<endl<<"4 - Dividir;"<<endl<<"5 - Sair"<<endl;
cout<<"Introduza o número correspondente à opção desejada: ";

cin>>op;

system("cls");

switch (op)
{
case 1:
cout<<"Introduza o 1º valor a ser somado: ";
cin>>n1;
cout<<"Introduza o 2º valor a ser somado: ";
cin>>n2;
cout<<"A soma é: "<<soma(&n1,&n2);
break;
 
case 2:
cout<<"Introduza o 1º valor ao qual irá ser subtraído o 2º: ";
cin>>n1;
cout<<"Introduza o 2º valor: ";
cin>>n2;
cout<<"A diferença é: "<<sub(&n1,&n2);
break;
 
case 3:
cout<<"Introduza o 1º valor a ser multiplicado: ";
cin>>n1;
cout<<"Introduza o 2º valor a ser multiplicado: ";
cin>>n2;
cout<<"O produto é: "<<mult(&n1,&n2);
break;
 
case 4:
cout<<"Introduza o dividendo: ";
cin>>n1;
cout<<"Introduza o divisor: ";
cin>>n2;
cout<<"O quociente é: "<<divi(&n1,&n2);
break;
 
case 5:
do {
cout<<"Deseja mesmo sair?[S=1/N=0]";
cin>>sai;
if (sai==1)
{cout<<"O programa irá encerrar. Prima qualquer tecla para continuar.";}

else if (sai==0)
{cout<<"O encerramento do programa foi cancelado. O programa irá retornar ao menu inicial. Prima qualquer tecla para continuar.";}

else
{cout<<"O caracter introduzido não corresponde a uma opção válida. Por favor volte a introduzir o caracter correspondente à opção desejada. Prima qualquer tecla para continuar.";
getche();
system("cls");};

} while (sai!=1 && sai!=0);};
getche();
system("cls");
}while (sai!=1);

return 0;}
 
float soma (int *a, int *b)
{return (*a+*b);};
 
float sub (int *c, int *d)
{return (*c-*d);};
 
float mult (int *e, int *f)
{return (*e*(*f));};
 
int divi (int *g, int *h)
{return(*g/(*h));
};
Eu sei que o erro está onde mando imprimir o resultado da função, apenas não entendo porquê nem como corrigi-lo:( (note-se que o meu prof, diga-se de passagem, no que toca a programação é uma besta quadrada, e nem recorrendo ao livro consegui corrigir isto, até porque tá igual:S).
Agradecia que me ajudassem, nem que fosse com umas pistas. Desde já obrigado.
Desculpem o longo post.
Abraço
 
Sempre que vires essa mensagem repara se a função foi ou não declarada. Em C/C++ todas as funções têm de ser declaradas antes do main. Neste caso tens duas alternativas:

- Colocas o protótipo da função, desta forma o compilador sabe que a função existe e depois "procura-a".
Código:
(...)
int soma( int a, int b ); // Declaração da função
(...)
int main() {
    (...)
    return 0;
}

int soma( int a, int b ) { // Corpo da função
    return a+b;
}

- Declaras a função antes do main

Código:
(...)
int soma( int a, int b ) { // Declaração e corpo da função
    return a+b;
}
(...)
int main() {
    (...)
    return 0;
}

É tão simples quanto isso (no que diz respeito aos erros de compilação :p). O resto do código não estive a ver, mas qualquer problema avisa.
 
Sempre que vires essa mensagem repara se a função foi ou não declarada. Em C/C++ todas as funções têm de ser declaradas antes do main. Neste caso tens duas alternativas:

Errado, todas as funções têm de ser declaradas antes de serem chamadas por outra função, ou então serem criadas antes de serem chamadas.

Se declarares todas as funções no inicio, de facto que não vais ter problemas nenhuns destes, mas a justificação mais correcta é a que dei.

Pessoalmente não uso muito a declaração de funções, gosto mais de as criar antes do main e por ordem decrescente de criação. (primeiro a última função criada)
 
Sim, eu sei que qualquer função tem que ser declarada antes de ser chamada. O que quis dizer é que para o caso simples em que apenas é um usado um ficheiro e todas as funções são chamadas apenas pelo main é isso que acontece. Não me parece que aqui fossem ser usados múltiplos ficheiros ou funções que se chamam umas às outras. ;)
Se for para ser mais detalhado também convinha falar nos ficheiros .h, que não são nada mais que os protótipos das funções, tirando situações excepcionais como os templates.
Apenas achei que neste caso não era importante referir isso, mas se calhar era o que devia ter feito. Dessa forma evitava imprecisões... :p
 
Exacto, bastava colocar os headers das funções antes da main, e assim já compila.

Eu coloquei o protótipo da função antes da main. deste genero:

float soma (int *a, int *b);

main()
{...};

float soma (int *a, int *b)
{return (a+b)};...

Como tinha feito na outra calculadora. mas dava outro erro que agora também não me recordo qual era.
Obrigado pela ajuda^^
 
A mim não me dá erro, ele compila e funciona. Apenas apresenta um warning resultante de usar o <iostream.h>:

32:2 C:\Dev-Cpp\include\c++\3.4.2\backward\backward_warning.h #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
 
Deixo aqui o código que tenho (já alterado e a funcionar):

Código:
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
 
int i,n1,n2,result,op,sai;

[color=red]float soma (int *a, int *b);
float sub (int *c, int *d);
float mult (int *e, int *f);
int divi (int *g, int *h);[/color]

int main()
{
do {
cout<<"Calculadora"<<endl<<"************"<<endl<<"1 - Somar;"<<endl<<"2 - Subtrair;"<<endl<<"3 - Multiplicar;"<<endl<<"4 - Dividir;"<<endl<<"5 - Sair"<<endl;
cout<<"Introduza o número correspondente à opção desejada: ";

cin>>op;

system("cls");

switch (op)
{
case 1:
cout<<"Introduza o 1º valor a ser somado: ";
cin>>n1;
cout<<"Introduza o 2º valor a ser somado: ";
cin>>n2;
cout<<"A soma é: "<<soma(&n1,&n2);
break;
 
case 2:
cout<<"Introduza o 1º valor ao qual irá ser subtraído o 2º: ";
cin>>n1;
cout<<"Introduza o 2º valor: ";
cin>>n2;
cout<<"A diferença é: "<<sub(&n1,&n2);
break;
 
case 3:
cout<<"Introduza o 1º valor a ser multiplicado: ";
cin>>n1;
cout<<"Introduza o 2º valor a ser multiplicado: ";
cin>>n2;
cout<<"O produto é: "<<mult(&n1,&n2);
break;
 
case 4:
cout<<"Introduza o dividendo: ";
cin>>n1;
cout<<"Introduza o divisor: ";
cin>>n2;
cout<<"O quociente é: "<<divi(&n1,&n2);
break;
 
case 5:
do {
cout<<"Deseja mesmo sair?[S=1/N=0]";
cin>>sai;
if (sai==1)
{cout<<"O programa irá encerrar. Prima qualquer tecla para continuar.";}

else if (sai==0)
{cout<<"O encerramento do programa foi cancelado. O programa irá retornar ao menu inicial. Prima qualquer tecla para continuar.";}

else
{cout<<"O caracter introduzido não corresponde a uma opção válida. Por favor volte a introduzir o caracter correspondente à opção desejada. Prima qualquer tecla para continuar.";
getche();
system("cls");};

} while (sai!=1 && sai!=0);};
getche();
system("cls");
}while (sai!=1);

return 0;}
 
float soma (int *a, int *b)
{return (*a+*b);};
 
float sub (int *c, int *d)
{return (*c-*d);};
 
float mult (int *e, int *f)
{return (*e*(*f));};
 
int divi (int *g, int *h)
{return(*g/(*h));
};
Uso o Dev-C++ 4.9.9.2.
 
Só uma coisa: se estás a programar em C++ porque iostream.h e não iostream?

Penso que não estou a dizer nada de errado, mas iostream.h é uma prática de C, e não de C++ (embora não haja problema, pois C está "dentro" de C++). E quem diz iostream diz outras.
 
Só uma coisa: se estás a programar em C++ porque iostream.h e não iostream?

Penso que não estou a dizer nada de errado, mas iostream.h é uma prática de C, e não de C++ (embora não haja problema, pois C está "dentro" de C++). E quem diz iostream diz outras.

Porque apanhei o hábito do .h. e por exemplo. o visual studio c++ dá-me o warning que a lib tá outdated se usar iostream.h. mas se usar só iostream dá-me erros em todos os couts e cins :S enfim..
 
Porque apanhei o hábito do .h. e por exemplo. o visual studio c++ dá-me o warning que a lib tá outdated se usar iostream.h. mas se usar só iostream dá-me erros em todos os couts e cins :S enfim..

#include <iostream>

using std::cout;
using std::cin;

ou então,

using namespace std;

Atenção que o conio.h não pode ser escrito como conio. A lib stdlib não sei, só testando.

Outra coisa que não percebi, qual a razão de teres o conio.h? Sim, eu sei que é para usar o getche(), mas não entendo o porquê...
 
Última edição:
Porque preciso de usar o getche() para que o programa não apague imediatamente o resultado. basicamente foi para isso:P

PS: Eu sei que há libs que têm que ser usadas como são no C
 
Porque preciso de usar o getche() para que o programa não apague imediatamente o resultado. basicamente foi para isso:P

PS: Eu sei que há libs que têm que ser usadas como são no C

Experimenta em vez do getche e em vez do system("cls") escrever getchar().

Aquilo do erro se usares #include <iostream> é porque ele não definiste o cout e o cin como sendo do espaço std. Tens de usar os using's. Outra maneira era escreveres std::cout, std::cin, std::endl, etc.
 
Aqui vai uma série de notas sobre o código:

- Em C++ não existem os cabeçalhos iostream.h ou stdlib.h. Existem sim os cabeçalhos iostream e stdlib.
- Isso do conio.h não existe em C++ e estás a usar isso sem qualquer justificação.
- Deves evitar usar variáveis globais a todo o custo. Se te sentires forçado a usá-las então tens de justificar o seu uso muito bem. Neste caso não há justificação possível
- Tu recebes uma introdução de dados via cin>>op; mas não fazes absolutamente nada para validar a informação que recebeste. Isso é muito mau.
- system("cls"); não é C++ e não funciona em mais lado nenhum senão numa plataforma específica.
- voltas a não validar os dados que são introduzidos em cin>>n1; e cin>>n2;. Isso é muito mau.
- o teu uso de ponteiros de memória não faz qualquer sentido. Não faria se estivesses a programar em C e muito menos sentido faz ao programares em C++. Com esse tipo de opções só vais conseguir produzir erros e potenciais problemas de segurança.
- tu tens um molho de funções que recebem ponteiros de memória mas não fazes nem uma única verificação de sanidade. Isso é mesmo muito mau.


Agora as dicas:
- respeita as normas da linguagem. Faz questão de usar só e exclusivamente as normas da linguagem. Tudo o resto só vai fazer com que aprendas tudo muito mal e só consigas fazer erros.
- tens de te certificar que em todas as funções os parâmetros fazem sentido. Se não fizerem então começa a dar uso ao mecanismo de excepções de C++.
- tens de te certifica que toda e qualquer entrada de dados faz sentido. Em toda a entrada de dados do utilizador tens de te certificar que ela se restringe a um domínio aceitável. Tudo o resto é erro.
- C++ não é C. Em C++ não há muita justificação para usares ponteiros de memória explicitamente. Tens de justificar muito bem o teu uso de ponteiros e mesmo assim tens de ver mesmo se vale a pena.
 
Aqui vai uma série de notas sobre o código:

- Em C++ não existem os cabeçalhos iostream.h ou stdlib.h. Existem sim os cabeçalhos iostream e stdlib.
- Isso do conio.h não existe em C++ e estás a usar isso sem qualquer justificação.
- Deves evitar usar variáveis globais a todo o custo. Se te sentires forçado a usá-las então tens de justificar o seu uso muito bem. Neste caso não há justificação possível
- Tu recebes uma introdução de dados via cin>>op; mas não fazes absolutamente nada para validar a informação que recebeste. Isso é muito mau.
- system("cls"); não é C++ e não funciona em mais lado nenhum senão numa plataforma específica.
- voltas a não validar os dados que são introduzidos em cin>>n1; e cin>>n2;. Isso é muito mau.
- o teu uso de ponteiros de memória não faz qualquer sentido. Não faria se estivesses a programar em C e muito menos sentido faz ao programares em C++. Com esse tipo de opções só vais conseguir produzir erros e potenciais problemas de segurança.
- tu tens um molho de funções que recebem ponteiros de memória mas não fazes nem uma única verificação de sanidade. Isso é mesmo muito mau.


Agora as dicas:
- respeita as normas da linguagem. Faz questão de usar só e exclusivamente as normas da linguagem. Tudo o resto só vai fazer com que aprendas tudo muito mal e só consigas fazer erros.
- tens de te certificar que em todas as funções os parâmetros fazem sentido. Se não fizerem então começa a dar uso ao mecanismo de excepções de C++.
- tens de te certifica que toda e qualquer entrada de dados faz sentido. Em toda a entrada de dados do utilizador tens de te certificar que ela se restringe a um domínio aceitável. Tudo o resto é erro.
- C++ não é C. Em C++ não há muita justificação para usares ponteiros de memória explicitamente. Tens de justificar muito bem o teu uso de ponteiros e mesmo assim tens de ver mesmo se vale a pena.

Greatbuzini. agradeço a tua preocupação e resposta. mas agradecia que antes de falares lesses o que escrevem. foi algo que me foi pedido pelo professor, não foi tirado da minha cabeça. e diga-se de passagem que ele é uma besta em programação, então, eu vou tentando aprendendo donde posso.
O IDE que nos foi chapado, por muito que desgoste, é o visual studio 2005 e nele essa função "system("cls")" é a única que funciona. A clearscreen padrão, que agora não me recordo da sintaxe já não.
O programa que fiz foi para apenas realizar o que me foi pedido pelo professor. ele pediu algo simples, rudimentar. Tal como indicado no título.
Mais tarde farei as mudanças que achar necessárias não só para melhorar o funcionamento do programa mas também para aprender.

Agora deixo o meu conselho. Lê;)

Abraço
 
- Em C++ não existem os cabeçalhos iostream.h ou stdlib.h. Existem sim os cabeçalhos iostream e stdlib.

Errado. Em C++ os headers do C são precedidos por c e sem .h, logo stdlib.h fica cstdlib, como cmath, cctype, ...
Segundo, os headers .h continuam a existir, de outra forma o programa não funcionaria. É sim recomendado usar os novos headers...
 
Yap. Toda a razão Consu:) Obrigado pela ajuda de todos.:) Já agora. ninguém tem um link dum site com uns tutoriais fixes de programação com BD em c++?
Abraço
 
Errado. Em C++ os headers do C são precedidos por c e sem .h, logo stdlib.h fica cstdlib, como cmath, cctype, ...
Segundo, os headers .h continuam a existir, de outra forma o programa não funcionaria. É sim recomendado usar os novos headers...

Na norma C++98 houve uma série de cabeçalhos que foram eliminados, onde se incluem os cabeçalhos iostream.h e o stdlib.h. Os cabeçalhos de C também foram incluidos com um nome diferente para compatibilidade. Não confundas as coisas.

Existem compiladores de C++ que ainda enviam oferecem esses cabeçalhos e há ainda uns que oferecem os cabeçalhos de C tal e qual como estão. No entanto, não entres pelo disparate de cometer o erro de acreditar que uma coisa faz parte da linguagem só porque um compilador qualquer oferece.

As normas estão bem definidas. Basta lê-las.
 
Back
Topo