
hrcerq
(usa Outra)
Enviado em 24/02/2018 - 23:32h
Olá novamente.
A princípio, vejo duas possibilidades de melhoria no seu código.
("A princípio" porque você alega ser iniciante e portanto ainda deve estar trabalhando com o básico, mas posteriormente vai achar novas melhorias para seu código, usando fatoração e possivelmente ponteiros de função, além dos tratamentos de exceção. Mas a princípio vamos manter as coisas em um nível mais básico pra facilitar o entendimento.)
# Melhoria 1
Você conhece os tipos enumerados? Se não conhece, sugiro ler sobre aqui:
http://www.cplusplus.com/doc/tutorial/other_data_types/ (seção "Enumerated types (enum)")
Depois de ler a seção citada acima, você deve imaginar porque comentei sobre esse tipo: você pode criar um tipo pré-definido para suas operações matemáticas, como no exemplo a seguir:
typedef enum {
soma=1,
sub,
mult,
divi
} operacao;
Atenção: este trecho não deve constar na função main e sim anteriormente a ela, ok? Em um caso real, isto ficaria em um arquivo de cabeçalho separado, mas vamos ignorar por enquanto.
Dito isto, veja que o tipo
operacao foi criado, com quatro possibilidades de valor (1,2,3 e 4) representando as operações soma, subtração, multiplicação e divisão, respectivamente. Feito isso, você pode criar um menu na função main, que vai perguntar a operação desejada ao usuário:
operacao op;
cout << "Início do programa\n";
cout << "Escolha a operação:\n"
<< soma << ": soma\n"
<< sub << ": subtração\n"
<< mult << ": multiplicação\n"
<< divi << ": divisão\n"
<< "\n> ";
int escolha;
cin >> escolha;
op = (operacao) escolha; // Conversão explícita é necessária
Observe que onde deveria estar o número está o nome do tipo enumerado, assim eu garanto que o número certo aparecerá, caso resolva mudar os códigos das operações no futuro. Veja também que uma conversão explícita é necessária na última linha. O tipo operacao não é sintaticamente idêntico ao tipo inteiro, portanto eu devo explicitamente dizer que vou guardar um valor compatível.
# Melhoria 2
Além de saber qual a operação deve ser feita, você precisa saber também quantos operandos o usuário quer. Usar um switch pra isso, além de não ser prático, é limitador, pois o usuário não pode escolher um valor que não esteja previsto no switch. Então eu proponho outra forma de capturar essa informação.
Primeiramente, pergunte ao usuário quantos operandos ele quer usar, armazenando o valor em uma variável do tipo inteiro:
int nOperandos;
cout << "Quantos operandos? ";
cin >> nOperandos;
Em seguida, defina duas variáveis: o valor total da operação (resultado final) e uma variável para armazenar valores informados pelo usuário de forma iterativa.
float total = 0;
float proximo;
Atenção: É importante que o total seja inicializado para 0, já que será depois somado a outros valores e queremos garantir que seu valor inicial seja efetivamente 0.
A maneira como essas variáveis serão manipuladas depende da operação escolhida. Aí entra a próxima etapa (o switch):
switch (op) {
case soma:
// Seção referente a soma
break;
case sub:
cout << "Subtração";
// Seção referente a subtração
break;
case mult:
cout << "Multiplicação";
// Seção referente a multiplicação
break;
case divi:
cout << "Divisão";
// Seção referente a divisão
break;
default:
cout << "Operação inválida";
}
Adapte o bloco switch para cada função (coloquei o exemplo da soma):
case soma:
cout << "Soma:\n";
for (int i=0; i<nOperandos; i++)
{
cout << "Valor a somar: ";
cin >> proximo;
total += proximo;
}
cout << "Total: " << total;
break;
Veja que dessa forma, o usuário pode escolher quantos operandos quer usar, e então o laço
for vai pedir ao usuário por um valor novo pela quantidade de operandos que foi definida. Se o usuário escolhe 3 operandos, 3 valores serão pedidos e então somados ao total. No final o valor total é exibido.
Você pode definir um mecanismo similar para a multiplicação que, assim como a soma, tem a propriedade comutativa. Já as operações de subtração e divisão são influenciadas pela ordem dos fatores, então precisarão de algumas pequenas adaptações. Vou deixar isso a seu encargo, já que não está no escopo da sua pergunta.
Sinto pela resposta longa, mas uma meia explicação pode ser pior do que nenhuma explicação.
---
Atenciosamente,
Hugo Cerqueira