Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 12.10.2015
Сообщений: 133

Округлить числа с плавающей точкой

25.10.2015, 17:00. Показов 7732. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите почему работает неправильно! Не округляет, а выдает только числа до запятой! Исправьте пожалуйста!!

Вот задание:
Строка состоит из символов, среди которых, в частности могут
быть цифры. Последовательность цифр (возможно включая плавающую
точку), отделенную любыми другими символами, следует считать
числами. Строка задается пользователем с клавиатуры.
Для каждого выделенного из данной строки числа с плавающей
запятой выполнить округления. Округление выполнить до знака после
точки, порядковый номер которого задается пользователем с клавиатуры.
Если округления необходимо выполнить до второго знака, то с дробной
части оставить только две первые цифры (или вторую изменить с
правилам округления), а все остальные удалить.
Предусмотреть исключения из целой части лишних нулей. Лишними
считать нули, расположенные в начале числа (0010 превратить в 10).
Вывести на экран строку, образованную из введенного пользователем
путем выполнения указанных действий.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
    setlocale(LC_ALL, "rus");
    char str[100];
    cout << "Введите строку:" << endl;
    cin >> str;
    int n;
    cout << "Введите точность" << endl;
    cin >> n;
    const char separator[] = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
    char *Ptr = NULL; 
    Ptr = strtok(str, separator);
    while (Ptr)
    {
        cout << round(atof(Ptr)*(pow(10,n))/pow(10,n)) << ' ';
        Ptr = strtok(0, separator);
    }
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.10.2015, 17:00
Ответы с готовыми решениями:

Конструирование значения целого числа или числа с плавающей точкой по его дампу
Как сконструировать значения целого числа(char, short int, long int) или числа с плавающей точкой(float,double) по его дампу(bin,oct,hex)??

Точность числа с плавающей точкой
У типа float числа одинарной точности с плавающей запятой обеспечивают относительную точность 7-8 десятичных цифр. Внимание, вопрос!...

Вывод числа с плавающей точкой
Доброго всем времени суток. Пытаюсь вывести число с плавающей запятой на LCD. long int Eb = 0x5959; char st_Ebf =...

37
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.10.2015, 17:12
Скобки проверь.
C++
1
cout << round(atof(Ptr) * (pow(10, n))) / pow(10, n) << ' ';
0
0 / 0 / 1
Регистрация: 12.10.2015
Сообщений: 133
25.10.2015, 17:22  [ТС]
не помогло (
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.10.2015, 18:40
У меня же работает. Покажи актуальный вариант программы и какие вводишь данные.
0
431 / 385 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
27.10.2015, 09:35
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
#include <iostream>
#include <string>
 
using namespace std;
 
void work(string s)
{
    cout << s << endl;
}
 
void extract(string s, void (*work)(string))
{
    const string digits = "1234567890.";
    string::size_type digits_begin;
    string::size_type digits_end = 0;
    do {
        digits_begin = s.find_first_of(digits, digits_end);
        if (digits_begin == string::npos) { break; }
        digits_end = s.find_first_not_of(digits, digits_begin);
        (*work)(s.substr(digits_begin, digits_end - digits_begin));
    } while (digits_end != string::npos);
}
 
int main()
{
    extract("abc0.01xyz99.99vtulhu.", &work);
    return 0;
}
0
0 / 0 / 1
Регистрация: 12.10.2015
Сообщений: 133
27.10.2015, 20:44  [ТС]
я здесь ничего не понимаю((
0
0 / 0 / 1
Регистрация: 12.10.2015
Сообщений: 133
28.10.2015, 10:53  [ТС]
Подскажите пожалуйста! Очень срочно!
У меня была строка, я с помощью strtok выделила из нее числа и округлила их. Как теперь вывести певоначальную строку, только чтобы вместо всех тех чисел были округленные числа???
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
28.10.2015, 11:40
А кто мешает предварительно ее скопировать
C++
1
2
char str1[100]="123 456",str2[100];
strcpy(str2,str1);// в str2 теперь копия
А если надо строку из того, что получилось, то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
    ostringstream os;   
...
    for(int i=0;i<10;i++)
        os<<x[i]<<' '; // x - массив того, что надо вывести в строку
    string result=os.str();
    cout<<result<<endl;
0
0 / 0 / 1
Регистрация: 12.10.2015
Сообщений: 133
28.10.2015, 11:43  [ТС]
а как сделать чтобы вместо тех чисел, округленные были??

Добавлено через 1 минуту
Вот мой код недописанный, он выдает только числа, а нужно строку с числами

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
int main()
{
    setlocale(LC_ALL, "rus");
    char str[100];
    cout << "Введите строку:" << endl;
    cin.getline(str,100);
    int n;
    cout << "Введите точность:" << endl;
    cin >> n;
    const char str2[] = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz/.;:?!() ";
    char *Ptr = NULL; 
    Ptr = strtok(str, str2);
    cout << "Результат:";
    while (Ptr)
    {
        cout << round(atof(Ptr)*pow(10, n)) / pow(10, n) << ';';
        Ptr = strtok(0, str2);
    }
    cout << endl;
    return 0;
}
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
28.10.2015, 12:14
Это будет выглядеть так, но в Вашем алгоритме округления ошибки.
В частности - нет такой библиотечной функции round
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
#include <iostream>
#include <sstream>
#include <string>
#include <cmath>
using namespace std;
int main()
{
    ostringstream os;   
    setlocale(LC_ALL, "rus");
    char str[100];
    cout << "Введите строку:" << endl;
    cin.getline(str,100);
    int n;
    cout << "Введите точность:" << endl;
    cin >> n;
    const char str2[] = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz/;:?!() ";
    char *Ptr = NULL; 
    Ptr = strtok(str, str2);
    cout << "Результат:";
    double  pn=pow(10.0, n);
    while (Ptr)
    {
        double a=atof(Ptr);
        double around=int(a*pn) / pn; 
        os<<around<< ';';
        Ptr = strtok(0, str2);
    }
    string result=os.str();
    cout<<result<<endl;
    system("pause");
    return 0;
}
А по-хорошему, будет так
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 <iostream>
#include <sstream>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
    setlocale(LC_ALL, "rus");
    string str;
    cout << "Введите строку:" << endl;
    getline(cin,str);
    int n;
    cout << "Введите точность:" << endl;
    cin >> n;
    istringstream istr(str);
    double  pn=pow(10.0, n);
    double a;
    ostringstream os;   
    while (istr>>a)
    {
        double around=int(a*pn) / pn; 
        os<<around<< ';';
    }
    string result=os.str();
    cout << "Результат:"<<result<<endl;
    system("pause");
    return 0;
}
Учтите, что теперь целая часть от дробной отделяется не запятой а точкой.
Причина - сишные функции типа atof учитывают русификацию, а потоковые почему-то нет.
Может, кто-нибудь подскажет - почему?
1
0 / 0 / 1
Регистрация: 12.10.2015
Сообщений: 133
28.10.2015, 12:41  [ТС]
почему то не работает, пишет "Результат:" и конец.
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
28.10.2015, 14:10
Кучу тем насоздавала, а форматировать не научилась Тогда сама и разбирайся.
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
28.10.2015, 14:31
Цитата Сообщение от Nastya15684 Посмотреть сообщение
почему то не работает, пишет "Результат:" и конец.
А у меня:
Вложение 592824
0
0 / 0 / 1
Регистрация: 12.10.2015
Сообщений: 133
28.10.2015, 16:08  [ТС]
zss, мне нужно чтобы в строке еще буквы были и другие символы
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.10.2015, 16:39
Цитата Сообщение от zss Посмотреть сообщение
В частности - нет такой библиотечной функции round
Как это нет?
http://www.cplusplus.com/refer... /?kw=round
0
0 / 0 / 1
Регистрация: 12.10.2015
Сообщений: 133
28.10.2015, 17:40  [ТС]
нужно вот так, только в результате чтобы еще буквы были
0
0 / 0 / 1
Регистрация: 12.10.2015
Сообщений: 133
02.11.2015, 18:38  [ТС]
как double преобразовать в char?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.11.2015, 18:42
C++
1
2
3
double d; 
...
char c = d;
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.11.2015, 18:43
C++
1
2
    double d = 123.456;
    char c = d;
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
02.11.2015, 18:44
в char* ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <sstream>
 
using namespace std;
 
int main(){
 
   double x = 1.789;
   char *pch = new char[255]{};
 
 
    stringstream ss;
    ss<<x;
    ss>>pch;
 
    cout << pch;
 
    delete []pch;
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.11.2015, 18:44
Помогаю со студенческими работами здесь

Усечение числа с плавающей точкой
Доброго времени суток! Собсно сабж. floor(v*1000)/1000 не помогает, обнуляется только несколько знаков после запятой, а остальные...

Неправильный вывод числа с плавающей точкой
Здравствуйте. Почему когда я ввожу число с плавающей точкой, например, 43.2300012, а затем вывожу его, то при выводе печатается не...

Числа с плавающей точкой после деления
Помогите, какая тут ошибка? мне нужно чтобы вышло числа с плавающей точкой после деления( например, 13/2=6,5), а у меня почему то выходит...

Ifstream считать из файла числа с плавающей точкой
Здравствуйте форумчане. Поток std::ifstream хорошо считывает целые числа, но когда дело доходит до числе с плавающей точкой он считывает...

Вывод числа с плавающей точкой в строку с округлением
В результате работы следующего блока char buf; float val = 123.4567F; sprintf(buf,&quot;%f&quot;, val); SetWindowText(hLabel2, buf); ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru