Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 28.04.2014, 15:51   #1 (permalink)
furt123
Member
 
Регистрация: 06.12.2013
Сообщений: 25
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Question Паскаль. Работа с массивами

наваял тут лабу. вроде со всем справился. но вы уж проанализируйте пожалуйста. может, что-то не учёл.
задание: дана квадратная матрица А порядка n. сформировать вектор d из сумм элементов столбцов А, отсортировать вектор и сформировать из его элементов диагональную матрицу С. И окончательно найти след матрицы

Код:
program laba;

var
  a: array [1..5, 1..5] of integer;
  c: array [1..5, 1..5] of integer;
  d: array [1..5] of integer;
  i, j, n, s, k, h, p: integer;

begin
  Write(' ввод размерности матрицы n= ');
  Readln(n);
  for i := 1 to n do
    for j := 1 to n do 
    begin
      write('A[', i, ',', j, ']=');
      Readln(a[i, j]);
    end;
  writeln(' полученная матрица ');
  for i := 1 to n do
  begin
    for j := 1 to n do
      Write('  ', a[i, j], ' ');
    writeln;
  end;
  writeln;
  for j := 1 to n do
  begin
    s := 0;
    for i := 1 to n do
      s := s + a[i, j];
    d[j] := s;
  end;
  Write('вектор d-->  ');
  for j := 1 to n do
    write(d[j]:4);
  writeln; writeln;
  
  
  for j := 1 to n - 1 do
    for k := 1 to n - j do
      if d[k] > d[k + 1] then begin
        h := d[k];
        d[k] := d[k + 1];
        d[k + 1] := h
      end;
  
  write('Отсортированный массив: ');
  for j := 1 to n do
    write(d[j]:4);
  
  writeln;
  for i := 1 to n do
    for j := 1 to n do 
    begin
      if i = j then c[i, j] := d[j] else c[i, j] := 0;
    end;
  
  writeln(' полученная матрица c:');
  for i := 1 to n do
  begin
    for j := 1 to n do
      Write('  ', c[i, j], ' ');
    writeln;
  end;
  p := 0;
  for i := 1 to n do
    p := p + c[i, i];
  writeln('след матрицы = ', p);
end.
furt123 вне форума   Ответить с цитированием

Старый 28.04.2014, 15:51
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

По этим ссылкам содержится нужная вам информация

Помогите решить задачу c массивами. Паскаль
Паскаль. Работа со списками
Паскаль. Работа с деревьями
Работа с массивами на ассемблере
Работа с массивами
Паскаль АВС. Задача с массивами

Старый 28.04.2014, 16:03   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от furt123 Посмотреть сообщение
наваял тут лабу. вроде со всем справился. но вы уж проанализируйте пожалуйста. может, что-то не учёл.
Да вроде всё правильно. Единственно (не ошибка - так, убирание лишнего), я бы вместо
Код:
a: array [1..5, 1..5] of integer;   
c: array [1..5, 1..5] of integer;
написал просто
Код:
a, c: array [1..5, 1..5] of integer;
Но, повторяю, можно и так, как у Вас.
Vladimir_S вне форума   Ответить с цитированием
Старый 28.04.2014, 16:10   #3 (permalink)
furt123
Member
 
Регистрация: 06.12.2013
Сообщений: 25
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

да - верно. спасибо)
furt123 вне форума   Ответить с цитированием
Старый 28.04.2014, 21:58   #4 (permalink)
furt123
Member
 
Регистрация: 06.12.2013
Сообщений: 25
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от furt123 Посмотреть сообщение
for j := 1 to n - 1 do
for k := 1 to n - j do
if d[k] > d[k + 1] then begin
h := d[k];
d[k] := d[k + 1];
d[k + 1] := h
end;
обьясните пожалуйста эту часть кода (сортировка). далал по анологии с другими подобными заданиями на форуме. это метод пузыря?
в особенности интересует как понимать эту строку:
Цитата:
Сообщение от furt123 Посмотреть сообщение
for k := 1 to n - j do
furt123 вне форума   Ответить с цитированием
Старый 28.04.2014, 22:28   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от furt123 Посмотреть сообщение
обьясните пожалуйста эту часть кода (сортировка). далал по анологии с другими подобными заданиями на форуме. это метод пузыря? в особенности интересует как понимать...
Да, это метод пузырька. Подробно и, надеюсь, достаточно наглядно этот метод (в числе прочих) разобран в моей заметке Об алгоритмах упорядочения одномерных массивов.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 10.05.2014, 22:10   #6 (permalink)
furt123
Member
 
Регистрация: 06.12.2013
Сообщений: 25
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

понимаю, что наверно надоел. но всё равно надеюсь на вашу помощь.
преподователь просит сделать так, чтобы при отсутствии необходимости сортировать вектор программа не перемалывала его, а выходила из цикла. намекнул на использование флага. схема алгоритма у меня есть, но как реализовать это в тексте программы не понимаю. подскажите пожалуйста.
furt123 вне форума   Ответить с цитированием
Старый 10.05.2014, 22:59   #7 (permalink)
furt123
Member
 
Регистрация: 06.12.2013
Сообщений: 25
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

вроде справился) проверьте пожалуйста.
Цитата:
repeat
flag := False;
for j:=n-1 downto 1 do
if b[j] > b[j+1] then
begin
k:= b[j];
b[j] := b[j+1];
b[j+1] := k;
flag := True;
end;
until not flag;
furt123 вне форума   Ответить с цитированием
Старый 10.05.2014, 23:37   #8 (permalink)
furt123
Member
 
Регистрация: 06.12.2013
Сообщений: 25
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

или вот со счётчиком(выкладываю весь текст, поскольку сомневаюсь в коректности) :

Цитата:
program kursovoi_projekt;

var
a, c: array [1..5, 1..5] of integer;
b: array [1..5] of integer;
i, j, n, s, k, p: integer;
flag: Boolean;

begin
Write(' Ввод размерности матрицы n= ');
Readln(n);
for i := 1 to n do
for j := 1 to n do
begin
write('A[', i, ',', j, ']=');
Readln(a[i, j]);
end;
writeln('Исходная матрица A ');
for i := 1 to n do
begin
for j := 1 to n do
Write(' ', a[i, j], ' ');
writeln;
end;
writeln;
for j := 1 to n do
begin
s := 0;
for i := 1 to n do
s := s + a[i, j];
b[j] := s;
end;
Write('Вектор B--> ');
for j := 1 to n do
write(b[j]:4);
writeln; writeln;


i := 0;
repeat
i := i + 1;
flag := False;
for j := n - 1 downto 1 do
if b[j] > b[j + 1] then
begin
k := b[j];
b[j] := b[j + 1];
b[j + 1] := k;
flag := True;
end;
until not flag;

write('Отсортированный вектор B: ');
for j := 1 to n do
write(b[j]:4);

writeln;
for i := 1 to n do
for j := 1 to n do
begin
if i = j then c[i, j] := b[j] else c[i, j] := 0;
end;

writeln('Полученная матрица C:');
for i := 1 to n do
begin
for j := 1 to n do
Write(' ', c[i, j], ' ');
writeln;
end;
p := 0;
for i := 1 to n do
p := p + c[i, i];
writeln('След матрицы = ', p);
end.

если не ошибаюсь счётчик должен помогать в том, чтобы не сравнивать с элементом, который после первого прохода стоит на своём месте.
furt123 вне форума   Ответить с цитированием
Старый 11.05.2014, 09:38   #9 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от furt123 Посмотреть сообщение
если не ошибаюсь счётчик должен помогать в том, чтобы не сравнивать с элементом, который после первого прохода стоит на своём месте.
Ошибаетесь. Смысл этого вполне идиотского алгоритма таков: мы многократно проходим массив целиком, и при каждом проходе меняем местами соседние элементы, если они расположены "неправильно" (предыдущий больше последующего). И продолжаем так до тех пор, пока таких "неправильных" пар не останется. Ну что же, как говорится, "хозяин - барин", и если Вашему преподу нравится именно этот способ - то пусть будет так.
А ошибок в программе я не вижу.
Vladimir_S вне форума   Ответить с цитированием
Старый 11.05.2014, 12:02   #10 (permalink)
furt123
Member
 
Регистрация: 06.12.2013
Сообщений: 25
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

понял, спасибо.
furt123 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 15:44.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.