• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Помогите написать две несложные программы

Alessandro4

Новые
Регистрация
27 Фев 2019
Сообщения
17
Реакции
0
Баллы
0
Помогите написать две несложные программы

Знаю, темы несложные, но я, видимо, проспал. Решите и объясните, пожалуйста
 

Вложения

  • EA3BA9F5-2A8A-4E53-901A-78783B59F6F0.webp
    EA3BA9F5-2A8A-4E53-901A-78783B59F6F0.webp
    125.1 KB · Просмотры: 319
  • 0382146A-2A1C-42DC-ADE2-90433BDD97C9.webp
    0382146A-2A1C-42DC-ADE2-90433BDD97C9.webp
    56.1 KB · Просмотры: 296
Ладно. Вот первое задание:
Код:
Const
 N=20;

Var
 A,B:Array[1..N] of Integer;
 i,j,S,P,Ifirst,Ilast:Integer;

Begin
 Randomize;
 Writeln('Initial array:');
 for i:=1 to N do
  begin
   A[i]:=-5+Random(10);
   if (i=5) or (i=17) then A[i]:=0;
   Write(A[i]:4);
  end;
 Writeln;
 Writeln;

 P:=1;
 for i:=1 to (N div 2) do P:=P*A[2*i];
 Writeln('Product = ',P);
 Writeln;
 Writeln;

 Ifirst:=0;
 Repeat
  Inc(Ifirst);
 Until A[Ifirst]=0;
 Ilast:=N+1;
 Repeat
  Dec(Ilast);
 Until A[Ilast]=0;
 S:=0;
 for i:=Ifirst+1 to Ilast-1 do S:=S+A[i];
 Writeln('Sum = ',S);
 Writeln;
 Writeln;

 j:=0;
 for i:=1 to N do
  if A[i]>=0 then
   begin
    Inc(j);
    B[j]:=A[i];
   end;
 j:=N+1;
 for i:=N downto 1 do
  if A[i]<0 then
   begin
    Dec(j);
    B[j]:=A[i];
   end;
 Writeln('New array:');
 for i:=1 to N do Write(B[i]:4);
 Readln
End.
 
Второе задание. Тут отмечу, что об не напортачить в методичке — и речи быть не может! Дают конкретные матрицы с n=3 и тут же заявляют, что n=8. Или нужно сгенерить свои матрицы? Как всегда, мутно.
Код:
Const
 n=3;
 m=4;

Var
 A:Array[1..n,1..m] of Real;
 B:Array[1..m] of Real;
 D:Array[1..n] of Real;
 i,k:Integer;

Begin
 A[1,1]:= 3.8; A[1,2]:= 0.1; A[1,3]:= 1.2; A[1,4]:= 2.4;
 A[2,1]:= 3.8; A[2,2]:=-1.0; A[2,3]:= 3.1; A[2,4]:= 1.5;
 A[3,1]:=-1.6; A[3,2]:= 0.4; A[3,3]:= 3.0; A[3,4]:= 1.0;
 B[1]:= 1.0;
 B[2]:= 3.2;
 B[3]:= 2.0;
 B[4]:=-2.1;

 for i:=1 to n do D[i]:=0;

 for i:=1 to n do
  for k:=1 to m do
   D[i]:=D[i]+A[i,k]*B[k];

 Writeln('Result:');
 for i:=1 to n do
  Writeln('D[',i,'] = ',D[i]:7:3);

 Readln
End.
 
А где в первом задании произведение элементов массива с четными номерами
 
Объясните пожалуйста остальные строки вашей первой программы
 
Объясните пожалуйста остальные строки вашей первой программы
Не буду. Программа настолько проста, что Вам было бы полезно разобраться в ней самостоятельно. Конечно, если возникнут КОНКРЕТНЫЕ вопросы, с удовольствием отвечу.
Но так, вкратце:
1. Объявляется (константой) длина массива (20).
2. Методом случайных чисел заполняется массив. После этого двум элементам принудительно присваиваются нулевые значения, чтобы нулевые элементы заведомо присутствовали.
3. Ищется произведение элементов с четными номерами.
4. Ищутся номера первого и последнего нулевых элементов. Считается сумма элементов с номерами между найденными.
5. Организуется новый массив В, в который сначала последовательно помещаются все неотрицательные элементы массива А, а потом с конца — все отрицательные элементы.

Результаты всех действий выводятся на экран.
 
Сижу, пытаюсь разбирать программу... Объясните, как работает произведение элементов массива, а именно строчку с for и сумма элементов массива особенно циклы repeat и также строчку с for
 
Объясните, как работает произведение элементов массива
Давайте разберём на примере. Пусть нам нужно найти произведение элементов массива, стоящих на ЧЕТНЫХ позициях. Зададим массив:
7 2 9 1 3 5 6, т.е. N=7.
Нам нужно найти произведение 2*1*5, т.е. произведение A[2]*A[4]*A[6].
1. Искомому произведению P изначально присваиваем значение 1.
2. Находим (N div 2), т.е результат ЦЕЛОЧИСЛЕННОГО деления N на 2, в данном случае это 3.
3. Проходим в цикле по i от 1 до 3 домножение произведения P на элементы A[2i], т.е. при изменении i от 1 до 3 номера элементов будут приобретать значения 2, 4, 6. Что нам и требуется. Всё!
сумма элементов массива особенно циклы repeat и также строчку с for
Тут так. Задача: найти первый и последний нулевые элементы, и сосчитать сумму элементов между ними. Обозначим номера этих нулевых элементов, как Ifirst и Ilast соответственно. Найдём их.
Для этого:
1. Присваиваем Ifirst значение 0. Далее в цикле repeat..until прибавляем к Ifirst по единичке до тех пор, пока не выполнится условие A[Ifirst]=0. Всё, нашли номер первого нулевого элемента.
2. Присваиваем Ilast значение N+1. Далее в цикле repeat..until убавляем от Ilast по единичке до тех пор, пока не выполнится условие A[Ilast]=0. Так находим номер последнего нулевого элемента.
3. Присваиваем искомой сумме S начальное значение 0, а затем в цикле for..to прибавляем к S значения элементов с номерами между Ifirst и Ilast. Всё!
 
С суммой массива разобрался, а вот с произведением не очень. Зачем писать (N div 2), если можно сразу написать 10?

И можно подробнее об этом?
Проходим в цикле по i от 1 до 3 домножение произведения P на элементы A[2i], т.е. при изменении i от 1 до 3 номера элементов будут приобретать значения 2, 4, 6.
 
Зачем писать (N div 2), если можно сразу написать 10?
Можно. Но это вопрос культуры программирования. А если Вы захотите изменить длину массива, например, сделав её равной 30? Или 100? В моём варианте достаточно поменять константу N в первой строке, а всё остальное не трогать, а в Вашем придётся лезть в программу и менять в каких-то местах её "потроха". Это плохо.
И можно подробнее об этом?
Даже и не знаю... мне кажется, всё разжевано настолько подробно, что дальше некуда. При прохождении цикла от 1 до (N div 2) номера элементов массива удваиваются, т.е. приобретают значения 2, 4, 6, 8... и до N, если N чётное, или до (N-1), если нечётное. Что ж тут непонятного?
 
Благодарю, с первой программой вполне разобрался, объяснил и понял.

Насчет матриц.. объясните в целом как работает программа со строчки for
 
Насчет матриц.. объясните в целом как работает программа со строчки for
Да что ж тут объяснять? Как написана у Вас в методичке формула произведения матриц, точнее, умножения матрицы на вектор (невероятно, но написана без ошибок и ляпов; бывает же в кои-то веки раз...), так и запрограммировано. Один в один.
 
Назад
Сверху