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

При умножении 3 чисел лишние нули в дробной части

19.12.2024, 13:07. Показов 1230. Ответов 7

Студворк — интернет-сервис помощи студентам
прохожу курс яндекс практикума и там есть задание создать сложный калькулятор, поддерживающий операции с несколькими числами(-2*5-11/-25=, 5*-2+1/10= и т.д) в общем то возникла такая проблема что с двумя числами все нормально работает, но при умножении 3 и более чисел с каждым дополнительным числом в умножении добавляется по 6-8 нулей, я не знаю почему, я проверял код и вроде нигде нету операций из за которых добавятся нули. При умножении и делении 2 чисел проблем нету, только от 3 и более.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>
#include <cstring>
using namespace std;
double applyOperation(double a, double b, char op) {//для быстрого подсчета операции
   if (op == '*')
      return a*b;
   if (op == '/')
      return a/b;
   if (op == '+')
      return a+b;
   if (op == '-')
      return a-b;
   return 0;
}
int main(){
   bool isnum=false;//                    является ли читаемая цифра частью числа
   string curstr="";//                    строка, в которую считывается число
   int firstnumcoord, lastnumcoord;//     координаты начала и окончания операции чтобы заменить их
   char ch;
   string line;
   while(cin>>ch, ch!='='){//             читаем операцию до знака =(по заданию операция может в несколько строк вводиться)
      line.push_back(ch);
   }
   for(int i=0;i<line.size();++i){//      удаление пробелов
      if(isspace(line[i]))
         line.erase(i);
   }
   for (int i = 0; i < line.size(); i++) {
      if(i==0){
         if(line[i]=='-'&&!isnum){//если первый символ числа -
            curstr+=line[i];
            isnum=true;
            firstnumcoord=i;
         }
         else if(isdigit(line[i])&&!isnum){//если первый символ числа цифра
            curstr+=line[i];
            isnum=true;
            firstnumcoord=i;
         }
      }
      if(i!=0){//если первый символ числа минус
         if(line[i]=='-'&&!isnum&&(line[i-1]=='/'||line[i-1]=='*'||line[i-1]=='-'||line[i-1]=='+')){
            curstr+=line[i];
            isnum=true;
            firstnumcoord=i;
         }//если первый символ числа цифра
         else if(isdigit(line[i])&&!isnum&&(line[i-1]=='/'||line[i-1]=='*'||line[i-1]=='-'||line[i-1]=='+')){
            curstr+=line[i];
            isnum=true;
            firstnumcoord=i;
         }//если цифра является частью числа
         else if(isdigit(line[i])&&isnum){
            curstr+=line[i];
         }
         else if(line[i]=='*'||line[i]=='/'&&i!=line.size()){
            lastnumcoord=i;
            do{
            if(lastnumcoord==i&&line[lastnumcoord+1]=='-')//если первый символ 2 числа -
               lastnumcoord++;
            else if (lastnumcoord == line.size() || line[lastnumcoord+1] == '*' || line[lastnumcoord+1] == '/' || line[lastnumcoord+1] == '+' || line[lastnumcoord+1] == '-') {
               break;//если 2 число заканчивается
            }
            lastnumcoord++;
            
            }while(lastnumcoord < line.size());
         //заменяем часть строки на результат выражения
            line=line.substr(0,firstnumcoord)+to_string(applyOperation(stod(curstr),stod(line.substr(i+1, lastnumcoord-i+1)), line[i]))+line.substr(lastnumcoord);
 
            curstr="";//отчищаем строку куда пишем число
            isnum=false;
            i=firstnumcoord-1;//устанавливаем цикл на начало выражения
         }
      }
   }
   cout<<stod(line)<<endl;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.12.2024, 13:07
Ответы с готовыми решениями:

Нули дробной части в печатной форме
Здравствуйте, при формировании печатной формы, если число имеет дробную часть с окончанием 0 (пример: 15,60), то ноль не выводится в конце....

Лишние нули при выводе целых чисел
Как решить проблему я к сожалению не нашел в интернете. Суть в том, что в консоль при выводе float целое число, например 5, выводиться...

При чтении чисел из файла, считывает лишние нули
Здравствуйте Моя задача написать алгоритм сортировки слиянием чисел из текстового файла. Однако при переписывании чисел из одного файла...

7
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
19.12.2024, 13:45
1. Приведите пример что есть
Цитата Сообщение от ZEFIR4I4EK Посмотреть сообщение
при умножении 3 и более чисел
2. А приоритет операций вы не учитываете?
0
0 / 0 / 0
Регистрация: 19.12.2024
Сообщений: 4
19.12.2024, 13:56  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
А приоритет операций вы не учитываете?
ну умножение и деление происходит по порядку, потом я буду добавлять сложение и вычитание, но оно будет идти после цикла с умножением и делением, так что все должно работать по математическим правилам
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
19.12.2024, 14:12
А "обратная польская запись" - не было таких слов на практикуме?
0
Злостный нарушитель
 Аватар для Verevkin
10358 / 5773 / 1274
Регистрация: 12.03.2015
Сообщений: 26,685
19.12.2024, 14:58
Цитата Сообщение от ZEFIR4I4EK Посмотреть сообщение
я не знаю почему, я проверял код и вроде нигде нету
Именно для таких случаев придумали отладчик. Воспользуйся, это же бесплатно!
0
0 / 0 / 0
Регистрация: 19.12.2024
Сообщений: 4
19.12.2024, 15:29  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
А "обратная польская запись" - не было таких слов на практикуме?
нет, такого не рассказывали
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
19.12.2024, 15:34
ZEFIR4I4EK,
Цитата Сообщение от ZEFIR4I4EK Посмотреть сообщение
line=line.substr(0,firstnumcoord)+ to_string(applyOperation(stod(curstr), stod(line.substr(i+1, lastnumcoord-i+ 1)), line[i]))+ line.substr(lastnumcoord);
Вот от такого кода можно просто чокнуться.
Мало того, что он нечитаемым, так его и отлаживать невозможно.
С трудом, привел его к такому
C++
1
2
3
4
                double t1 = stod(line.substr(i + 1, lastnumcoord - i + 1));
                double t = applyOperation(stod(curstr), t1, line[i]);
                string res = to_string( t );
                line = line.substr(0, firstnumcoord) + res + line.substr(lastnumcoord+1);
Вот его уже можно отлаживать и Вы сможете увидеть, что res получается в виде "4.000000".
Поэтому, Вам придётся в строке res поудалять лишние нули.

P.S. А еще у Вас не анализируется наличие десятичной точки.
Если Вы хотите обрабатывать действительные числа, то будьте добры учесть это (я уж не говорю о числах типа 1.2E-3).

И, в принципе, кто Вам мешает для ввода чисел использовать istringstream::operator>>
Он возьмет на себя всю эту работу.
1
0 / 0 / 0
Регистрация: 19.12.2024
Сообщений: 4
19.12.2024, 17:02  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
P.S. А еще у Вас не анализируется наличие десятичной точки.
Если Вы хотите обрабатывать действительные числа, то будьте добры учесть это (я уж не говорю о числах типа 1.2E-3).
все, теперь я похоже понял почему неправильно все обрабатывается, у меня в одной из прошлых версий кода(то ли 3, то ли 4) был учет символов . е Е, спасибо огромное
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.12.2024, 17:02
Помогаю со студенческими работами здесь

Как задать нули в дробной части целого числа
Привет всем! Нужно решить задачу в которой числа округляются до 2 знаков после точки.Суть в том, что, наверное, нужно выводить не целое...

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

Найти количество чисел, содержащих две одинаковые цифры в дробной части чисел последовательности
Помогите пожалуйста, нужно составить последовательность Ai по следующей формуле Ai=ln(i)*cos(2i)+60*i и сохранить ее в файл, округлив...

Рассмотрение дробной части чисел
Здравствуйте! :) Подскажите, пожалуйста, с решение одной задачки. Сама задача:Дана строка. Если строка содержит целое число – вывести 0,...

Отсекание лишних чисел в дробной части
Как отсечь лишние числа в дробной части? Допустим, мне нужно, чтобы в дробной части было всегда не больше 3 знаков.


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru