Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 1
Регистрация: 14.12.2014
Сообщений: 49

Вычислить количество и сумму положительных элементов трехмерного массива

23.02.2015, 17:03. Показов 1355. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята, помогите пожалуйста! В универе задали задание, а я не могу понять как работать с подпрограммами пока еще, так что надеюсь на вашу поддержку! Спасибо большое, заранее!

Составить подпрограмму, которая вычисляет количество и сумму положительных элементов трехмерного массива X. C помощью подпрограммы вычислить количество и сумму положительных элементов массивов A(5,6,4), B(3,8,2) и С(6,6,10). Элементы массивов рассчитываются по формулам:
Aijk=kcos(j+4)+esin(i),
Bijk =kcos(3.2j+4.2)+esin(1.5i),
Cijk =kcos(12.4j+1)+esin(i+2.82).
После е, sin идет в степени!!!)))
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.02.2015, 17:03
Ответы с готовыми решениями:

Вычислить сумму и количество положительных элементов массива
Вычислить сумму и количество положительных элементов массива X(n), где 1<=n<=100 Буду очень признателен

Вычислить сумму и количество положительных элементов массива х
Помогите задачу !!! Массив х 10. Вычеслите сумму и кол-во положительных элементов массива х. х - действительные числа.

Вычислить сумму положительных элементов массива и их количество
в одномерном массиве состоящем из 25 вещественных элементов вычислить:сумму положительных элементов и их кол

11
Эксперт Pascal/Delphi
6812 / 4568 / 4820
Регистрация: 05.06.2014
Сообщений: 22,433
25.02.2015, 10:22
Natali13, формулы непонятны. Перепишите, пожалуйста, используя редактор формул.
1
1 / 1 / 1
Регистрация: 14.12.2014
Сообщений: 49
26.02.2015, 22:43  [ТС]
Aijk=kcos(j+4)+esin(i),
Bijk =kcos(3.2j+4.2)+esin(1.5i),
Cijk =kcos(12.4j+1)+esin(i+2.82)

Добавлено через 38 секунд
вроде так
0
 Аватар для APALoff
1648 / 1077 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
26.02.2015, 23:49
Цитата Сообщение от Natali13 Посмотреть сообщение
kcos
Какую-то новую функцию придумали?
0
Модератор
10451 / 5741 / 3409
Регистрация: 17.08.2012
Сообщений: 17,474
02.03.2015, 13:03
Цитата Сообщение от APALoff Посмотреть сообщение
Какую-то новую функцию придумали?
Да ладно.
Aijk=kcos...
0
 Аватар для APALoff
1648 / 1077 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
02.03.2015, 15:03
"Ах вот оно что, Михалыч!"
Мда, читать мысли не обязан, но телепатом должен быть ты. //м.Йода
2
1 / 1 / 1
Регистрация: 14.12.2014
Сообщений: 49
08.03.2015, 00:37  [ТС]
Ребята, здесь массив трехмерный!!!!
i,j,k - порядковые номера элементов массива
Помогите пожалуйста!
0
Модератор
10451 / 5741 / 3409
Регистрация: 17.08.2012
Сообщений: 17,474
08.03.2015, 10:03
Цитата Сообщение от Natali13 Посмотреть сообщение
Ребята, здесь массив трехмерный!!!!
И что? Хоть N-мерный... Задачка Ваша, по-моему, явно не для Pascal ABC.

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

- объявление нового типа, например,
Pascal
1
type matr = array[1..10, 1..10, 1..10] of real;
и использование переменной данного типа в качестве параметра. В чистом виде подходит для массивов с фиксированными размерами (здесь - 10, 10, 10);
- для переменных размеров для предыдущего способа есть костыль: перед вызовом подпрограммы копировать целевой массив в массив с заведомо большими размерами и передавать в подпрограмму эту копию и размеры целевого массива;
- использовать в качестве параметра указатель на целевой массив и размеры целевого массива;
- вместо массива использовать динамическую структуру, например, список;
- использовать потоки;
- передавать как параметр динамический массив с нужным количеством измерений и переменными размерами.

Вот решение Вашей задачи для Free Pascal через динамические массивы. Не знаю, запустится ли это дело в Pascal ABC, в нём слишком много всего ампутировано. Естественно, в ABC я программу не тестировал, поскольку ставить это уродство на свой компьютер не собираюсь, а запускать с помощью подходящего онлайн-сервиса в лом. Хотя, может, и попробую. Программа:
Pascal
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
type mas = array of array of array of real;
 
procedure gen(var x: mas; n: char; a, b, c, d: real);
var i, j, k: integer;
begin
  writeln('Array ', n, ':');
  for i := 0 to high(x) do
    for j := 0 to high(x[i]) do
      begin
        if j = 0 then write(i + 1, ': ') else write('   ');
        for k := 0 to high(x[i, j]) do
          begin
            x[i, j, k] := k * cos(a * j + b) + exp(sin(c * i + d));
            write(x[i, j, k]:7:3)
          end;
        writeln
      end
end;
 
procedure sum(var x: mas; var s: real; var c: integer);
var i, j, k: integer;
begin
  s := 0;
  c := 0; //исправлено
  for i := 0 to high(x) do
    for j := 0 to high(x[i]) do
      for k := 0 to high(x[i, j]) do
        if x[i, j, k] > 0
          then begin
            s := s + x[i, j, k];
            inc(c)
          end
end;
 
procedure out_res(n: char; s: real; c: integer);
begin
  writeln('Sum of positive elements of array ', n, ' = ', s:0:3, ', count = ', c);
  write('Press <Enter> to continue');
  readln
end;
 
procedure pass(var p: mas; n: char; x, y, z: integer; a, b, c, d: real; var sn: real; var cn: integer); //исправлено
begin
  setlength(p, x, y, z);
  gen(p, n, a, b, c, d);
  sum(p, sn, cn);
  out_res(n, sn, cn)
end;
 
var a, b, c: mas;
    ca, cb, cc: integer;
    sa, sb, sc: real;
begin
  pass(a, 'A', 5, 6, 4, 1.0, 4.0, 1.0, 0.0, sa, ca);
  pass(b, 'B', 3, 8, 2, 3.2, 4.2, 1.5, 0.0, sb, cb);
  pass(c, 'C', 6, 6, 10, 12.4, 1.0, 1.0, 2.82, sc, cc);
  write('Complete, press <Enter> to exit');
  readln
end.
Добавлено через 5 минут
Что-то я Pascal ABC интерпретатора онлайн не нашёл... Попадаются только Pascal ABC.NET трансляторы онлайн...
2
1 / 1 / 1
Регистрация: 14.12.2014
Сообщений: 49
09.03.2015, 16:37  [ТС]
ОГО, спасибо большое!!! Установила Free Pascal и все отлично скомпилировала, только в некоторые моменты немного непонятны! Можете, пожалуйста, с комментариями написать!
0
Модератор
10451 / 5741 / 3409
Регистрация: 17.08.2012
Сообщений: 17,474
09.03.2015, 18:31
Лучший ответ Сообщение было отмечено Natali13 как решение

Решение

Для начала пояснение насчёт вычисления элементов массивов. Нетрудно заметить, что формулы для всех трёх массивов можно обобщить:

Xijk =k∙cos(a∙j+b)+esin(c∙i+d)

что в программе и используется. То есть, для каждого массива есть свои размеры x, y, z и свои коэффициенты a, b, c, d для обобщённой формулы.

Программа с комментариями:
Pascal
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
type mas = array of array of array of real; //объявление типа для 3-мерного динамического массива
           //просто так, без пользовательского типа, массив в процедуру не передать
 
//процедура генерации массива
//формальные параметры: параметр: описание, способ передачи в подпрограмму
//x: целевой массив, по ссылке
//n: имя массива (1 символ), по значению
//a, b, c, d: коэффициенты для функции, по значению
procedure gen(var x: mas; n: char; a, b, c, d: real);
var i, j, k: integer; //локальные переменные, счётчики
begin
  writeln('Array ', n, ':'); //печать заголовка
  for i := 0 to high(x) do //циклы по измерениям массива
    for j := 0 to high(x[i]) do
      begin
        //каждый слой 3-мерного массива - это 2-мерный массив
        //в первой строке печатаем в начале строки номер слоя, в остальных - в начале строки пробелы
        if j = 0 then write(i + 1, ': ') else write('   ');
        for k := 0 to high(x[i, j]) do
          begin
            x[i, j, k] := k * cos(a * j + b) + exp(sin(c * i + d)); //вычисляем элемент
            write(x[i, j, k]:7:3) //печатаем в строчку (без перевода строки)
          end;
        writeln //строчка кончилась, печатаем перевод строки
      end
end;
 
//процедура суммирования массива
//формальные параметры: параметр: описание, способ передачи в подпрограмму
//x: целевой массив, по ссылке
//s: сумма, по ссылке
//c: количество элементов, по ссылке
procedure sum(var x: mas; var s: real; var c: integer);
var i, j, k: integer; //локальные переменные, счётчики
begin
  s := 0; //сумма положительных, пока 0
  c := 0; //счётчик количества положительных, пока 0 //здесь было k := 0; - исправлено
  for i := 0 to high(x) do //циклы по массиву
    for j := 0 to high(x[i]) do
      for k := 0 to high(x[i, j]) do
        if x[i, j, k] > 0 //если очередной элемент положительный,
          then begin //то
            s := s + x[i, j, k]; //прибавляем его к сумме
            inc(c) //а к счётчику прибавляем 1
          end
end;
 
//процедура вывода результата
//формальные параметры: параметр: описание, способ передачи в подпрограмму
//n: имя целевого массива (1 символ), по значению
//s: сумма положительных элементов, по значению
//c: количество положительных элементов, по значению
procedure out_res(n: char; s: real; c: integer);
begin
  //печатаем сумму и количество
  writeln('Sum of positive elements of array ', n, ' = ', s:0:3, ', count = ', c);
  //ожидание нажатия <Enter> (для просмотра результатов) перед обработкой следующего массива
  write('Press <Enter> to continue');
  readln //здесь вводится этот самый <Enter>
end;
 
//процедура обработки массива
//использует процедуры gen, sum, out_res
//формальные параметры: параметр: описание, способ передачи в подпрограмму
//p: целевой массив, по ссылке
//n: имя массива (1 символ), по значению
//x, y, z: размеры массива, по значению
//a, b, c, d: коэффициенты для функции, по значению
//sn: сумма положительных элементов целевого массива, по ссылке
//cn: количество положительных элементов целевого массива, по ссылке
procedure pass(var p: mas; n: char; x, y, z: integer; a, b, c, d: real; var sn: real; var cn: integer);
//!!! в строчке выше была неточность: количество положительных передавалось по значению, исправлено
begin
  setlength(p, x, y, z); //установка размеров массива
  gen(p, n, a, b, c, d); //генерация и печать массива
  sum(p, sn, cn); //нахождение суммы и количества положительных элементов
  out_res(n, sn, cn) //вывод результата
end;
 
//основная программа
var a, b, c: mas; //целевые массивы
    ca, cb, cc: integer; //их суммы положительных элементов
    sa, sb, sc: real; //их количества положительных элементов
begin
  pass(a, 'A', 5, 6, 4, 1.0, 4.0, 1.0, 0.0, sa, ca); //обработка A[5,6,4]
  pass(b, 'B', 3, 8, 2, 3.2, 4.2, 1.5, 0.0, sb, cb); //обработка B[3,8,2]
  pass(c, 'C', 6, 6, 10, 12.4, 1.0, 1.0, 2.82, sc, cc); //обработка С[6,6,10]
  write('Complete, press <Enter> to exit'); //завершающее сообщение, <Enter> для выхода из программы
  readln //здесь вводится этот самый <Enter>
end.
И ещё. На самом деле, в основной программе суммы и количества положительных элементов вовсе и не требуются. Оставлено в предположении, что данная программа может быть основой для другого задания. Поэтому программу можно несколько сократить. Переменные ca, cb, cc, sa, sb, sc в основной программе выкинуть, выкинуть в вызовах и в описании процедуры pass формальные параметры sn, cn, добавив в процедуру pass эти самые sn, cn в качестве локальных переменных.

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

Исправлена ошибка в строке 37
1
1 / 1 / 1
Регистрация: 14.12.2014
Сообщений: 49
09.03.2015, 20:38  [ТС]
ОГРОМНОЕ просто СПАСИБО!
а можете еще рассказать зачем нам вводить в обработке массивов так много цифр? Почему просто не оставить
pass(a, 'A', 5,6,4, sa, ca); ну и так далее?
0
Модератор
10451 / 5741 / 3409
Регистрация: 17.08.2012
Сообщений: 17,474
09.03.2015, 23:36
Для формулы. Разберём последний вызов подпрограммы pass.
Pascal
1
  pass(c, 'C', 6, 6, 10, 12.4, 1.0, 1.0, 2.82, sc, cc); //обработка С[6,6,10]
- pass - имя процедуры;
- далее идут фактические параметры;
- (c, - обрабатываем массив "c";
- 'C', - этот символ печатается в сообщениях процедур gen и out_res (их формальный параметр n);
- 6, 6, 10, - размеры массива, используются всеми процедурами, кроме out_res;
- 12.4, 1.0, 1.0, 2.82, - коэффициенты для формулы вычисления членов массива,
Сijk = k∙cos(a∙j+b)+esin(c∙i+d)= k∙cos(12.4∙j+1.0)+esin(1.0∙i+2.82)
используются в процедуре gen (интересно, а как Вы планировали для разных массивов
по разным формулам в одной и той же процедуре элементы вычислять, без этой горы чисел?);
- sc, cc - сумма и количество положительных элементов массива "c", вот как раз их-то, как я писал выше, использовать вовсе и необязательно;
- ); //обработка С[6,6,10] - конец команды и комментарий.

Невнимательно прочитали, что я писал до этого?

Добавлено через 11 минут
Обнаружил ошибку в строке 37, программы в постах #8 и #10 исправлены.

Можно и поменьше формальных параметров, только тогда суммы и количества положительных элементов массива в основную программу передаваться не будут (писал об этом выше). Да оно, в общем-то, и не надо. Конец программы под спойлером.

Вариант программы с меньшим числом параметров процедуры pass
Pascal
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
procedure pass(var p: mas; n: char; x, y, z: integer; a, b, c, d: real);
//!!! в строчке выше была неточность: количество положительных передавалось по значению, исправлено
var sn: real; //сумма и количество теперь вычисляются локально,
    cn: integer; //и в основную программу не передаются
begin
  setlength(p, x, y, z); //установка размеров массива
  gen(p, n, a, b, c, d); //генерация и печать массива
  sum(p, sn, cn); //нахождение суммы и количества положительных элементов
  out_res(n, sn, cn) //вывод результата
end;
 
//основная программа
var a, b, c: mas; //целевые массивы
begin
  pass(a, 'A', 5, 6, 4, 1.0, 4.0, 1.0, 0.0); //обработка A[5,6,4]
  pass(b, 'B', 3, 8, 2, 3.2, 4.2, 1.5, 0.0); //обработка B[3,8,2]
  pass(c, 'C', 6, 6, 10, 12.4, 1.0, 1.0, 2.82); //обработка С[6,6,10]
  write('Complete, press <Enter> to exit'); //завершающее сообщение, <Enter> для выхода из программы
  readln //здесь вводится этот самый <Enter>
end.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.03.2015, 23:36
Помогаю со студенческими работами здесь

Вычислить сумму и количество положительных элементов массива
Условие :вычислить (формула)где s1 и к1 -сумма и количество положительных элементов массива Х(100); s2 и к2 сумма и колличество...

Вычислить сумму и количество положительных, сумму и количество отрицательных элементов массива
Помогите пожалуйста сдалать следующие 2 задачи : 1)вычислить сумму и количество положительных, сумму и количество отрицательных элементов...

Вычислить количество положительных элементов массива и сумму элементов массива, расположенных после последнего элемента, равного нулю
В одномерном массиве, состоящем из n вещественных элементов, вычислить: количество положительных элементов массива; сумму элементов...

Вычислить сумму элементов массива А, количество положительных элементов массива В и его максимальный элемент
Дано натуральное число n, массивы А и В размерностью n. Вести с клавиатуры элементы массивов и вычислить сумму элементов массива А ,...

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru