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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2015, 11:25   #1
_Marchel_
Пользователь
 
Регистрация: 14.11.2015
Сообщений: 17
По умолчанию Квадратная матрица

Задана матрица X[N,N], где N<=15. В каждом столбце матрицы поменять местами минимальный элемент и элемент главной диагонали. Преобразованную матрицу вывести на экран.

Ребят, почти всю программу написал, минимум нашёл, а вот минимальный элемент столбца с элементом главной диагонали не меняет, подскажите как исправить.

Код:
program ABC;
const Nmass=15;
var X:array[1..Nmass,1..Nmass] of integer;
 N,min,i,j,z: integer;
begin
 cls;
 //ручной ввод массива
 writeLn('Введите число элементов в массиве X');
 readLn(N);
 writeLn('Вводим элементы массива X:');
 for i:=1 to N do
 for j:=1 to N do
 begin
 write('X[',i,',',j,']=');
 readLn(X[i,j]);
 end;
 //вывод массива до измененния 
 
 writeLn('Исходный массив X:');
 for i:=1 to N do
 begin
 for j:=1 to N do
 write(X[i,j]:5);
 writeLn;
 end;
 // замена элементов
 For j:=1 to n do
 begin
  min:=9999;
 for i:=1 to n do
 If x[i,j] < min then
 begin
 min:=x[i,j];
 X[j,j]:=min;
 end;
 end;
 //вывод массива поле измененния
 writeLn;
 writeLn('массив X после изменения:');
 for i:=1 to N do
 begin
 for j:=1 to N do
 write(X[i,j]:5);
 writeLn;
 end;
end.
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 12.12.2015 в 11:28.
_Marchel_ вне форума Ответить с цитированием
Старый 12.12.2015, 11:46   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не, не так..

попробуйте такой код:
Код:
  // замена элементов
 For j:=1 to n do
 begin
   // поиск минимального элемента в столбце
   minRowIndex:=1;
   for i:=2 to n do
     If X[i,j] < X[minRowIndex,j] then minRowIndex:=i;

   //обменяем элементы местами
   tempX := X[j,j];
   X[j,j] := X[minRowIndex,j];
   X[minRowIndex,j] := tempX;
  
 end;

не забудьте в var описать переменную minRowIndex типа Integer
и переменную tempX такого же типа, как элементы массива X (в данном случае, тоже типа Integer)


если что-то непонятно, то спрашивайте.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.12.2015, 11:54   #3
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

надо не только MIN искать, но и помнить его позицию J,I
Код:
If x[i,j] < min then
 begin
    min:=x[i,j];
    mini:=i;minj:=j;
 end;
    x[j,j]      :=x[j,j]+x[mini,minj];
    x[mini,minj]:=x[j,j]-x[mini,minj];
    x[j,j]      :=x[j,j]-x[mini,minj];
upd. minj=j полюбому. значит вместо minj пишем j
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.

Последний раз редактировалось Aleksandr H.; 12.12.2015 в 11:57.
Aleksandr H. вне форума Ответить с цитированием
Старый 12.12.2015, 12:03   #4
_Marchel_
Пользователь
 
Регистрация: 14.11.2015
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
не, не так..

попробуйте такой код:
Код:
  // замена элементов
 For j:=1 to n do
 begin
   // поиск минимального элемента в столбце
   minRowIndex:=1;
   for i:=2 to n do
     If X[i,j] < X[minRowIndex,j] then minRowIndex:=i;

   //обменяем элементы местами
   tempX := X[j,j];
   X[j,j] := X[minRowIndex,j];
   X[minRowIndex,j] := tempX;
  
 end;

не забудьте в var описать переменную minRowIndex типа Integer
и переменную tempX такого же типа, как элементы массива X (в данном случае, тоже типа Integer)


если что-то непонятно, то спрашивайте.
спасибо большое, всё работает, очень помогли !

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
надо не только MIN искать, но и помнить его позицию J,I
Код:
If x[i,j] < min then
 begin
    min:=x[i,j];
    mini:=i;minj:=j;
 end;
    x[j,j]      :=x[j,j]+x[mini,minj];
    x[mini,minj]:=x[j,j]-x[mini,minj];
    x[j,j]      :=x[j,j]-x[mini,minj];
upd. minj=j полюбому. значит вместо minj пишем j
большое спасибо, возьму на заметку !

Последний раз редактировалось Stilet; 12.12.2015 в 16:09.
_Marchel_ вне форума Ответить с цитированием
Старый 12.12.2015, 12:11   #5
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Serge_Bliznykov, подскажите такой момент: массив Х - integer, заполняю его, например,
Код:
a[i,j]:=10000+random(500)
тогда код ТС не будет работать из-за строки
Код:
min:=9999;
. Для обхода етого случая надо min приcваивать не 9999, а значение первого елемента столбца j. Вопрос: почему у меня получилось такое большое число (см скрин)? или проблема не в
Код:
 min:=a[1,j]
Изображения
Тип файла: jpg att.jpg (76.2 Кб, 75 просмотров)
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 12.12.2015, 13:02   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

mini тоже начальное значение нужно - минимум может быть в первой строке
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.12.2015, 13:20   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
mini тоже начальное значение нужно - минимум может быть в первой строке
опередили!

всё так.
в вашем случае мало написать
Цитата:
Код:
min:=a[1,j];
нужно
Код:
mini:=1;
min:=a[1,j];
но вообще, я бы предложил значение min вообще не хранить.
Какой в этом смысл, если у Вас есть переменная mini, где находится индекс минимального значения?!
Выбросите min и вместо неё пишите X[mini,j]

смотрите, например, мой пример выше...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.12.2015, 13:57   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Попробовал на Д7, там еще выпендреж компилятора с оптимизацией цикла в отладке. Обмен так сделать и все будет Ok
Код:
    k:=x[j,j];
    x[j,j]:=x[mini,j];
    x[mini,j]:=k;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.12.2015, 15:19   #9
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Попробовал на Д7, там еще выпендреж компилятора с оптимизацией цикла в отладке. Обмен так сделать и все будет Ok
Код:
    k:=x[j,j];
    x[j,j]:=x[mini,j];
    x[mini,j]:=k;
это классика обмена, а я решил выделаться и без вспомогательной переменной обойтись "криатифф низащитан"
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
квадратная матрица C/C++ vadimc Помощь студентам 1 02.12.2013 10:54
Квадратная матрица MrRifleman Общие вопросы C/C++ 1 02.04.2012 21:02
Квадратная матрица SVing Паскаль, Turbo Pascal, PascalABC.NET 7 13.12.2011 00:58
Квадратная матрица D|Frost| Общие вопросы C/C++ 4 05.07.2011 16:39
квадратная матрица Tata4ka Помощь студентам 2 02.11.2010 13:47