Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Heidel
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649

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

24.10.2011, 10:21. Показов 1242. Ответов 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 );
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.10.2011, 10:21
Ответы с готовыми решениями:

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

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

Задача с типами данных
Может, что-то уже было здесь, но не могу найти. Дано целое число Y - год, лежащее в диапазоне 1970-2100; целое число М - месяц, лежащее...

14
1 / 1 / 0
Регистрация: 14.10.2011
Сообщений: 18
24.10.2011, 10:34
а если сделать массивы double?

Добавлено через 11 минут
в double то можно положить целое число, в int дробное - врядли.
0
27 / 27 / 13
Регистрация: 07.11.2010
Сообщений: 154
24.10.2011, 12:15
Конечно массивы должны быть дабловыми! Если это не подходит по условию задачи, то и переменная типа дабл не подходит по здравому смыслу
0
 Аватар для Heidel
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649
24.10.2011, 12:49  [ТС]
Если массив будет double, не будет работать
C++
1
if (*(Massive+i)%Delitel==0)
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
24.10.2011, 13:05
Heidel, либо делайте исходный массив int, а конечный double. Либо делайте оба массива double, но при обработке отбрасывайте дробную частью. Еще один вариант это создать собственную функцию вычисления остатка от деления для дробных чисел с заданной точностью
1
1 / 1 / 0
Регистрация: 14.10.2011
Сообщений: 18
24.10.2011, 13:14
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)))
0
 Аватар для Heidel
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649
24.10.2011, 13:23  [ТС]
fasked, а как, если задать исходный массив int, переопределить его потом в double?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
24.10.2011, 14:24
Heidel, явное приведение типов, но это не переносимо и не безопасно.
0
 Аватар для Heidel
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649
24.10.2011, 14:46  [ТС]
fasked, то есть, этого лучше не делать. Понятно.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.10.2011, 09:52
Цитата Сообщение от Heidel
C++
1
double ObrabotkaMassiva
C++
1
        return 0;
у тебя функция возвращает вещественный тип, а в операторе возврата записано целое число

Цитата Сообщение от Heidel
Если массив будет double, не будет работать
Цитата Сообщение от fasked
Еще один вариант это создать собственную функцию вычисления остатка от деления для дробных чисел с заданной точностью
для деления с остатком вещественных чисел есть fmod()
0
 Аватар для Heidel
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649
25.10.2011, 10:13  [ТС]
В программе сейчас процедуры заполнения и обработки массива записаны таким образом
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 );
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
25.10.2011, 10:54
Цитата Сообщение от accept Посмотреть сообщение
для деления с остатком вещественных чисел есть fmod()
Акцент был на словах "с заданной точностью". Все мы знаем, какую подлянку могут подбросить вещественные числа при строгих сравнениях.
0
 Аватар для Heidel
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649
25.10.2011, 11:22  [ТС]
fasked,
Цитата Сообщение от fasked Посмотреть сообщение
Все мы знаем, какую подлянку могут подбросить вещественные числа при строгих сравнениях.
И какую же?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
25.10.2011, 11:27
Цитата Сообщение от Heidel Посмотреть сообщение
И какую же?
0 не обязательно равен 0. Нельзя с вещественными числами работать так:
C++
1
2
if (a == b) {
}
Например, следующий цикл может никогда не завершиться:
C++
1
2
for (double i = 0.0; i != 10.0; i += 0.1) {
}
0
 Аватар для Heidel
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649
25.10.2011, 11:40  [ТС]
fasked, в таком случае получается, что строка из программы
C++
1
if (fmod (*(Massive+i),Delitel)==0)
неверна? оба числа типа double.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.10.2011, 11:40
Помогаю со студенческими работами здесь

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

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

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

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

Пoмoгите со строковыми типами данных
Дан текст, состоящий не менее чем из пяти слов. Вывести на экран слова, которые имеют одинаковые окончания...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru