Форум программистов, компьютерный форум CyberForum.ru

Целочисленное деление с округлением - пограмма готовая, только округление... - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 84, средняя оценка - 4.61
x-positive
1 / 1 / 0
Регистрация: 09.02.2011
Сообщений: 21
13.02.2011, 04:11     Целочисленное деление с округлением - пограмма готовая, только округление... #1
Помогите, пожалуйста, только работать надо с тем, что имеется...
Нельзя использовать новых переменных, нельзя округлять только "к выводу на экран".
Нельзя использовать функции round, int или прочих подобных функций.

Есть два варианта решения:
1. Использование функции разложения на две части - целую и дробную с использованием функции modf(x,&y), только не знаю как её применить. А затем целые части поделить (они уже имеют тип int.
2. Округление чисел double (подскажите какую функцию использовать).

Я уже не знаю что делать... Помогите чем сможете...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/* Дано действительные числа x, y і z. Решить уравнения и найти остаток от
 * целочисленного деления округлённых a і b.*/
#include <stdio.h>
#include <conio.h>
#include <math.h>
main()                                                                               
{
double a,b,x,y,z;
 
printf("x = ");         //ввод данных
scanf("%f",&x);
 
printf("y = ");
scanf("%f",&y);
 
printf("z = ");
scanf("%f",&z);
 
//решение уравнений
a = (sqrt(fabs(x-1))-pow(fabs(z),1.0/3))/(1+pow(x,2)/2+pow(y,2)/4)+pow(z,4);
b = (3+exp(y-1))/(1+pow(x,5)*fabs(y-tan(z)))+pow(x,2);
 
printf("\tResult:\n\na = %g\n",a);  //вывод результатов
printf("b = %g\n",b);
 
r = int(modf(a,&x)) % modf((b,&y));      //остаток от целочисленного деления округленных a і b
printf("a/b = %g",a);       //вывод остатка от деления
 
getch();
return 0;
}
Вся сложность вот в этой строке:
C++
1
a = modf(a,&x) % modf(b,&y);       //остаток от целочисленного деления округленных a і b
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2011, 04:11     Целочисленное деление с округлением - пограмма готовая, только округление...
Посмотрите здесь:

C++ Есть готовая прога,только нужно модифицировать.
Как записать целочисленное деление? C++
Целочисленное деление с++ C++
Проблемы с округлением вещественных чисел C++
Целочисленное деление C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.02.2011, 06:03     Целочисленное деление с округлением - пограмма готовая, только округление... #2
x-positive, modf используется легко возвращает дробную часть, в указателе хранит целую.
Функции для округления double - ceil(double) - округляет вверх; floor(double) - округляет вниз
x-positive
1 / 1 / 0
Регистрация: 09.02.2011
Сообщений: 21
13.02.2011, 18:51  [ТС]     Целочисленное деление с округлением - пограмма готовая, только округление... #3
нет, ошибку выдаёт=(
modf не срабатывает.
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
14.02.2011, 11:50     Целочисленное деление с округлением - пограмма готовая, только округление... #4
C
1
2
3
double x;
int y;
 y = x+0.5;
Удачи!
x-positive
1 / 1 / 0
Регистрация: 09.02.2011
Сообщений: 21
16.02.2011, 07:09  [ТС]     Целочисленное деление с округлением - пограмма готовая, только округление... #5
Мне без переменных лишних.. И округление по правилам (if a<C,5 a=1; if a>=C.5 a=2), где С - целая часть числа. Помогите реализовать...

Добавлено через 3 часа 9 минут
Только что с грехом пополам удалось реализовать вот такой кусочек кода:

if (modf(a,&a) >=0.5) {modf(a,&a);a+=1;}
if (modf(b,&b) >=0.5) {modf(b,&b);b+=1;}
a = (int)a % (int)b;
printf("a/b = %g\n\n",a);

кажется программа выполняет свои обязанности. хоть и с использованием лишних для меня (int).
а вот мой долгожданный второй вариант:

a = (int)floor(a+0.5) % (int)floor(b+0.5);
printf("a/b = %g",a);

На этом всё. Спасибо за полезную информацию всем
WiseLord
Сообщений: n/a
07.08.2011, 10:51     Целочисленное деление с округлением - пограмма готовая, только округление... #6
Да, вызов floor(x + 0.5), пожалуй самое лучшее решение для округления по правилам )
Наверное, из-за него разработчики Си и не заморочились создавать отдельную функцию round )
Ammandus
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 23
24.08.2011, 09:12     Целочисленное деление с округлением - пограмма готовая, только округление... #7
помогите округлить в большую сторону. Ввожу данные: 7.17.9..должно получиться 7.89

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
 
int main()
{
  int f, sh, oldp;
  int np;
  
  cout << "Vvedite kolichestvo funtov: ";
  cin >> f;
  cout << "Vvedite kolichestvo shillingov: ";
  cin >> sh;
  cout << "Vvedite kolichestvo pensov: ";
  cin >> oldp;
  cout << "staryi' format: " << f << "." 
       << sh << "." << oldp << endl;
 
 
  np = (sh * 12 + oldp) / 2.4;
 
  
  cout << "v novoi' sisteme: " << f << "." << np << endl;
 
  return 0;
}
Добавлено через 1 минуту
это перевод из старой денежной системы фунтов в новую.

Устаревшая денежная система Великобритании состояла из фунтов, шиллингов и пенсов. 1 фунт был равен 20 шилингам, 1 шилинг - 12 пенсам....Например, запись 5.2.8 обозначала 5 фунтов, 2 шиллинга и 8 пенсов(пенс - множественное число от пенни). Современная денежная система состоит только из фунтов и пенсов, причём один фунт равен 100 пенсам. Такой фунт называют десятичным.
таким образом 5.2.8 = 5.13(если быть точнее 5.133333).
7.17.9(по старой системе) = 7.89(по новой)

 Комментарий модератора 
Используйте теги форматирования кода!
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
24.08.2011, 11:23     Целочисленное деление с округлением - пограмма готовая, только округление... #8
C
1
 np = (sh * 12 + oldp) / 2.4 + 0.5;
Ammandus
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 23
24.08.2011, 12:51     Целочисленное деление с округлением - пограмма готовая, только округление... #9
это будет универсальный случай или частный?

Добавлено через 39 секунд
спасибо, огромное
-=ЮрА=-
Заблокирован
Автор FAQ
24.08.2011, 17:04     Целочисленное деление с округлением - пограмма готовая, только округление... #10
Цитата Сообщение от x-positive Посмотреть сообщение
modf(a,&x)
- &x - зачем, нужно просто х писать
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
24.08.2011, 17:09     Целочисленное деление с округлением - пограмма готовая, только округление... #11
-=ЮрА=-, нет, нужно именно &x. Функция modf вторым аргументом принимает указатель.

Добавлено через 59 секунд
Другое дело, что сама функция modf здесь избыточна...
-=ЮрА=-
Заблокирован
Автор FAQ
24.08.2011, 17:18     Целочисленное деление с округлением - пограмма готовая, только округление... #12
x-positive, посмотри эти посты, да и в целом весь топик, в нём проблемма округления была рассмотрена основатльно
непонятки
непонятки

Добавлено через 2 минуты
Вот на всякий случай код без modf и int()
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
char s[2];
 
int main()
{
        char ch;
        double val;
 
        double fpart;
        double spart;
        int kop;
        do
        {
                printf("Enter double\r\n");
                scanf("%lf",&val);
 
                fpart = floor(val);
                spart = val - fpart;
                printf("%.0f RU",fpart);
                sprintf(s,"%0.f",100.0*spart);
                sscanf(s,"%d",&kop);
                printf(" %d KOP\r\n",kop);
                
                printf("Celay chast' %lf\r\n",fpart);
                printf("Drobn chast' %lf\r\n",spart);
 
                printf("[Y/N] - Y - Enter new value\r\n");
                ch = getch();
        }
        while(ch == 'Y' || ch == 'y');
        return 0;
}
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
24.08.2011, 17:19     Целочисленное деление с округлением - пограмма готовая, только округление... #13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- это означает что дабл внутри тела функции модернизируется, неужели таких функций никогда не делал fun(double &val);? В программе функция вызывается как
C++
1
double a;fun(a);
-=ЮрА=-, функция modf из библиотеки Си, где ссылочных параметров не бывает в принципе. Если функция принимает указатель, то это значит лишь то, что ей надо передавать указатель.
-=ЮрА=-
Заблокирован
Автор FAQ
24.08.2011, 17:29     Целочисленное деление с округлением - пограмма готовая, только округление... #14
Цитата Сообщение от x-positive Посмотреть сообщение
Помогите, пожалуйста, только работать надо с тем, что имеется...
Вот вариант решения твоей проблеммы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main()                                                                               
{
    double x = 0,y = 0,z = 0;
 
    //ввод данных
    printf("x = ");                 
    scanf("%lf",&x);//для double нужно использовать %lf
 
    printf("y = ");
    scanf("%lf",&y);
 
    printf("z = ");
    scanf("%lf",&z);
 
    //решение уравнений
    double a = (sqrt(fabs(x-1))-pow(fabs(z),1.0/3))/(1+pow(x,2)/2+pow(y,2)/4)+pow(z,4);
    double b = (3+exp(y-1))/(1+pow(x,5)*fabs(y-tan(z)))+pow(x,2);
 
    printf("\tResult:\n\na = %lf\n",a);  //вывод результатов
    printf("b = %lf\n",b);
 
    a = modf(a/b,&b);
    printf("a/b = %lf",a);       //вывод остатка от деления
    getch();
    return 0;
}
Миниатюры
Целочисленное деление с округлением - пограмма готовая, только округление...  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2011, 14:45     Целочисленное деление с округлением - пограмма готовая, только округление...
Еще ссылки по теме:

Целочисленное деление C++
C++ Написать программу: целочисленное деление
C++ Не могу понять почему вылазят нули. double и целочисленное деление

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
25.08.2011, 14:45     Целочисленное деление с округлением - пограмма готовая, только округление... #15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- &x - зачем, нужно просто х писать
http://www.codenet.ru/progr/cpp/sprd/modf.php
Второй параметр все-таки адрес
Yandex
Объявления
25.08.2011, 14:45     Целочисленное деление с округлением - пограмма готовая, только округление...
Ответ Создать тему
Опции темы

Текущее время: 18:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru