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

Задача 7 главы 7 из книги Р. Лафоре. Строки - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Расстояние между двумя точками, double или int? http://www.cyberforum.ru/cpp-beginners/thread1306841.html
#include <iostream> #include <conio.h> #include <cmath> using namespace std; int distance(int, int, int, int); int main() { int x1 = 4;
C++ Упорядочить заданную матрицу по возрастанию элементов в каждом столбце Дана матрица С размером m*n. Упорядочить эту матрицу по возрастанию элементов в каждом столбце. помогите пожалуйста срочнооо! http://www.cyberforum.ru/cpp-beginners/thread1306833.html
C++ Получить матрицу С=(A+B*2)*В+A
Даны матрицы: А размером m*k и В размером k*n.Получить матрицу С=(A+B*2)*В+A Добавлено через 54 секунды Точно
C++ Перестановками заполнить главную диагональ двумерного массива наибольшими элементами
Дана квадратная матрица. С помощью перестановок добиться того, чтобы её максимальный элемент находился в верхнем левом углу, следующий по величине в позиции (2.2) и т.д. Таким образом необходимо заполнить все главную диагональ. Подскажите, как рациональнее сделать это.
C++ Определить максимальную сумму соседних элементов в двумерной матрице http://www.cyberforum.ru/cpp-beginners/thread1306818.html
Определить максимальную сумму соседних элементов в двумерной матрице
C++ Адреса двух разных переменных одинаковы Добрый день! Пытаюсь вывести в Memo1 адреса переменных: int a=5555; int b=6156; Memo1->Lines->Add(IntToStr(&a)); Memo1->Lines->Add(IntToStr(&b)); Получаю в итоге: для "a" адрес равен 1, для "b" адрес равен 1. Разве они не должны быть разные? Переменные же разные. Спасибо заранее всем кто откликнется подробнее

Показать сообщение отдельно
StNic
0 / 0 / 0
Регистрация: 20.12.2013
Сообщений: 5
21.11.2014, 14:00     Задача 7 главы 7 из книги Р. Лафоре. Строки
Добрый день! Недавно начал изучать С++ по, наверное, уже всем поднадоевшему, учебнику Роберта Лафоре. На данный момент изучаю главу с массивами и строками. Меня привела в тупик задача 7 главы 7:
Одним из недостатков C++ является отсутствие для бизнес-программ встроенного типа для денежных значений, такого, как $173 698 001.32. Такой денежный тип должен иметь возможность для хранения числа с фиксированной десятичной точкой точностью около 17 знаков, которого было бы достаточно для хранения национального долга в долларах и центах. К счастью, встроенный тип C++ long double имеет точность 19 цифр, поэтому мы можем использовать его как базисный для класса money, даже используя плавающую точку. Однако нам нужно будет добавить возможность ввода и вывода денежных значений с предшествующим им знаком доллара и разделенными запятыми группы по три числа: так проще читать большие числа. Первым делом при разработке такого класса напишем метод mstold(), который принимает денежную строку, то есть строку, представляющую собой некоторое количество денег типа
"$1 234 567 890 123.99"
в качестве аргумента и возвращает эквивалентное ее значению число типа long double.
Вам нужно будет обработать денежную строку как массив символов и, просматривая ее символ за символом, скопировать из нее только цифры (0-9) и десятичную точку в другую строку. Игнорируется все остальное, включая знак доллара и запятые. Затем вы можете использовать библиотечную функцию _atold() (заметим, что здесь название функции начинается с символа подчеркивания — заголовочные файлы STDLIB.H или MATH.H) для преобразования новой строки к числу типа long double. Предполагаем, что денежное значение не может быть отрицательным. Напишите функцию main() для проверки метода mstold(), которая несколько раз получает денежную строку от пользователя и выводит соответствующее число типа long 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
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
#include <windows.h>
#include <math.h>
#include <iostream>
#include <iomanip>
using namespace std;
 
const int MAX = 22;
class money {
    private:
        long double sum;
 
    public:
        money(): sum(0.0)
        { }
        money(long double sm): sum(sm)
        { }
        void show() const {
            cout << setprecision(MAX) << sum << endl;
        }
        long double mstold(char []);
};
 
long double money::mstold(char numb[]) {
    long double mny;
    char num[MAX];
    int k = 0;
    for (int j = 0; j < strlen(numb); j++)
        for (int i = 0; i < 10; i++)
            if (numb[j] == (i + '0'))
                num[k++] = numb[j];
            else if (numb[j] == '.') {
                num[k++] = '.';
                break;
            }
    num[k] = '\0';
    mny = _atold(num);
    return mny;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    money mn, result;
    char number[MAX];
    char answer = 'a';
    do {
        cout << "Введите значение суммы: ";
        cin.get(number, MAX);
        result = mn.mstold(number);
        cout << "Вы ввели сумму: ";
        result.show();
        cout << "Вы хотите продолжить (y/n)? ";
        cin >> answer;
    } while (answer != 'n');
    return 0;
}
По условию задачи, пользователь несколько раз должен ввести строку и получить результат. Для этого я воспользовался циклом do. Первый раз я нормально ввожу строку, например, то значение, которое предложено в книге - $1 234 567 890 123.99 - и получаю нужный результат уже в числовом значении - 1234567890123.99. Дальше идет предложение о том, чтобы продолжить перевод чисел. Я ввожу любое значение, кроме 'n', но дальше программа просто уходит в бесконечный цикл, выводя сообщения о том, что уже введен 0. При этом в массиве number[0] = '\0'. Может кто-нибудь подскажет как я могу это исправить. Большое спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 00:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru