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

Выполняется не та часть кода, почему?

07.12.2024, 07:26. Показов 3897. Ответов 29

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Не могу понять в чем проблема. При вводе всех отрицательных чисел нужно их суммировать и вывести на экран. При всех нулевых элементах - нужно вывести нулевую сумму. Но выполняется именно тот код, который располагается выше другого.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (first_pos_idx == -1) {
        // Если все элементы равны нулю
        sum_and_count(arr, first_pos_idx, N, &sum, &count);
        printf("Sum = 0\nCount = %d", count);
        free(arr);
        return 0;
    }
 
    int last_pos_idx = find_last_positive(arr, N);
 
    if (last_pos_idx == -1) {
        // Если последний положительный элемент не найден, считаем сумму всех элементов
        sum_and_count(arr, 0, N - 1, &sum, &count);
        printf("Sum = %d\nCount = %d\n", sum, count);
        free(arr);
        return 0;
    }
Почему в независимости от того какие числа введены(все нули или все отрицательные) все равно будет выводится одно и тоже. Как это исправить?
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
#include <stdio.h>
#include <stdlib.h>
 
/// Ввод последовательности чисел
void input_array(int* arr, int n) {
    for (int i = 0; i < n; i++) {
        printf("Enter element %d: ", i + 1);
        scanf_s("%d", &arr[i]);
    }
}
 
// Поиск индекса первого положительного элемента
int find_first_positive(int* arr, int n) {
    for (int i = 0; i < n; i++) {
        if (arr[i] > 0) {
            return i;
        }
    }
    return -1;
}
 
// Поиск индекса последнего положительного элемента
int find_last_positive(int* arr, int n) {
    for (int i = n - 1; i >= 0; i--) {
        if (arr[i] > 0) {
            return i;
        }
    }
    return -1;
}
 
// Подсчет суммы и количества элементов между двумя индексами
void sum_and_count(int* arr, int start_idx, int end_idx, int* sum, int* count) {
    *sum = 0;
    *count = 0;
 
    for (int i = start_idx + 1; i < end_idx; i++) {
        *sum += arr[i];
        (*count)++;
    }
}
 
int main() {
    int N;
 
    printf("Enter the length of the sequence N: ");
    scanf_s("%d", &N);
 
    int* arr = (int*)malloc(N * sizeof(int));
    if (arr == NULL) {
        printf("Error allocating memory.\n");
        return 1;
    }
 
    input_array(arr, N);
 
    int first_pos_idx = find_first_positive(arr, N);
    int sum = 0, count = 0;
    if (first_pos_idx == -1) {
        // Если все элементы равны нулю
        sum_and_count(arr, first_pos_idx, N, &sum, &count);
        printf("Sum = 0\nCount = %d", count);
        free(arr);
        return 0;
    }
 
    int last_pos_idx = find_last_positive(arr, N);
 
    if (last_pos_idx == -1) {
        // Если последний положительный элемент не найден, считаем сумму всех элементов
        sum_and_count(arr, 0, N - 1, &sum, &count);
        printf("Sum = %d\nCount = %d\n", sum, count);
        free(arr);
        return 0;
    }
 
    
 
    // Проверка, что last_pos_idx больше или равен first_pos_idx
    if (last_pos_idx < first_pos_idx) {
        printf("Invalid indices: The end of the range must be greater than the beginning.");
        free(arr);
        return 1;
    }
 
    // Выполнение подсчета суммы и количества элементов
    sum_and_count(arr, first_pos_idx, last_pos_idx, &sum, &count);
 
    printf("Sum of elements: %d\n", sum);
    printf("Number of elements: %d\n", count);
 
    free(arr);
 
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.12.2024, 07:26
Ответы с готовыми решениями:

Часть кода не выполняется
Часть кода которая находится после строки закрытия файла file.close(); (84 строка) не выполняется. Почему и как это исправить? ...

Не выполняется часть кода
Вообщем проблема такая: написал код, и в отладчике наблюдаю, что не выполняется часть кода(условий никаких нет). Первые 3 строчки в...

Не выполняется часть кода с MPI
#include&lt;assert.h&gt; #include&lt;errno.h&gt; #include&lt;mpi.h&gt; #include&lt;math.h&gt; #include&lt;stdio.h&gt; #include&lt;fstream&gt; #include &lt;iostream&gt; ...

29
Злостный нарушитель
 Аватар для Verevkin
10889 / 5825 / 1288
Регистрация: 12.03.2015
Сообщений: 26,890
07.12.2024, 21:20
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от itisme2488 Посмотреть сообщение
Я давно это признал и теперь вот пытаюсь разобраться
1. Напиши функцию поиска индекса элемента, значение которого больше этого индекса.
C
1
2
3
4
int find_a(int* x, size_t count)
{
  // добавить говнокод сюды
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13225 / 6857 / 1827
Регистрация: 18.10.2014
Сообщений: 17,378
07.12.2024, 21:28
Цитата Сообщение от itisme2488 Посмотреть сообщение
а в какой тогда ситуации может выполнятся "в случае отсутствия описанного последнего элемента суммирование производится до конца последовательности"
В ситуации, когда первый элемент (начало последовательности) нашелся, а второй элемент (конец последовательности) не нашелся, вестимо.

---

Ваша задача - найти сумму элементов в некоем диапазоне. Вам в условии сказано, как найти начало диапазона. Вам в условии сказано, как найти конец диапазона. И если диапазон пуст (начало найти не удалось), от ответ - 0. Вот и вся задача.
0
0 / 0 / 0
Регистрация: 25.12.2022
Сообщений: 37
07.12.2024, 21:28  [ТС]
Я исправил функцию в начальном коде, и теперь должен найтись именно первый элемент, больший своего номера, а не первый положительный элемент
C
1
2
3
4
5
6
7
8
int find_first_positive(int* arr, int n) {
    for (int i = 0; i < n; i++) {
        if (arr[i] > i) {
            return arr[i];
        }
    }
    return -1;
}
0
Злостный нарушитель
 Аватар для Verevkin
10889 / 5825 / 1288
Регистрация: 12.03.2015
Сообщений: 26,890
07.12.2024, 21:31
Цитата Сообщение от itisme2488 Посмотреть сообщение
Я исправил функцию в начальном коде
Да ты реально задолбал...

Перестань.
------
Надо найти не значение, а индекс.
0
0 / 0 / 0
Регистрация: 25.12.2022
Сообщений: 37
07.12.2024, 21:40  [ТС]
C
1
2
3
4
5
6
7
8
int find_first_positive(int* arr, int n) {
    for (int i = 0; i < n; i++) {
        if (arr[i] > i) {
            return i;
        }
    }
    return -1;
}
Извиняюсь, понял
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13225 / 6857 / 1827
Регистрация: 18.10.2014
Сообщений: 17,378
07.12.2024, 21:41
Цитата Сообщение от itisme2488 Посмотреть сообщение
Я исправил функцию в начальном коде, и теперь должен найтись именно первый элемент, больший своего номера, а не первый положительный элемент
Тут вопрос еще в том, что такое "порядковый номер". Индекс при индексации с нуля? Или человеческий порядковый номер при нумерации с единицы?

Я бы предположил, что скорее второе...
0
Злостный нарушитель
 Аватар для Verevkin
10889 / 5825 / 1288
Регистрация: 12.03.2015
Сообщений: 26,890
07.12.2024, 22:00
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
#include <stdio.h>
#include <assert.h>
 
// функция поиска индекса элемента, значение которого больше этого индекса
int find_a(int* x, size_t count)
{
  assert(x && count);
  for (int idx = 0; idx != count; idx++)
    if (*x++ > idx) return idx;
  return -1;
}
 
// функция поиска конечного индекса 
int find_b(int* x, size_t count)
{
  assert(x && count);
  int idx = count;
  while (idx--)
    if (x[idx] > 0) 
      return idx;
  return count - 1;  
}
 
// функция подсчёта суммы элементов массива 
int sum(int* x, size_t count)
{
  int sum = 0;
  if (count)
    while (count--) 
      sum += *x++;
  return sum;
}
 
/* Для последовательности целых чисел заданной длины N (вводится в диалоге 
   с пользователем) подсчитать общую сумму и количество элeментов заданной 
   последовательности, которые расположены между первым элементом 
   последовательности, значение которого больше его порядкового номера, 
   и последним положительным элементом последовательности. В случае, если 
   не существует такого первого элемента, значения искомых сумм полагаются 
   равными нулю, в случае отсутствия описанного последнего элемента 
   суммирование производится до конца последовательности */
   
int get_info(int* x, size_t* count)
{
  int idx_a = find_a(x, *count);
  if (idx_a < 0) 
  {
    *count = 0;
    return 0;
  }
  
  int idx_b = find_b(x, *count);
  *count = 1 + (idx_a < idx_b ? idx_b - idx_a : idx_a - idx_b);
  return sum(x + (idx_a < idx_b ? idx_a : idx_b), *count);
}
 
int main()
{
  int x[] = {-1, -2, 3, 3, -3, -2}; // имитация ввода
  
  size_t count = sizeof(x) / sizeof(*x);
  int sum = get_info(x, &count);
  printf("Count: %lu; Sum: %d\n", count, sum);
  return 0;
}
Дальше - сами.
Я спать пошёл.
0
0 / 0 / 0
Регистрация: 25.12.2022
Сообщений: 37
07.12.2024, 22:14  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Тут вопрос еще в том, что такое "порядковый номер". Индекс при индексации с нуля? Или человеческий порядковый номер при нумерации с единицы?
Нам сказали, что по индексам
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В ситуации, когда первый элемент (начало последовательности) нашелся, а второй элемент (конец последовательности) не нашелся, вестимо.
Я же правильно понимаю, что это последовательность, по типу (2, -5, -9)?
C
1
2
3
4
if (last_pos_idx == -1) {
    sum_and_count(arr, first_pos_idx, N - 1, &sum, &count);
    ...
}
Я написал в коде так, но все равно вместо суммы выводит нули

Добавлено через 29 секунд
Спасибо за помощь!
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13225 / 6857 / 1827
Регистрация: 18.10.2014
Сообщений: 17,378
07.12.2024, 22:26
Честно говоря, я еще раз перечитал условие, и я в упор не понимаю, как может быть "в случае отсутствия описанного последнего элемента" (если нашелся первый).

Первый элемент диапазона будет заведомо положителен. Это значит, что если нам удалось найти первый элемент диапазона, то это автоматически означает, что в последовательности есть последний положительный элемент.

То есть замечание "в случае отсутствия описанного последнего элемента" является избыточным/бессмысленным.

Цитата Сообщение от itisme2488 Посмотреть сообщение
Я же правильно понимаю, что это последовательность, по типу (2, -5, -9)?
Если буквально понимать условие задачи, то первый элемент диапазона тут 2. И последний элемент диапазона тут тоже 2. То есть сумма равна 2. И программа должна напечатать именно 2.
0
0 / 0 / 0
Регистрация: 25.12.2022
Сообщений: 37
08.12.2024, 01:14  [ТС]
,,,

Добавлено через 3 минуты
Исправил часть кода с first_pos_idx:
C
1
2
3
4
5
6
if (first_pos_idx == -1) {
        int count = N; // Количество элементов в массиве
        printf("Sum = 0\nCount = %d\n", count);
        free(arr);
        return 0;
    }

Но как исправить эту часть, чтобы суммировать элементы, при отсутствии последнего положительного элемента так и не понял. Указал в "sum_and_count(arr, first_pos_idx, N, &sum, &count);" первый элемент, который есть и длину всей последовательности, но суммы все равно нет.
C
1
2
3
4
5
6
7
// Если последний положительный элемент не найден, считаем сумму всех элементов
    if (last_pos_idx == -1) {
        sum_and_count(arr, first_pos_idx, N, &sum, &count);
        printf("Sum = %d\nCount = %d\n", sum, count);
        free(arr);
        return 0;
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.12.2024, 01:14

Участок B кода выполняется позже, чем участок A кода, но почему-то B влияет на работоспособность A! Почему?
Друзья! То есть суть такая, создаю объект и в конструктор передаю имя процесса и хэндл снимка системы. А в конструкторе начинается...

Не выполняется часть кода входа на сайт
Привет всем! Есть следующий код для входа: &lt;?php session_start(); include_once 'config.php'; error_reporting(1); echo...

Часть кода выполняется только в режиме отладки
В приложении есть вот такой кусок кода WebClient wc = new WebClient(); wc.DownloadStringCompleted += new...

Определить букву подключенной флешки (не выполняется часть кода)
Здравствуйте! Пытаюсь определить букву подключенной флешки. Событие, что флешка подключилась - срабатывает, но дальше дело не идет. ...

Не выполняется часть кода при соблюдении условия в событии ajaxComplete()
Добрый Вечер! Подскажите пожалуйста в чем причина того что код отвечающий за скрытие элемента $(&quot;.blink&quot;).hide() не отрабатывает...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru