С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
31 / 34 / 18
Регистрация: 30.09.2011
Сообщений: 202

Перевод строки в число

20.12.2015, 22:13. Показов 3854. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание таково: нужно создать функцию, которая переводит строку из чисел типа string в число типа double (строку string нужно! посимвольно перекинуть в char[] при этом отбрасывая пробелы, и другие знаки (например: $)). Тоесть я должен ввести денежную сумму: $1 234 567.89, а в ответ получить - 1234567.89. Да, еще в функции main () нужно зациклить просьбу о вводе этой денежной строки..
Вот мой вариант программы (цикл в функции main (), и собственно функция работающая со строкой - change):

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
#include <iostream>
#include <string>
#include <stdlib.h>
#include <iomanip>
 
using namespace std;
 
double change (string);
 
int main ()
{
setlocale (LC_ALL, "Russian");
string s;
char answ;
double number;
do
{
cout << "Введите строку:\n";
getline (cin, s);
number = change(s);
cout << "\nВы ввели число: " << setiosflags(ios::fixed)
<< setiosflags (ios::showpoint) << setprecision (2)
<< setw (15) << number;
cout << "\nПродолжить (y/n)??? "; cin >> answ;
}
while (answ != 'n');
cout << endl;
return 0;
}
 
double change (string ss)
{
const int MAX = 20;
char masone[MAX], mastwo[MAX];
int l = ss.length ();
int count = 0;
ss.copy (masone, l, 0);
masone[l] = '\0';
char check;
for (int j = 0; j < l; j++)
{
check = masone[j];
switch (check)
{
case '0': mastwo[count++] = masone[j]; break;
case '1': mastwo[count++] = masone[j]; break;
case '2': mastwo[count++] = masone[j]; break;
case '3': mastwo[count++] = masone[j]; break;
case '4': mastwo[count++] = masone[j]; break;
case '5': mastwo[count++] = masone[j]; break;
case '6': mastwo[count++] = masone[j]; break;
case '7': mastwo[count++] = masone[j]; break;
case '8': mastwo[count++] = masone[j]; break;
case '9': mastwo[count++] = masone[j]; break;
case '.': mastwo[count++] = masone[j]; break;
}
}
mastwo[count] = '\0';
double result = strtod (mastwo, '\0');
return result;
}
Но в ней есть 2 проблемы:
1) Если брать пример ввода сверху сообщения, то моя программа выведет результат: 1234567.00 . Тоесть знаки после точки исчезли. Почему??? Как исправить???
2) Цикл работает не правильно... После ввода символа y, он не принимает от меня новую строку, а выводит сообщение
Введите строку:

Вы ввели: 0.00
как будто я и не вводил строку... Почему??? Как и исправить???
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.12.2015, 22:13
Ответы с готовыми решениями:

Перевод строки в число
Помогите пожалуйста. Требуется перевести строку типа string в число типа long double. К примеру string str = &quot;1111.11&quot; ...

Перевод из строки в число
Подскажите в чем ошибка. Метод должен принимать строку в виде $456 654 456.36 и выдавать число типа double. double bMoney::getmoney() ...

Перевод из строки в число
Снова я =) Работаю над калькулятором. С функцией ввода разобрался. Значит есть строка ввода. рабочая. заполняет массив buf . Потом...

11
0 / 0 / 0
Регистрация: 19.12.2015
Сообщений: 17
20.12.2015, 22:16
Слушай, есть такая функция stoi(), которая переводит string в char. Зачем все это городить?
0
31 / 34 / 18
Регистрация: 30.09.2011
Сообщений: 202
20.12.2015, 22:18  [ТС]
Я такой функции не знаю + я специально поставил восклицательный знак после слова нужно в задании, сказано сделать так(... тем более хочется понять где ошибка именно в этом коде, я уже часа 3 сижу туплю...
0
0 / 0 / 0
Регистрация: 19.12.2015
Сообщений: 17
20.12.2015, 22:25
Хорошо. Но как ты переводишь элементы из строки в числа?? Я так и не понял. Я знаю только один вариант - из int(stroka) вычитать 48 и получать цифру, но у ебя этого нет.. Поясни.
0
31 / 34 / 18
Регистрация: 30.09.2011
Сообщений: 202
20.12.2015, 22:31  [ТС]
Использую функцию strtod ()... она работает со строкой в которой записаны только числа (именно поэтому нужно откинуть пробелы и лишние знаки) и переводит ее в double.
0
0 / 0 / 0
Регистрация: 19.12.2015
Сообщений: 17
20.12.2015, 22:33
А разбивать дробное число на 2 части и потом отдельно их переводить, а затем дробную часть делить на 10 в степени, равной количеству цифр в дробной части и прибавлять к целому не пробовал?
0
31 / 34 / 18
Регистрация: 30.09.2011
Сообщений: 202
20.12.2015, 22:39  [ТС]
Нет, не пробовал... это вариант, но по идее strtod () должен все сам переводить, с десятичными знаками... где-то ошибка...сейчас попробую переписать, посмотрим что получится)
0
0 / 0 / 0
Регистрация: 19.12.2015
Сообщений: 17
20.12.2015, 22:41
Попытка не пытка, дерзай)
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
20.12.2015, 22:41
Цитата Сообщение от LaRew Посмотреть сообщение
stoi()
string-to-int!!!
При чем тут char? и если ты не забыл то string это массив char!
Цитата Сообщение от LaRew Посмотреть сообщение
вычитать 48 и получать цифру,
вы о чем! Лень писать код но помогу алгоритмом.
Первое распарсить строку удалив от туда все что не является цифрой (#include <ctype.h> в помощь!)
потом, преобразуем с помощью stof(); строку в переменную типа double! у и все остальные действия!
0
31 / 34 / 18
Регистрация: 30.09.2011
Сообщений: 202
21.12.2015, 00:17  [ТС]
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
////// решение примеров
 
#include <iostream>
#include <iomanip>
#include <string>
 
using namespace std;
 
const int MAX = 30;
 
class bigproblem
{
private:
    char str[MAX];
public:
    bigproblem ()
    { str[0] = 0; }
    void showstr ()
    { cout << str << endl; }
    long double mstold (string);
};
 
long double bigproblem::mstold (string ss)
{
    int l = ss.size();
    int count = 0;
    for (int j = 0; j < l; j++)
    {
        switch (ss[j])
        {
        case '0': str[count++] = ss[j]; break;
        case '1': str[count++] = ss[j]; break;
        case '2': str[count++] = ss[j]; break;
        case '3': str[count++] = ss[j]; break;
        case '4': str[count++] = ss[j]; break;
        case '5': str[count++] = ss[j]; break;
        case '6': str[count++] = ss[j]; break;
        case '7': str[count++] = ss[j]; break;
        case '8': str[count++] = ss[j]; break;
        case '9': str[count++] = ss[j]; break;
        case '.': str[count++] = ss[j]; break;
        }
    }
    str[count] = 0;
    long double result = stold (str);
    return result;
}
 
int main ()
{
    string s;
    bigproblem bp;
    char answ;
    long double end;
    do
    {
        cout << "Enter money string:\n";
        getline (cin, s);
        end = bp.mstold (s);
        cout << "You entered: ";
        cout << setiosflags (ios::fixed) << setiosflags (ios::showpoint)
            << setprecision (2) << setw (15) << end << endl;
        cout << "One more time (y/n)??? "; cin >> answ;
    }
    while (answ != 'n');
    cout << endl;
    return 0;
}
Переписал, он не выводил символы после точки почему??? да потому что ему локаль русская не нравилась!!! и на это я потратил 4 часа жизни...
ну одной проблемой меньше...
НО! Осталась вторая проблема! Почему цикл работает некорректно????
P.S: в переписанной программе он выдает ошибку R6010 abort() has been called

Добавлено через 22 минуты
Сделал пошаговую отладку: когда запускается цикл во второй раз строка 58 игнорируется!!! почему??? как зациклить ввод строк???
0
0 / 0 / 0
Регистрация: 19.12.2015
Сообщений: 17
22.12.2015, 22:24
Погугли ошибку, с такой ни разу не сталкивался. И что за цикл у тебя? в for загнать не проще?
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
23.12.2015, 22:20
Цитата Сообщение от Lawliet1 Посмотреть сообщение
R6010 abort() has been called
Если еще актуально, полный текст ошибки дай
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.12.2015, 22:20
Помогаю со студенческими работами здесь

Перевод из строки в число
Каким способом можно перевести строчку типа &quot;System::String ^&quot; в тип double?

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

Перевод из строки в число
Извиняюсь, если такая тема уже была. Есть строка s. В ней записано 2 вещественных числа. Нужно оба записать в переменные типа float....

Перевод строки в число
У меня по заданию нужно в строку ввести числа через пробелы а потом убрать пробелы и перевести из строки в число мои цифры. #include...

Правильный перевод строки в число
Задача: дан файл,компоненты которого являются числами (все числа записаны через строчку.По одному числу на одной строчке).Найти кол-во...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru