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

Проблема с типами данных - C++

Восстановить пароль Регистрация
 
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
24.10.2011, 10:21     Проблема с типами данных #1
В одной функции одномерный динамический массив заполняется случайными числами

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Г‡Г*ïîëГ*ГҐГ*ГЁГҐ Г¬Г*Г±Г±ГЁГўГ* ñëó÷Г*Г©Г*ûìè Г·ГЁГ±Г«Г*ìè
int ZapolnenieMassiva (int *Massive, int SizeOfMassive)
{
 
int i;
 
cout << "Massiv iz " << SizeOfMassive <<" elementov\n";
 
    for (i=0; i<SizeOfMassive; i++)
    {
        *(Massive+i)=rand()%101;
        cout << *(Massive+i) << " " ;
    }
    cout <<"\n\n" ;
    return 0;
}
В второй функции элементы массива, кратные какому-либо числу (Delitel), умножаются на переменную

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// ГЋГЎГ°Г*áîòêГ* Г¬Г*Г±Г±ГЁГўГ*
double ObrabotkaMassiva (int *Massive, int SizeOfMassive, int Delitel, double Peremennaya)
{       
    
int i;
 
cout << "Elementy massiva kratnye " << Delitel << " umnojit na " << Peremennaya << "\n";
 
    for (i=0; i<SizeOfMassive; i++)
    {
        if (*(Massive+i)%Delitel==0)
            *(Massive+i) = *(Massive+i)*Peremennaya;        
            cout << *(Massive+i) << " " ;
    }
    cout <<"\n\n" ;
    return 0;
}
Но из-за того, что переменная имеет тип double
в строке warning C4244: '=' : conversion from 'double' to 'int', possible loss of data
и соответственно, при умножении элемента массива на переменную дробная часть отбрасывается.

Как сделать так, чтобы этого не было?

Кусок кода основной программы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int *nMassive, *mMassive, *lMassive;
int i=9, j=10, k=11;
int Delitel1=3, Delitel2=5, Delitel3=2;
 
    srand(time(NULL));
 
    nMassive = new int [i];
    mMassive = new int [j];
    lMassive = new int [k];
 
    ZapolnenieMassiva (nMassive, i); 
    ZapolnenieMassiva (mMassive, j);
    ZapolnenieMassiva (lMassive, k);
 
    cout <<"\n" ;
 
    ObrabotkaMassiva (nMassive, i, Delitel1, a );
    ObrabotkaMassiva (mMassive, j, Delitel2, b );
    ObrabotkaMassiva (lMassive, k, Delitel3, c );
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2011, 10:21     Проблема с типами данных
Посмотрите здесь:

Проблема с типами C++
Помогите разобраться с типами данных C++
C++ Пoмoгите со строковыми типами данных
C++ Работа с типами данных в массиве
C++ Возможная пробелами с типами данных
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
svinka
1 / 1 / 0
Регистрация: 14.10.2011
Сообщений: 18
24.10.2011, 10:34     Проблема с типами данных #2
а если сделать массивы double?

Добавлено через 11 минут
в double то можно положить целое число, в int дробное - врядли.
Krasti
27 / 27 / 3
Регистрация: 07.11.2010
Сообщений: 140
24.10.2011, 12:15     Проблема с типами данных #3
Конечно массивы должны быть дабловыми! Если это не подходит по условию задачи, то и переменная типа дабл не подходит по здравому смыслу
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
24.10.2011, 12:49  [ТС]     Проблема с типами данных #4
Если массив будет double, не будет работать
C++
1
if (*(Massive+i)%Delitel==0)
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
24.10.2011, 13:05     Проблема с типами данных #5
Heidel, либо делайте исходный массив int, а конечный double. Либо делайте оба массива double, но при обработке отбрасывайте дробную частью. Еще один вариант это создать собственную функцию вычисления остатка от деления для дробных чисел с заданной точностью
svinka
1 / 1 / 0
Регистрация: 14.10.2011
Сообщений: 18
24.10.2011, 13:14     Проблема с типами данных #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
#include <iostream.h>
#include <time.h>
#include <stdlib.h>
 
int ZapolnenieMassiva (double *Massive, int SizeOfMassive)
{
 
int i;
 
cout << "Massiv iz " << SizeOfMassive <<" elementov\n";
 
        for (i=0; i<SizeOfMassive; i++)
        {
                *(Massive+i)=rand()%101;
                cout << *(Massive+i) << " " ;
        }
        cout <<"\n\n" ;
        return 0;
}
 
int ObrabotkaMassiva (double *Massive, int SizeOfMassive, double Delitel, double Peremennaya)
{
 
int i;
 
cout << "Elementy massiva kratnye " << Delitel << " umnojit na " << Peremennaya << "\n";
 
        for (i=0; i<SizeOfMassive; i++)
        {
                   if ((*(Massive+i)/Delitel)> int((*(Massive+i)/Delitel)))
                    *(Massive+i) = *(Massive+i)*Peremennaya;
                    cout << *(Massive+i) << " " ;
        }
        cout <<"\n\n" ;
        return 0;
}
 
 
int main ( )
{
    double *nMassive, *mMassive, *lMassive;
    int i=9, j=10, k=11;
    int Delitel1=3, Delitel2=5, Delitel3=2;
    double a=5 ,b=5, c=5;
            srand(time(NULL));
 
            nMassive = new double [i];
            mMassive = new double [j];
            lMassive = new double [k];
 
            ZapolnenieMassiva (nMassive, i);
            ZapolnenieMassiva (mMassive, j);
            ZapolnenieMassiva (lMassive, k);
 
            cout <<"\n" ;
 
            ObrabotkaMassiva (nMassive, i, Delitel1, a );
            ObrabotkaMassiva (mMassive, j, Delitel2, b );
            ObrabotkaMassiva (lMassive, k, Delitel3, c );
return 0;
}
Добавлено через 27 секунд
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.h>
#include <time.h>
#include <stdlib.h>
 
int ZapolnenieMassiva (double *Massive, int SizeOfMassive)
{
 
int i;
 
cout << "Massiv iz " << SizeOfMassive <<" elementov\n";
 
        for (i=0; i<SizeOfMassive; i++)
        {
                *(Massive+i)=rand()%101;
                cout << *(Massive+i) << " " ;
        }
        cout <<"\n\n" ;
        return 0;
}
 
int ObrabotkaMassiva (double *Massive, int SizeOfMassive, double Delitel, double Peremennaya)
{
 
int i;
 
cout << "Elementy massiva kratnye " << Delitel << " umnojit na " << Peremennaya << "\n";
 
        for (i=0; i<SizeOfMassive; i++)
        {
                   if ((*(Massive+i)/Delitel)> int((*(Massive+i)/Delitel)))
                    *(Massive+i) = *(Massive+i)*Peremennaya;
                    cout << *(Massive+i) << " " ;
        }
        cout <<"\n\n" ;
        return 0;
}
 
 
int main ( )
{
    double *nMassive, *mMassive, *lMassive;
    int i=9, j=10, k=11;
    int Delitel1=3, Delitel2=5, Delitel3=2;
    double a=5 ,b=5, c=5;
            srand(time(NULL));
 
            nMassive = new double [i];
            mMassive = new double [j];
            lMassive = new double [k];
 
            ZapolnenieMassiva (nMassive, i);
            ZapolnenieMassiva (mMassive, j);
            ZapolnenieMassiva (lMassive, k);
 
            cout <<"\n" ;
 
            ObrabotkaMassiva (nMassive, i, Delitel1, a );
            ObrabotkaMassiva (mMassive, j, Delitel2, b );
            ObrabotkaMassiva (lMassive, k, Delitel3, c );
return 0;
}
Добавлено через 6 минут
вмесето
C++
1
if ((*(Massive+i)/Delitel)> int((*(Massive+i)/Delitel)))

надо
C++
1
if ((*(Massive+i)/Delitel)== int((*(Massive+i)/Delitel)))
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
24.10.2011, 13:23  [ТС]     Проблема с типами данных #7
fasked, а как, если задать исходный массив int, переопределить его потом в double?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
24.10.2011, 14:24     Проблема с типами данных #8
Heidel, явное приведение типов, но это не переносимо и не безопасно.
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
24.10.2011, 14:46  [ТС]     Проблема с типами данных #9
fasked, то есть, этого лучше не делать. Понятно.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.10.2011, 09:52     Проблема с типами данных #10
Цитата Сообщение от Heidel
C++
1
double ObrabotkaMassiva
C++
1
        return 0;
у тебя функция возвращает вещественный тип, а в операторе возврата записано целое число

Цитата Сообщение от Heidel
Если массив будет double, не будет работать
Цитата Сообщение от fasked
Еще один вариант это создать собственную функцию вычисления остатка от деления для дробных чисел с заданной точностью
для деления с остатком вещественных чисел есть fmod()
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
25.10.2011, 10:13  [ТС]     Проблема с типами данных #11
В программе сейчас процедуры заполнения и обработки массива записаны таким образом
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
// Заполнение одномерного массива произвольного размера случайными числами
void ZapolnenieMassiva (double *Massive, int SizeOfMassive)
{
 
cout << "Massiv iz " << SizeOfMassive <<" elementov\n";
 
    for (int i=0; i<SizeOfMassive; i++)
    {
        *(Massive+i)= (int) rand()%101;
        cout << *(Massive+i) << " " ;
    }
    cout <<"\n\n" ;
}
 
// Обработка массива. Элементы массива, кратные какому-либо числу (Delitel), умножаются на переменную
void ObrabotkaMassiva (double *Massive, int SizeOfMassive, int Delitel, double Peremennaya)
{       
    
cout << "Elementy massiva kratnye " << Delitel << " umnojit na " << Peremennaya << "\n";
 
    for (int i=0; i<SizeOfMassive; i++)
    {
        
            if (fmod (*(Massive+i),Delitel)==0)
            {
                *(Massive+i) = *(Massive+i)*Peremennaya;
            }
            cout << *(Massive+i) << " " ;
    }
    cout <<"\n\n" ;
}
Кусок кода основной программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
double *nMassive, *mMassive, *lMassive;
int i=9, j=10, k=11;
int Delitel1=3, Delitel2=5, Delitel3=2;
 
    srand(time(NULL));
 
    nMassive = new double [i];
    mMassive = new double [j];
    lMassive = new double [k];
 
    ZapolnenieMassiva (nMassive, i); 
    ZapolnenieMassiva (mMassive, j);
    ZapolnenieMassiva (lMassive, k);
 
    cout <<"\n" ;
 
    ObrabotkaMassiva (nMassive, i, Delitel1, a );
    ObrabotkaMassiva (mMassive, j, Delitel2, b );
    ObrabotkaMassiva (lMassive, k, Delitel3, c );
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
25.10.2011, 10:54     Проблема с типами данных #12
Цитата Сообщение от accept Посмотреть сообщение
для деления с остатком вещественных чисел есть fmod()
Акцент был на словах "с заданной точностью". Все мы знаем, какую подлянку могут подбросить вещественные числа при строгих сравнениях.
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
25.10.2011, 11:22  [ТС]     Проблема с типами данных #13
fasked,
Цитата Сообщение от fasked Посмотреть сообщение
Все мы знаем, какую подлянку могут подбросить вещественные числа при строгих сравнениях.
И какую же?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
25.10.2011, 11:27     Проблема с типами данных #14
Цитата Сообщение от Heidel Посмотреть сообщение
И какую же?
0 не обязательно равен 0. Нельзя с вещественными числами работать так:
C++
1
2
if (a == b) {
}
Например, следующий цикл может никогда не завершиться:
C++
1
2
for (double i = 0.0; i != 10.0; i += 0.1) {
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2011, 11:40     Проблема с типами данных
Еще ссылки по теме:

Путаница с типами данных TCHAR и char. Какой тип данных выбрать? C++
C++ Работа со структурными типами данных
C++ Ошибка с типами данных в подпрограмме

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

Или воспользуйтесь поиском по форуму:
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
25.10.2011, 11:40  [ТС]     Проблема с типами данных #15
fasked, в таком случае получается, что строка из программы
C++
1
if (fmod (*(Massive+i),Delitel)==0)
неверна? оба числа типа double.
Yandex
Объявления
25.10.2011, 11:40     Проблема с типами данных
Ответ Создать тему
Опции темы

Текущее время: 23:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru