Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2022, 18:03   #1
katya chern
 
Регистрация: 19.04.2022
Сообщений: 7
По умолчанию Массивы, С++

Буду очень благодарна за помощь со срочными заданиями.
1) Заданы одномерные массивы А и В соответствующих размерностей N и М. Построить массив С
размера N+М, разместив : положительные элементы массива А, положительные элементы массива В,
отрицательные элементы массива А и отрицательные элементы массива В.

2) Найти номер первого максимального элемента среди лежащих в элементах
диапазоне от ak до bk и расположенных правее первого положительного элемента/
katya chern вне форума Ответить с цитированием
Старый 04.12.2022, 18:42   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
void copy_arrays(int *C, int *A, int n, int *B, int m) {
  int j = 0;
  for (int i = 0; i < n; ++i) // Копируем положительные и нулевые элементы из массива A
    if (A[i] >= 0)
      C[j++] = A[i];
  for (int i = 0; i < m; ++i) // Копируем положительные и нулевые элементы из массива B
    if (B[i] >= 0)
      C[j++] = B[i];
  for (int i = 0; i < n; ++i) // Копируем отрицательные элементы из массива A
    if (A[i] < 0)
      C[j++] = A[i];
  for (int i = 0; i < m; ++i) // Копируем отрицательные элементы из массива B
    if (B[i] < 0)
      C[j++] = B[i];
  // Результат в массиве C
}

int get_index(int *A, int n, int ak, int bk) {
  int j = 0; // Номер первого положительного элемента в массиве
  for (int i = 0; i < n && A[i] > 0; ++i) // Поиск первого положительного элемента
    if (A[i] > 0) j = i;
  int m = (ak < bk) ? ak : bk; // Выбор минимального из индексов ak или bk
  if (m >= j) // Если номер первого положительного элемента находится до минимального из индексов диапазона, тогда он пуст и возвращаем -1 как код ошибки
    return -1;
  int k = (ak < bk) ? bk : ak; // Выбор максимального из индексов ak или bk
  k = (k < j) ? k : j; // Усечение диапазона ak - bk по позиции положительного элемента (если он попал в диапазон)
  j = m; // Поиск максимального элемента в получившемся диапазоне (принимаем элемент с минимальным индексом за максимальный, а после будем его обновлять)
  for (int i = m + 1; i < k; ++i) // Проходим по диапазону
    if (A[i] > A[j]) // Если найден элемент больше чем текущий максимум, тогда сохраняем его индекс
      j = i;
  return j; // Возвращаем индекс локального максимума из диапазона
}

int get_index2(int *A, int n, int ak, int bk) {
  int j = 0; // Номер первого положительного элемента в массиве
  for (int i = 0; i < n && A[i] > 0; ++i) // Поиск первого положительного элемента
    if (A[i] > 0) j = i;
  int m = 0;
  for (int i = 1; i < n; ++i) // Поиск максимального элемента в массиве
    if (A[i] > A[m])
      m = i;
  int x = (ak < bk) ? ak : bk; // Выбор минимального из индексов ak или bk
  if (j < x) // Если номер первого положительного элемента находится до минимального из индексов диапазона, тогда он пуст и возвращаем -1 как код ошибки
    return -1;
  int k = (ak < bk) ? bk : ak; // Выбор максимального из индексов ak или bk
  k = (j < k) ? j : k; // Усечение диапазона ak - bk по позиции положительного элемента (если он попал в диапазон)
  j = -1; // Если не найдем, тогда ответ -1 как код ошибки.
  for (int i = x; i < k; ++i) // Поиск элемента равного максимальному значению в массиве из диапазона ak - bk
    if (A[i] == A[m]) {
      j = i;
      break;
    }
  return j;
}
Два варианта второго вопроса т.к. не понятно о каком максимуме идет речь.

add: Как мне прочиталось, тогда имеется ввиду первый вариант. Но написал еще и вариант с максимальным элементом массива, хотя он сработает, если это значение будет меньше 0.

Последний раз редактировалось macomics; 04.12.2022 в 18:45.
macomics вне форума Ответить с цитированием
Старый 07.12.2022, 04:44   #3
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

Цитата:
Сообщение от katya chern Посмотреть сообщение
среди лежащих в элементах диапазоне от ak до bk
ak .. bk -- это диапазон индексов или значений?
Цитата:
Сообщение от macomics Посмотреть сообщение
Код:
  int j = 0; // Номер первого положительного элемента в массиве
  for (int i = 0; i < n && A[i] > 0; ++i) // Поиск первого положительного элемента
    if (A[i] > 0) j = i;
Это разве работает?
Код:
#include <stdio.h>

int main() {
  const int n = 5;
  const int A[n] = {-1, -2, 3, 4, -5};
  int j = 0;
  for (int i = 0; i < n && A[i] > 0; ++i)
    if (A[i] > 0) j = i;
  printf("j = %i\n", j);
  return 0;
}
Вывод на консоль:
Код:
j = 0
Хотя должно быть 2.
Пётр Седов вне форума Ответить с цитированием
Старый 07.12.2022, 07:47   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Перемудрил. Лучше бы break оставил.
Код:
int get_index(int *A, int n, int ak, int bk) {
  int j = 0; // Номер первого положительного элемента в массиве
  while (j < n && A[j] <= 0) j++; // Поиск первого положительного элемента
  int m = (ak < bk) ? ak : bk; // Выбор минимального из индексов ak или bk
  if (m >= j) // Если номер первого положительного элемента находится до минимального из индексов диапазона, тогда он пуст и возвращаем -1 как код ошибки
    return -1;
  int k = ak + bk - m; // Выбор максимального из индексов ak или bk
  k = (k < j) ? k : j; // Усечение диапазона ak - bk по позиции положительного элемента (если он попал в диапазон)
  j = m; // Поиск максимального элемента в получившемся диапазоне (принимаем элемент с минимальным индексом за максимальный, а после будем его обновлять)
  for (int i = m + 1; i < k; ++i) // Проходим по диапазону
    if (A[i] > A[j]) // Если найден элемент больше чем текущий максимум, тогда сохраняем его индекс
      j = i;
  return j; // Возвращаем индекс локального максимума из диапазона
}

int get_index2(int *A, int n, int ak, int bk) {
  int j = 0; // Номер первого положительного элемента в массиве
  while (j < n && A[j] <= 0) j++; // Поиск первого положительного элемента
  int m = 0;
  for (int i = 1; i < n; ++i) // Поиск максимального элемента в массиве
    if (A[i] > A[m])
      m = i;
  int x = (ak < bk) ? ak : bk; // Выбор минимального из индексов ak или bk
  if (j < x) // Если номер первого положительного элемента находится до минимального из индексов диапазона, тогда он пуст и возвращаем -1 как код ошибки
    return -1;
  int k = ak + bk - x; // Выбор максимального из индексов ak или bk
  if (k > j && A[m] == A[j]) { // Если индекс первого положительного элемента попал в диапазон и этот положительный элемент равен максимуму в массиве
    return j; // Тогда этот элемент и будет возвращен
  } else {
    return -1; // Иначе в диапазоне нет максимума массива т.к. он однозначно больше первого положительного элемента
  }
}

Последний раз редактировалось macomics; 07.12.2022 в 14:43.
macomics вне форума Ответить с цитированием
Старый 08.12.2022, 07:33   #5
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от katya chern Посмотреть сообщение
1) Заданы одномерные массивы А и В соответствующих размерностей N и М. Построить массив С
размера N+М, разместив : положительные элементы массива А, положительные элементы массива В,
отрицательные элементы массива А и отрицательные элементы массива В.
вот ещё такой вариант
Код:
#include <iostream>
#include <cassert>
#include <algorithm>

int main()
{
    const int A[]={1,-2,2,3,-7,5,-9};
    const int B[]={0,-8,2,3,-7,4,8,-9,0,-6};
    
    int C[std::size(A)+std::size(B)]{};
    
    auto nextC=std::begin(C);
    nextC=std::copy_if(std::begin(A),std::end(A),nextC,[](auto i){return i>=0;});
    nextC=std::copy_if(std::begin(B),std::end(B),nextC,[](auto i){return i>=0;});
    nextC=std::copy_if(std::begin(A),std::end(A),nextC,[](auto i){return i<0;});
    nextC=std::copy_if(std::begin(B),std::end(B),nextC,[](auto i){return i<0;});
    assert(nextC==std::end(C));
    
    for(auto i:C){std::cout<<i<<',';}
}
Код:
1,2,3,5,0,2,3,4,8,0,-2,-7,-9,-8,-7,-9,-6,
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
написать программу массивы (C++) - Даны два массива, скопировать эти массивы в 3-й результирующий (размером 10 элементов) так, что Саша1990 Помощь студентам 1 02.02.2015 16:03
Одномерные массивы, двумерные массивы, строки Sand093 C++ Builder 11 20.05.2012 21:48
Двумерные массивы(матрица) 2)Строковые массивы(строки): 3)Структуры nuriyat Помощь студентам 1 21.01.2012 16:16
Двумерные массивы(массивы указателей на массивы) krytishka99 Помощь студентам 1 29.12.2011 19:51
Даны одномерные массивы А и В. Сформировать массивы, состоящие из элемент LyaLya Помощь студентам 15 20.12.2009 14:12