Как создать программу, используя 3 перегруженные функции (разница в параметрах - int, long, float), при этом запрашивая только одну входную запись? - PullRequest
3 голосов
/ 10 августа 2011

Я должен написать программу, в которой я ставлю два числа, и программа вычисляет среднее значение.Я хочу написать свою программу так, чтобы, если я введу два десятичных числа, программа вызовет функцию с плавающей запятой, а если я введу два целых числа, она вызовет целочисленную функцию, введет два длинных числа, вызовет длинную функцию.

Основная проблема, с которой я столкнулся, - это выбор типа переменной.Потому что, если я использую тип long для своей переменной, но два числа, введенные пользователем, являются десятичными, то программа вызывает функцию long, а среднее значение получается как длинная переменная.

Вот что ямы дошли до этого:

#include <iostream>

int average(int, int);
long average(long, long);
float average(float, float);

int main()
{
        //The variables
        //      The problem with them is that if I use
        //      a type, let's say int, but the input
        //      is a float, then it won't work
         x;
         y;
         averag;

        std::cout << "Here is a number: ";
        std::cin >> x;  
        std::cout << "\nHere is another one: ";
        std::cin >> y;

        //The function in call
        averag = average(x, y);

        std::cout << "\n\nHere is the average: ";
        std::cout << averag;
        return 0;
}

//The definition of the int function
int average(int x, int y)
{
        int x;
        int y;
        int average;
        average = (x + y) / 2;
        return average;
}

// The definition of the short function
short average(short x, short y)
{
        short x;
        short y;
        short average;
        average = (x + y) / 2;
        return average;
}

// The definition of the float function
float average(float x, float y)
{
        float x;
        float y;
        float average;
        average = (x + y) / 2;
        return average;
}

//I think i'm not grasping the scopes in which I can define a variable
//and where I must define the parameters within the functions

Я думаю, что определение переменных типа в каждой области действия функции является неправильным, но как еще я должен определять переменные!

Как это сделать?

Ответы [ 4 ]

3 голосов
/ 10 августа 2011

Я бы хотел, чтобы пользователь сначала вводил тип (например, «Ввод F для числа с плавающей запятой, I для целого числа ...» и т. Д.), Затем использовал этот ввод в качестве условия, считывал входные данные в соответствующий тип переменной и вызывал бы перегруженный вами тип.average функция.

0 голосов
/ 10 августа 2011

Вы можете спросить пользователя, какой расчет он хочет выполнить.Недостатки:

  1. Внутренние части программы, которые не представляют интереса для пользователя, выставлены (пользователь хочет вычислить среднее из двух чисел).*

    Вы не можете доверять пользователю.Если ваша программа надежна и не дает сбоя (например, если пользователь вводит десятичные числа после выбора целочисленного вычисления), она может привести к неверным результатам

Я рекомендую прочитатьвводите каждый раз и смотрите, является ли значение десятичным числом, коротким целым числом (менее 9 цифр) или длинным целым числом.Затем вам нужно рассмотреть несколько случаев (например, один ввод - десятичный, другой - длинное целое) и выполнить расчет.Это довольно низкий уровень, но я бы все равно превратил его в функцию.

0 голосов
/ 10 августа 2011

Я бы ввел значение в виде строки, а затем использовал бы последовательные вызовы boost::lexical_cast для вывода типа:

std::string x,y;
std::cin >> x >> y;
try {
  short averag = average(boost::lexical_cast<short>(x), boost::lexical_cast<short>(y));
  std::cout << averag << "\n";
  return;
} catch(boost::bad_lexical_cast&) {}
try {
  int averag = average(boost::lexical_cast<int>(x), boost::lexical_cast<int>(y));
  std::cout << averag << "\n";
  return;
} catch(boost::bad_lexical_cast&) {}
try {
  float averag = average(boost::lexical_cast<float>(x), boost::lexical_cast<float>(y));
  std::cout << averag << "\n";
  return;
} catch(boost::bad_lexical_cast&) {}

std::cout << "Oops\n";

Однако, вероятно, я бы не использовал эту форму. Вероятно, я бы выделил общий код в шаблон функции.

0 голосов
/ 10 августа 2011

Да, определение переменных в области действия способа, как у вас, неверно.Ваши параметры определяют переменные, определение их в функции просто определит их снова.Я не очень знаком с c ++, но я думаю, что это «затеняет» переменные параметров, и ваши вычисления не будут работать.тип среднего они хотят выполнить в первую очередь.Если пользователь введет 5 и 4, среднее значение double будет отличаться от среднего значения long.

...