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

Рандомайзер не добавляет вещественные числа в массив

25.11.2020, 19:44. Показов 886. Ответов 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
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
#include <stdio.h>
#include <Windows.h>
#include <math.h>
#include <malloc.h>
#include <stdlib.h>
 
float fRand(float a, float b)
{
    return(rand() * (b-a) / RAND_MAX +a);
}
 
void main(void) 
{   
    
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251 );
    
    int n , i , count = 0;
    float arr[n];
    float fRand(float a, float b);
    float max=0, imax=0, sum=0, tmp=0, a, b;
    
    printf("Введите размерность n = ");
    scanf("%d", &n);
    printf("Введите интервал\n");
    printf("А = ");
    scanf("%f", &a);
    printf("\nB = ");
    scanf("%f", &b);
    
    while (n >= 0)
    {   
        arr[n] = fRand(a,b);
        
        if((arr[n] >= a) && (arr[n] <= b))
            count +=1;
        
        if (arr[n] > max)
            {
                max = arr[n];
            }
        n -= 1;
    }
    printf("\nКол-во элементов лежащих в интервале А и B = %d", count);
    
    for (i = imax+1; i < n; i++)
    {
        sum += arr[n];
    }
    printf("\nСумма элементов расположенных после мах числа = %4.1f", sum);
    
    printf("\nОтсортированный список по убыванию :");
    for  (i = 0; i< n-1; i += 1)
    {
        if(fabs(arr[n]) < fabs(arr[n+1]))
            {
                tmp = arr[n];
                arr[n] = arr[n+1];
                arr[n+1] = tmp;
            }
    printf("%4.1f  ", arr[n]);
    }   
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.11.2020, 19:44
Ответы с готовыми решениями:

Массив неверно воспринимает вещественные числа
Доброго времени суток!Помогите решить проблему. При вводе вещественных чисел в массив,они просто скипаются и принимаются в качестве двух...

Как записать вещественные числа из файла в массив?
Подскажите, пожалуйста, как записать вещественные числа из файла в массив. Пример строки из файла 1.5 0.5 8.6 7.8 1.96 Нужно, чтобы...

Заполнить случайными числами массив указателей на вещественные числа
Описать массив RARR указателей на вещественные числа,содержащий 10 элементов.В какой области памяти будет размещён этот массив?Какой объем...

13
Модератор
 Аватар для long399
2885 / 1840 / 933
Регистрация: 16.10.2013
Сообщений: 5,246
Записей в блоге: 15
26.11.2020, 05:46
Цитата Сообщение от Lefty04 Посмотреть сообщение
рандомайзер не добавляет вещественные числа в массив и программа не выводит этот массив
C
31
32
33
34
while (n >= 0)
    {   
        arr[n] = fRand(a,b);
        printf("%lf ", arr[n]);
Добавлено через 51 секунду
p.s. не проще использовать цикл for для работы с массивом ?
0
Заблокирован
26.11.2020, 11:54
Lefty04, это наверно раз десятый, когда я встречаю эту ошибку за последнее время.
Память под массив выделяется при компеляции. Твоя переменная n при компеляции указывает на мусор на стеке и это и есть размер твоего массива. То, что ты потом читаешь в переменную n ввод никак на размер массива уже не влияет.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,519
26.11.2020, 12:47
Цитата Сообщение от Lefty04 Посмотреть сообщение
int n , i , count = 0;
    float arr[n];
Чему равно n ?
Сколько в итоге элементов будет у вашего массива?

Цитата Сообщение от sodda Посмотреть сообщение
Память под массив выделяется при компеляции.
Данный фрагмент кода написан на языке си.
И использует variable length array
0
Заблокирован
26.11.2020, 13:02
eva2326, а я думал на G.
Это на С++ так можно.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,519
26.11.2020, 13:30
Цитата Сообщение от sodda Посмотреть сообщение
Это на С++ так можно.
Нет, нельзя.
На языке с++ размер массива всегда должен быть известен времени компиляции.

Тем не менее, компиляторы gcc позволяют использовать VLA в качестве своего расширения.
В результате получается непортируемый код.
0
Заблокирован
26.11.2020, 13:58
eva2326, можно. Все зависит от стандарта и компилятора.

Цитата Сообщение от eva2326 Посмотреть сообщение
ем не менее, компиляторы gcc позволяют использовать VLA в качестве своего расширения.
Разрешает, но память все равно выделяет при копиляции

Добавлено через 18 минут
eva2326, я сейчас попробовал два компилятора. На gcc работает норма вроде. На Сlang работает криво.
Но лучше не гадать и так не делать.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,519
26.11.2020, 14:11
Цитата Сообщение от sodda Посмотреть сообщение
копиляции
Цитата Сообщение от sodda Посмотреть сообщение
компеляции
Это - очень сложное слово.

Во-первых, я не рассматриваю код, который возбуждает у компиляторов ворнинги.

Во-вторых, не понятно к чему вообще вы привели этот фрагмент.
Он никак не иллюстрирует вашу точку зрения.

В-третьих, я оставила ссылку на офф. документацию.
Так сложно было почитать?

В-четвертых, вы вообще с логикой дружите?
Как это у вас так интересно получается: память копилятор компелятор компилятор выделяет времени копиляции комплеяции компиляции, а изменять размер массива можно в рантайме?

https://rextester.com/MDKCHQ83596

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//gcc 7.4.0
 
#include  <stdio.h>
 
void foo()
{
    int n = 1;
label:
    {
        int a[n];
        printf("The array has %zu elements\n", sizeof a / sizeof *a);
        if (n++ < 10) 
            goto label; 
    }
}
 
int main(void)
{
    foo();
}
0
Заблокирован
26.11.2020, 14:22
Цитата Сообщение от eva2326 Посмотреть сообщение
В-четвертых, вы вообще с логикой дружите?
Как это у вас так интересно получается: память копилятор компелятор компилятор выделяет времени копиляции комплеяции компиляции, а изменять размер массива можно в рантайме?
Я вам всё выше написал. Все зависит от компилятора. Да, c gcc можно так делать, вы правы. Опять же все зависит от компилятора и стандарта языка.
На gcc работает нормально, на Сlang работает криво.
Мы же не знаем какой компилятор кто использует. Поэтому так лучше вообще не делать никогда.
Миниатюры
Рандомайзер не добавляет вещественные числа в массив  
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,519
26.11.2020, 14:47
Цитата Сообщение от sodda Посмотреть сообщение
Я вам всё выше написал. Все зависит от компилятора.
Вы пишите чушь.
И вы не ответили на вопрос:
Цитата Сообщение от eva2326 Посмотреть сообщение
Как это у вас так интересно получается: память копилятор компелятор компилятор выделяет времени копиляции комплеяции компиляции, а изменять размер массива можно в рантайме?
Цитата Сообщение от sodda Посмотреть сообщение
Опять же все зависит от компилятора и стандарта языка.
VLA описан в стандарте языка С99.
Все компиляторы, которые его поддерживают, подчиняются единым правилам, описанным в C99.
Откройте стандарт, и почитайте уже наконец.

Цитата Сообщение от sodda Посмотреть сообщение
Мы же не знаем какой компилятор кто использует. Поэтому так лучше вообще не делать никогда.
А ещё вы не знаете кто на каких автомобилях ездиет по утрам на работу.
Из этого никак не следует, что лучше теперь от машин отказаться.

/зы Я не рассматриваю скриншоты без кода.
0
Заблокирован
26.11.2020, 15:00
Цитата Сообщение от eva2326 Посмотреть сообщение
Вы пишите чушь.
Смотрите картинку внизу.

Цитата Сообщение от eva2326 Посмотреть сообщение
И вы не ответили на вопрос:
Я вам ответил. Если можно задать размер массива во время выполнения программы, то память выделяется в runtime.
Просто в свое время я читал книги - и не я один - в которых говорится, что так делать нельзя, если память под массив не выделяется динамически с помощью соответствующих методов. Поэтому я так никогда не делаю. И поэтому у меня не бывает проблем с памятью.

Цитата Сообщение от eva2326 Посмотреть сообщение
VLA описан в стандарте языка С99.
Все компиляторы, которые его поддерживают, подчиняются единым правилам, описанным в C99.
Откройте стандарт, и почитайте уже наконец.
Я там привел картинку, где видно, что такое выделение памяти в разных компиляторах работает по-разному.
Что на этот счёт говорит ваш стандарт?
Вот вы не знаете, что С++ 14 поддерживает ваше VLA, а говорите, что в С++ так нельзя.
Вы сами-то стандарты читаете эти?

Цитата Сообщение от eva2326 Посмотреть сообщение
А ещё вы не знаете кто на каких автомобилях ездиет по утрам на работу.
Из этого никак не следует, что лучше теперь от машин отказаться.
Ну это уже из разряда женской логики что-то.
К чему это?
0
Заблокирован
26.11.2020, 15:00
картинка
Миниатюры
Рандомайзер не добавляет вещественные числа в массив  
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,519
26.11.2020, 15:31
Цитата Сообщение от sodda Посмотреть сообщение
Если можно задать размер массива во время выполнения программы, то память выделяется в runtime.
Вот теперь правильно.

Цитата Сообщение от sodda Посмотреть сообщение
Просто в свое время я читал книги - и не я один - в которых говорится, что так делать нельзя, если память под массив не выделяется динамически с помощью соответствующих методов.
Не нужно путать "массив" с "VLA"

Цитата Сообщение от sodda Посмотреть сообщение
Вот вы не знаете, что С++ 14 поддерживает ваше VLA, а говорите, что в С++ так нельзя.
Вы сами-то стандарты читаете эти?
Да, читаю.

Bо-первых, не VLA, а C++ Dynamic Arrays

А во-вторых, они так и не были приняты.

с++ никогда не поддерживал ни VLA, ни Dynamic Arrays

Цитата Сообщение от sodda Посмотреть сообщение
Ну это уже из разряда женской логики что-то.
К чему это?
Болтать о том, в чем вы ни бум бум - это, наверное, из разряда мужланской логики?

Просто подумайте: зачем кому-то отказывается от такого замечательного и полезного VLA, лишь потому, что вы не компетентны знаете какой у него компилятор?
0
Заблокирован
26.11.2020, 17:07
eva2326, что как эксперт по стандартам скажите.
ждём вашего вердикта

Добавлено через 45 минут
Цитата Сообщение от eva2326 Посмотреть сообщение
Просто подумайте: зачем кому-то отказывается от такого замечательного и полезного VLA, лишь потому, что вы не компетентны знаете какой у него компилятор?
Во-первых этого не знают сами те, кто пишет код.
Если ты не знаешь поддерживает это твой компилятор или нет, то лучше делать так, как точно будет работать.
С - это язык с кучей вещей, которые характеризуются как неопределённое поведении.
Clang для языка С++ позволяет VLA.
Но в С++ это так же не нужно, как и в Rust, например.
Там есть векторы, правда память для векторов в Rust выделяется в куче.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fn main() {
    
    let n = 5;
    let m: [u8; n];
    
}
 
rustc -o main main.rs
error[E0435]: attempt to use a non-constant value in a constant
 --> main.rs:4:17
  |
4 |     let m: [u8; n];
  |                 ^ non-constant value
 
error: aborting due to previous error
 
For more information about this error, try `rustc --explain E0435`.
compiler exit status 1
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.11.2020, 17:07
Помогаю со студенческими работами здесь

Как сделать, чтобы массив генерировал вещественные числа в диапазоне от –10 до 10?
Здравствуйте! В 1С:Предприятие 8.3.15 создал обработчик генератора случайных чисел в массиве: &amp;НаСервере Процедура...

Одномерный динамический массив (удалить все вещественные числа, оставив только целые)
Здравствуйте!Помогите,пожалуйста,надо из динамического массива удалить все вещественные числа, оставив только целые, полу-ченный массив...

Массив (Все вещественные числа массива которые больше 10 заменить на 1,остальные округлить до целого)
Подскажите что не так в программе. Суть в том,надо все вещественные числа массива которые больше 10 заменить на 1,остальные округлить до...

Даны натуральное число n и вещественные числа . Найти минимальное из вещественных чисел (массив не использовать)
Даны натуральное число n и вещественные числа . Найти минимальное из вещественных чисел (массив не использовать). помогите пожалуйста ))

Дан одномерный массив, содержащий вещественные числа. Для каждого элемента массива напечатать число отрицательных элементов, идущих за ним
Дан одномерный массив, содержащий вещественные числа. Для каждого элемента массива напечатать число отрицательных элементов, идущих за ним...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru