Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение числа и использование перегрузки функции 
:(
    Опции темы
marknew
Дата 29.4.2017, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



Приветствую! Необходимо написать две версии общей функции get_number таким образом, чтобы функция get_number могла быть использована для целого числа или для числа с плавающей точкой, как потребуется. Функция должна принимать числовой аргумент, определяющий значение по умолчанию. Для приведенного вызова: get_number(0) функция должна возвращать целочисленное значение, тогда как get_number(0.0) должна возвращать значение типа double. Для этого нам нужно перегрузить две версии функции, одна из которых принимает и возвращает значение типа int, а другая принимает и возвращает значение типа double.

По отдельности, у меня получилось написать работоспособный код:

Вариант 1 (для целых чисел).

Код

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <math.h>
using std::cin;
using std::cout;
using std::endl;
 
int get_number();
 
int main() {
    double x;
    system("chcp 1251 > nul");
    
    for(;;) {
        cout << "Введите число (нажмите Enter для выхода): ";
        x = get_number();
        
        if (x == 0.0)
            break;
        
        cout << "Квадратный корень введенного числа равен: " << sqrt(x);
        cout << endl << endl;
    }
    
    cout << endl;
    
    system("pause");
    return 0;
}
 
int get_number() {
    char s[100];
    cin.getline(s,99);
       
    if (strlen(s) == 0)
        return 0;
       
    return atoi(s);
}


Вариант 2 (для double).

Код

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <math.h>
using std::cin;
using std::cout;
using std::endl;
 
double get_number();
 
int main() {
    double x;
    system("chcp 1251 > nul");
 
    for(;;) {
        cout << "Введите число (нажмите Enter для выхода): ";
        x = get_number();
        
        if (x == 0.0)
            break;
        
        cout << "Квадратный корень введенного числа равен: " << sqrt(x);
        cout << endl << endl;
    }
    
    cout << endl;
 
    system("pause");
    return 0;
}
 
double get_number() {
       char s[100];
       cin.getline(s,99);
       
       if (strlen(s) == 0)
           return 0.0;
       
       return atof(s);
}


Собственно, вопрос заключается в том, как объединить эти две версии в одну? Пока у меня не получается даже скомпилировать такой код.. Никак не могу понять, как в данном случае правильно осуществить вызов функции после введения числа? Что я должен указывать в аргументах, если я заранее не знаю, какое будет введено число int\double?

Код

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <math.h>
using std::cin;
using std::cout;
using std::endl;
 
int get_number(int val);
double get_number(double val);
 
int main() {
    double x;
    system("chcp 1251 > nul");
    
    for(;;) {
        cout << "Введите число (нажмите Enter для выхода): ";
        x = get_number();
        
        if (x == 0.0)
            break;
        
        cout << "Квадратный корень введенного числа равен: " << sqrt(x);
        cout << endl << endl;
    }
    
    cout << endl;
    
    system("pause");
    return 0;
}
 
int get_number(int val) {
    char s[100];
    cin.getline(s,99);
       
    if (strlen(s) == 0)
        return 0;
       
    return atoi(s);
}
 
double get_number(double val) {
       char s[100];
       cin.getline(s,99);
       
       if (strlen(s) == 0)
           return 0.0;
       
       return atof(s);
}

PM MAIL   Вверх
xvr
Дата 30.4.2017, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(marknew @  29.4.2017,  22:47 Найти цитируемый пост)
 Никак не могу понять, как в данном случае правильно осуществить вызов функции после введения числа? Что я должен указывать в аргументах, если я заранее не знаю, какое будет введено число int\double?

В вашем задании нет ни слова о том, что вызов функции будет после введения числа. Равно как и нет требования, что бы конкретная функция выбиралась в процессе исполнения программы после введения числа.

PM MAIL   Вверх
marknew
Дата 30.4.2017, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



Цитата(xvr @  30.4.2017,  08:13 Найти цитируемый пост)
В вашем задании нет ни слова о том, что вызов функции будет после введения числа. Равно как и нет требования, что бы конкретная функция выбиралась в процессе исполнения программы после введения числа.

Наверное, я не совсем корректно написал, попробую переформулировать. Да это не то чтобы для задания, просто я самостоятельно, по книжке, пытаюсь разобраться, поэтому, заранее приношу свои извинения, за возможно тупые вопросы. Что нужно добавить, чтобы конкретная функция выбиралась в процессе исполнения программы после введения числа? Ну и собственно остается актуальным мой изначальный вопрос - Как объединить эти мои две версии в одну работоспособную программу? Достаточно ли для этого перегрузки функции, либо этого мало и требуется что то еще?  
PM MAIL   Вверх
vpf
Дата 30.4.2017, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 14.11.2016
Где: Moscow

Репутация: нет
Всего: нет



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

PM MAIL IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
marknew
Дата 30.4.2017, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



Цитата

Перегрузка работает только по входным аргументам. Вы же пытаетесь перегрузить функцию по выходу, как перегрузка это не работает.

Ок, с этим более-менее понятно.

Цитата

Если у функции нет аргументов, но требуется разный тип результата,  нужно делать разные функции.
  
Вот это не совсем ясно. Я попробовал дать разные имена функциям и не использовать перегрузку, но это не особо помогло..  Если не сложно, могли бы вы написать эти две функции, которые я мог бы использовать в контексте моего примера?
PM MAIL   Вверх
vpf
Дата 30.4.2017, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 14.11.2016
Где: Moscow

Репутация: нет
Всего: нет



Попробую завтра, пока скажу так, допустим есть две функции getInt() и getDouble() одна возвращает int, другая double.
Вы ввели число в виде строки. Проверяете по regexp  формат числа в виде  "\d+"  если совпадает, значит введено целое число,
вызываете getInt если не совпадает вызываете getDouble()
Как вариант, если с regexp проблемы, просто сделать поиск "."  (точки) если есть, значит вызвать getDouble(), нет getInt().


PM MAIL IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
marknew
Дата 30.4.2017, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



Цитата

Попробую завтра

Был бы очень благодарен!

Цитата

пока скажу так, допустим есть две функции getInt() и getDouble() одна возвращает int, другая double.
Вы ввели число в виде строки. Проверяете по regexp  формат числа в виде  "\d+"  если совпадает, значит введено целое число,
вызываете getInt если не совпадает вызываете getDouble()
Как вариант, если с regexp проблемы, просто сделать поиск "."  (точки) если есть, значит вызвать getDouble(), нет getInt().

Хорошо, попробую копнуть в этом направлении..

Это сообщение отредактировал(а) marknew - 30.4.2017, 20:59
PM MAIL   Вверх
vpf
Дата 1.5.2017, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 14.11.2016
Где: Moscow

Репутация: нет
Всего: нет



Код

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <math.h>

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

bool get_number();

int main() {
    system("chcp 1251 > nul");
    for (;;) {
        cout << "Введите число (нажмите Enter для выхода): ";
        if (!get_number())
            break;
    }
    cout << endl;

    system("pause");
    return 0;
}

bool get_number() {
    char s[100];
    cin.getline(s, 99);

    if (strlen(s) == 0)
        return false;

    if (strstr(s, ".") != NULL) {
        double x = atof(s);
        if (x == 0.0)
            return false;
        cout << "Квадратный корень введенного числа равен: " << sqrt(x);
    } else {
        int x = atoi(s);
        if (x == 0) {
            return false;
        }
        cout << "Квадратный корень введенного числа равен: " << sqrt(x);
    }
    cout << endl << endl;
    return true;
}


Вариант обычный.

Код

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <math.h>

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

bool get_number();
double get_double(char* s);
int get_int(char* s);

int main() {
    system("chcp 1251 > nul");
    for (;;) {
        cout << "Введите число (нажмите Enter для выхода): ";
        if (!get_number())
            break;
    }
    cout << endl;

    system("pause");
    return 0;
}

double get_double(char * s) {
    double x = atof(s);
    if (x != 0.0)
        cout << "Квадратный корень введенного числа равен: " << sqrt(x);
    return x;
}

int get_int(char * s) {
    int x = atoi(s);
    if (x != 0)
        cout << "Квадратный корень введенного числа равен: " << sqrt(x);
    return x;
}

bool get_number() {
    char s[100];
    cin.getline(s, 99);

    if (strlen(s) == 0)
        return false;

    if (strstr(s, ".") != NULL) {
        if(get_double(s) == 0.0)
            return false;
    } else {
        if(get_int(s) == 0)
            return false;
    }
    cout << endl << endl;
    return true;
}


Вариант с функциями и разными значениями возврата

Это сообщение отредактировал(а) vpf - 1.5.2017, 08:46
PM MAIL IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
marknew
Дата 2.5.2017, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



Цитата(vpf @ 1.5.2017,  08:14)
Код

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <math.h>

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

bool get_number();

int main() {
    system("chcp 1251 > nul");
    for (;;) {
        cout << "Введите число (нажмите Enter для выхода): ";
        if (!get_number())
            break;
    }
    cout << endl;

    system("pause");
    return 0;
}

bool get_number() {
    char s[100];
    cin.getline(s, 99);

    if (strlen(s) == 0)
        return false;

    if (strstr(s, ".") != NULL) {
        double x = atof(s);
        if (x == 0.0)
            return false;
        cout << "Квадратный корень введенного числа равен: " << sqrt(x);
    } else {
        int x = atoi(s);
        if (x == 0) {
            return false;
        }
        cout << "Квадратный корень введенного числа равен: " << sqrt(x);
    }
    cout << endl << endl;
    return true;
}


Вариант обычный.

Код

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <math.h>

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

bool get_number();
double get_double(char* s);
int get_int(char* s);

int main() {
    system("chcp 1251 > nul");
    for (;;) {
        cout << "Введите число (нажмите Enter для выхода): ";
        if (!get_number())
            break;
    }
    cout << endl;

    system("pause");
    return 0;
}

double get_double(char * s) {
    double x = atof(s);
    if (x != 0.0)
        cout << "Квадратный корень введенного числа равен: " << sqrt(x);
    return x;
}

int get_int(char * s) {
    int x = atoi(s);
    if (x != 0)
        cout << "Квадратный корень введенного числа равен: " << sqrt(x);
    return x;
}

bool get_number() {
    char s[100];
    cin.getline(s, 99);

    if (strlen(s) == 0)
        return false;

    if (strstr(s, ".") != NULL) {
        if(get_double(s) == 0.0)
            return false;
    } else {
        if(get_int(s) == 0)
            return false;
    }
    cout << endl << endl;
    return true;
}


Вариант с функциями и разными значениями возврата

Спасибо, но, к сожалению, у меня оба варианта при компиляции выдают ошибки.. Компилятор ругается вот на эту строчку:
Код

int get_int(char * s) {
cout << "Квадратный корень введенного числа равен: " << sqrt(x);


Error 1 error C2668: 'sqrt': ambiguous call to overloaded function
         2 IntelliSense: more than one instance of overloaded function "sqrt" matches the argument list

Использую Visual C++ 2010 Express.
PM MAIL   Вверх
vpf
Дата 2.5.2017, 05:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 14.11.2016
Где: Moscow

Репутация: нет
Всего: нет



PM MAIL IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
marknew
Дата 2.5.2017, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



Цитата(vpf @ 2.5.2017,  05:38)
http://stackoverflow.com/questions/2296266...loaded-function

Сейчас посмотрю, в принципе, тему можно считать закрытой, т.к. нашлось более подходящее решение, достаточно было к моей изначальной версии всего то лишь добавить нужный аргумент (при вызове get_number). Но, в любом случае, спасибо вам за предоставление альтернативного варианта кода!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1669 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.