Форум программистов, компьютерный форум, киберфорум
Наши страницы
Boost C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
flo
0 / 0 / 0
Регистрация: 17.12.2011
Сообщений: 67
1

Boost Test. Массивы - разобрать код

18.04.2015, 17:04. Просмотров 695. Ответов 5
Метки нет (Все метки)

Помогите разобраться с Boost Test. Вообще не понятно как и что работает.
И можно ли вообще протестировать эти функции:
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
#include <iostream>
#include "functions.h"
 
using namespace std;
 
//Проверка на диапазон числа 2^256
bool RangeForNumber(char a[], int n)
{
    int i;
    int nt;//длина числа 2^256
    char t[85]={1,1,5,7,9,2,0,9};//Cоздание массива числа 2^256
    for(i=8;i<78;i++)//дополняем нулями до кона длины числа
        t[i]=0;
    nt=7+i;//длина числа=85
    if (n==86 && a[0]==0)//рассмотрим случай, если введено первое отрицательное
        for (i=0;i<n;i++)
            if (t[i]>a[i+1]) return false;
            else if (a[i+1]>t[i]) return true;
    if (n>nt) return true;
        else if (nt>n) return false;
    else
      for (i=0; i<n; i++)
      if (a[i]>t[i]) return true;
      else if (t[i]>a[i]) return false;
    return false;
}
 
//Проверка на ввод посторонних символов
bool isNumber (char *str, int size)
{
   for (int i = 0; i < size; i++)
   {
       if(i==0 && str[i]!='-')
            continue;
        if (str[i] <'0' || str[i]>'9' )
            return true;
     }
 return false;
}
 
void InputNumbers(char *ar, int n)
{
    int i=0, j=0;
    int r1=0; // если введен минус
    bool l = true;
    bool u = true;
    while(true)
    {
        int i=0, j=0,r1=0;
        cout << "\n Введите число: ";
        ar[i]=getchar();
        if(ar[i]=='-')
        {   
            ar[0]=r1;
        }
        while(ar[i]!='\n')
        {
            i++;
            ar[i]=getchar();    
        }
        n=i;
        l= isNumber(ar,n);
        u= RangeForNumber(ar,n);
        if (l||u) 
            cout <<"\n Некорректное значение. Повторите ввод. \n";
        else break; 
    }
    if(ar[0]==0)
    {
        for(i=1; i<n; i++) 
        ar[i]-=48;
    }
    for(i=0; i<n; i++) 
    ar[i]-=48;
         
}
C++
1
2
3
4
5
6
7
8
9
#include "functions.h"
#include <boost/test/unit_test.hpp>
 
BOOST_AUTO_TEST_CASE(Input)
{
        const int n=5;
         char actual[n] = { 1, 2, 3, 4, 5 };
    //BOOST_CHECK(isNumber(actual,5));
}
Возможно ли тест написать на ввод числа? Например, чтобы на входе было значение "12354fff" и тест бы не проходил?

Добавлено через 17 часов 42 минуты
Вот я попыталась. Но тест теперь всегда ошибочный, даже, если я введу 12345
C++
1
2
3
4
5
6
7
8
9
#include "functions.h"
#include <boost/test/unit_test.hpp>
 
BOOST_AUTO_TEST_CASE(isNumbers)
{
    char actual[5]={5,6,'-',2,3};
    bool l=true;
    BOOST_CHECK(isNumber(actual,5) == l);
}
Исправила ошибки в коде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
//Проверка на ввод посторонних символов
bool isNumber (char *str, int size)
{
   for (int i = 0; i < size; i++)
   {
      if(i==0 && str[i]=='-')
            continue;
        if (str[i] <'0' || str[i]>'9')
            return false;
     }
 return true;
}
Добавлено через 43 минуты
Почему второй тест не проходит?
C++
1
2
3
4
5
6
7
8
9
10
11
12
BOOST_AUTO_TEST_CASE(SymbolInNumber)
{
    char actual[5]={5,'a',2,2,3};
    bool l=false;
    BOOST_CHECK(isNumber(actual,5) == l);
}
BOOST_AUTO_TEST_CASE(isNumbers)
{
    char actual[5]={1,1,1,1,1};
    bool l=true;
    BOOST_CHECK(isNumber(actual,5) == l);
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2015, 17:04
Ответы с готовыми решениями:

boost test
Нужно сделать юнит тест. Попытался примеры найти. Я так понял следующий код...

Boost test как запустить
Пишу лабораторную работу в ней нужно сделать тесты используя boost. Скачал...

Разобрать json документ используя boost
Народ, подскажите плиз как разобрать вот такой документ: имя &quot;54289&quot;-...

Разобрать JSON документ используя Boost
Народ, подскажите плиз как разобрать вот такой JSON документ используя Boost: ...

Разобрать код рисования
Помогите разобрать код до функции рисования,дальше вроде все понятно ...

5
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
20.04.2015, 10:52 2
flo, Потому что прежде чем лезть в BOOST_TEST стоит разобраться с языком.
C++
1
char actual[5]={1,1,1,1,1};
Вообщем-то здесь actual инициализируется пятью символами с ASCII кодом 1.
Иницилизируйте так:
C++
1
char actual[5]={'1','1','1','1','1'};
0
flo
0 / 0 / 0
Регистрация: 17.12.2011
Сообщений: 67
20.04.2015, 12:05  [ТС] 3
Цитата Сообщение от ForEveR Посмотреть сообщение
в BOOST_TEST стоит разобраться с языком.
Спасибо большое. Верно подметили в языке я не разбираюсь, раз такое не учла.

Добавлено через 21 минуту
ForEveR, а если я в самой программе,при вводе числа с клавиатуры, учитываю эту особенность, как
C++
1
2
3
4
5
6
for(i=0; i<n; i++)
        if (i==0 && ar[i]=='-')
        {
            ar[i]=ar[i]-45;
        }
        else ar[i]-=48;
Использую длинную арифметику и хочу перемножить два числа
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
//Умножение длинных чисел
void Multiplication(char b[], int n, char c[], int m, char e[], int &y)
{
        char h[200];
    int i,j,l,o;
    y=0;
    //Обнуляем результат
    for(i=0; i<n+m; i++)
         h[i]=0;
    //Умножение
    for(i=0; i<m; i++)
    {
     o=0; l=0;
     for(j=n-1; j>=0; j--) 
     {
        h[j+m-i]+=(b[j]*c[m-1-i] + o)%10;
        if(h[j+m-i]>9) 
         {
             l=h[j+m-i]/10;
             h[j+m-i]=h[j+m-i]%10;
         }
        o=(b[j]*c[m-i-1] + o)/10+l;        
        if(j==0) 
            h[j+m-1-i]+=o;
        l=0;
     }
    }
    //Избавляемся от ведущих нулей
    n=n+m;
    while(h[0]==0)
    {
      for(j=0; j<n-1; j++)
         h[j]=h[j+1];
      if(n!=1) n--; 
        else break;
    }
    y=n;
    //Вывод результата
    for(i=0; i<y; i++)
        e[i] = h[i];
}
Как быть тогда с объявлением массивов в тесте?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//Тест на умножение если два отрицательных числа
BOOST_AUTO_TEST_CASE(twoNegativeNumbers)
{
    char actual1[4]={'-',1,2,3};
    char actual2[2]={'-',1};
    char result[3]={1,2,3};
    char actual3[3];
    int y;
    for (int i=0;i<3;i++)
        result[i]-=48;
    Multiplication(actual1,4,actual2,2,actual3,y);
    BOOST_CHECK_EQUAL(actual3,result);
}
Или нужно делать изменения в самой функции умножения?
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
20.04.2015, 12:37 4
flo, Зачем вообще делать -48 при вводе, если IsNumber смотрит как работает с char символами ('0' == 48)?
А вот Multiplication уже пусть заботится о том, чтобы привести массив символов в числовой вид.
Ну или оставить так, разницы вообщем-то нет. Сравнение должно идти по другому, через std::equal например, ибо сейчас сравниваются адреса двух массивов.
0
flo
0 / 0 / 0
Регистрация: 17.12.2011
Сообщений: 67
20.04.2015, 15:24  [ТС] 5
Цитата Сообщение от ForEveR Посмотреть сообщение
Зачем вообще делать -48
А это уже после проверки на символы в числе
Спасибо за ответы, частично помогло)
0
flo
0 / 0 / 0
Регистрация: 17.12.2011
Сообщений: 67
21.04.2015, 23:59  [ТС] 6
ForEveR, Вы мне очень помогли с умножением. Всё теперь работает.
Можете объяснить, мне вот нужно, чтобы числа создавались в диапазоне от -2^256 до + 2^256. Я создала функцию, которая проверяет, что число находится в этом диапазоне

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
bool RangeForNumber(char a[], int n)
{
    int i,j;
    const int nt =85;
    char t[85]={'1','1','5','7','9','2','0','9'}; //Cоздание массива числа 2^256
    for (i=8;i<78;i++)
        t[i]='0';   
    if (n==86 && a[0]=='-')
    {
        int neg=1;
        for (i=0;i<nt;i++)
        {
            if (t[i]!=a[i+1]) int neg=0; 
            //else
            if (a[i+1]>t[i]) return false;
        }
        if(neg==1) return true;
    }
    if(nt==n)
    {
        int pos=1;
        for (i=0;i<nt;i++)
        {
            if (t[i]!=a[i]) int pos=0;
            //else
            if (a[i]>t[i]) return false;
        }
        if(pos==1) return true;
    }
    if (nt>n) return true;
    return false;
}
Тест Он проходит, а в программе, если ввести число 2^256, то ошибка
//Число равно 2^256
C++
1
2
3
4
5
6
7
//Число равно 2^256
BOOST_AUTO_TEST_CASE(EqualityPosNumber)
{
    char actual[85]={'1','1','5','7','9','2','0','9','0',};
    bool truth=true;
    BOOST_CHECK(RangeForNumber(actual,85) == truth);
}
это потому,что я в языке не разбираюсь?
Будут ли записываться оставшиес нули в массиве actual?

Добавлено через 1 час 29 минут
ForEveR, всё я уже разобралась)
0
21.04.2015, 23:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2015, 23:59

Boost начало работы: Undefined reference to `boost::system::generic_category() '
Добрый день Собственно говоря возникла необходимость использовать boost в...

Boost Log - undefined reference to `boost::system::system_category()'
Пытаюсь скомпилировать код из примеров Boost Log:#include...

Использование boost и boost.build с несколькими компиляторами
Здравствуйте! Собрал библиотеку boost и boost.build для двух компиляторов:...


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

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

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