Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 05.12.2018
Сообщений: 12

Проблема с заполнением массива вещественными числами

09.04.2019, 20:57. Показов 2400. Ответов 5

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Хочу попросить знатоков помочь решить проблему.
Проблема заключается в заполнении массива вещественными, "рандомными" числами (case 2) в выбранном пользователем диапазоне:
  • Когда появляется 0.0, то цикл проверки попросту игнорирует его и выводит "No zeroes are in the array found", хотя нули присутствуют, хоть и редко. (в мануальном вводе все ок)
  • Не могу понять почему так редко появляются нули.
Само задание выглядит так:
  1. Найти количество положительных элементов массива.
  2. Найти сумму элементов массива,расположенных после последнего элемента равного нулю.
  3. Преобразовать массив таким образом,чтобы, сначала располагались все элементы, целая часть которых не превышает 1, а потом все остальные!
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <iostream>
#include <time.h>
#include <iomanip>
 
using namespace std;
 
int menu()
{   
    int variant;
    cout << "Choose either random or manual filling the array\n" << endl;
    cout << "1. Manual\n"
         << "2. Random\n";
    cin >> variant;
 
    return variant;
}
 
int main(float argc, char* argv[])
{
    int variant = menu();
    int n;
    int ch = 0;
    cout << "Please enter size of array" << endl;
    cin >> n;
    float *arr = new float[n];
    cout << endl;
    int ind = 0, check = 0;
    float sum = 0;
    float tmp;
    switch (variant) {
    case 1:
        cout << "You choose manual" << endl;
 
        for (int i = 0; i < n; i++)
        {
            cout << "Enter element " << i + 1 << ":";
            cin >> arr[i];
            if (arr[i] > 0)
                ch++;
        }
        cout << "---------------------------------------------------------------" << endl;
        cout << "Amount of positive numbers: " << ch << endl;
 
        for (int i = n - 1; i > 0; --i)
        {
            if (arr[i] != 0)
            {
                sum += arr[i];
                check = 1;
            }
 
            if (arr[i] == 0) {
                check = 0;
                cout << "Sum of elements after 0:" << sum << endl;
                break;
            }
        }
 
        if (check == 1)
            cout << "No zeroes are in the array found" << endl;
        cout << "---------------------------------------------------------------" << endl;
 
        for (int i = 0; i < n; i++)
        {
            if (arr[i] <= 1)
            {
                tmp = arr[i];
                for (int j = i; j > ind; j--)
                {
                    arr[j] = arr[j - 1];
                }
                arr[ind] = tmp;
                ind++;
            }
        }
        for (int i = 0; i < n; i++)
            cout << arr[i] << endl;
        break;
    
    case 2:
        cout << "You choose random" << endl;
        int min, max;
        srand(time(NULL));
        cout << "Please enter a range of random filling the array: " << endl;
        cin >> min >> max;                                                      // объявление массива
        cout << "---------------------------------------------------------------" << endl;
        for (int i = 0; i < n; i++) {
            arr[i] = (float)rand() /RAND_MAX* (max - min) + min;
        }
 
        for (int i = 0; i < n; i++)
        {
            if (arr[i] > 0)
                ch++;
        }
        for (int i = 0; i < n; i++)
            cout << fixed << setprecision(1) << arr[i] << endl;
        cout << "Amount of positive numbers: " << ch << endl;
        cout << "---------------------------------------------------------------" << endl;
 
        for (int i = n - 1; i > 0; --i)
        {
            if (arr[i] != 0)
            {
                sum += arr[i];
                check = 1;
            }
            
            if (arr[i] == 0) {
                check = 0;
                cout << "Sum of elements after 0:" << sum << endl;
                break;
            }
        }
    
            if(check == 1)
                cout << "No zeroes are in the array found" << endl;
            cout << "---------------------------------------------------------------" << endl;
            
            for (int i = 0; i < n; i++)
            {
                if (arr[i] <= 1)
                {
                    tmp = arr[i];
                    for (int j = i; j > ind; j--)
                    {
                        arr[j] = arr[j - 1];
                    }
                    arr[ind] = tmp;
                    ind++;
                }
            }
            for (int i = 0; i < n; i++)
                cout << fixed << setprecision(1) << arr[i] << endl;
            break;
        }
    
    system("pause");
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.04.2019, 20:57
Ответы с готовыми решениями:

Генерация массива случайными вещественными числами
Дан одномерный вещественный массив из N элементов (N – нечетное), заданных случайными числами на промежутке [a; b). Значения N, a, b...

Заполнение массива вещественными числами с двумя знаками после запятой
Здравствуйте! Я только начала работать в С++ и не знаю как заполнить одномерный массив из 10 элементов вещественными числами в диапазоне от...

Текстовый файл с вещественными числами сравнить с числами массива
Добрый день! Огромная просьба помочь с программой. Дан текстовый файл с вещественными числами. Числа необходимо сравнивать с другими...

5
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
09.04.2019, 21:03
Цитата Сообщение от Необучаемый Посмотреть сообщение
if (arr[i] == 0) {
Действительные числа надо сравнивать с некоторой точностью
C++
1
2
3
4
5
6
7
8
9
10
            if (fabs(arr[i])>1e-18) // 17 нулей после запятой
            {
                sum += arr[i];
                check = 1;
            }else
            {
                check = 0;
                cout << "Sum of elements after 0:" << sum << endl;
                break;
            }
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
09.04.2019, 21:06
Необучаемый,
C++
1
(abs(arr[i]) < 1e-8)
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
09.04.2019, 21:13
Лучший ответ Сообщение было отмечено Необучаемый как решение

Решение

Цитата Сообщение от Необучаемый Посмотреть сообщение
Когда появляется 0.0, то цикл проверки попросту игнорирует его и выводит "No zeroes are in the array found", хотя нули присутствуют
Логическая ошибка с установкой check.
Надо ДО цикла сказать check = 1. А уже в цикле при встрече с нулем check = 0
Цитата Сообщение от Необучаемый Посмотреть сообщение
(в мануальном вводе все ок)
Нет. Та же ошибка. Посмотрите на последовательности 1 0 2
1
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
10.04.2019, 01:48
Лучший ответ Сообщение было отмечено Необучаемый как решение

Решение

Цитата Сообщение от Необучаемый Посмотреть сообщение
Не могу понять почему так редко появляются нули.
задайте конкретный диапазон в районе нуля, чем он меньше, тем нули будут встречаться чаще. учитывая специфику задачи, можно включить в массив обязательный ноль, например так: a[rand()%n]=0.0; применять eps=1e-8 при сравнении с нулём не нужно, так как ноль получается "правильный". избегайте повторения одинаковых блоков в коде. не нужно усложнять задачу тем, что не требуется по условию (ввод границ интервала, выбор варианта заполнения).

впрочем выбор варианта заполнения оставил, раз уж Вы решили включить его в код:
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
77
78
79
80
81
82
83
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace std;
 
void Random(double *a, int n)
{
    for (int i = 0; i < n; i++)      
      a[i]=0.1*(rand()%199 - 99);
      a[rand()%n]=0.0;
}   
    
void Set(double *a, int n)
{
    cout << "Enter " << n << " elements:\n";
    for (int i = 0; i < n; i++)
    cin >> a[i];
}
 
void Print(double *a, int n) 
{
    for (int i = 0; i < n; i++)     
      cout << a[i] << " ";      
    cout << "\n";
} 
 
int main()
{
    srand((int)time(0));
    int n, count_pos=0, m=0, k=0;
    cout << "n="; cin >> n;
 
    double*a = new double[n], sum=0.0, sum1;
 
    int choose;
    cout << "Made choose: Random - 1, Keyboard - 2: ";    
    cin >> choose;
    
       switch(choose)
    {
        case 1:
        {
            Random(a,n);
            break;
        }
        case 2:
        {
            Set(a,n);
            break;
        }      
        default:
            cout << "Wrong option!";
    }
    
    Print(a,n);    
    
    for (int i = 0; i < n; i++) 
      {
      if (a[i]>0.0) count_pos++;
      sum+=a[i];
      if (a[i]==0.0) {m=1;sum1=sum;}
      }
      
    cout << "count positive = " << count_pos << "\n";
    if (m==0) cout << "Negative elements are absent\n";
    else if (a[n-1]==0.0) cout << "Elements after last null are absent\n";
    else cout << "local sum = " << sum-sum1 << "\n";
    
    for (int i = 0; i < n; i++)
        if (fabs(a[i])<=1)
        {
            for (int j = i; j > k; j--) 
            swap(a[j],a[j-1]);
            k++;
        }
        
    Print(a,n);         
    
    delete[]a;
system("pause");
return 0;
}
Добавлено через 23 минуты
строки 58-68 в предложенном коде можно заменить, в этом случае будет 2 цикла:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (int i = 0; i < n; i++) 
      {      
      if (a[i]>0.0) count_pos++;
      else if (a[i]==0.0) m=1;
      }
      
    cout << "count positive = " << count_pos << "\n";
    if (m==0) cout << "Negative elements are absent\n";
    else if (a[n-1]==0.0) cout << "Elements after last null are absent\n";
    else 
    {
    for (int i = n-1; a[i]; i--)
    sum+=a[i];
    cout << "local sum = " << sum << "\n";
    }
1
0 / 0 / 0
Регистрация: 05.12.2018
Сообщений: 12
10.04.2019, 20:48  [ТС]
Yetty, Байт, zayats80888, zss, Спасибо, Высшие умы, за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.04.2019, 20:48
Помогаю со студенческими работами здесь

Создание одномерного массива с заполнением рандомными числами
Напишите пожалуйста процесс создания одномерного массива с его заполнением рандомными числами.

Проблема с заполнением массива
Помогите разобраться!! Дано: Столбец А - даты, столбец В- данные (длина 1500 строк) Требуется переписать таблицу следующим образом ...

Проблема с заполнением массива
import java.util.Scanner; import java.util.Arrays; public class mergeSortedArrysSololearn { public static void main(String args)...

Проблема с заполнением массива из StringGrid
Здравствуйте! Вот сам код: var Form1: TForm1; x,y:array of real; implementation {$R *.lfm} { TForm1 }

Проблема со случайным заполнением массива
собственно, на этой простой задаче возникла проблема. код: for i := 0 to Form1.n - 1 do for j := 0 to Form1.n - 1...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru