Автор Тема: ПОМОГИТЕ С ПАСКАЛЕМ!!!  (Прочитано 12746 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн GerM

  • Ветеран
  • *****
  • Сообщений: 3160
  • Карма: -1013
  • Пол: Мужской
  • ...хихик...
    • Просмотр профиля
ПОМОГИТЕ С ПАСКАЛЕМ!!!
« : 21.01.07, 22:14:18 »
Не знаю в том ли разделе я создал тему...ну да ладно, помогите пожалуйста с Паскалем, одному хорошему человеку, очень просил...вот задачка, просто надо написать программу в Паскале...

В квадратной таблице обменяйте местами элементы строки и столбца на пересечении которых ноходится минимальный из положит элементов.

Заранее спасибо...

МОдераторы, сорри, но очень надо... <:/
 (с) GerM :-)


Insanity

  • Гость
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #1 : 22.01.07, 12:21:55 »
Могу помочь с таким на Бейсике, но если обязательно Паскаль - http://forum.codenet.ru/forumdisplay.php?f=27

Fаust

  • Гость
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #2 : 22.01.07, 15:38:37 »
Нате =)
Сеня ночью что-то не клеилось...переделал - получилось =)

uses Crt;
var
a,b:array [1..10,1..10] of Integer;
i,j,im,jm:Byte;
m:Integer;
begin
ClrScr;
randomize;

m:=101;
{/////////////////////////////////////////////////////////////////}
for i:=1 to 10 do begin
for j:=1 to 10 do begin
a[i,j]:=random(100);
if (a[i,j]>0) and (a[i,j]<m) then
begin
m:=a[i,j];
im:=i;jm:=j;
end;
end;
end;

{/////////////////////////////////////////////////////////////////}
for i:=1 to 10 do begin
for j:=1 to 10 do begin
                              b[i,j]:=a[i,j];
b[im,j]:=a[j,jm];
b[j,jm]:=a[im,j];
Write(a[i,j]:3);
end;
writeln;
end;
writeln;
for i:=1 to 10 do begin
for j:=1 to 10 do begin
Write(b[i,j]:3);
end;
   writeln;
end;

WriteLn(m,' || ',im,':',jm);

ReadKey;
end.

Оффлайн Mr DocToR

  • Ветеран
  • *****
  • Сообщений: 1159
  • Карма: -69
  • Пол: Мужской
    • Просмотр профиля
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #3 : 22.01.07, 17:28:53 »
Ты проверял свою прогу? [[cool4]]
Если да, то ты должен был заметить, что всё получается криво, если этот элемент лежит на перечесечии какой-нить 2ой строки и 3-ого столбца.. И получается всё норм, когда элемент лежит на диагоналях матрицы.

+ я не понял, зачем ты при переборе всех элементов делаешь это:" a[i,j] :=a [j,i]" ?

Вот посмотри мой текст. Я только беру минимальный полож не всей матрицы, а именно из тех элементов, которые лежат на диагоналях.(i=j или i+j=n+1, где nxn -размер массива.)

Fаust

  • Гость
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #4 : 22.01.07, 18:22:49 »
Ты проверял свою прогу? [[cool4]]
Если да, то ты должен был заметить, что всё получается криво, если этот элемент лежит на перечесечии какой-нить 2ой строки и 3-ого столбца.. И получается всё норм, когда элемент лежит на диагоналях матрицы.

+ я не понял, зачем ты при переборе всех элементов делаешь это:" a[i,j] :=a [j,i]" ?

Вот посмотри мой текст. Я только беру минимальный полож не всей матрицы, а именно из тех элементов, которые лежат на диагоналях.(i=j или i+j=n+1, где nxn -размер массива.)
Да, я проверял свою прогу
Где это я a[i,j] :=a [j,i] делаю? О_о о_О

Вот посмотри мой текст. Я только  беру минимальный полож не всей матрицы, а именно из тех элементов, которые лежат на диагоналях.(i=j или i+j=n+1, где nxn -размер массива.)

Посмотрел=) Лучше бы не смотрел=)
1. Ты задание читал? ПОчему ты говоришь, "Я только  беру минимальный полож не всей матрицы, а именно из тех элементов, которые лежат на диагоналях", хотя в задании просят: "В квадратной таблице обменяйте местами элементы строки и столбца на пересечении которых ноходится минимальный из положит элементов."
Я что-то не вижу ни слова про диагонали=)))
2. i+j=n+1, где nxn -размер массива --- я мож чего не понимаю...но если i,j - счетчики строк и столбцов, то условие i+j=n+1 не выполнимо=)))
Для примера - матрица 2х2, значит n=2, исзодя из этого i+j=3, исходя из этого i<>j ну никак=) Да и вообще чушь какая-то=)
3. Посмотрим скрин =)
3.1. Во-первых, по правилам записи номера элемента - первым числом записывается номер строки, а не столбца=) Ну да лана=)
3.2. Смотрим скрин =) У тебя прога нашла минимальный элемент=11, а как же первая строка?? А 9 вроде меньше 11 =)))) Ну да лана, опустим и это =)
То, что строки и столбцы не совсем совпадают - это коллизия из-за самой постановки задачи, опустим=) НО, столбец на строку намана заменился, а вот строка на столбец...НЕА=) посмотри в 3-ей строке выделил жОлтым=) У нас 21, а должно быть 11 =) Хотя может из первой таблицы эта 21 как-то закралась (не смотрел ещё код, потому не совсем понимаю почему;) )

ГОСПОДИ, не, я на этот ужас смотреть не могу=) ЗАЧЕМ МУДРИТЬ!?:)))))))
ИМХО, алгоритм:
1. Находим мин. эл-т в матрице
2. Запоминаем координаты этого эл-та
3. Формируем новую матрицу = первичной
4. В новой матрице за константу ставим строку(например, не помню что я на что менял в проге)))))))) ) и цикл по столбцам и приравниваем к столбцу из первичной матрицы, путем прогона по тому же циклу, только константа будет уже столбец, а строка идет по циклу. Константы - это координаты минимального элемента в матрице.
Точно так же меняем и столбец на строку.
5. вывод новой матрицы

Собссно, зачем такой код жуткий как у тебя - не понимаю. Зачем так много переменных? Когда надо всего 2 массива, 4 счетчика и 1 временная переменная для нахождения мин. элемента (пузырек ;) )

ПыСы. По существу про глюки моей проги выслушаю =) Желательно с картинками =)
ПыПыСы. Не претендую на супер-программера, но меня учили оптимизировать код. Чем проще система - тем стабильнее работа ;)

Оффлайн Mr DocToR

  • Ветеран
  • *****
  • Сообщений: 1159
  • Карма: -69
  • Пол: Мужской
    • Просмотр профиля
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #5 : 22.01.07, 23:41:06 »
Да, текст и впрям большой у мну.. просто последние ДЗ заставляли работать без введения новых массивов(привычка) =) + я рассматриваю все условия, которые могут привести к ошибке.
Вот исправил текст, была нелепая ошибка ("<>" не там поставил).

Дык, товарисц, вы моё сообщение даже , видимо, не дочитали, раз задаёте такие вопросы, ответы на которые лежат в предыдущем посту.
Да, кстати, можно даже задать условие, что если минимальный элемент лежит не на диагоналях, то поменять местами строку и столбец НЕЛЬЗЯ.
Поентому я просто ищу ОСОБЫЙ минимальный элемент.

Напишите ответ , если дана такая матрица:
213
456
789

ответ=?? :D


п.с. проверьте свою прогу ещё раз и посмотриче что у вас порядок элементов меняеца в этих строке и столбце.
п.с.2 А в условии сказано, что массив 10х10? []>0

Оффлайн exBoMBeR

  • Ветеран
  • *****
  • Сообщений: 21338
  • Карма: -273
  • Пол: Мужской
    • Просмотр профиля
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #6 : 23.01.07, 09:22:36 »
Не вижу причин создавать второй массив ... имхо это антиоптимизация  [[curtain]]
Проще надо быть ... проще ... если у нас есть im и jm хранящие строку и столбец с минимальным элементом то обмен строки и столбца выполняется за один проход цикла:

for i=1 to 10 do
begin
  m := a[i, jm];
  a[i, jm] := a[im, i];
  a[im, i] := m;
end;

при этом удачно используется имеющаяся переменная m и это действительно начинает напоминать оптимизацию ...

«И нет величия там, где нет простоты, добра и правды». Лев Николаевич Толстой.

Fаust

  • Гость
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #7 : 23.01.07, 17:38:39 »
Да, текст и впрям большой у мну.. просто последние ДЗ заставляли работать без введения новых массивов(привычка) =) + я рассматриваю все условия, которые могут привести к ошибке.
Вот исправил текст, была нелепая ошибка ("<>" не там поставил).

Дык, товарисц, вы моё сообщение даже , видимо, не дочитали, раз задаёте такие вопросы, ответы на которые лежат в предыдущем посту.
Да, кстати, можно даже задать условие, что если минимальный элемент лежит не на диагоналях, то поменять местами строку и столбец НЕЛЬЗЯ.
Поентому я просто ищу ОСОБЫЙ минимальный элемент.

Напишите ответ , если дана такая матрица:
213
456
789

ответ=?? :D


п.с. проверьте свою прогу ещё раз и посмотриче что у вас порядок элементов меняеца в этих строке и столбце.
п.с.2 А в условии сказано, что массив 10х10? []>0
ПОЧЕМУ нельзя менять местами? В условии нигде не сказано, что минимальный элемент должен остаться на своем месте ;) Не сказано и про идентичность. Так что это личные выводы и просто придирчивость.
По поводу размерности матрицы - если лень ручками поменять, можно использовать переменную, без проблем=) А ещё можно работать с открытыми массивами и вводить размерность с клавиатуры. Но зачем усложнять?

2exBoMBeR, хорошая идея, полностью согласен =)

Оффлайн M@lish

  • Ветеран
  • *****
  • Сообщений: 1605
  • Карма: -22
  • Пол: Мужской
  • ДАЕШЬ ПОЗИТИФ!Хачу карму[+]100
    • Просмотр профиля
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #8 : 23.01.07, 17:56:44 »
Нужен програмист на один день... Есть 2 задачи, которые нужно решить....но без обьяснения это не получиться... Поэтому, у кого есть время...в личку!

Не пытайтесь спорить с дебилом...иначе Вы опуститесь до его уровня...где он Вас задавит своим опытом...

По реке плывёт кирпич
Деревянный как стекл

Оффлайн Sht?ih(S_РФ)

  • Ветеран
  • *****
  • Сообщений: 1970
  • Карма: 137
  • Пол: Мужской
    • Просмотр профиля
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #9 : 23.01.07, 18:31:59 »
Люди.. а мне случаем не поможите? а то чет ни как не вьеду:

мож увидев готовую картину ченить и пойму.

вобщем задача такая:
"Дана матрица А(ввод элементов матрицы осуществляется с клавиатуры). Вывести на экран строку, сумма элементов которой больше."

Оффлайн LEND

  • Пользователь
  • **
  • Сообщений: 95
  • Карма: 155
  • Истина как всегда где-то рядом
    • Просмотр профиля
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #10 : 23.01.07, 18:46:59 »
Привет участникам темы
Случайно натолкнулся на эту тему.
Дана задача:
 В квадратной таблице обменяйте местами элементы строки и столбца
 на пересечении которых ноходится минимальный из положительных элементов.
 

Задачка не такая уж и сложная. GERM имел ввиду под квадратной таблицей - квадратную матрицу. Необязательно сначала применять RANDOM и RANDOMIZE. Дайте человеку понять саму матрицу, рассмотреть ее и на основе поставленной задачи даже взглядом определить минимальное положительное число в ней. Пусть он поймет и обоснует сначала на примере как это надо
сделать, а уж потом применяет автоматическое построение матрицы любой N величины.
И еще в условии задачи бы сказано про квадратную таблицу (квадратную матрицу). Могу напомнить, что такое вообще матрица и в частности квадратная матрица.
Так вот МАТРИЦА - прямоугольная таблица составленная из m-n чисел, называется
матрицей из m строк и n столбцов или матрицей размера m*n, а также еще m*n -
матрицей.

               |A11 A12 A13 ... A1n|
               |A21 A22 A23 ... A2n|  (1)
               |A31 A32 A33 ... A3n|

Числа Aij(i=1,2,...,m; j=1,2,...,n) называются элементами матрицы;
первый индекс i элемента указывает номер строки, в которой стоит элемент матрицы, а второй индекс j - номер столбца.
Матрица (1) может обозначаться также
    ||Aij||, i=1,2,...,m; j=1,2,2,...,n
Кроме того, для матриц используются обозначения
       (Aij) и [Aij]

Квадратная матрица(порядка n) - это когда число строк матрицы равно числу
ее столбцов ( и равно n)


Я даю наглядное решение этой задачи:
Пусть есть квадратная матрица массивом 3x3
                  3 -5  1
                  2  6  4
                 -4  8  7
Наименьшее положительное число здесь 1
Тогда в этом случае строка матрицы массива 3x3, где находится число 1
                 3,-5,1
Столбец  1,4,7

Необходимо заменить столбец на строку или строку на столбец(разницы нет)
При замене строка - 7,4,1 а столбец 1,-5,3
Причем не должна переставляться только 1(наименьший полож.элемент), а остальные элементы заменяемых строк и столбцов могут переставляться как угодно, т.е. 4,7,1 а столбец 1,3,-5
В этом суть не меняется исходя из условия задачи. Там в какой последовательности должны идти переменные - не указано.

Можно устанавливать наименьшее положительное число в любую ячейку.
При расчете это число должно находиться где бы оно не стояло и от него начинался отсчет замены.
И так можно решить другие квадратные матрицы любого объема.
Частный случай(пример 1):
uses crt;
const
 (*Не ставьте только n=1 и по 1 элементу. В программе можно сделать на это защиту.*)
 n=3; {Кол.элементов последовательности}
  Matrix:array[1..3,1..3] of integer=((3,-5,1),(2,6,4),(-4,8,7));
var
 i,j,ii,jj: integer;                      {счетчики}
 Min:integer;                          {минимальный положительный элемент в массиве}
 stolb,strok:integer;                {столбец и строка}
 strMas:array[1..n] of integer;  {элементы массива строки}
 stbMas:array[1..n] of integer; {элементы массива столбца}
 kolstb,kolstr:integer;              {кол. столбцов и строк в матрице}
 obmen:integer;                     {переменная обмена}
BEGIN
ClrScr;


          Min:=0;
for i:=1 to n do begin
  for j:=1 to n do begin
              if (Matrix[i,j]<>0) and (Matrix[i,j]>0) then begin
                      Min:=Matrix[i,j];
                                                       end;
                   end;
                 end;

          if Min=0 then begin
           writeln('Элементы массива - отрицательные!');
           readln;
           halt;
                        end;

writeln(' ':10,'Матрица');
{===== Выводим матрицу и находим наименьший положительный ее элемент}
for i:=1 to n do begin
  for j:=1 to n do begin
     if (Min>=Matrix[i,j]) and (Matrix[i,j]>0) then begin
                                                    Min:=Matrix[i,j];
                                                    strok:=i;
                                                    stolb:=j;
                                                    end;
    write('Matrix(',i,',',j,')=',Matrix[i,j],' ');
                     end;
           writeln
                  end;
{readln;}


 writeln('Минимальное положительное в матрице число -> ',Min);
 writeln('Строка при мини. положительном числе -> ',strok);
 writeln('Столбец при мини. положительном числе -> ',stolb);
 writeln(' ---------------------------');
   for i:=1 to n do begin
    for j:=1 to n do begin
    {================= Определяем и записываем строки}
             if i=strok then begin
                             inc(ii);
                             strMas[ii]:=Matrix[strok,j];
                            end;

    {================= Определяем и записываем столбцы}
             if j=stolb then begin
                             inc(jj);
                             stbMas[jj]:=Matrix[i,stolb];
                             end;
                     end;
                    end;
  kolstb:=n;
  kolstr:=n;
writeln('Количество строк -> ',kolstr);
writeln('Количество столбцов -> ',kolstb);

{===============================================}
          write('Было - строка: ');
          for ii:=1 to n do begin
           write(strMas[ii],' ');
                            end;
       writeln;
{======================= Показ столбцов ==============}
          write('Было - столбец: ');
          for jj:=1 to n do begin
                write(stbMas[jj],' ');
                            end;
       writeln;
       writeln(' ---------------------------');
{=====================================================}

{===================== Обмен строк =========}
          for ii:=1 to n do begin
                    if ii=stolb then begin
                        obmen:=strMas[strok];
                        strMas[strok]:=strMas[ii];
                        strMas[ii]:=obmen;
                     end;
                          end;
{===================== Обмен столбцов =========}
          for jj:=1 to n do begin
                    if jj=strok then begin
                        obmen:=stbMas[stolb];
                        stbMas[stolb]:=stbMas[jj];
                        stbMas[jj]:=obmen;
                                     end;
                          end;
{========================= Показ столбцов ======================}
               write('Стало - столбец: ');
          for ii:=1 to n do begin
           write(strMas[ii],' ');
                            end;
       writeln;
{======================= Показ строк ==============}
               write('Стало - строка: ');
          for jj:=1 to n do begin
                write(stbMas[jj],' ');
                            end;
       writeln;
       writeln(' ---------------------------');
{=====================================================}

for i:=1 to n do begin
  for j:=1 to n do begin
               if i=strok then begin
                             Matrix[strok,j]:=stbMas[j];
                            end;
                if j=stolb then begin
                      Matrix[i,stolb]:=strMas; {здесь пишется strMas(i) - только скобки квадратные }
                                end;                    {тег i не дает их писать}
                   end;
                 end;

for i:=1 to n do begin
  for j:=1 to n do begin
   write('Matrix(',i,',',j,')=',Matrix[i,j],' ');
                   end;
           writeln
                  end;

writeln('Продолжение - ENTER(ВВОД)');
readln;
END.

Можно увеличить статический массив. Можно переставить элементы массива.
При увеличение нужно добавить в массив еще элементы и изменить n

Даю пример расчета - полученный результат.
« Последнее редактирование: 23.01.07, 22:31:16 от LEND »
В мире временном, сущность которого - тлен,
Не сдавайся вещам несущественным в плен. © О.Х.

Оффлайн LEND

  • Пользователь
  • **
  • Сообщений: 95
  • Карма: 155
  • Истина как всегда где-то рядом
    • Просмотр профиля
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #11 : 23.01.07, 19:00:20 »
А вот теперь когда алгоритм ясен можно сделать и автоматическое построение матрицы
Создание алгоритма не вызывает проблем.
Не ставьте только n1=1, хотя в программе можно сделать на это защиту.

Пример 2

uses crt;
const
 n1=9;
 { где n1 =4,9,25,36,49 и т.д. квадраты}
var
 n:integer;
 i,j,ii,jj,m: integer;                               {счетчики}
 Min:integer;                                      {минимальный положительный элемент в массиве}
 stolb,strok:integer;                            {столбец и строка}
 strMas:array[1..100] of integer;           {элементы массива строки}
 stbMas:array[1..100] of integer;          {элементы массива столбца}
 kolstb,kolstr:integer;                         {кол. столбцов и строк в матрице}
 obmen:integer;                                {переменная обмена}
 kor:integer;                                     {целое число из корня n1}
 k:array[1..n1] of integer;                   {Массив случайных чисел}
 Matrix:array[1..100,1..100] of integer; {Массив матрицы - можно взять и больше}
BEGIN
ClrScr;
if Trunc(sqrt(n1))<>sqrt(n1) then begin
 writeln('Вводите целое число и т.д 4,9,25,36,49 ');
   readln;
   halt
end;
{==================== Находим корень =============}
      kor:=TRUNC(sqrt(n1));
      n:=kor;
writeln('Дана последовательность ',n1,' чисел');
    (* RANDOMIZE; {Менять последовательность}*) {можно разремачить}
        Min:=0;
  for m:=1 to n1 do begin
        k[m]:=RANDOM(-m);
        k[m]:=k[m] div 1000;
         if (k[m]<>0) and (k[m]>0) then Min:=k[m];
        write(k[m],' ')
                     end;

          if Min=0 then begin
           writeln('Элементы массива - отрицательные!');
           readln;
           halt;
                        end;
{========== Создаем матрицу исходя из получ. квадр. корня ================}
                 i:=1;
                 j:=0;
            for m:=1 to n1 do begin
                if j=kor then begin
                  j:=0;
                  i:=i+1
                end;
                  j:=j+1;
                 Matrix[i,j]:=k[m];
                              end;
writeln;
{===== Выводим матрицу и находим наименьший положительный ее элемент}
writeln(' ':10,'Матрица');
for i:=1 to n do begin
  for j:=1 to n do begin
     if (Min>=Matrix[i,j]) and (Matrix[i,j]>0) then begin
                                                    Min:=Matrix[i,j];
                                                    strok:=i;
                                                    stolb:=j;
                                                    end;
   write('Matrix(',i,',',j,')=',Matrix[i,j],' ');
                   end;
           writeln
                  end;
readln;
 writeln('Минимальное положительное в матрице число -> ',Min);
 writeln('Строка при мини. положительном числе -> ',strok);
 writeln('Столбец при мини. положительном числе -> ',stolb);
 writeln(' ---------------------------');
   for i:=1 to n do begin
    for j:=1 to n do begin
    {================= Определяем и записываем строки}
             if i=strok then begin
                             inc(ii);
                             strMas[ii]:=Matrix[strok,j];
                            end;

    {================= Определяем и записываем столбцы}
             if j=stolb then begin
                             inc(jj);
                             stbMas[jj]:=Matrix[i,stolb];
                             end;
                     end;
                    end;
  kolstb:=n;
  kolstr:=n;
writeln('Количество строк -> ',kolstr);
writeln('Количество столбцов -> ',kolstb);

{===============================================}
          write('Было - строка: ');
          for ii:=1 to n do begin
           write(strMas[ii],' ');
                            end;
       writeln;
{======================= Показ столбцов ==============}
          write('Было - столбец: ');
          for jj:=1 to n do begin
                write(stbMas[jj],' ');
                            end;
       writeln;
       writeln(' ---------------------------');
{=====================================================}

{===================== Обмен строк =========}
          for ii:=1 to n do begin
                    if ii=stolb then begin
                        obmen:=strMas[strok];
                        strMas[strok]:=strMas[ii];
                        strMas[ii]:=obmen;
                     end;
                          end;
{===================== Обмен столбцов =========}
          for jj:=1 to n do begin
                    if jj=strok then begin
                        obmen:=stbMas[stolb];
                        stbMas[stolb]:=stbMas[jj];
                        stbMas[jj]:=obmen;
                                     end;
                          end;
{========================= Показ столбцов ======================}
               write('Стало - столбец: ');
          for ii:=1 to n do begin
           write(strMas[ii],' ');
                            end;
       writeln;
{======================= Показ строк ==============}
               write('Стало - строка: ');
          for jj:=1 to n do begin
                write(stbMas[jj],' ');
                            end;
       writeln;
       writeln(' ---------------------------');
{=====================================================}

for i:=1 to n do begin
  for j:=1 to n do begin
               if i=strok then begin
                             Matrix[strok,j]:=stbMas[j];
                            end;
                if j=stolb then begin
                      Matrix[i,stolb]:=strMas; {здесь пишется strMas(i) - только скобки квадратные }
                                end;                   {тег i не дает их писать}
                   end;
                 end;

for i:=1 to n do begin
  for j:=1 to n do begin
   write('Matrix(',i,',',j,')=',Matrix[i,j],' ');
                   end;
           writeln
                  end;

writeln('Продолжение - ENTER(ВВОД)');
readln;
END.


Алгоритм можно применить и не только для квадратных матриц
В частном(примере 1) можно варьировать кол. элементов и n
Даю примеры расчета - данные результата.

Ну вот и все.
С уважением к участникам ТЕМЫ

LEND
« Последнее редактирование: 23.01.07, 22:32:36 от LEND »
В мире временном, сущность которого - тлен,
Не сдавайся вещам несущественным в плен. © О.Х.

Оффлайн Роза Люксембург

  • Старожил
  • ****
  • Сообщений: 350
  • Карма: 144
  • Пол: Женский
    • Просмотр профиля
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #12 : 23.01.07, 19:59:36 »
Люди.. а мне случаем не поможите? а то чет ни как не вьеду:

мож увидев готовую картину ченить и пойму.

вобщем задача такая:
"Дана матрица А(ввод элементов матрицы осуществляется с клавиатуры). Вывести на экран строку, сумма элементов которой больше."

считаете сумму элементов каждой строки и смотрите кто больше, например:
a(mxn) - исходный массив
b(1xn) - искомая строка

smax = 0; - сумма элементов искомой строки

for i = 1 to m
{
   s = 0;
   for ii = 1 to n
   {
      s = s + a(i, ii); 
   }
   if s > smax then
   {
      smax = s;
      for q= 1 to n
      {
         b(1, q) = a(i, q)
      }

   }
}

вы, правда, не сказали на каком языке надо, но основная идея такая...

Оффлайн Sht?ih(S_РФ)

  • Ветеран
  • *****
  • Сообщений: 1970
  • Карма: 137
  • Пол: Мужской
    • Просмотр профиля
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #13 : 23.01.07, 22:49:00 »
Люди.. а мне случаем не поможите? а то чет ни как не вьеду:

мож увидев готовую картину ченить и пойму.

вобщем задача такая:
"Дана матрица А(ввод элементов матрицы осуществляется с клавиатуры). Вывести на экран строку, сумма элементов которой больше."

считаете сумму элементов каждой строки и смотрите кто больше, например:
a(mxn) - исходный массив
b(1xn) - искомая строка

smax = 0; - сумма элементов искомой строки

for i = 1 to m
{
   s = 0;
   for ii = 1 to n
   {
      s = s + a(i, ii); 
   }
   if s > smax then
   {
      smax = s;
      for q= 1 to n
      {
         b(1, q) = a(i, q)
      }

   }
}

вы, правда, не сказали на каком языке надо, но основная идея такая...
Идею я понял.. язык - турбопаскаль.. а вот как эту  идею в жизнь воплотить?

Fаust

  • Гость
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #14 : 24.01.07, 08:01:39 »
2Lend,доброго времени суток и Вам. Можно немного критики и обсуждения касаемо предложенного кода?

1.

          Min:=0;
for i:=1 to n do begin
  for j:=1 to n do begin
              if (Matrix[i,j]<>0) and (Matrix[i,j]>0) then begin
                      Min:=Matrix[i,j];
                                                       end;
                   end;
                 end;

          if Min=0 then begin
           writeln('Элементы массива - отрицательные!');
           readln;
           halt;
                        end;

writeln(' ':10,'Матрица');
{===== Выводим матрицу и находим наименьший положительный ее элемент}
for i:=1 to n do begin
  for j:=1 to n do begin
     if (Min>=Matrix[i,j]) and (Matrix[i,j]>0) then begin
                                                    Min:=Matrix[i,j];
                                                    strok:=i;
                                                    stolb:=j;
                                                    end;

>>>>Зачем разделять проверку на наличие элемента больше 0 и нахождение наименьшего из найденных элементов больше 0??? Лишние строки кода, ибо можно было сделать так:

{===== Выводим матрицу и находим наименьший положительный ее элемент}
for i:=1 to n do begin
  for j:=1 to n do begin
     if (Min>=Matrix[i,j]) and (Matrix[i,j]>0) then begin
                                                    Min:=Matrix[i,j];
                                                    strok:=i;
                                                    stolb:=j;
                                                    end;
if Min=0 then begin
           writeln('Элементы массива - отрицательные!');
           readln;
           halt;
                        end;
__________________________________________________
for i:=1 to n do begin
  for j:=1 to n do begin
              if (Matrix[i,j]<>0) and (Matrix[i,j]>0) then begin
                      Min:=Matrix[i,j];
                                                       end;
                   end;
                 end;
__________________________________________________
ИМХО - лишнее.

2.
for i:=1 to n do begin
    for j:=1 to n do begin
    {================= Определяем и записываем строки}
             if i=strok then begin
                             inc(ii);
                             strMas[ii]:=Matrix[strok,j];
                            end;

    {================= Определяем и записываем столбцы}
             if j=stolb then begin
                             inc(jj);
                             stbMas[jj]:=Matrix[i,stolb];
                             end;
                     end;
                    end;

>>>>А зачем инкапсуляция? (вернее даже вообще нужно использование ii???) И зачем делать ставить условие на равенство i и strok,stolb? Мы уж знаем индексы элемента. Лишнее действие...

3. При включеном randomize; числа при генерации будут ВСЕГДА разными. Если randomize не прописан, то числа одинаковые при каждом запуске программы ;) Зачем вообще код такой по генерации? Зачем изобретать велосипед? Вот эти операции с корнями и проч.... не понимаю...




СОББСНО, ВОПРОС КО ВСЕМ: ПОЧЕМУ НЕ УСТРОИЛ КОД МОЕЙ ПРОГРАММЫ?:) Где в нем ошибка и зачем такое бессмысленное количество строк кода? Все просто и не надо усложнять жизнь ;)
Пису пис ;)

Fаust

  • Гость
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #15 : 24.01.07, 08:17:31 »
Идею я понял.. язык - турбопаскаль.. а вот как эту  идею в жизнь воплотить?
uses Crt;
var
a:array[1..10,1..10] of Integer;
im,i,j:Byte;
mm,m:Integer;
begin
ClrScr;
for i:=1 to 10 do
  for j:=1 to 10 do
     begin
       Write('Введите элемент массива ',i,',',j,': ');
       Read(a[i,j]);
     end;
for i:=1 to 10 do begin
 m:=0;
  for j:=1 to 10 do
     begin
       m:=m+a[i,j];
       
     end;
 if m>mm then begin
                       mm:=m;
                       im:=i;
                    end;
                        end;
WriteLn('Сумма элементов: ', m);
WriteLn('Номер строки: ',im);
for j:=1 to 10 do Write(a[im,j]:3);
ReadKey;
end.

ПыСы. Чот я жоско так 10х10 массив забил  [[china]]  <:/

Оффлайн Sht?ih(S_РФ)

  • Ветеран
  • *****
  • Сообщений: 1970
  • Карма: 137
  • Пол: Мужской
    • Просмотр профиля
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #16 : 24.01.07, 18:55:54 »
Спасибо , Faust! теперь врубился..

Fаust

  • Гость
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #17 : 24.01.07, 19:23:49 »
Спасибо , Faust! теперь врубился..
Не за что =)

Оффлайн LEND

  • Пользователь
  • **
  • Сообщений: 95
  • Карма: 155
  • Истина как всегда где-то рядом
    • Просмотр профиля
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #18 : 24.01.07, 21:19:47 »
Faust
Я сейчас перепесал и запустил твой код
и вот что получил.
Твой код указан в твоем посту. Я его и взял.

================== Трехмерная матрица ================
1 пример
 51  3 72
 71 33 71               Наименьшее число 3 1строка, 2 столбец
 72 44 30                        1 строка  - 51 3  72
                                 2 столбец - 3  33 44
  3 33 44
 71  3 71                        Должно быть
 72 72 30                        по строке    -  33 3 44                       
3 || 1:2                         по столбцу   -  3 51 72                                       

                                 Получаем при замене
                                 по строке    -  3 33 44 - это правильно
                                 а по столбцу    33 3 72
 
                                 где число 51
                                 Причем если ты не оставляешь на месте
                                 наименьшее число - значит затираешь цифру 
     

2 пример
 95 85 22
 15 75 10               Наименьшее число 10  2строка, 3 столбец           
 27 60 62                        2 строка  - 15 75 10                   
                                 3 столбец - 22 10 62                   
 95 85 15                                                               
 22 10 62                        Должно быть                             
 27 60 10                        по строке    -  15 10 75 
10 || 2:3                        по столбцу   -  22 62 10                 
                                                                         
                                 Получаем при замене                     
                                 по строке    -  22 10 62 - это правильно               
                                 а по столбцу    15 62 10                 
                                                                         
                                 где число 75 

                                 Опять же если ты не оставляешь на месте
                                 наименьшее число - значит затираешь цифру 

================== Четырехмерная матрица ================
 64 30 95 89
 78 25 44 59
  3 62 54 23
 29 89 63 41
                       Наименьшее число 3  3строка, 1 столбец           
  3 30 95 89                    3 строка  -  3 62 52 23                     
 62 25 44 59                    1 столбец - 64 78  3 29                   
 54 78  3 29                                                             
 23 89 63 41                    Должно быть                             
3 || 3:1                        по строке    -  3 64 78 29                 
                                по столбцу   -  62 54 3 23                 
                                                                         
                                Получаем при замене                     
                                по строке    -  54 78  3 29 
                                а по столбцу     3 62 54 23                 
                                                                         
                                где число 64                             
                                                                         
                                Опять же если ты не оставляешь на месте 
                                наименьшее число - значит затираешь цифру


 49 31 42 60
 98  2 35 93
  1  6 59 82
  9 42 77 39

  1 31 42 60
  6  2 35 93
 59 98  1  9
 82 42 77 39
1 || 3:1

И так большинство матриц
Я не проверял выше, но думаю что то же так будет.
И как ты думаешь?
Но в матрице вместе с положительными цифрами могут быть и отрицательные.
И как ты на это смотришь.
Но ты сделал работу. Ты должен сам разобраться в своем коде. Скажу только одно. Твоя ошибка заключается в том, что ты не понял что наименьшее положительное число не должно перемещаться, а должно находится на том же месте.
Поэтому твой код неверен, где - должен разобраться сам. Посиди и подумай.
Но я знаю - ты парень граммотный и решишь эту задачу. Я уверен что ты с этим справишься.
И у меня не всегда получается. Поэтому прежде чем показывать код, я его тщательно проверяю.

А насчет критики - каждый пишет так как может, лишь бы результаты были верны.
С уважением
LEND

2Sht?ih(S_РФ)
 Я также предлагаю свое решение задачи
 Вчера эту задачу не увидел, т.к. прочитал не все посты в этой ТЕМЕ.
 Заметил только сейчас. Сел и написал тем боле что задачка уж очень легкая.
 Я написал 3 способа решения, но так Faust уже дал решение я приведу один из них
uses crt;
const
 nstr=2; {Кол. строк в матрице}
 nstb=3; {Кол. столбцов в матрице}
var
 i,j: integer;                                        {счетчики}
 Max:integer;                                      {Максимальная сумма в матрице по строкам}
 s,st:integer;                                      {s-сумма по строке, st - строка}
 Matrix:array[1..nstr,1..nstb] of integer;  {Массив матрицы A}
BEGIN
ClrScr;
if (nstr=1) or (nstb=1) then begin
writeln('Недопустимое число для составления матрицы');
            halt;
            end;

{=========== Ручной ввод с клавиатуры в матрицу A(nstr,nstb) ==========}
writeln(' ':10,'Матрица A');
for i:=1 to nstr do begin
  for j:=1 to nstb do begin
  write('Введите элементы строки ',i,' в матрицу A(',nstr,',',nstb,') ->');
  read(Matrix[i,j]);
                      end;
                    end;
writeln('Продолжение - ENTER(ВВОД)');
readln;

{=== Вывод элементов матрицы на дисплей =========}
for i:=1 to nstr do begin
  for j:=1 to nstb do begin
write('Matrix(',i,',',j,')=',Matrix[i,j],' ');
                      end;
                writeln;
                    end;
writeln('Количество строк -> ',nstr);
writeln('Количество столбцов -> ',nstb);
writeln(' ---------------------------');


{=== Запись Максимальной суммы и строки ======}
for i:=1 to nstr do begin
                s:=0;
  for j:=1 to nstb do begin
                   s:=s+Matrix[i,j];
                   end;
           writeln('Строка матрицы -> ',i,' сумма по строке -> ',s);

                   if i=1 then begin
                                Max:=s;
                                st:=i;
                               end
                               else begin
        if Max<s then begin
            Max:=s; {Максимальная сумма в матрице по строке}
            st:=i;       {Строка матрицы где найдена максимальная сумма}
                      end;
                                    end;
                 end;
writeln('Максимальная сумма матрицы A=',Max,' находится в строке ',st);
writeln('Продолжение - ENTER(ВВОД)');
readln;
END.


В мире временном, сущность которого - тлен,
Не сдавайся вещам несущественным в плен. © О.Х.

Fаust

  • Гость
Re:ПОМОГИТЕ С ПАСКАЛЕМ!!!
« Ответ #19 : 24.01.07, 22:55:25 »
2LEND, те пропадающие элементы пропадают по той причине, что сначала я забиваю в новой матрице столбец, а потом строку=) Если сделать наоборот - теряться будет элемент из строки первичной матрицы =) В задании указано поменять местами, про сохранение элемента ничего не сказано. Как вариант - подставлять по уже имеющимся координатам минимального элемента сам этот элемент, то есть возвращать его на место И ВСЕ РАВНО=) Будем терять элементы. А почему? А потому что при такой замене адресация тоже меняется и i <> j. Не потерять ни одного элемента можно лишь тогда, когда эти элементы лежат на главной и побочной диагонали, о чем писал mr Doctor ...

По поводу задачи 2, что-то не учел, что матрица может быть и не квадратной=)

ПыСы. Приятно пообщаться с адекватным, грамотным человеком=)