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

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

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

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

24.10.2011, 10:21. Просмотров 740. Ответов 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++):

Проблема с типами - C++
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; const int cN=100; struct pirkinys { ...

Путаница с типами данных TCHAR и char. Какой тип данных выбрать? - C++
Я создавал тему в соседнем разделе:http://www.cyberforum.ru/cpp-networks/thread1119035.html Насколько я понял, то POST-данные в TCHAR...

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
Эксперт С++
4934 / 2514 / 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
Эксперт С++
4934 / 2514 / 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
4821 / 3241 / 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
Эксперт С++
4934 / 2514 / 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
Эксперт С++
4934 / 2514 / 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) {
}
Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
25.10.2011, 11:40  [ТС] #15
fasked, в таком случае получается, что строка из программы
C++
1
if (fmod (*(Massive+i),Delitel)==0)
неверна? оба числа типа double.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2011, 11:40
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.10.2011, 11:40
Ответ Создать тему
Опции темы

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