Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
klimbasov
1 / 1 / 0
Регистрация: 08.08.2019
Сообщений: 3
1

Анализ строки на наличие чисел

08.08.2019, 17:38. Просмотров 2522. Ответов 6

Здравствуйте, возникла проблема с работой кода:

здесь код
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
#include <iostream>
#include <string.h>
#include <conio.h>
#include <stdio.h>
using namespace std;
int main()
{
    string fnc;             //  анализируемая строка
    getline(cin, fnc);
    int a;              //счётчик
    int counter_1=0;        //  номер рассматриваемой ячейки массива mass_of_fullnum
    int max_counter_1=1;    // количество чисел, размерность массива mass_of_fullnum
    int k = 10;         // смещение,задающее разрядность числа
    fnc.c_str();
    for (a=0;a<fnc.length();a++){
        cout<<"element number is "<<a<< "  element valiu is "<<fnc[a]<<'\n';
    }
    
 
    for (a=0;a<fnc.length();a++){   // определение размера массива mass_of_fullnum
        if (fnc[a]!='1' and 
            fnc[a]!='2' and
            fnc[a]!='3' and
            fnc[a]!='4' and
            fnc[a]!='5' and
            fnc[a]!='6' and
            fnc[a]!='7' and
            fnc[a]!='8' and
            fnc[a]!='9' and
            fnc[a]!='0' and
            fnc[a]!='=' and
            fnc[a]!='y' and
                        fnc[a]!='x'){
                max_counter_1++;
            } 
            if(fnc[a]=='x'){
                max_counter_1=max_counter_1-1;
            }
            }
            cout << "max of mass_of_fullnum is  "<< max_counter_1<<'\n';
    
    int *mass_of_fullnum = new int[max_counter_1]; // объявление массива взятия чисел
    for (a=0;a<fnc.length();a++){ //цикл взятия чисел
        if (fnc[a]=='1' or 
            fnc[a]=='2' or 
            fnc[a]=='3' or 
            fnc[a]=='4' or 
            fnc[a]=='5' or 
            fnc[a]=='6' or 
            fnc[a]=='7' or 
            fnc[a]=='8' or 
            fnc[a]=='9' or 
            fnc[a]=='0')
            {
            mass_of_fullnum[counter_1]=  mass_of_fullnum[counter_1]*k + (fnc[a] - '0');
            }
        else
        if (fnc[a]=='+' or
            fnc[a]=='-' or
            fnc[a]=='*' or
            fnc[a]=='/')
            {
            counter_1++;
            }
        
    }
    for (counter_1=0; counter_1<max_counter_1;counter_1++)  // вывод элементов массив mass_of_fullnum
    {   
        cout << "element number is " << counter_1 << "  element valiu is " << mass_of_fullnum[counter_1]<<'\n';
    }
}


принцип работы:
1)вводим строку без пробелов, в соответствии с логикой написания уравнения, например "y=x*5-345+648" (однако можно не использовать символы 'x', 'y' и '=');
2)преобразовываем её в строку c-стиля;
3)получаем количество чисел в строке в соответствии с логикой: если есть знак,то за ним следует число.вносим поправку в случае наличия 'x';
4)создаём динамический массив mass_of_fullnum, куда будут записываться числа, с количеством элементов max_counter_1;
5)получаем числа из символов путём удаления '0' , составляем числа и вносим в mass_of_fullnum.

По ходу выполнения программа выводит:
1)каждый символ строки;
2)количество элементов массива mass_of_fullnum;
3)сами элементы массива mass_of_fullnum.

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

вот пример компиляции

y=x*5-345+648-56-4+72-89/678-45
element number is 0 element valiu is y
element number is 1 element valiu is =
element number is 2 element valiu is x
element number is 3 element valiu is *
element number is 4 element valiu is 5
element number is 5 element valiu is -
element number is 6 element valiu is 3
element number is 7 element valiu is 4
element number is 8 element valiu is 5
element number is 9 element valiu is +
element number is 10 element valiu is 6
element number is 11 element valiu is 4
element number is 12 element valiu is 8
element number is 13 element valiu is -
element number is 14 element valiu is 5
element number is 15 element valiu is 6
element number is 16 element valiu is -
element number is 17 element valiu is 4
element number is 18 element valiu is +
element number is 19 element valiu is 7
element number is 20 element valiu is 2
element number is 21 element valiu is -
element number is 22 element valiu is 8
element number is 23 element valiu is 9
element number is 24 element valiu is /
element number is 25 element valiu is 6
element number is 26 element valiu is 7
element number is 27 element valiu is 8
element number is 28 element valiu is -
element number is 29 element valiu is 4
element number is 30 element valiu is 5
max of mass_of_fullnum is 9
element number is 0 element valiu is 17044800
element number is 1 element valiu is 5
element number is 2 element valiu is -140172839
element number is 3 element valiu is 648
element number is 4 element valiu is -44
element number is 5 element valiu is -157278600
element number is 6 element valiu is -1762131060
element number is 7 element valiu is 1677568269
element number is 8 element valiu is -576757082

--------------------------------
Process exited with return value 0
Press any key to continue . . .

Ситуация не зависит от используемых математических знаков, наличия 'x', 'y' и '=', количества чисел и их разрядов, места сохранения cpp-файла и даже времени суток.
Код компилировал в dev-c++
прошу, помогите найти ошибку.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2019, 17:38
Ответы с готовыми решениями:

Анализ строки на наличие в ней сокращения "ул." и переносит "ул." в начало этой же строки
Всем привет! Есть код, который производит анализ строки на наличие в ней сокращения &quot;ул.&quot; и...

Проверка строки на наличие одинаковых чисел
Здравствуйте . В обще задание звучит так Возникла проблема как проверить числа . Подскажите...

Анализ файла на наличие числовой информации
Есть файл, в нём нужно оставить только слова состоящие из цифр полностью. Под словом...

Выполнить анализ кода программы на наличие в нем всех циклов for языка C#
Выполнить анализ кода программы на наличие в нем всех циклов for языка C#. Напечатать результаты...

Выполнить анализ кода программы на наличие в нем всех операторов присваивания языка C#
Выполнить анализ кода программы на наличие в нем всех операторов присваивания языка C#

6
SomniPhobia
463 / 315 / 116
Регистрация: 22.11.2017
Сообщений: 819
08.08.2019, 19:01 2
Лучший ответ Сообщение было отмечено Peoples как решение

Решение

klimbasov, привет!
Тебе нужно из строки вытащить 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
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
 
int main()
{
    setlocale(LC_ALL, "Rus");
 
    std::string line;
    std::getline(std::cin, line);
    size_t pos = 0u;
    std::vector<double> box;
    for (auto it = std::begin(line); ; )
    {
        double value;
        try
        {
            value = std::stod(std::string(it, std::end(line)), &pos);
            if (pos)
            {
                box.push_back(value);
                if (std::distance(std::begin(line), it) + pos >= line.length())
                    break;
                std::advance(it, pos);
                ++it;
            }
        }
        catch (const std::invalid_argument& ia)
        {
            ++it;
            continue;
        }
        catch (const std::out_of_range& oor)
        {
            std::cout << "Переполнение переменной\n";
            return 1;
        }
    }
    for (auto value : box)
        std::cout << value << " ";
    std::cout << "\n";
 
    return 0;
}
1
Миниатюры
Анализ строки на наличие чисел  
Изображения
 
klimbasov
1 / 1 / 0
Регистрация: 08.08.2019
Сообщений: 3
08.08.2019, 19:33  [ТС] 3
SomniPhobia, большое спасибо, именно это и должно получаться на выходе. Однако хотелось бы узнать причину неправильной работы моего кода, так как вышеуказанный код является частью программы и переписывать её полностью под ваш вариант будет несколько трудоёмко.
1
marat_miaki
254 / 213 / 118
Регистрация: 08.04.2013
Сообщений: 923
08.08.2019, 20:27 4
Лучший ответ Сообщение было отмечено klimbasov как решение

Решение

стр 42
C++
1
int *mass_of_fullnum = new int[max_counter_1] {};
решит часть ваших проблем
1
Yetty
3350 / 2296 / 1494
Регистрация: 18.12.2017
Сообщений: 7,271
08.08.2019, 20:27 5
klimbasov, напишите условие задачи. приведите пару примеров ввода-вывода.
0
klimbasov
1 / 1 / 0
Регистрация: 08.08.2019
Сообщений: 3
08.08.2019, 20:34  [ТС] 6
marat_miaki, спасибо, это полностью решило проблему.
0
Peoples
Эксперт С++
1431 / 900 / 774
Регистрация: 06.02.2016
Сообщений: 2,371
Записей в блоге: 19
Завершенные тесты: 5
10.08.2019, 10:45 7
Лучший ответ Сообщение было отмечено Peoples как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <regex>
#include <algorithm>
#include <iterator>
 
int main()
{
    const std::string express{"y=x*5.1-3,45+648-56-4+72-89/678-45"};
    const std::regex reg{R"(\d+(\.|\,)?\d*)"};
    std::copy(std::sregex_token_iterator{express.cbegin(), express.cend(), reg}, {}, 
                   std::ostream_iterator<std::string>(std::cout, " "));
}
1
10.08.2019, 10:45
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2019, 10:45

Анализ чертежей, созданных в KOMPAS (SolidWorks) на наличие в нем объектов определенного типа
Доброе время суток, всем! Нужна ваша помощь, может кто-то с чем-то похожим сталкивался. Нужно...

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

Проверка на наличие строки в БД
Пытаюсь проверить, есть ли уже строка с такими же данными в БД(MySQL). При использовании...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.