Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2013, 09:57   #1
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию Функции

Создайте void-функцию с именем round(), которая округляет значение своего аргумента типа double до ближайшего целого значения. Пусть round() использует параметр-ссылку и возвращает округленный результат через этот параметр. Продемонстрируйте вызов round() в программе. Для решения этой задачи вам понадобится функция modf() из стандартной библиотеки. Она имеет такой прототип:

double modf(double num, double *i);

Функция modf() разлагает num на целую и дробную части. Она воз-вращает дробную часть и помещает целую часть в переменную, на которую указывает i. Функция требует заголовок <cmath>.

Код:
#include <cstdlib>
#include <iostream>
#include <cmath>

using namespace std;

double modf(double num, double *i);

int main()
{ double num, *i;
    
    cout<<"Vvedite chislo: ";
    cin>>num;
    
void round(double &num);

{

    return (num >= 0) ? (int)(num + 0.5) : (int)(num - 0.5);
 
}
cout<<"Chislo: "<<num;
 cin>>num;
return 0;
}
В чем ошибка? Программа откомпилировалась, но не работает(

Последний раз редактировалось Diana528; 12.04.2013 в 10:25.
Diana528 вне форума Ответить с цитированием
Старый 12.04.2013, 10:49   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ответьте себе на несколько вопросов:
1) Где у вас прописана функция round?
2) Где у вас вызывается фунцкия round?
3) В чем разница между void round(double &num); и double modf(double num, double *i);
4) Зачем прописываете прототип modf?
5) Зачем делаете include <cmath>

Последний раз редактировалось waleri; 12.04.2013 в 10:51.
waleri вне форума Ответить с цитированием
Старый 12.04.2013, 10:54   #3
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию

в смысле где прописана?

Функция modf() разлагает num на целую и дробную части. Она воз-вращает дробную часть и помещает целую часть в переменную, на которую указывает i. Функция требует заголовок <cmath>, т.к. это математическое действие

Код:
#include <cstdlib>
#include <iostream>
#include <cmath>

using namespace std;

double modf(double num, double *i);
    
int main()

{ 
    double *i, num;
  
  void round(double num);

{
 (num >= 0) ? (num + 0.5) : (num - 0.5);
     }
   

    *i= round( double num);//âûçîâ ôóíêöèè
    cout<<"Vvedite chislo: ";
    cin>>num;

    cout<<"Chislo: "<<*i;
 cin>>*i;
return 0;
}
в чем моя ошибка

Последний раз редактировалось Stilet; 12.04.2013 в 19:11.
Diana528 вне форума Ответить с цитированием
Старый 12.04.2013, 11:55   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Diana528 Посмотреть сообщение
в смысле где прописана?
Где находится ваша функция round?
waleri вне форума Ответить с цитированием
Старый 12.04.2013, 11:57   #5
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию

Код:
#include <cstdlib>
#include <iostream>
#include <cmath>

using namespace std;

double modf(double num, double *i);
         
int main()

{ 
    double *i, num;
  
  cout<<"Vvedite chislo: ";
    cin>>num;
 *i= round(num);
    cout<<"Chislo: "<<num;
 cin>>num;
 
  void round( double num);
  {
(num >= 0) ? (num + 0.5) : (num - 0.5);
     }

 
return 0;
}

Последний раз редактировалось Diana528; 12.04.2013 в 12:17.
Diana528 вне форума Ответить с цитированием
Старый 12.04.2013, 12:18   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
в чем моя ошибка
В непонимании синтаксиса C++.
1) В C++ нельзя объявлять функции внутри других функций, такое объявление нелегально и будет некорректно интерпретировано компилятором.
2) Заголовок, описание функции ( void round(double num); ) - это просто "обещание" компилятору, что где-то там, потом, такая функция ему встретится - чтобы он не удивлялся, увидев её вызов. Определение функции должно находиться отдельно, в глобальной области видимости и его синтаксис не требует точки с запятой после сигнатуры функции:
Код:
void round(double num)
{
 (num >= 0) ? (num + 0.5) : (num - 0.5);
}
3) Функция, приведённая выше, бессмысленна: поскольку её аргумент передаётся по значению, и она ничего не возвращает и не производит никаких значимых побочных действий, то её вызов не будет иметь видимого эффекта.

4) Далее, для такой функции нелегально использование
Код:
*i= round( double num);
round возвращает void, "ничего". Соответственно, её вызов не может стоять в правой части оператора присваивания. Кроме того, double при аргументе функции будет сочтено синтаксической ошибкой.

5)
Код:
double *i, num;
Эта инструкция объявляет и определяет переменную i, являющуюся указателем на double и переменную num типа double, значение каждой из них не определено. *i - "то, что находится по адресу i". Попытка обратиться к памяти по неопределённому адресу - undefined behavior. Формально, программа (если она скомпилируется и будет запущена) имеет право повести себя как угодно после такого обращения.
Abstraction вне форума Ответить с цитированием
Старый 12.04.2013, 12:25   #7
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию

Код:
#include <cstdlib>
#include <iostream>
#include <cmath>

using namespace std;

double modf(double num, double *i);

void round( double num)
  {
 (num >= 0) ? (num + 0.5) : (num - 0.5);
}        
int main()

{ 
    double i, num;
  
  cout<<"Vvedite chislo: ";
    cin>>num;
    
 i= round(num);
    
 cout<<"Chislo: "<<i;
 cin>>i; 

 
return 0;
}
и все же опять ошибка
D:\Ìîè äîêóìåíòû\main.cpp In function `void round(double)':
10 D:\Ìîè äîêóìåíòû\main.cpp new declaration `void round(double)'
Diana528 вне форума Ответить с цитированием
Старый 12.04.2013, 12:40   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Компилятор говорит, что он уже знает одну round(double) и вторая ему не нужна. В стандарте такой функции нет. Что у Вас за компилятор?

В качестве средства борьбы, можете переименовать функцию в MyRound.
Abstraction вне форума Ответить с цитированием
Старый 12.04.2013, 17:40   #9
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Зачем в этом коде modf?
Чо вы хотели сказать этой строчкой
Код:
(num >= 0) ? (num + 0.5) : (num - 0.5);
? Ни присваивания, ни возврата,...
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 12.04.2013, 17:59   #10
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
В стандарте такой функции нет.
А разве в cmath.h нету rand? Помоему есть, и её действие заключается в том, что она округляет до целого (возвращает double).
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.
Че Гевара вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование подпрограммы-функции: Вычислить значение функции (Турбо паскаль) RealUnited Паскаль, Turbo Pascal, PascalABC.NET 1 05.12.2012 20:34
Построение графика функции, мигание(затухание) шарика в минимумах функции kas1m_rus Паскаль, Turbo Pascal, PascalABC.NET 0 27.05.2012 20:28
Как подменить адрес возврата функции func на адрес функции f используя переполнение буфера buf и функции gets dmitrii6120 Помощь студентам 6 14.11.2011 20:10
Мини бэйсик:объявление функции, вызов функции , возврат. AL_LORD Помощь студентам 2 14.10.2010 17:48
Программа на СИ++, используя функции работы с файлами и функции <string.h> Аня Popova Фриланс 9 13.09.2010 15:52