0 / 0 / 0 Регистрация: 19.03.2015 Сообщений: 11 |
|
1 |
|
Вычислить произведение отрицательных элементов массива19.03.2015, 10:56. Показов 9129. Ответов 12
Дан массив из n элементов (вещественные числа). Вычислить: 1) произведение отрицательных элементов массива 2) сумму элементов массива, расположенных между максимальным и минимальным элементами. Упорядочить элементы по возрастанию.
0 |
zss Модератор 13085 / 10362 / 6201 Регистрация: 18.12.2011 Сообщений: 27,707 |
||||
19.03.2015, 11:06 |
2 |
|||
Возьмите образец
0 |
pavel_pushok 30 / 30 / 9 Регистрация: 25.12.2014 Сообщений: 115 |
||||
19.03.2015, 11:14 |
3 |
|||
1 пункт
0 |
ForEveR В астрале 8048 / 4805 / 655 Регистрация: 24.06.2010 Сообщений: 10,562 |
||||
19.03.2015, 11:14 |
4 |
|||
Сообщение было отмечено Памирыч как решение Решение
0 |
creonis 0 / 0 / 0 Регистрация: 19.03.2015 Сообщений: 11 |
||||
19.03.2015, 13:14 [ТС] |
5 |
|||
сделал первую часть, можете вторую сделать по этой?
0 |
FunkyShits 6 / 6 / 3 Регистрация: 15.12.2009 Сообщений: 39 |
||||
19.03.2015, 16:39 |
6 |
|||
Сообщение было отмечено Памирыч как решение Решение
0 |
0 / 0 / 0 Регистрация: 19.03.2015 Сообщений: 11 |
|
19.03.2015, 19:46 [ТС] |
7 |
что-то явно не так после строчки cout<<“max: “<<max<<” ” <<“min: “<<min<<endl; Миниатюры
0 |
0 / 0 / 0 Регистрация: 19.03.2015 Сообщений: 11 |
|
19.03.2015, 19:59 [ТС] |
8 |
да и вы в коде забыли srand ((unsigned int) time (0));, а так же вместо a[i]=rand() %20-10.0; взяли a[i] = rand() % 41 – 20;
0 |
6 / 6 / 3 Регистрация: 15.12.2009 Сообщений: 39 |
|
19.03.2015, 22:44 |
9 |
creonis, да и вы в коде забыли srand ((unsigned int) time (0));, а так же вместо a[i]=rand() %20-10.0; взяли a[i] = rand() % 41 – 20; не вижу смысла в строчке: srand ((unsigned int) time (0))
0 |
creonis 0 / 0 / 0 Регистрация: 19.03.2015 Сообщений: 11 |
||||
20.03.2015, 11:36 [ТС] |
10 |
|||
но ведь на скрине сумма чисел, находящихся между макс и мин не равна -17. там должно быть -15 Добавлено через 12 часов 23 минуты
посмотрите, почему во 2 пункте он как-то не так считает сумму?
0 |
FunkyShits 6 / 6 / 3 Регистрация: 15.12.2009 Сообщений: 39 |
||||
20.03.2015, 15:17 |
11 |
|||
0 |
0 / 0 / 0 Регистрация: 19.03.2015 Сообщений: 11 |
|
20.03.2015, 20:35 [ТС] |
12 |
я уже теряюсь Миниатюры
0 |
creonis 0 / 0 / 0 Регистрация: 19.03.2015 Сообщений: 11 |
||||
20.03.2015, 21:32 [ТС] |
13 |
|||
все, понял в чем проблема, сделал. вот код, если вдруг кому понадобится:
0 |
using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApp2 { class Program { static void Main(string[] args) { var size = 10; var array = new List<int>(); Console.WriteLine("Ввести массив А из 10 элементов,найти произведение отрицательных nэлементов и вывести на экран"); Console.WriteLine("Введите значения с клавиатуры, незабудьте ввести отрицательные числа!"); while (size-- > 0) array.Add(int.Parse(Console.ReadLine())); Console.WriteLine("Исходный массив: {0}", string.Join(" ", array)); Console.WriteLine("Произведение отрицательных чисел равно: {0}", array.Where(x => x < 0).Aggregate((x, y) => x * y)); Console.ReadKey(); } } }
Создать массив К из [10] путем ввода с клавиатуры. Вынести массив на экран и одну строку Создать и вывести массив М с [12] элементов (произвольные числа на промежутке (-1000; 1500]). Вывести на экран таблицу индекс элемента, сам элемент.
Найти произведение отрицательных элементов массива М и максимальный элемент массива К.
#include <iostream>
#include <cmath>
#define k1 10
using namespace std;
int main(int argc, char** argv) {
system("color 0A");
setlocale(0, "rus");
int K[k1];
double n = 10;
cout << "vvedit 10 chisel";
for (int i = 0; i < k1; i++) {
cin >> K[i];
}
for (int i = 0; i < k1; i++) {
cout << K[i] << " ";
}
int M[12];
srand(time(0));
for (int i = 0; i < 12; i++) {
M[i] = rand() % 2501 - 1000;
cout << "[" << i << "] " << M[i] << "n";
}
int Dob_v = 0, flg = 0, max=K[0];
for (int i = 0; i < 12; i++) {
if (M[i] < 0)
{
flg = 1;
Dob_v *= M[i];
}
for (int i = 0; i < 12; i++) {
if (K[i] > max)
{
max = K[i];
}
}
}
if (flg)
cout << endl << "Добуток вiд'ємних M: " << Dob_v << endl;
else
cout << endl << "Немає вiдємних M!" << endl;
cout << "Максимальне K: " << max << endl;
}
-
Вопрос заданболее двух лет назад
-
371 просмотр
int Dob_v = 0 ...
for (int i = 0; i < 12; i++) {
...
Dob_v *= M[i]
Переполнение может быть, однако.
for (int i = 0; i < 12; i++) {
if (K[i] > max)
{
max = K[i];
}
почему i < 12
?
Пригласить эксперта
С произведением все просто – вы инициализировали Dob_v нулем, а произведение любого числа с нулем = нулю. Вот у вас всегда нулевой результат. Инициализируйте Dob_v единицей.
У вас путаница в двух последних циклах – разберитесь с закрывающими скобками – получается цикл по K вложен в цикл по M. Причем в цикле по К не правильное условие, т.к. К содержит всего 10 элементов.
-
Показать ещё
Загружается…
17 мая 2023, в 00:31
100000 руб./за проект
16 мая 2023, в 22:24
150000 руб./за проект
16 мая 2023, в 21:41
500 руб./за проект
Минуточку внимания
В современной школе информатика –
достаточно сложный предмет для усвоения
учащимися. Основное препятствие для
полноценного изучения информатики – нехватка
времени. Мною проанализировано много учебных
планов и методик преподавания информатики и для
общеобразовательных классов, и для профильных с
углубленным изучением информатики. Вывод
неутешителен. Предлагаемые материалы
основываются на гораздо большем годовом
количестве учебных часов, чем то, которым мы
реально располагаем. Следствием расхождения
между рекомендуемым и реальным объемом учебных
часов является невозможность использовать в
процессе обучения какой-то один учебник
информатики. Это неудобно как ученикам, так и
преподавателю. Выходом из этой ситуации является
разработка собственной методики преподавания
информатики с ориентацией на творческую
деятельность учащихся и тестовый контроль,
которая, не уменьшая объем материала, позволяла
бы сократить время на его усвоение учениками и
уложиться в отведенное количество часов.
Основываясь на своем опыте работы с
учащимися старшего звена, я выделила несколько
основных тем, без усвоения которых невозможно
успешное изучение всего курса информатики, и
разработала собственную методику их
преподавания. Я пользуюсь ей уже несколько лет,
что позволяет добиваться хороших результатов в
освоении учениками моего предмета. С методикой
преподавания одной из таких тем я и хочу
познакомить вас.
Секрет могущества ЭВМ – высокая
скорость и большая память. Для записи алгоритмов,
работающих с большими объемами информации, в
алгоритмическом языке существуют специальные
табличные величины (или просто таблицы).
Исполнение многих алгоритмов было бы просто
невозможно, если бы соответствующие объекты не
были каким-либо образом организованы:
упорядочены, классифицированы, занумерованы и
так далее. Итак, нужно уметь организовать не
только действия, но и те объекты, над которыми эти
действия производятся.
Необходимо отметить, что таблицы
(массивы) как основное средство представления
однородной информации неизбежно используются во
всех реальных компьютерных программах. На
табличном принципе основана и архитектура
современных ЭВМ: память машины можно
рассматривать как большой массив байтов, адреса
которых располагаются по возрастанию.
Следовательно, без понимания
информационной сущности таблиц и основных
алгоритмов их обработки невозможно формирование
полноценных представлений о возможностях ЭВМ и
принципах их работы. Для построения сколь-нибудь
сложных и содержательных программ необходимо
уверенное владение общими принципами применения
таблиц и базовыми приемами их
обработки. В данной работе будет рассмотрен ряд
простых алгоритмов, которые используются при
построении более сложных.
Алгоритм вычисления суммы
1. Пусть дан массив A,
состоящий из n элементов: a1,
a2, a3, …, an. Нужно
найти их сумму, т.е. S=a1+a2+a3+…+an.
Нахождение суммы есть
последовательное нахождение суммы по формулам:
S=0 S=S+a2 … S=S+ai S=S+an
S=S+a1 S=S+a3 …
Алгоритм вычисления суммы удобно
организовать циклом, взяв за параметр цикла
переменную i, которая
меняется от 1 до n с шагом 1, и
записав в цикле формулу S=S+ai один раз. Схема алгоритма приведена
на рис. 1а.
В схеме блок 4 присваивает S нулевое значение, блок 5 счетчику i
присваивает начальное значение,
блок 6 выполняет накопление суммы, блок 7 изменяет
значение i на 1, блок 8
осуществляет проверку условия повторения цикла.
При выполнении этого условия управление
передается в начало цикла, а при невыполнении –
осуществляется выход из цикла, т.к. при i=n+1 суммировать не нужно. n – в схеме предполагается число, но n может быть и переменной, значение
которой равно числу элементов массива A, которое нужно вводить перед
описанием массива.
При разработке этого алгоритма
учащимся можно предложить изменить схему на
случай, если нужно найти сумму элементов,
расположенных на четных местах в массиве A (Ответ: Блок 5 надо изменить на i=2 и блок 7 на i=i+2)
или задать вопрос – что изменится в схеме на
рис.1а, если суммировать только положительные
элементы массива A? (Ответ:
Перед блоком суммирования 6 нужно поставить блок
проверки элемента массива ai на положительность и, если он
положителен, то его суммировать, а если нет, то
обходить блок суммирования.) Схема алгоритма
будет иметь вид:
При таком тщательном исследовании
схемы алгоритма учащиеся без особых затруднений
ответят на вопрос – что добавить в схеме на
рис.2, чтобы в ней подсчитывалось еще количество
положительных элементов массива?
(Ответ: Надо ввести
переменную k для получения
количества положительных элементов и перед
циклом присвоить ей значение 0. После блока
проверки 7 по пути “+” нужно поставить блок,
содержащий k=k+1, который ведет
счет количества положительных элементов массива
A.) Схема алгоритма приведена
на рис.3а.
Алгоритм вычисления произведения
Этот алгоритм предлагается учащимся
разработать самостоятельно, взяв за основу
алгоритм определения суммы элементов массива
(Рис. 1а). Учащиеся должны не только указать на
изменения блока 6 на S=S*ai
(в S будет направляться
произведение элементов), но и дать четкое
объяснение изменению блока 4 на S=1. Схема алгоритма представлена на
рис.1б.
Алгоритм формирования нового массива
Как положительные элементы массива A сформировать в массив? Обозначим
массив положительных элементов B и по пути “+” после блока 7 поставим
присвоение соответствующему элементу массива B элемент массива A,
т.е. блок, содержимое которого bk=ai.
k будем использовать
как меняющийся индекс нового массива. Необходимо
обратить внимание учащихся на блок 2, в котором
требуется описать массив B,
указав количество его элементов равное
количеству элементов массива A. Схема алгоритма на рис.3б.
Алгоритм определения максимального элемента
Для получения максимального числа
введем переменную M и ей
присвоим значение первого элемента массива a1, а затем необходимо сравнить M с текущим элементом массива ai и если текущий элемент будет больше M, то значение M
заменить на значение этого элемента. Схема
алгоритма на Рис. 4. Очень важно обратить внимание
учащихся на начальное значение переменной M.
Почему, например нельзя
переменной M присвоить
значение равное нулю? (Ответ: Для массива с
отрицательными значениями элементов максимум не
будет найден.)
Алгоритм упорядочения массива методом
“Пузырька”
Действия по упорядочению некоторых
данных по ключу называются процессом сортировки.
Очевидно, что с отсортированными данными
работать легче и быстрее, чем с произвольно
расположенными. Все применения ЭВМ основаны на
их способности к быстрой и точной обработке
больших объемов информации, а это возможно
только тогда, когда информация однородна и отсортирована.
Существует довольно много различных методов
сортировки, отличающихся друг от друга степенью
эффективности, под которой понимается
количество сравнений и количество обменов,
произведенных в процессе сортировки, время
выполнения и объем
занимаемой ОП. Рассмотрим сортировку методом
“Пузырька”, которая легко описывается в форме
четких алгоритмов и приводит к простой
программной реализации.
Одномерный массив A
из n элементов упорядочим по
возрастанию. При
пузырьковой сортировке элементы массива попарно
сравниваются и более “легкие” элементы как бы
всплывают на поверхность. При реализации
алгоритма возникает проблема в определении
количества шагов сортировки. Для решения этой
задачи воспользуемся известным методом
“расстановки флажков”, благодаря
которому однозначно будет определен момент
завершения сортировки и выхода из цикла (блок 5).
В качестве “флажка” возьмем числовую
переменную F и присвоим ей
произвольное начальное значение отличное от
нуля (блок 4). Схема алгоритма на рис. 5. По парное
сравнивание элементов и их обмен местами
происходит в блоках 9-12, здесь же изменяется
значение флажка (блок 13). В случае, когда все
элементы массива будут упорядочены, значение F останется равным нулю (блок 6). Блоки
3 и 15 являются укрупненными, т.к. алгоритмы ввода и
вывода элементов массива подробно не описаны на
схеме (Рис. 5).
В помощь учащимся общеобразовательной
школы мною разработано методическое пособие по
алгоритмам обработки массивов данных, в котором
подробно рассматриваются элементарные
алгоритмы, используемые при составлении более
сложных алгоритмов, и прилагается большая
подборка задач.
Задачи “Первые шаги”
- В массиве а1, а2, …, а50
определить количество нулей. - В массиве d1, d2, …, d35
найти сумму чисел, расположенных на нечетных
местах. - В массиве с1, с2
, …, с40
найти произведение отрицательных чисел. - В массиве b1, b2, …, b45
найти сумму отрицательных чисел. - В массиве b1, b2, …, b20
найдите количество “единиц”. - Из массива а1, а2
, …, а30
найти произведение чисел, расположенных на
нечетных местах. - В массиве с1, с2
, …, с40
найти сумму чисел больших единицы. - В массиве чисел а1, а2
, …, а50
найти количество чисел меньших единицы. - В массиве с1, с2
, …, с37
найти произведение чисел больших 2. - В массиве а1, а2
, …, а40
найти сумму чисел, расположенных на местах
кратных 3. - В массиве а1, а2
, …, а50
найти произведение чисел меньших или равных 2. - В массиве b1, b2, …, b45
найти количество чисел равных 3,5. - В массиве d1, d2, …, d50
найти сумму чисел равных 4,7. - В массиве b1, b2, …, b30
найти произведение чисел больших
или равных 5. - В массиве с1, с2
, …, с70
найти количество “нулей”, стоящих на
нечетных местах. - В массиве b1, b2, …, b65
найти сумму чисел больших или
равных 5. - В массиве d1, d2, …, d30
найти произведение чисел, исключая
первый и последний элемент. - В массиве а1, а2
, …, а35
найти количество “единиц”, стоящих на четных
местах. - В массиве чисел а1, а2
, …, а30
найти сумму отрицательных чисел, стоящих на
нечетных местах. - В массиве чисел в1, в2, …, в35
найти произведение чисел больших или равных 2. - В массиве чисел с1, с2, …, с40
найти количество чисел, попавших в интервал [а,
в] - В массиве чисел с1, с2, …, с40
найти сумму чисел, не попавших в
интервал [с, d]. - В массиве чисел в1, в2, …, в45
найти произведение всех ненулевых чисел. - В массиве чисел с1, с2, …, с60 найти
количество нулей стоящих на местах, кратных 4 т.е.
среди чисел с4, с8, …, с60. - В массиве чисел z1, z2, …, z200
найти сумму чисел z5, z10,
…, z200.
Задачи “Джентльменский
набор”.
- Даны три последовательности
чисел а1, а2, …,
a9, b1, b2 …, b9,
с1, с2, …, с9.
Составьте новую последовательность d1, d2,
…, d9, каждый элемент
которой определяется по правилу di =
max (аi, bi, сi), где i=
1,2, …,9. - Найти номер первого нулевого
элемента массива х1, х2, …, х20 и
сумму элементов предшествующих ему. - Даны три последовательности
чисел: а1, а2, …, а8; b1, b2, …, b8; с1, с2
, …, с8.
Составить новую последовательность, в которой
чередовались бы числа всех трех
последовательностей, т.е. d1 = a1; d2=b1;
d3 = c1; d4 = a2; d5 = b2;
d6 = c2. - Известно, что в массиве а1, а2, …, а16
количество отрицательных чисел
равно количеству положительных. Составить новый
массив так, чтобы чередовались положительные и
отрицательные числа. - Найти сумму элементов
последовательности b1, b2, …, b15
, расположенных правее последнего
отрицательного элемента и номер этого элемента. - Дана последовательность чисел с1
, с2, …, с16
. Найти произведение элементов этой
последовательности до первого нулевого и сумму
элементов, расположенных после него. - Из массива с1
, с2, …, с18
получить массив х1
, х2, …, х18
по правилу; х1
= с1, х2
=с3, …, х9
=с17, x10=с18
, х11=с16,
…, x18=с2. - Из данного массива чисел х1
, х2, …, х25
исключить последнее положительное
число. Оставшиеся числа переписать в новый
массив z1, z2, …, z24. - Найти номер первого
положительного элемента массива b1, b2,
…, b15 и сумму элементов,
расположенных правее него. - Все положительные элементы
массива а1, а2
, …, а20,
расположенные правее первого нулевого элемента,
увеличить в два раза. - В массиве х1
, х2, …, х25
поменять местами элементы х1
, х4, х7
, х10, …, х22
с наименьшим из следующий за
ними соответствующей пары элементов. - Из заданного массива а1
, а2, …, а12
, не содержащего нулей, получить
массив b1, b2, …, b12
, приняв в качестве первых его
элементов все положительные элементы массива A
с сохранением порядка их
следования, а в качестве остальных элементов все
отрицательные элементы также с сохранением
порядка их следования. - Дан массив с1
, с2, …, с15, состоящий из нулей и единиц.
Подсчитать количество 0, количество 1 и
количество нулей до первой единицы. - Дан массив чисел х1, х2, …, х22
. Переписать в другой массив из
данного все элементы, расположенные правее
последнего отрицательного элемента, сохраняя
порядок их следования. - По данным числам х, у, z получить массив а1, а2, …, а17
, где а1 = х,
а2 = у, а3 = z,
а каждый следующий элемент
массива определяется как среднее арифметическое
трех предшествующих. - Из заданных массивов а1
, а2, …а8;
b1, b2, …, b12; с1
, с2, …, с6
получить массив d1, d2,
…, d26 в котором
разместить сначала все элементы массива A, затем элементы массива B
и в конце элементы массива C. - В массиве а1
, а2, …, а18 вычислить сумму отрицательных до
последнего нулевого и произведение элементов
расположенных правее него. - В массиве у1, у2, …, у18
элементы с номерами, кратными 4,
заменить среднем арифметическим из трех
предшествующих элементов. - Массивы х1, х2, …, х10
и у1, у2, …, у10
преобразовать по правилу: большее из хi
и уi
принять в качестве нового значения хi
, а меньшее – в качестве нового
значения уi (i = 1,2, …,10). - Все элементы массива а1
, а2, …, а45, начиная с первого по порядку
положительного элемента, уменьшить на 0,5, если
значение элемента превышает 1 и увеличивать на 0,5
в противном случае. - В массиве а1, а2, …, а25
найти произведение первых трех
положительных элементов. - Из десяти последних
отрицательных чисел последовательности t1,
t2, t3, …, t300
сформировать последовательность у1, у2, …, у10. - Если наименьший элемент данной
последовательности х1,
х2, …, х27 больше 0,1 то все отрицательные
элементы последовательности заменить единицей. - Дана последовательность а1, а2, …, а50
. Сформировать последовательность в1, в2, …, в50
следующим образом: в начале
расположить все отрицательные элементы
последовательности, а затем все остальные.
Задачи “Уже
проблемы”
- Дан массив а1, а2,
…, a20. Получить массив
х1+у1
, х2+у2, …, хr+уr
, где элементами массива х1, х2, …, хp
являются отрицательные, а
элементами массива у1, у2
, …, уt
положительные элементы массива A, r = min
(р, t). - Найти номер первого нулевого элемента массива а1, а2, …, а25
и произведение элементов,
расположенных до него, а среди элементов,
расположенных правее первого нулевого, найти
максимальный элемент. - В данном массиве чисел с1, с2, …, с25
поменять местами максимальный элемент с
последним отрицательным элементом. - Из массива х1, х2, …, х25
сформировать два массива; в одном написать числа,
расположенные до минимального элемента массива
х, в другой расположенный правее минимального. - Пять последних элементов последовательности у1,
у2, …, у40 помножить на номер
максимального элемента данной
последовательности. - Из массива а1, а2, …, а30
исключить максимальный элемент. - Среди отрицательных элементов массива х1,
х2, …, х50 найти минимальный и
помножить на него все отрицательные элементы,
стоящие левее этого минимального. - Дана последовательность чисел d1, d2,
…, d50. Найти сумму S1 элементов до
максимального элемента и сумму S2
элементов, расположенных правее него. - В данном массиве чисел а1, а2, …, а25
поменять местами минимальный и максимальный
элементы. - Найти сумму положительных элементов
последовательности d1, d2, …, d40,
расположенных до первого нулевого элемента,
заменить этой суммой минимальный элемент
массива. - Из отрицательных элементов массива х1, х2
…, x30, расположенных левее минимального
элемента, сформировать новый массив. - Из элементов последовательности у1, у2,
…, у25, расположенных между первым нулевым и
максимальным (в предположении, что в массиве есть
положительные числа) (или максимальным и первым
нулевым), сформировать новый массив. - Дан массив чисел а1, а2, …, а50.
Найти сумму элементов массива, стоящих правее
первого положительного элемента, и максимальный
элемент, его номер среди чисел предшествующих
первому положительному. - В массиве у1, у2, …, у25 поменять
местами минимальный элемент с первым
положительным элементом. - Среди элементов последовательности а1, а2,
…, а25 расположенных до первого
отрицательного элемента, найти минимальный
элемент. Из положительных элементов массива,
расположенных правее минимального, сформировать
новый массив. - Три отрицательных элемента массива b1, b2,
…, b25, расположенных правее максимального
помножить на номер максимального элемента. - Дан массив х1, х2, …, х30.
Помножить элементы массива на квадрат его
наименьшего элемента, если хi больше или
равно 0, и на квадрат его наибольшего элемента,
если хi меньше 0. - Дана последовательность t1, t2, …, t20.
Среди положительных элементов найти
максимальный и помножить на него все
положительные элементы последовательности. - Из элементов последовательности с1, с2,
с3 …, с45, стоящих на нечетных местах и
расположенных правее минимального элемента
данной последовательности, сформировать новый
массив d1, d2, … - В массиве чисел х1, х2, …, х17
заменить нулем все отрицательные элементы,
предшествующие его максимальному элементу. - Дана последовательность чисел а1, а2,
…, а25; из положительных элементов данной
последовательности, расположенных до
минимального элемента, сформировать
последовательность р1, p2, p3… - Из массива у1, у2, …, у50
сформировать новый массив в1, в2, в3,
…, в который записать все числа, находящиеся в
массиве у между его максимальным и минимальным
(или минимальным и максимальным) элементами. - Из массива х1, х2, …, х30
получить массив у1, у2, …, уn
состоящий из элементов массива х, расположенных
правее его максимального элемента. - Если наименьший элемент данной
последовательности х1, х2, …, х27
больше 0,1 то все отрицательные элементы
последовательности заменить единицей. - Найти наименьший элемент из элементов
последовательности x1, x2, …, x25,
расположенных до первого отрицательного числа.
Все отрицательные числа, расположенные правее
первого отрицательного, помножить на этот
наименьший. - В последовательности у1, у2, …, у25
найти максимальный элемент из элементов, стоящих
на четных местах. Помножить на него все элементы
данной последовательности, стоящие на нечетных
местах и расположенные правее найденного
максимального.
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
142 |
S+=X[i];
cout<<“S=”<<S<<“n”;
Дан массив X, состоящий из N элементов. Найти произведение элементов этого массива. Решение этой задачи сводится к тому, что значение переменной Р, в которую предварительно была записана единица, последовательно умножается на значение i–го элемента массива. Блок-схема алгоритма приведена на рис. 5.5.
Соответствующий фрагмент
программы будет иметь вид:
for (P=1,i=0;i<N;i++) P*=X[i]; cout<<“P=”<<P<<“n”;
Рисунок 5.5. Вычисление произведения элементов массива
ЗАДАЧА 5.1. Задан массив целых чисел. Найти сумму простых чисел и произведение отрицательных элементов массива.
Алгоритм решения задачи состоит из следующих этапов.
1.Вводим массив X[N].
2.Для вычисления суммы в переменную S записываем значение 0, для вычисления произведения в переменную P записываем 1.
3.В цикле (i изменяется от 0 до N-1 с шагом 1) перебираем все элементы массива X, если очередной элемент массива является простым числом, добавляем его к сумме, а если очередной элемент массива отрицателен, то умножаем его на P.
4.Выводим на экран значение суммы и произведения.
Блок-схема решения задачи представлена на рис. 5.6. Для решения задачи нам понадобится хорошо уже известная функция проверки является ли число простым.
Текст программы с подробными комментариями приведён далее.
#include <iostream> using namespace std; //Текст функции prostoe. bool prostoe (int N)
{int i; bool pr;
if (N<2) pr=false; else
for(pr=true,i=2;i<=N/2;i++) if (N%i==0)
{pr=false;
break;
}
return pr;
}
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
143 |
Рисунок 5.6. Блок–схема алгоритма решения задачи 5.1
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
144 |
int main()
{
int *X,i,N,S,P;
//Ввод размерности массива. cout<<“Введите размер массива “;cin>>N;
//Выделение памяти для хранения динамического массива. X=new int [N];
//Ввод массива X. cout<<“Ведите массив Хn”; for(i=0;i<N;i++)
{
cout<<“X(“<<i<<“)=”;cin>>X[i];}
//В цикле перебираем все элементы массива for(P=1,S=i=0;i<N;i++)
{
//Если очередной элемент массива – простое число, //добавляем его к сумме.
if (prostoe(X[i])) S+=X[i];
//Если очередной элемент массива отрицателен, //умножаем его на P.
if (X[i]<0) P*=X[i];
}
//Вывод S и P на экран.
cout << “S=” <<S<<“tP=”<<P<< endl; //Освобождение занимаемой массивом X памяти. delete [] X;
return 0;
}
Результаты работы программы представлены ниже.
Введите размер массива 10 Ведите массив Х
X(0)=-7
X(1)=-9
X(2)=5
X(3)=7
X(4)=2
X(5)=4
X(6)=6
X(7)=8
X(8)=10
X(9)=12 S=14 P=63
5.3.4 Поиск максимального элемента в массиве и его номера
Дан массив X, состоящий из n элементов. Найти максимальный элемент массива и номер, под которым он хранится в массиве.
Алгоритм решения задачи следующий. Пусть в переменной с именем Max хранится значение максимального элемента массива, а в переменной с именем Nmax – его номер. Предположим, что нулевой элемент массива является максимальным и
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
145 |
запишем его в переменную Max, а в Nmax – его номер (то есть ноль). Затем все
элементы, начиная с первого, сравниваем в цикле с максимальным. Если текущий элемент массива оказывается больше максимального, то записываем его в переменную Max, а в переменную Nmax – текущее значение индекса i. Процесс определения
максимального элемента в массиве приведен в таблице 5.3 и изображен при помощи блок-схемы на рис. 5.7.
Таблица 5.3. Определение максимального элемента и его номера в массиве
Номера элементов |
0 |
1 |
2 |
3 |
4 |
5 |
Исходный массив |
4 |
7 |
3 |
8 |
9 |
2 |
Значение переменной Max |
4 |
7 |
7 |
8 |
9 |
9 |
Значение переменной Nmax |
1 |
2 |
2 |
4 |
5 |
5 |
Рисунок 5.7. Поиск максимального элемента и его номера в массиве
Соответствующий фрагмент программы имеет вид: for (Max=X[0],Nmax=i=0;i<n;i++)
if (Max<X[i])
{
Max=X[i]; Nmax=i;
}
cout<<“Max=”<<Max<<“n”;
cout<<“Nmax=”<<Nmax<<“n”;
При поиске максимального элемента, можно найти его номер, а потом по номеру извлечь значение максимального элемента из массива. Текст программы
иллюстрирующий этот вариант алгоритма приведён далее.
#include <iostream> using namespace std;
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
146 |
int main()
{float *X; int i,N,nom;
//Ввод размерности динамического массива
cout<<“Введите размер массива “;cin>>N;
X=new float[N]; |
//Выделения памяти для хранения |
//динамического массива X. |
//Ввод динамического массива Х. cout<<“Введите элементы массива Хn”; for(i=0;i<N;i++)
cin>>X[i];
//В переменной nom будем хранить номер максимального //элемента. Предположим, что максимальным элементом, //является элемент с номером 0.
nom=0;
for(i=1;i<N;i++)
//Если очередной элемент больше X[nom], значит nom не //является номером максимального элемента, элемент с //номером i больше элемента X[nom], поэтому //переписываем число i в переменную nom.
if (X[i]>X[nom]) nom=i;
cout << “Максимальный элемент=”<<X[nom]; cout << “, его номер=” << nom<< endl;
return 0;
}
Совет. Алгоритм поиска минимального элемента в массиве будет отличаться от приведенного выше лишь тем, что в условном блоке и, соответственно, в конструкции if текста программы знак поменяется с < на >.
ЗАДАЧА 5.2. Найти минимальное простое число в целочисленном массиве X[N].
Эта задача относится к классу задач поиска минимума (максимума) среди элементов, удовлетворяющих условию. Подобные задачи рассматривались в примерах обработку последовательности чисел. Блок-схема приведена на рис. 5.8.
Необходимо первое простое число объявить минимумом, а затем все последующие простые элементы массива сравнивать с минимумом. В цикле будем последовательно проверять, является ли элемент массива простым числом (функция prostoe). Если X[i] является простым числом, то количество простых чисел k
увеличиваем на 1, далее, проверяем, если k равено 1, то этот элемент объявляем
минимальным, иначе сравниваем его с минимальным .
Текст программы:
#include <iostream> using namespace std; bool prostoe (int N)
{int i; bool pr; if (N<2) pr=false; else
for(pr=true,i=2;i<=N/2;i++) if (N%i==0)
{pr=false; break; } return pr;
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
147 |
}
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
148 |
Рисунок 5.8. Блок–схема рещения задачи 5.2
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
149 |
int main(int argc, char **argv)
{
int i,k,n,nom,min,*x;
//Ввод количества элементов в массиве. cout<<“n=”; cin>>n;
//Выделяем память для динамического массива x. x=new int [n];
//Ввод элементов массива. cout<<“Введите элементы массива X”; for(i=0;i<n;i++)
cin>>x[i];
//С помощью цикла по переменной i, перебираем все элементы //в массиве x, k – количество простых чисел в массиве.
for(i=k=0;i<n;i++)
//Проеверяем, является ли очередной элемент массива //простым числом. Если x[i] – простое число.
if (prostoe(x[i]))
{
//Увеличиваем счётчик количества простых чисел в массиве. k++;
//Если текущий элемент является первым простым числом в //массиве, объявляем его минимумом, а его номер сохраняем //в перемнной nom.
if (k==1) {min=x[i];nom=i;} else
//Все последующие простые числа в массиве сравниваем с
//минимальным простым числом. Если текущее число меньше
//min, перезаписываем его
//в переменную min, а его номер – в переменную nom. if (x[i]<min) {min=x[i];nom=i;}
}
//Если в массиве были простые числа, выводим значение и //номер минимального простого числа.
if (k>0) cout<<“min=”<<min<<“tnom=”<<nom<<endl;
//Иначе выводим сообщение о том, что в массиве нет простых //чисел.
else cout<<“Нет простых чисел в массиве”<<endl; return 0;
}
Аналогично можно написать программу для задачи поиска минимума (максимума) среди элементов, удовлетворяющих какому-либо условию (минимум среди положительных элементов, среди чётных и т.д.).
ЗАДАЧА 5.3. Найти k минимальных чисел в массиве вещественных чисел.
Перед решением этой довольно сложно задачи рассмотрим более простую задачу. Найти два наименьших элемента в массиве.
Фактически надо найти номера (nmin1, nmin2) двух наименьших элементов массива. На первом этапе надо найти номер минимального (nmin1) элемента массива. На втором этапе надо искать минимальный элемент, при условии, что его номер не
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
150 |
равен nmin1. Вторая часть очень похожа на предыдущую задачу (минимум среди элементов, удовлетворяющих условию, в этом случае условие имеет вид i!=nmin).
Текст программы с комментариями приведен далее.
#include <iostream> using namespace std;
int main(int argc, char **argv)
{
int kvo,i,n,nmin1,nmin2; double *X; cout<<“n=”;cin>>n;
X=new double [n];
cout<<“Введите элементы массива Хn”; for(i=0;i<n;i++)
cin>>X[i];
//Стандартный алгоритм поиска номера первого минимального //элемента (nmin1).
for(nmin1=0,i=1;i<n;i++)
if (X[i]<X[nmin1]) nmin1=i;
//Второй этап – поиск номера минимального элемента, //среди элементов, номер которых не совпадает nmin1. //kvo – количество таких элементов.
for(kvo=i=0;i<n;i++)
//Если номер текущего элемента не совпадает с nmin1, if (i!=nmin1)
{
//увеличиваем количество таких элементов на 1. kvo++;
//Номер первого элемента, индекс которого не равен nmin1, //объявляем номером второго минимального элемента.
if (kvo==1) nmin2=i; else
//очередной элемент индекс которого не равен nmin1 //сравниваем с минимальным, если он меньше, номер // перезаписываем в переменную nmin2.
if (X[i]<X[nmin2]) nmin2=i;}
//Вывод двух минимальных элементов и их индексов. cout<<“nmin1=”<<nmin1<<“tmin1=”<<X[nmin1]<<endl; cout<<“nmin2=”<<nmin2<<“tmin2=”<<X[nmin2]<<endl; return 0;
}
По образу и подобию можно написать задачу поиска трёх минимальных элементов в массиве. Первые два этапа (поиск номеров двух минимальных элементов в массиве) будут полным повторением кода, приведенного на листинге выше. На третьем этапе нужен цикл, в котором будем искать номер минимального элемента, при условии, что его номер не равен nmin1 и nmin2. Авторы настоятельно рекомендуют читателям
самостоятельно написать подобную программу. Аналогично можно написать программу поиска четырёх минимальных элементов. Однако при этом усложняется и увеличивается код программы. К тому же, рассмотренный прием не позволит решить задачу в общем случае (найти k минимумов).
Для поиска k минимумов в массиве можно поступить следующим образом. Будем
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
151 |
формировать массив nmin, в котором будут храниться номера минимальных элементов массива x. Для его формирования организуем цикл по переменной j от 0 до k–1. При каждом вхождении в цикл в массиве nmin будет j-1 элементов и мы будем искать j-й минимум (формировать j-й элемент массива). Алгоритм формирования j-го элемента состоит в следующем: необходимо найти номер минимального элемента в массиве x, исключая номера, которые уже хранятся в массиве nmin. Внутри цикла по j необходимо выполнить такие действия. Для каждого элемента массива x (цикл по переменной i) проверить содержится ли номер в массиве nmin, если не содержится, то количество (переменная kvo) таких элементов увеличить на 1. Далее, если kvo равно 1, то это первый элемент, который не содержится в массиве nmin, его номер объявляем номером минимального элемента массива (nmin_temp=i;). Если kvo>1, сравниваем текущий элемент x[i] с минимальным
(if (x[i]<X[nmin_temp]) nmin_temp=i;).
Блок-схема алгоритма поиска k минимальных элементов массива представлена на
рис. 5.934. Далее приведён текст программы с комментариями.
#include <iostream> using namespace std;
int main(int argc, char **argv)
{int p,j,i,n,*nmin,k,kvo,nmin_temp; bool pr;
double *x; cout<<“n=”;cin>>n; x=new double [n];
cout<<“Введите элементы массива Хn”; for(i=0;i<n;i++)
cin>>x[i];
cout<<“Введите количество минимумовn”;cin>>k;
nmin=new int[k];
//Цикл по переменной j для поиска номера j+1 минимального //элемента
for(j=0;j<k;j++)
{
kvo=0;
//Перебираем все элементы массива. for(i=0;i<n;i++)
{
//Цикл по переменной p проверяет содержится ли номер i в // массиве nmin.
pr=false;
for(p=0;p<j;p++)
if (i==nmin[p]) pr=true;
//Если не содержится, то количество элементов увеличить на // 1.
if (!pr)
{
kvo++;
34 В блок-схеме отсутствует ввод данных и вывод результатов.
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
152 |
Рисунок 5.9. Блок–схема алгоритма поиска k минимальных элементов в
массиве x.
//Если kvo=1, то найден первый элемент, который не
//содержится в массиве nmin, его номер объявляем номером
//минимального элемента массива
if (kvo==1) nmin_temp=i; else
//Если kvo>1, сравниваем текущий элемент x[i] с // минимальным.
if (x[i]<x[nmin_temp]) nmin_temp=i;
}
}
//Номер очередного минимального элемента записываем в // массив nmin.
nmin[j]=nmin_temp;
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
153 |
}
//Вывод номеров и значений k минимальных элементов // массива.
for(j=0;j<k;j++)
cout<<“nmin1=”<<nmin[j]<<“tmin1=”<<x[nmin[j]]<<endl; return 0;
}
Проверку содержится ли число i в массиве nmin, можно оформить в виде функ-
ции, тогда программа будет иметь вид:
#include <iostream> using namespace std;
//Функция проверяет содержится ли число i в массиве x из n //элементов. Функция возвращает true, если содержится //false, если не содержится.
bool proverka(int i, int *x, int n)
{
bool pr; int p; pr=false;
for(p=0;p<n;p++)
if (i==x[p]) pr=true; return pr;
}
int main(int argc, char **argv)
{
int j,i,n,*nmin,k,kvo,nmin_temp;
double *x; cout<<“n=”;cin>>n; x=new double [n];
cout<<“Введите элементы массива Хn”; for(i=0;i<n;i++)
cin>>x[i];
cout<<“Введите количество минимумовn”;cin>>k; nmin=new int[k];
//Цикл по переменной j для поиска номера j+1 минимального // элемента
for(j=0;j<k;j++)
{
kvo=0;
//Перебираем все элементы массива. for(i=0;i<n;i++)
{
//Вызов функции proverka, чтобы проверить содержится ли число i
//в массиве nmin из j элементов if (!proverka(i,nmin,j))
{
kvo++;
if (kvo==1) nmin_temp=i; else
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
154 |
if (x[i]<x[nmin_temp]) nmin_temp=i;
}
}
nmin[j]=nmin_temp;
}
//Вывод номеров и значений k минимальных элементов // массива.
for(j=0;j<k;j++)
cout<<“nmin1=”<<nmin[j]<<“tmin1=”<<x[nmin[j]]<<endl; return 0;
}
Авторы настоятельно рекомендуют читателю разобраться со всеми версиями решения задачи 5.3.
ЗАДАЧА 5.4. Поменять местами максимальный и минимальный элементы в массиве X.
Алгоритм решения задачи можно разбить на следующие этапы.
1.Ввод массива.
2.Поиск номеров максимального (nmax) и минимального (nmin) элементов массива.
3.Обмен элементов местами (рис. 2.1) с помощью временной (буферной) переменная temp:
temp=X[nmax];X[nmax]=X[nmin]; X[nmin]=temp;
Текст программы с комментариями:
#include <iostream> using namespace std;
int main(int argc, char **argv)
{int i,N,nmax,nmin; float temp; cout<<“N=”;cin>>N; float X[N];
cout<<“Введите элементы массива Хn”; for(i=0;i<N;i++)
cin>>X[i];
//Поиск номеров максимального и минимального элементов //массива.
for(nmax=nmin=0,i=1;i<N;i++)
{
if (X[i]<X[nmin]) nmin=i; if (X[i]>X[nmax]) nmax=i;
}
//Обмен максимального и минимального элементов местами. temp=X[nmax];X[nmax]=X[nmin]; X[nmin]=temp;
//Вывод преобразованного массива. cout<<“Преобразованный массив Хn”; for(i=0;i<N;i++)
cout<<X[i]<<” “; cout<<endl; return 0;
}
ЗАДАЧА 5.5. Найти среднее геометрическое среди простых чисел,
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
155 |
расположенных между максимальным и минимальным элементами массива.
Среднее геометрическое k элементов (SG) можно вычислить по формуле SG=√k P , P – произведение k элементов. При решении этой задачи необходимо найти произведение и количество простых чисел, расположенных между максимальным и
минимальным элементами.
Алгоритм решения задачи состоит из следующих этапов:
1.Ввод массива.
2.Поиск номеров максимального (nmax) и минимального (nmin) элементов массива.
3.В цикле перебираем все элементы массива, расположенные между максимальным и минимальным элементами. Если текущий элемент является простым числом, то необходимо увеличить количество простых чисел на 1, и умножить P на значение элемента массива.
4. Вычислить |
k |
SG=√P . |
|
При решении |
этой задачи следуем учитывать, что неизвестно какой элемент |
расположен раньше максимальный или минимальный.
Текст программы с комментариями приведён далее.
#include <iostream> #include <math.h> using namespace std; bool prostoe (int N)
{
int i; bool pr;
if (N<2) pr=false; else
for(pr=true,i=2;i<=N/2;i++) if (N%i==0)
{
pr=false;
break;
}
return pr;
}
int main(int argc, char **argv)
{int i,k,n,nmax,nmin, p, *x;
//Ввод количества элементов в массиве. cout<<“n=”; cin>>n;
//Выделяем память для динамического массива x. x=new int [n];
//Ввод элементов массива. cout<<“Введите элементы массива X”; for(i=0;i<n;i++)
cin>>x[i];
//Поиск номеров максимального и минимального элементов в //массиве.
for(nmax=nmin=i=0;i<n;i++)
{
if (x[i]<x[nmin]) nmin=i;
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #