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

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 teu professor pode ser uma besta mas mesmo assim isso não implica que tenhas de violar a linguagem ou adoptar práticas más. Por exemplo, o teu professor pode ter forçado o uso de apontadores de memória mas por outro lado a insistência de não verificar a sanidade da entrada de dados já é algo que vai muito além disso.

Uma coisa é conseguir martelar código às 3 pancadas de forma que às vezes até funciona. Outra coisa é programar.

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.
E assim declaras que estás intencionalmente a cometer uma asneira.

Compreende o seguinte: um compilador não define a linguagem. Se realmente quiseres escrever um programa numa linguagem então usas a linguagem e não umas tretas irrelevantes cuja única justificação que se dá para o uso é "mas existe neste programa específico". Se quiseres escrever algo que funciona e está correcto então apoias-te nas normas. Ao desviares-te disso já estás a pôr o pé na poça.


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.

O facto do programa ser "simples" e "rudimentar" não justifica que ele seja mal escrito e baseado em más práticas. É exactamente essa a diferença entre uma coisa feita decentemente e algo produzido às 3 pancadas. Se não és capaz nem sentes necessidade de fazer bem uma coisa tão "simples" e "rudimentar" então obviamente que menos capaz serás e menos necessidade sentes em fazer bem qualquer projecto menos "simples" e menos "rudimentar".

Ou seja, é exactamente isso que distingue quem é competente de quem não é.
 
Sobre o uso do system("cls"), tens de ter a noção de duas coisas.

A primeira é que a linguagem de programação C++ ( e a C) não reconhece conceitos como "monitor" ou "janela". Os únicos canais de acesso a dados que reconhece por defeito e que se encontram já estabelecidos são o stdin, stdout e stderr. Esses canais, como seguem o paradigma de UNIX e no que diz respeito ao seu uso, não passam de ficheiros e como é óbvio tu não "limpas a janela" dum ficheiro.

A segunda é sobre o cls. Trata-se dum programita que não só não é definido em absolutamente nenhuma norma (e por isso o seu funcionamento não é definido) como também só existe numa plataforma específica. Quando existe. Ao escreveres os teus programitas baseando-te numa coisa que não tens garantia absolutamente nenhuma que exista tu estás a depender dum ponto que não sabes se vai funcionar ou não. Tudo bem, podes argumentar que é um programa de maravilha e não vai ter uso. No entanto o que vai ter uso é o que aprendes ao fazer o programa. Se ao fazeres o programa aprendes que fazer as coisas às 3 pancadas é aceitável, incluindo usares coisas que vão "partir"... Estás no mau caminho e é a garantia que vais criar problemas desnecessariamente no futuro.

P.S.: um comando semelhante que é de facto normalizado é o comando clear de UNIX. Sabes o que é que esse programa faz? Envia para o stdout o número estritamente necessário de linhas vazias de maneira que o texto previamente existente deixe de aparecer no ecrã.
 
O teu professor pode ser uma besta mas mesmo assim isso não implica que tenhas de violar a linguagem ou adoptar práticas más. Por exemplo, o teu professor pode ter forçado o uso de apontadores de memória mas por outro lado a insistência de não verificar a sanidade da entrada de dados já é algo que vai muito além disso.

Uma coisa é conseguir martelar código às 3 pancadas de forma que às vezes até funciona. Outra coisa é programar.


E assim declaras que estás intencionalmente a cometer uma asneira.

Compreende o seguinte: um compilador não define a linguagem. Se realmente quiseres escrever um programa numa linguagem então usas a linguagem e não umas tretas irrelevantes cuja única justificação que se dá para o uso é "mas existe neste programa específico". Se quiseres escrever algo que funciona e está correcto então apoias-te nas normas. Ao desviares-te disso já estás a pôr o pé na poça.




O facto do programa ser "simples" e "rudimentar" não justifica que ele seja mal escrito e baseado em más práticas. É exactamente essa a diferença entre uma coisa feita decentemente e algo produzido às 3 pancadas. Se não és capaz nem sentes necessidade de fazer bem uma coisa tão "simples" e "rudimentar" então obviamente que menos capaz serás e menos necessidade sentes em fazer bem qualquer projecto menos "simples" e menos "rudimentar".

Ou seja, é exactamente isso que distingue quem é competente de quem não é.

Não. A diferença é que tu estás a falar, sem saberes o que sei ou não sei fazer. Podia ter perfeitamente verificado a entrada de dados, se estavam dentro dos padrões e tudo mais, sei bem o que é programar. Mas:

1º ainda sou iniciante em c++, não convém tentar já subir um bocado mais a escala porque posso dar um erro mais crucial, daí ganhar um hábito ainda pior, e a partir daí como muitos dizem é a morte do artista.

2º o objectivo do programa não era ser preciso nem perfeito, apenas atingir o objectivo estipulado, seja as 3 pancadas ou não, desde que funcionasse.

3º sei o que são IDE's e sei que não definem uma linguagem, são apenas programas que traduzem a linguagem para a qual foram preparados compilar, fazer debug e linking, de modo a passar este para linguagem máquina, ou binária, como preferires, que possa ser entendida e executada pela máquina.

4º Não é por eu por agora usar soluções "à boa velha portuguesa" (desculpem o termo mas temos fama de tentar despachar tudo:P) agora no secundário que o irei continuar a fazer. apenas o fiz pois nem era pedido pelo prof, nem eu ainda tenho conhecimento suficiente da linguagem para o fazer, nem o meu prof iria entender pois tudo o que ele sabe lê no livro, e os exercicios que nos manda fazer, não são exercicios, apenas é copiar o código do livro. tento fazer por mim para aprender.

Sem nada mais referente a este assunto, agradeço de novo a tua preocupação.

Eu no entanto terei que fazer uma PAT. e visto que o meu prof é um 0 à esquerda no que toca a programar, quando lhe falei em programar com BD em c++, porque todos os outros vao usar VB porque é só click, click, click, ele apenas me soube mandar sacar códigos já feitos da net e modificar aquilo de modo a que pudesse usar no meu. O problema é que para modificar também preciso entender, e prefiro fazer algo por mim mesmo.
Sei que já fiz esta pergunta, e posso tar a tornar-me um pocuo chato, mas volto a perguntar se alguém sabe onde posso aprender online, de graça preferencialmente, por tutoriais e afins, a programar bases de dados, ou a ligar BD's de acess em c++.

Já agora, qual o modo correcto de limpar o ecrã assim sendo?

Abraço
 
Última edição:
Boas amigo. Tou a ver que desde a nossa última conversa tens andado em cima do C++. Fazes bem.

Olha, quando tu fazes a passagem dos argumentos por referencia, não dava para retornar normalmente, sem o uso de pointers? Não tenho a certeza disto, mas acho que funciona.

Bem, continua a estudar fortemente C++ para não tremeres na universidade.

Vá, cumps.
 
Dá. aliás. Eu também tenho essa versão feita. Mas o prof pediu as 2 (com ponteiros, e sem ponteiros). Daí eu fazer esta:P Sim, tenho-lhe dado bem. E é das linguagens que vamos aprender este ano por isso ainda melhor tenho que lhe dar para usa-la na minha PAT. Nunca mais apareceste no msn:/

Abraço
 
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.

Se sabes o que é compatibilidade compreendes certamente o recomendado. Essa norma já tem praticamente 10 anos, porque é que será que continuam a ser suportadados os headers originais? Não é por acaso que os processadores da Intel continuam a ser compatíveis com versões anteriores. As normas só são realmente normas se forem adoptadas, neste caso o que se passa é que qualquer compilador inclui esses headers.
 
Dá. aliás. Eu também tenho essa versão feita. Mas o prof pediu as 2 (com ponteiros, e sem ponteiros). Daí eu fazer esta:P Sim, tenho-lhe dado bem. E é das linguagens que vamos aprender este ano por isso ainda melhor tenho que lhe dar para usa-la na minha PAT. Nunca mais apareceste no msn:/

Abraço

Sry amigo. Tenho andado um bocado aterefado e mal tempo tenho para fazer o que mais gosto. Mas a ver se agora passo a ir lá mais vezes para continuarmos a trocar ideias. Então e o 12.º, está a correr bem?.

Quanto a C++ já sabes. Se tiveres alguma dúvida que o teu "professor" não saiba explicar, apita que eu tento sempre ajudar.

Vá, cumps.
 
Sry amigo. Tenho andado um bocado aterefado e mal tempo tenho para fazer o que mais gosto. Mas a ver se agora passo a ir lá mais vezes para continuarmos a trocar ideias. Então e o 12.º, está a correr bem?.

Quanto a C++ já sabes. Se tiveres alguma dúvida que o teu "professor" não saiba explicar, apita que eu tento sempre ajudar.

Vá, cumps.
Isso é que dá jeito:P sabes alguma cena de programar com BD? tipo.. ligar um programa em c++ a uma bd em Acess ou assim?
O 12º tem corrido fixe. E as cenas como vao por ai?

Back on topic... Ainda ninguém no meio da discussão disse qual o modo correcto de fazer clear screen...

Abraço
 
Isso é que dá jeito:P sabes alguma cena de programar com BD? tipo.. ligar um programa em c++ a uma bd em Acess ou assim?
O 12º tem corrido fixe. E as cenas como vao por ai?

Back on topic... Ainda ninguém no meio da discussão disse qual o modo correcto de fazer clear screen...

Abraço

Quanto à primeira parte da tua pergunta: ainda não sei ligar C++ a uma BD, mas vou comprar este natal um livro de programação em SQL que refere como ligar C++, VB e outros a SQL. Sei, no entanto, programar em PHP com ligação a MySQL. Quando eu souber mais sobre ligação entre BD e C++ digo alguma coisa.

Segunda parte. Vou ser a dizer-te como fazer clear screen em C++

Código:
#include <iostream>
using namespace std;
 
int main()
{
cout << "Teste de limpeza do ecrã." << endl << "Prima [ENTER] para limpar";
 
cin.get();           //esperar pela tecla [ENTER]
 
system ("cls");    //limpeza do ecrã
 
cout << "Ecrã acaba de ser limpo.";
 
cin.get();
 
return 0;            //indicar que correu tudo bem
}

E cá está. Um exemplo de código em que é evidente a limpeza da console. Basta digitar system("cls") que ele limpa, sem ser preciso incluir qualquer outro header.

Bem amigo, por aqui as coisas estão fixes. Muito trabalho (o 1.º agrupamento é aquela base...), mas as notas estão a ser boas.

Mas olha, o teu professor não sabia como se fazia clear screen?

Vá, cumps
 
Código:
#include <iostream>
using namespace std;
 
int main()
{
cout << "Teste de limpeza do ecrã." << endl << "Prima [ENTER] para limpar";
 
cin.get();           //esperar pela tecla [ENTER]
 
system ("cls");    //limpeza do ecrã
 
cout << "Ecrã acaba de ser limpo.";
 
cin.get();
 
return 0;            //indicar que correu tudo bem
}
E cá está. Um exemplo de código em que é evidente a limpeza da console. Basta digitar system("cls") que ele limpa, sem ser preciso incluir qualquer outro header.

O que ele queria era fazer uma função que fizesse o mesmo que o system("cls"), e não fazer uma função que o usasse!
 
O que ele queria era fazer uma função que fizesse o mesmo que o system("cls"), e não fazer uma função que o usasse!

Baderous, ele perguntou expressamente se alguem sabia fazer clear screen. Se ele quer usar uma função já feita ou fazer ele uma, isso já não te posso dizer. Mas agora, se estivermos a falar de criar algo novo que possibilite a limpeza de ecrã, isso já envolve muita coisa que me parece que ele ainda não teve contacto a este nível. Estamos a falar de bibliotecas como a windows.h e afins. Ou seja, ele teria de estar a programar directamente a carta de vídeo.

Mas se é isso, também lhe arranjo. Tenho aqui em casa algumas classes já feitas que permitem aceder directamente à carta de vídeo e a partir de aí, já se pode limpar o ecrã, recorrendo a funções ou classes criadas no momento.

Vá, cumps
 
- system("cls"); não é C++ e não funciona em mais lado nenhum senão numa plataforma específica.

Sobre o uso do system("cls"), tens de ter a noção de duas coisas.

A primeira é que a linguagem de programação C++ ( e a C) não reconhece conceitos como "monitor" ou "janela". Os únicos canais de acesso a dados que reconhece por defeito e que se encontram já estabelecidos são o stdin, stdout e stderr. Esses canais, como seguem o paradigma de UNIX e no que diz respeito ao seu uso, não passam de ficheiros e como é óbvio tu não "limpas a janela" dum ficheiro.

A segunda é sobre o cls. Trata-se dum programita que não só não é definido em absolutamente nenhuma norma (e por isso o seu funcionamento não é definido) como também só existe numa plataforma específica. Quando existe. Ao escreveres os teus programitas baseando-te numa coisa que não tens garantia absolutamente nenhuma que exista tu estás a depender dum ponto que não sabes se vai funcionar ou não. Tudo bem, podes argumentar que é um programa de maravilha e não vai ter uso. No entanto o que vai ter uso é o que aprendes ao fazer o programa. Se ao fazeres o programa aprendes que fazer as coisas às 3 pancadas é aceitável, incluindo usares coisas que vão "partir"... Estás no mau caminho e é a garantia que vais criar problemas desnecessariamente no futuro.

P.S.: um comando semelhante que é de facto normalizado é o comando clear de UNIX. Sabes o que é que esse programa faz? Envia para o stdout o número estritamente necessário de linhas vazias de maneira que o texto previamente existente deixe de aparecer no ecrã.

Já agora, qual o modo correcto de limpar o ecrã assim sendo?

Baderous, ele perguntou expressamente se alguem sabia fazer clear screen. Se ele quer usar uma função já feita ou fazer ele uma, isso já não te posso dizer. Mas agora, se estivermos a falar de criar algo novo que possibilite a limpeza de ecrã, isso já envolve muita coisa que me parece que ele ainda não teve contacto a este nível. Estamos a falar de bibliotecas como a windows.h e afins. Ou seja, ele teria de estar a programar directamente a carta de vídeo.

Mas se é isso, também lhe arranjo. Tenho aqui em casa algumas classes já feitas que permitem aceder directamente à carta de vídeo e a partir de aí, já se pode limpar o ecrã, recorrendo a funções ou classes criadas no momento.

Julgo que esta sequência de posts responde à tua dúvida.
 
Sim, meu caro amigo mj2p. o baderous tem razão. disseram-me que não é propriamente correcto usar essa função, daí eu perguntar outra que faça o mesmo, mas seja a correcta;) Não te esqueças de quando entrares na matéria de BDs me avisares:P

Abraço
 
Última edição:
Sim, meu caro amigo mj2p. o baderous tem razão. disseram-me que não é propriamente correcto usar essa função, daí eu perguntar outra que faça o mesmo, mas seja a correcta;) Não te esqueças de quando entrares na matéria de BDs me avisares:P

Abraço

Tá bem. Desculpa então a ti e ao Baderous.

Quando entrar em BD aviso.

Mas olha, queres que te envie as classes que tenho que te permitem comunicar directamente com a carta de vídeo? Acho que não é a melhor opção por agora, mas podes tentar.

Vá, cumps.
 
Tá bem. Desculpa então a ti e ao Baderous.

Quando entrar em BD aviso.

Mas olha, queres que te envie as classes que tenho que te permitem comunicar directamente com a carta de vídeo? Acho que não é a melhor opção por agora, mas podes tentar.

Vá, cumps.
Estou disposto a tentar. Além de que aprender é sempre bom:P danke^^
 
Não. A diferença é que tu estás a falar, sem saberes o que sei ou não sei fazer. Podia ter perfeitamente verificado a entrada de dados, se estavam dentro dos padrões e tudo mais, sei bem o que é programar.
Eu falei somente baseado no código que apresentaste. Esse código é a única demonstração do que sabes a que tive acesso. Como tu apresentaste erros de palmatória num código que, como achaste por bem apresentá-lo ao público para obter críticas, fizeste os possíveis para tirar de lá todos os erros então é óbvio para qualquer um que os erros que cometeste são erros que nunca te passaram pela cabeça.

E já agora, os erros a que me refiro não tem a ver com entidades abstractas como " padrões de uso". É um erro de palmatória. Tu violas a regra básica de "toda a função deve verificar se a entrada de dados é válida". Como agravante, tu passas ponteiros, tu usas ponteiros e tu dependes de ponteiros. No entanto, tu não fazes uma única verificação se os ponteiros que recebes em parâmetros são válidos ou não. Isso é uma asneira da grossa típica de novatos bem verdes.


Mas:

1º ainda sou iniciante em c++, não convém tentar já subir um bocado mais a escala porque posso dar um erro mais crucial, daí ganhar um hábito ainda pior, e a partir daí como muitos dizem é a morte do artista.
Mas... Mas... escreveste atrás "sei bem o que é programar"...

Repara, o que apontei são erros cruciais. Por exemplo, a insistência em não verificares a sanidade dos dados inseridos em especial no que trata a ponteiros de memória faz com que os erros se propagam e, pior ainda, possam revelar-se problemas de segurança. Verificar para onde é que um ponteiro aponta antes de usá-lo é das coisas mais básicas que é obrigatório fazer quando se lida com memória dinâmica.

2º o objectivo do programa não era ser preciso nem perfeito, apenas atingir o objectivo estipulado, seja as 3 pancadas ou não, desde que funcionasse.
Ora lá está o teu problema. Tu pensas que o objectivo dum exercício de programação é fazer as coisas às 3 pancadas, evitando fazer as coisas bem. Sabes, se durante a tua aprendizagem a única coisa que aprendes é a fazer as coisas às 3 pancadas então adivinha como é que vais sair daí. Pois.

3º sei o que são IDE's e sei que não definem uma linguagem, são apenas programas que traduzem a linguagem para a qual foram preparados compilar, fazer debug e linking, de modo a passar este para linguagem máquina, ou binária, como preferires, que possa ser entendida e executada pela máquina.
Jesus. Nem sabes o que é um IDE. Um IDE não é um compilador e um compilador não é um IDE.

4º Não é por eu por agora usar soluções "à boa velha portuguesa" (desculpem o termo mas temos fama de tentar despachar tudo:P) agora no secundário que o irei continuar a fazer. apenas o fiz pois nem era pedido pelo prof, nem eu ainda tenho conhecimento suficiente da linguagem para o fazer, nem o meu prof iria entender pois tudo o que ele sabe lê no livro, e os exercicios que nos manda fazer, não são exercicios, apenas é copiar o código do livro. tento fazer por mim para aprender.
Errado. Tu vais continuar a fazer as coisas "às três pancadas" porque, durante todo o teu processo de aprendizagem, tu não vais querer fazer as coisas de outra maneira. Achas mesmo que no futuro tu vais acordar um dia a fazer e a saber fazer as coisas bem? Não. É um processo gradual que vem de hábitos. Se tu não começas a fazer bem as coisas agora mesmo então nunca mais vais conseguir fazer.

E já agora, o teu professor deve ter-te pedido para fazer as coisas. Com certeza que ele não te pediu para fazer as coisas mal.

Sem nada mais referente a este assunto, agradeço de novo a tua preocupação.
É pena que só os outros se preocupem com coisas básicas como competência e boas práticas.

Eu no entanto terei que fazer uma PAT. e visto que o meu prof é um 0 à esquerda no que toca a programar, quando lhe falei em programar com BD em c++, porque todos os outros vao usar VB porque é só click, click, click, ele apenas me soube mandar sacar códigos já feitos da net e modificar aquilo de modo a que pudesse usar no meu. O problema é que para modificar também preciso entender, e prefiro fazer algo por mim mesmo.
Sei que já fiz esta pergunta, e posso tar a tornar-me um pocuo chato, mas volto a perguntar se alguém sabe onde posso aprender online, de graça preferencialmente, por tutoriais e afins, a programar bases de dados, ou a ligar BD's de acess em c++.
Procura por bases de dados a sério. O sqlite oferece uns interfaces muito simples de se usar e implementa bem SQL.

Já agora, qual o modo correcto de limpar o ecrã assim sendo?
Tal como já disse, isso de "ecrã" não existe em C ou C++. Logo, as normas da linguagem não oferecem interfaces para manipular algo que não existe.

Se quiseres manipular isso de "ecrã" tu tens de recorrer a bibliotecas que lidem com isso. Por exemplo, a biblioteca ncurses existe em todos os sistemas que respeitem as normas POSIX.

No entanto a verdade é que isso de "limpar o ecrã" não é suportado por nenhuma norma de linguagem pois é algo que simplesmente é irrelevante. Aliás, as únicas pessoas que aparecem a querer isso são os novatos que ainda não aprenderam a programar. Com o tempo aprendem melhores maneiras de fazer a entrada e saida de dados e apercebem-se que não há nenhuma necessidade de fazer isso.
 
1º Sei programar. Algoritmia é a estrutura lógica da programação. saber ou não por completo a linguagem e a respectiva sintaxe, comandos, etc não implica que não saiba programar.
2º Nunca na vida um professor de secundário te vai pedir para seguires todas as regras e normas de que linguagem for. O que te pedem é para fazeres o programa funcionar para X objectivo!;).

Bem, acho que já chega de discussão desnecessária. agradeço a ajuda de todos
 
2º Nunca na vida um professor de secundário te vai pedir para seguires todas as regras e normas de que linguagem for. O que te pedem é para fazeres o programa funcionar para X objectivo!;).
Se for mau professor? Sim, concordo.

Os bons hábitos têm de se pegar logo no inicio, já vi pessoal começar a programar de uma forma terrível e habituar-se àquilo...

Bem, acho que já chega de discussão desnecessária. agradeço a ajuda de todos
Olha que este tipo de discussão não é nada desnecessário :) É bastante importante mesmo que tu, e todos que estão a iniciar, tenham noção de como as coisas devem ser feitas!

Não vejas as criticas como algo destrutivo, vê como conselhos ;) Só os aceitas se quiseres :)
 
Back
Topo