Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 472

Потенциальная утечка памяти

15.03.2026, 13:57. Показов 9757. Ответов 118
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Помогаю тут знакомому делать лабораторную по программированию на С++. Делаю в Qt так как начал его изучать.
Задание:
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) максимальный по модулю элемент массива;[1]
2) сумму элементов массива, расположенных между первым и вторым положительными элементами.
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.
Вот, что у меня получилось:
C++ (Qt)
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
 main.cpp
#include <QCoreApplication>
#include<conio.h>
#include<math.h>
#include <QTextStream>
 
/* в среде разработки Qt на C++ позволяет использовать все идентификаторы
 из пространства имён std без указания префикса std::(например для count,cin,endl)*/
using namespace std;
 
int main()
{
    // задаём локализацию всех функций программы на русский язык, по умолчанию это только английский язык
    setlocale(LC_ALL, "Rus");
    QTextStream cin(stdin); cin.setCodec("CP866");         // кодировка для ввода в консоль
    QTextStream cout(stdout); cout.setCodec("CP1251");     // кодировка для вывода из консоли
    // 1
    int i,n,imax;
    float max=0;
    cout << QString::fromUtf8("Введите размерность массива n:")<< endl;
    cin >> n;
    cout << QString::fromUtf8("Введите через пробел элементы мaccива, дробную часть через точку:") << endl;
    float *p=new float[n];
    for(i=0; i<n; i++)
        cin >> p[i];
    for (max=p[0], imax=i=0; i<n; i++)
        if(fabs(p[i])>fabs(max))
        {
            max=p[i];
            imax=i;
        }
    cout << QString::fromUtf8("\nМаксимальный по модулю элемент: ") << max << endl;
    cout << QString::fromUtf8("Позиция максимального по модулю элемента: ") <<imax+1;
    // 2
    float sum=0;
    for (i = 0; i < n; i++)  // проходим циклом по длине массива
    {
        if (p[i] > 0)        // если встретим первый положительный элемент
        {
            i++;             // увеличиваем счётчик на 1  
            /* далее идём циклом пока не встретим следующий положительный элемент 
               или пока не закончиться длина массива
            */          
            while (p[i] <= 0 && i < n)  
            {                              
                sum += p[i]; // суммируем не удовлетворяющие условию элементы массива в переменную sum
                i++;         // увеличиваем счётчик на 1 
            }
            // как только выполнилось одно из условий выходим из цикла
            break;                          
        }
    }
    cout << QString::fromUtf8("\nCyммa элементов расположенных между 1 и 2 положительными элементами: ") << sum;
    // 3
    cout << QString::fromUtf8("\nПреобразованный массив:") << endl;   
    for(i=0; i<n; i++)
        if(p[i]!=0)
        {
            cout << p[i] << " ";
        }
    for(i=0; i<n; i++)
        if(p[i]==0)
        {
            cout << p[i]<< " ";
        }    
    return 0;
}
Вроде как всё работает, но появляется нехорошее предупреждение:
C++ (Qt)
1
2
D:\Examples\Option9\main.cpp:65:12: Potential leak of memory pointed to by 'p' [clang-analyzer-cplusplus.NewDeleteLeaks]
D:\Examples\Option9\main.cpp:65:12 : Потенциальная утечка памяти, на которую указывает 'p' [clang-analyzer-cplusplus.NewDeleteLeaks]
Помогите разобраться что не так.
И если можно подскажите как в этом коде сделать ЗАЩИТУ если в консоли будет набрано не правильное количество элементов.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.03.2026, 13:57
Ответы с готовыми решениями:

Утечка памяти
Доброго времени суток. Написал оконное приложение. Столкнулся с проблемой - утекает память. ...

Шаблоны STL & утечка памяти.
Доброе время суток. Имеются 2 класса: 1)TVoteServer 2)TVoteServers - класс коллекция TVoteServer...

Утечка памяти
Доброго времени суток! Столкнулся с проблемой утечки памяти! Будь у меня маленькая программка,...

118
 Аватар для vlisp
1070 / 991 / 153
Регистрация: 10.08.2015
Сообщений: 5,426
18.03.2026, 11:25
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от GAZot Посмотреть сообщение
а что я вынес из ваших 4 постов, что я не туда засунул.
так и было. нет? Почитай про принцип KISS. ты его нарушил и получил в ответ проблемы
У тебя задача в 2 действия. но ты решил даже тут читернуть. в итоге у тебя количество ненужных циклов сильно больше нуля. программа неоптимизированная и медленная.
так не то что на плюсах, даже на си не пишут.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
18.03.2026, 14:50
Цитата Сообщение от GAZot Посмотреть сообщение
Qt здесь не при чём, но он стоит у меня в качестве IDE работы с C++
Если даже используешь Qt Creator в качество IDE для написания на С++, никто тебя не заставляет использовать фрейморк Qt.
Ты ввел всех в заблуждение своими постами и даже кодом из первого поста, в котором ты используешь Qt.
На 59-м сообщении оказалось, что Qt тебе и не нужен, а ты имел в виду Qt Creator

Итак, тебе просто нужно написать консольное приложение на С++, без Qt.
Судя по твоему коду из первого поста, при создании проекта в Qt Creator ты ошибочно выбрал в качестве типа проекта "Qt Console Application". Вместо этого ты должен был выбрать "Non-Qt Project / Plain C++ Application".

А что касается отображения кириллицы в Qt Creator, то там своя специфика. Я вообще советую в настройках проектах, в Run Settings выбрать Run in terminal, так более-менее будет норм, поскольку стандартное окно ввода/вывода слабенькое, а во втором случае, когда выбрано Run in terminal, включается режим эмуляции системного терминала во встроенном окне. А если хочется чтобы вызывалось прям само черное системное окно терминала, то кроме включения в настройках проекта Run in terminal, еще нужно в настройках IDE убрать галочку Use internal terminal.

Цитата Сообщение от GAZot Посмотреть сообщение
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) максимальный по модулю элемент массива;[1]
2) сумму элементов массива, расположенных между первым и вторым положительными элементами.
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <numeric>
 
int main() 
{
    std::vector<double> arr{-2.5, 4.25, 0, -1.24, -9.5, 3.5, 0, 8.15, -3.4, 6.5, 0, 10.75, -24.12, 4.5};
 
    auto max_abs_iter = std::max_element(arr.begin(), arr.end(),
        [](double a, double b) {
            return std::abs(a) < std::abs(b);
        });
    std::cout << "Max by absolute value: " << *max_abs_iter << std::endl;
 
    double sum_between = 0;
    int pos_count = 0;
    auto start = arr.end();
    
    for (auto it = arr.begin(); it != arr.end(); ++it) 
    {
        if (*it > 0) 
        {
            pos_count++;
            if (pos_count == 1) start = it;
            else if (pos_count == 2) 
            {
                sum_between = std::accumulate(start + 1, it, 0.0);
                break;
            }
        }
    }
    std::cout << "Sum between first two positives: " << sum_between << std::endl;
 
    std::stable_partition(arr.begin(), arr.end(),
        [](double x) { return x != 0; });
    
    std::cout << "Array with zeros at the end: ";
    for (const auto& x : arr)
        std::cout << x << ' ';
    std::cout << std::endl;
}
Вывод:
Code
1
2
3
Max by absolute value: -24.12
Sum between first two positives: -10.74
Array with zeros at the end: -2.5 4.25 -1.24 -9.5 3.5 8.15 -3.4 6.5 10.75 -24.12 4.5 0 0 0

ввод данных с клавы и кириллицу сам добавишь, выше я уже показал, как это делать.

Еще, в условии сказано "Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.", но не сказано, должен ли соблюдаться изначальный порядок ненулевых чисел? Я соблюдаю этот порядок, но если порядок не нужен, замени std::stable_partition на std::partition.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,119
Записей в блоге: 2
18.03.2026, 16:22
Цитата Сообщение от Royal_X Посмотреть сообщение
Ты ввел всех в заблуждение своими постами и даже кодом из первого поста, в котором ты используешь Qt.
Ну а почему бы не написать эту детскую задачку с использованием Qt? Заодно и потренироваться с фреймворком, все равно планируется с ним работать. Не вижу здесь никакого "заблуждения"
Цитата Сообщение от Royal_X Посмотреть сообщение
std::max_element
..
std::accumulate
..
std::stable_partition
И что, именно так надо писать? Типа "чем больше std - тем лучше"? Знает какую ф-цию вызывать - значит грамотный Спорный вопрос, но во всяком случае юзать эти ф-ции можно тому кто уже умеет обойтись без них. Иначе получается такая "обезьяна без кармана" Особенно последний пункт (нули в конец), его необходимо уметь делать руками

Кстати структура решения та же что и в стартовом посте - последовательно/независимо решаются 3 задачи в 3 циклах. Такой порядок необязателен, можно все сделать в одном цикле. Что лучше - ну на такой задании без разницы, просто иметь ввиду что есть альтернатива
0
 Аватар для vlisp
1070 / 991 / 153
Регистрация: 10.08.2015
Сообщений: 5,426
18.03.2026, 16:24
Цитата Сообщение от Igor3D Посмотреть сообщение
std::max_element
..
std::accumulate
..
std::stable_partition
сколько тут циклов под капотом?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
18.03.2026, 16:50
Цитата Сообщение от Igor3D Посмотреть сообщение
И что, именно так надо писать?
ну а в твоем коде от С++ почти ничего, там просто сишный код, циклоепство.

Преимущества моего кода:
- читаемость, сразу видно, что там происходит
- разделение ответственности (твой код же хрупкий - изменение одной логики легко сломает другую). У меня все можно быстро вынести в разные функции.
- реализации из STL могут использовать векторизацию и другие оптимизации компилятора. К тому же, я даже могу быстро заменить accumulate на reduce и прикрутить execution.
- переиспользуемость: лямбды в моем варианте легко вынести, переиспользовать, протестировать отдельно. У тебя же все намертво вшито в цикл.

Цитата Сообщение от Igor3D Посмотреть сообщение
Знает какую ф-цию вызывать - значит грамотный
чёт мне кажется, что ты лично не знаешь, как их вызывать. Просто уже встречал похожих на тебя самоуверенных людей, которые пишут на С и ошибочно думают, что они могут говорить, что и С++ знают, полагая, что к любой сишной функции можно просто добавить std:: и типа будет работать. Посмотри сколько функций в С и сколько в С++26...

Цитата Сообщение от Igor3D Посмотреть сообщение
Иначе получается такая "обезьяна без кармана"
возможно, каким-то новичкам и стоит изучать внутренние устройства алгоритмов, а не сразу брать готовые. Но это не мой случай. Непонятны эти выпады в мой адрес и вся эта критика. Сомневаешься, что я не могу тоже десткий лисапед написать или что?
0
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 472
18.03.2026, 17:22  [ТС]
да QtCreator

Добавлено через 24 минуты
Да последний код Royal_X это что то, я думаю препод у студента сам охренет от него. Мне кажется это всё равно, что в начальных классах на уроке математике рассказывать про интегралы
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
18.03.2026, 17:29
Цитата Сообщение от GAZot Посмотреть сообщение
я думаю препод у студента сам охренет от него
в таком случае, бери код Igor3D. Тебе тут уже тыщу кодов написали, есть коды на любой вкус)))
0
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 472
18.03.2026, 17:31  [ТС]
Мне понравилось, специально посмотрел, что за функции.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
18.03.2026, 17:39
Цитата Сообщение от Igor3D Посмотреть сообщение
Ну а почему бы не написать эту детскую задачку с использованием Qt?
а что конкретно Qt даст? ну поменяем vector на QVector и т.д. и что потом? Будет тот же алгоритм. Или есть объективные причины перейти на Qt?

Добавлено через 5 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
а что конкретно Qt даст?
ну кроме того, что Qt6Core.dll повысит размер почти на 10 МБ
0
фрилансер
 Аватар для Алексей1153
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,292
18.03.2026, 17:45
Цитата Сообщение от Royal_X Посмотреть сообщение
Преимущества моего кода:
я бы ещё добавил - правильная декомпозиция задачи.

А циклы провоцируют смешивать ответственность - например, сразу заполнить массив и вывести на экран. А это обычно - плохая архитектура или снижение производительности
1
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,119
Записей в блоге: 2
18.03.2026, 19:22
Цитата Сообщение от Royal_X Посмотреть сообщение
возможно, каким-то новичкам и стоит изучать внутренние устройства алгоритмов, а не сразу брать готовые. Но это не мой случай. Непонятны эти выпады в мой адрес и вся эта критика. Сомневаешься, что я не могу тоже десткий лисапед написать или что?
Это легко проверить. Напишете std::stable_partition сами, "из головы" или полезете в исходники std?

Цитата Сообщение от Royal_X Посмотреть сообщение
а что конкретно Qt даст? ну поменяем vector на QVector и т.д. и что потом? Будет тот же алгоритм. Или есть объективные причины перейти на Qt?
Представьте что уже перешли, решение использовать Qt в проекте уже принято, и нет смысла в данной задаче как-то обходиться без него
Цитата Сообщение от Royal_X Посмотреть сообщение
- переиспользуемость: лямбды в моем варианте легко вынести, переиспользовать, протестировать отдельно. У тебя же все намертво вшито в цикл.
Это вот эти лямбды?
C++
1
2
{ return std::abs(a) < std::abs(b); }
{ return x != 0; });
Их правда надо выносить, переиспользовать, протестировать?
Цитата Сообщение от Royal_X Посмотреть сообщение
Преимущества моего кода:
О каких-то преимуществах, архитектуре и.т.п. можно говорить если есть (или планируется) какой-то объем кода имеющий ценность, трудоемкость. А на лабе для начинающих любой разумный вариант хорош, все высокие рассуждения здесь "вилами по воде".
Цитата Сообщение от Royal_X Посмотреть сообщение
ну а в твоем коде от С++ почти ничего, там просто сишный код, циклоепство.
Не знаю что такое "циклоепство", но у меня один цикл. И почему Вы стесняетесь "сишного" кода, наверно имея ввиду без std::, функторов, лямбд, а лучше всего что ходит только под новыми стандартами?
Нужно так написать, чтобы все только глазками лупали! Чтобы спрашивали "а шо это?". Вот это крутое знание плюсов!
Я не разделяю такого подхода/мнения. Возьмите либу или др open-sources которая Вам нравится как работает и "побродите" в отладчике по ее исходникам, возможно это отучит Вас совать std:: во все места
0
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 472
18.03.2026, 21:06  [ТС]
Ребят, ребят а Вы вообще в курсе, что чат переместили в ветку С++ для начинающих и я уже почти страницу модератору отправил на удаление
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,475
18.03.2026, 22:03
GAZot, ежели решил упароться делать с Qt - то и упарываться надо по максимуму - с графонием. На виджетах или в QML влезть. А иначе это бред. Ты и Qt не изучаешь и вот эта часть:

Цитата Сообщение от GAZot Посмотреть сообщение
Помогаю тут знакомому делать лабораторную по программированию на С++
становится сомнительной - вряд ли у знакомого есть познания в Qt, а иначе он, скорее всего, сам всё сделал бы. А так - ему ещё и объяснять придётся что такое QTextStream и прочие кутешные стринги.


P.S. Сорри, если другие участники на это уже указывали. Лень читать предыдущие посты - так что всем предлагаю меня понять и простить
0
Заблокирован
18.03.2026, 23:12
Раз пошла такая пьянка, то и я поговнокодю и пофлудю.

Цитата Сообщение от Igor3D Посмотреть сообщение
И почему Вы стесняетесь "сишного" кода
Потому что в большинстве случаев на С++ так никто не кодит по многим причинам.
Задача выполненная с помощью общих алгоритмов легко пишется, читается и редактируется.
Они проверены и работоспособны, в отличие от своего сишкокодерства.
Есть моменты когда пишешь низкоуровневый код с указателями, выделениями памяти и прочим.
Но это редкие случаи.
Преждевременная оптимизация - большой порок. И в контексте С++ приносит больше вреда чем пользы.
Вот в моём коде(ниже под спойлером) можно оптимизировать решение второй задачи, но нужно ли?

Цитата Сообщение от Igor3D Посмотреть сообщение
Напишете std::stable_partition сами, "из головы"
На счёт сложных алгоритмов. qsort / rotate и прочие, прочие. Их не нужно держать "в голове", зазубренные, просто нужно быть знакомыми и знать, в общих чертах, как они работают, и только для того, что бы написать свою вариацию, при необходимости.

Уже ближе к реальному коду.
Но реальный код не будет состоять из трёх задач.
И поэтому будет систематизирован и выделен в фрагменты кода отвечающие за отдельные задачи, включая ввод, фильтр его содержимого и обработку ошибок.

Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <iterator>
#include <vector>
#include <iterator>
#include <numeric>
#include <algorithm>
 
int main(){
   std::cin.exceptions(std::istream::failbit | std::istream::badbit);
   bool job_done = false, input = false;
   
   int n{};
   const int nmin{2}, nmax{10};
            
   using elem_type = double;
   std::vector<elem_type> v;
 
   while(!input){
      try{
         while (std::cout << "Enter element count [" << nmin << ", " <<  nmax << "]: " 
                && std::cin >> n && !(n >= nmin && n <= nmax))
            std::cout << "Enter a valid count value." << std::endl;    
 
         std::cout << "Enter " << n << " elements : ";
         
         v.clear();         
         v.reserve(n);
 
         std::copy_n(std::istream_iterator<elem_type>(std::cin), 
                     n,
                     std::back_inserter(v));
   
         input = true;
          
      }catch(const std::ios_base::failure& e){
         if (std::cin.bad()){
            std::cout << "Input failure, run programm again." << std::endl;
            return EXIT_FAILURE;
         }
 
         std::cin.clear(); // reset state of the stream
 
         try{
            while(std::cin.get() != '\n') // extract all "broken" data
               ;
            std::cout << "Illegal input, try again" << std::endl;
         }
         catch(const std::ios_base::failure& e){ // failure extract data
            std::cout << "Input failure, run programm again." << std::endl;
            return EXIT_FAILURE;
         }
      }
   }
   
   while(!job_done){      
      // do work here
 
      if(v.size() == 0)
         return EXIT_FAILURE;
         
      // 1 part of job   
      auto max_absolute = std::max_element(std::cbegin(v), 
         std::cend(v),
         [](const elem_type& lhs, const elem_type& rhs){
            return std::less<elem_type>()(std::abs(lhs), std::abs(rhs));
         }
      );
      std::cout << "Maximum absolute value : " <<  *max_absolute << std::endl;
 
      // 2 part of job        
      auto is_positive = [](const elem_type& val){
         return val > elem_type{};
      };
      auto first_positive  = std::find_if(std::cbegin(v), std::cend(v), is_positive);
      auto second_positive = first_positive == std::cend(v) ? 
         std::cend(v) :
         std::find_if(std::next(first_positive), std::cend(v), is_positive);
         
      if(first_positive != std::cend(v) && second_positive != std::cend(v)){
         std::cout << "Summ elements between first two positive values : "
             << std::accumulate(std::next(first_positive), second_positive, elem_type{})
             << std::endl;
      }
      else
         std::cout << "There are no two positive values." << std::endl;
         
      // 3 part of job 
      std::stable_partition(std::begin(v), std::end(v), 
         [](const elem_type& val){
            return val != elem_type{};
         }
      );
      
      std::copy(std::cbegin(v), 
                std::cend(v), 
                std::ostream_iterator<elem_type>(std::cout, " "));
      
      // done
      job_done = true;
   }
}

https://onlinegdb.com/Gd-uBfRGpg

Теперь про ввод данных.
Стандартные потоки - это обобщенный подход к обработки ввода-вывода.
И задача/желание ТС, иметь контроль над вводом(а именно ввод несколько значений с контролем на их количество, больше/меньше ожидаемого), выходит за возможности семантики стандартных потоков.
Поэтому, необходимую логику, разбивают на более мелкие задачи и используют те же средства.
Если это нужно, были уже примеры/варианты и от меня и от Royal_X.

Теперь у меня вопрос к душнилам-тошнилам в этой теме.
Правда ли для обучающего процесса, нужно каждую задачу писать в таком стиле?
Да ещё и в классы это обернуть(потому что это С++)?
Или для ознакомления с чем, достаточно это что-то и только его использовать?
[риторические вопросы]

И ещё сомнительно что я все случаи учёл, особенно при вводе.
А std::cin - особый поток со своим поведением. Хоть у него и может быть случай eof(Ctrl+D для емулятора терминала onlinegdb.com, вероятно выполняется код на unix системе)), но на практике этого мало кто знает и использует.
Поэтому это учитывают и соответственно организовывают интерактивность с пользователем.

p.s. Для ТС. 99,99% всего кода на С++ - это базовые общие инструменты, особенно стандартные.
И это касается практически всех библиотек и фреймворков.
На все случаи жизни всего не сделать и это естественно.
Поэтому каждая команда делает инструменты под себя и свои задачи.
Стандартные потоки не для всяких задач одинаково полезные. Но на их основе можно многое сделать.

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

А тема показательная, таки

Добавлено через 45 секунд
Recrut_rf, да норм всё, можно курить здесь

Добавлено через 15 минут
Royal_X, кстати, твой последний exe-ик, на Qt, консольный.
Нормально отображает русские символы на Win10 x64.
Но вот на ниже системах, я в этом сомневаюсь.
И как по заказу, всегда найдется какая то "зверушка"[цензура] на virustotal, которая обнаружит там угрозу)
1
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,247
19.03.2026, 00:48
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
  {
double arr[]{ -2.5, 4.25, 0, -1.24, -9.5, 3.5, 0, 8.15, -3.4, 6.5, 0, 10.75, -24.12, 4.5 };
    char one{};
    double max_el{}, summ{};
for (int i = 0; i < sizeof(arr) / sizeof(*arr); ++i)
    {
if (arr[i] > 0. && !one)one = 1;
        else {
        if (arr[i] > 0. && one)one = -1;
            if (one == 1)summ += arr[i];
        }
if (std::abs(arr[i]) > std::abs(max_el)) {
            max_el = arr[i];
        }   }
printf("Max by absolute value: %g ......\n Sum between first two positives: %g", max_el, summ);
 
        getchar();
  }
Гонять нули в зад, тут яп си бессилен. Тут надо всю мощщь языка с++.

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
int main()
  {
double arr[]{ -2.5, 4.25, 0, -1.24, -9.5, 3.5, 0, 8.15, -3.4, 6.5, 0, 10.75, -24.12, 4.5 };
    char one{};
    const int sz= sizeof(arr) / sizeof(*arr);
    double max_el{}, summ{};
for (int i = 0; i < sz; ++i)
    {
if (arr[i] > 0. && !one)one = 1;
        else {
        if (arr[i] > 0. && one)one = -1;
            if (one == 1)summ += arr[i];
        }
if (std::abs(arr[i]) > std::abs(max_el)) {
            max_el = arr[i];
        }   }
printf("Max by absolute value: %g ......\n Sum between first two positives: %g\n", max_el, summ);
 
for (int i = 0; i < sz; ++i) {
    if (arr[i] == 0.) {
        int i_n = i;
        for (;i_n < sz; ++i_n)
            arr[i_n] = arr[i_n + 1];
    arr[i_n-1] = 0.;
    }   }
for (int i = 0; i < sz; ++i)printf("%g\n", arr[i]);
 
getchar();
  }
0
Заблокирован
19.03.2026, 01:05
И конечно же, нужно и код который был бы, если бы это была задача с вводом не от пользователя, со всеми данными для решения всех трех подзадач и только базовыми инструментами С++. Которой эта задача и является.
Мы знаем только про std::cin/cout/endl, как учат на первом уроке.

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
#include <iostream>
 
double abs(double val){
   if (val < 0)
      return -val;
   return val;   
}
 
int main(){
   // init and input
   int n{}; std::cin >> n;
   double *arr = new double[n];
    
   for(int i{0}; i != n; ++i)
      std::cin >> arr[i];
   // end
   
   // 1
   {
      int imax = 0;
      for(int i{1}; i != n; ++i)
         if (abs(arr[imax]) < abs(arr[i]))
            imax = i;
      std::cout << arr[imax] << std::endl; // максимальный по модулю элемент
   }
   //end
   
   // 2
   // поиск первого и второго положительного числа, они точно есть
   int i_pos{0};
   for(int i = 0; i != n; ++i){
      if (arr[i] > 0.0){
         i_pos = i;
         break;
      }
   }
   double sum{};
   for(int i = i_pos + 1; i != n; ++i)
      if (!(arr[i] > 0.0 ))
         sum += arr[i];
   std::cout << sum << std::endl;   
   // end
   
   // 3
   int i_zero{n};
   for(int i = 0; i != n; ++i){
      if (arr[i] != 0.0){
         if (i_zero < i){
            arr[i_zero] = arr[i];
            arr[i] = 0.0;
            ++i_zero;
         }
      }
      else{
         if (i < i_zero)
            i_zero = i;
      }
   }
   
   for(int i = 0; i != n; ++i)
      std::cout << arr[i] << ' ';
   std::cout << std::endl;
   // end
   
   delete [] arr;
}
И больше для задачи и для сдачи, ничего не нужно.
И мешать всё в один проход, это анти-паттерн, который способен искривить даже ровные молодые руки.
Но это лишь для первых заданий. Циклы и прочее.
И на кой тут Qt, кодировки, ошибки ввода и прочий геморой, который на данном этапе обучения и задачи вообще не нужны.
Нельзя объять всё и сразу.

ТС, моргни три с половиной раза, если тебя держит в заложниках преподователь-извращенец.

Добавлено через 1 минуту
Цитата Сообщение от Наталья8 Посмотреть сообщение
Тут надо всю мощщь языка с++.
Нет, не "надо", и это уже показали.
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,247
19.03.2026, 01:23
Вот я напрягся... Как делать не надо...
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,247
19.03.2026, 01:25
000d60,
Быстро ты гонишь. Ударно работаешь. Жаль читателей не очень много.
Я за тобою не поспеваю.
Код выше... Они редактирование перекрыли, Да и ты что то вклеил..
0
Заблокирован
19.03.2026, 01:31
Цитата Сообщение от Наталья8 Посмотреть сообщение
Вот я напрягся... Как делать не надо...
Хорошо хоть сам это понимаешь.
Цитата Сообщение от Наталья8 Посмотреть сообщение
Да и ты что то вклеил..
Да, я читер)
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,247
19.03.2026, 01:32
Цитата Сообщение от 000d60 Посмотреть сообщение
Тут надо всю мощщь языка с++.
Нет, не "надо", и это уже показали.
==================
Ладушки сливаюсь...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.03.2026, 01:32

Будет ли утечка памяти при выполнении данного кода?
собстна, сабж. char* cpy(char* source, int pos, int kolv) { char* dist = new char; for(int...

Утечка памяти в работе с классами
вроде утечка памяти наблюдается в функции &quot;loadfromfile&quot;, помогите пожалуйста исправить ...

Утечка памяти, пользуюсь vld
Начал разбираться чо это такое, утечка памяти. Как самы простой способ нашел программу Visual Leak...

Утечка памяти при умножении матрицы на число
Всем доброго времени суток. Хочу спросить у Вас совета по поводу распределения памяти в...

Утечка памяти CppWebBrowser
Всем здравствуйте У меня возникла проблема: Утечка памяти CppWebBrowser вот код IHTMLDocument2...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru