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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
#1

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

24.10.2011, 10:21. Просмотров 732. Ответов 14
Метки нет (Все метки)

В одной функции одномерный динамический массив заполняется случайными числами

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++
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; const int cN=100; struct pirkinys { ...

Возможная пробелами с типами данных - C++
Здравствуйте! Есть следующие задание: http://s5.********************/uploads/images/2013/10/f918d6e0a9bf1c4476ca287477d9619b.png ...

Ошибка с типами данных в подпрограмме - C++
Не знаю, правильно ли я задал названия темы, суть проблемы следующая: Нужно было создать программу с структурой данных, в которой по...

Помогите разобраться с типами данных - C++
Здравствуйте! Размер (в байтах) объектов каких типов данных зависит от разрядности процессора?

Работа с типами данных в массиве - C++
Всем доброго времени суток , помогите выяснить одну вещь. Есть у меня массив типа char. Вот к примеру {1f-21df } Каким образом...

Пoмoгите со строковыми типами данных - C++
Дан текст, состоящий не менее чем из пяти слов. Вывести на экран слова, которые имеют одинаковые окончания &quot;ИЯ&quot;,&quot;ИСТ&quot;,&quot;ИКА&quot;. С этой темой...

Работа со структурными типами данных - C++
Задание: В файле записан массив A(nxm) целых чисел. Структура файла следующая: сначала хранится n и m, а затем массив A. Определить в нем...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
24.10.2011, 12:49  [ТС]     Проблема с типами данных #4
Если массив будет double, не будет работать
C++
1
if (*(Massive+i)%Delitel==0)
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
24.10.2011, 13:23  [ТС]     Проблема с типами данных #7
fasked, а как, если задать исходный массив int, переопределить его потом в double?
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.10.2011, 14:24     Проблема с типами данных #8
Heidel, явное приведение типов, но это не переносимо и не безопасно.
Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
24.10.2011, 14:46  [ТС]     Проблема с типами данных #9
fasked, то есть, этого лучше не делать. Понятно.
accept
4820 / 3240 / 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
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
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
25.10.2011, 10:54     Проблема с типами данных #12
Цитата Сообщение от accept Посмотреть сообщение
для деления с остатком вещественных чисел есть fmod()
Акцент был на словах "с заданной точностью". Все мы знаем, какую подлянку могут подбросить вещественные числа при строгих сравнениях.
Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
25.10.2011, 11:22  [ТС]     Проблема с типами данных #13
fasked,
Цитата Сообщение от fasked Посмотреть сообщение
Все мы знаем, какую подлянку могут подбросить вещественные числа при строгих сравнениях.
И какую же?
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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     Проблема с типами данных
Еще ссылки по теме:

Организация управления типами данных - C++
Поясните, пожалуйста, как происходит разделение типов данных в памяти? как компилятор определяет в каких ячейках хранятся соответствующие...

Массив с двумя типами данных - C++
&quot;Дан двумерный массив,в нем хранится информация о рабочих и их номера телефонов.Реализовать поиск по Фамилии и вывода телефона&quot; Подкиньте...

Работа сортировки с любыми типами данных - C++
Есть вот такая сортировка: typedef struct node_t *node, node_t; struct node_t { int v; node next; }; typedef struct { node head,...

Инициализация вектора с несколькими типами данных - C++
Необходимо создать список книг,содержащий название,автор,год выпуска, т.е. string,string,int . Решил взять вектор и хотел поэлементно ...

Реализация Fifo с разными типами данных - C++
Доброго времени суток! Задача следующая: Есть абстрактный класс CData, от него наследуются классы CByte, CWord, CNumber. Нужно...


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

Или воспользуйтесь поиском по форуму:
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     Проблема с типами данных
Ответ Создать тему
Опции темы

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