IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> задача на матрицы
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской

Репутация: -  0  +


есть ошибка в условии "If Simple_number", пытался исправить, но видимо неверно. помогите исправить)
Const Nmax=100;
Type IndexType=1..Nmax;
     Matrix=Array[IndexType,IndexType] of Longint;
Function Simple_number(A:Longint): Boolean;
Var  d,b  : Word;
Begin
     A:=Abs(A);
     If A<2 then begin
        Simple_number:=False;
        Exit;
     End;
     Simple_number:=True;
     b:= trunc(sqrt(A));
     For d:=2 to b do begin
        If (A mod d)=0 then begin
           Simple_number:=False;
           break;
        End;
     End;
End;
Function exist_3(A:Longint): Boolean;
Var q,p  :Longint;
Begin
     A:=Abs(A);
     q:=A;
     exist_3:=False;
     While q>0 do begin
         p:=q mod 10;
         If p=3 then begin
            exist_3:=True;
            Exit;
         End;
         q:=q div 10;
     End;
End;
Procedure Change(Var A:Matrix; n:IndexType);
Var i,j  :IndexType;
    max  :Longint;

Begin
     max:=low(Longint);
     j:=1;
     While j<=n do begin
         For i:=1 to n do begin
            If A[i,j]>max then max:=A[i,j];
         End;
         A[j,j]:=max;
         inc(j);
     End;
End;
Procedure Out(A:Matrix; n:IndexType);
Var  i,j  :IndexType;
Begin
     Writeln;
     For i:=1 to n do begin
         For j:=1 to n do write(A[i,j]);
         Write(#10#13,#10#13);
     End;
End;

Var   A       :Matrix;
      i,j,n,m :Integer;
      count   :Word;
Begin
   Repeat
     Write('Vvedite parametri matrici(n<100)');
     Read(n);
     m:=n;
     Writeln('Matrix:');
   Until (n>=1) and (n<=Nmax);
   For i:=1 to n do begin
     For j:=1 to n do Read(A[i,j]);
   End;
   count:=0;
   For j:=1 to n do begin
      For i:=1 to n do Simple_number(A[i,j]);
      If Simple_number(A[i,j]) then begin
         exist_3(A[i,j]);
         If exist_3(A[i,j]) then inc(count);
      End;
   End;
   If (count=m) and (exist_3(A[i,j])) then begin
      Change(A,n);
   end;
   for i:=1 to n do begin
      for j:=1 to n do write(a[i,j]:5);
      writeln;
   end;
   readln;
End.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


The matrix has me!!!
**

Группа: Пользователи
Сообщений: 74
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


а что это прога именно делает? ну, или должна делать...


--------------------
"Брать производную можно научить даже обезьяну" - мой препод по матану! :-)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской

Репутация: -  0  +


значит так, если есть простые числа в каждой строке, которые содержат цифру 3, то заменить числа на главной диагонали на наибольшие числа соотвествующего столбца
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


прогу не запускал, на счет синтаксических не знаю, но
 For j:=1 to n do begin
      For i:=1 to n do Simple_number(A[i,j]); // < ---------- непонятно зачем вызываешь в цикле для для всех элементов
      If Simple_number(A[i,j]) then begin // а проверяешь значение только для посл. элемента столбца


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



UPDATE

кстати, я не уверен, но могу допустить что после цикла for по i, это самое i будет больше N, что может вызвать выход за границы массива


Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Процедура Change не правильная, совсем не понятно то, о чем уже сказал klem4.
Write(#10#13,#10#13);
А не проще написать
writeln;
If (count=m) and (exist_3(A[i,j])) 
А вот здесь странно, т.к. если в массиве 3х3 будет 4 простых элементов, то это уже не сработает, да тут еще
and (exist_3(A[i,j]))
, что вообщем не правильно...
Подправил твой код, подучилось так
Const Nmax=5;
Type IndexType=1..Nmax;
     Matrix=Array[IndexType,IndexType] of Longint;
Function Simple_number(A:Longint): Boolean;
Var  d,b  : Word;
Begin
     A:=Abs(A);
     If A<2 then begin
        Simple_number:=False;
        Exit;
     End;
     Simple_number:=True;
     b:=A div 2;
     For d:=2 to b do begin
        If (A mod d)=0 then begin
           Simple_number:=False;
           break;
        End;
     End;
End;
Function exist_3(A:Longint): Boolean;
Var q,p  :Longint;
Begin
     A:=Abs(A);
     q:=A;
     exist_3:=False;
     While q>0 do begin
         p:=q mod 10;
         If p=3 then begin
            exist_3:=True;
            Exit;
         End;
         q:=q div 10;
     End;
End;
Procedure Change(Var A:Matrix; n:IndexType);
Var i,j  :IndexType;
    max  :Longint;

Begin
     for i:=1 to n do begin
         max:=a[1,i];
         For j:=1 to n do begin
            If A[j,i]>max then max:=A[j,i];
         End;
         A[i,i]:=max;
     End;
End;
Procedure Out(A:Matrix; n:IndexType);
Var  i,j  :IndexType;
Begin
     Writeln;
     For i:=1 to n do begin
         For j:=1 to n do write(A[i,j]);
         Writeln;
     End;
End;

Var   A       :Matrix;
      i,j,n,m :Integer;
      count   :Word;
Begin
   Repeat
     Write('Vvedite parametri matrici(n<100)');
     Read(n);
     m:=n;
     Writeln('Matrix:');
   Until (n>=1) and (n<=Nmax);
   For i:=1 to n do begin
     For j:=1 to n do Read(A[i,j]);
   End;
   count:=0;
   i:=1;
   while i<=n do begin
      j:=1;
      while j<=n do begin
      If Simple_number(A[i,j]) then
          If exist_3(A[i,j]) then begin
            inc(count);
            j:=n
         end;
         inc(j)
      End;
      inc(i)
   End;
   If count=m then  Change(A,n);
   for i:=1 to n do begin
      for j:=1 to n do write(a[i,j]:5);
      writeln;
   end;
   readln;
End.
Если будет ошибка, скажешь где и какая именно
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Несколько мыслей вслух: во-первых, насчет реализации Simple_number: не надо пробегать от 2 до (A div 2), достаточно - до trunc(sqrt(A)), будет быстрее... Постоянное переприсваивание Simple_number то в True, то в False тоже не улучшает читабельность программы, вполне достаточно вначале присвоить значению функции False, а в самом конце - True, как это и сделано, скажем, здесь: Замечательные числа (функция isPrime)

Теперь еще одно: Client, как ты думаешь, что будет проще и быстрее, сначала проверить число на простоту и потом смотреть, есть ли в его записи цифра 3, или наоборот, сначала проверить, есть ли тройка и только потом, если она есть, проверять на простоту? smile.gif Я бы, наверное, выбрал второй вариант все-таки...

P.s. В exist_3, кстати, тоже лишние переприсваивания true/false, не надо загромождать программу лишними действиями...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Цитата
Я бы, наверное, выбрал второй вариант все-таки...
yes2.gif у меня как раз эти идеи были, но в выложенном коде подправил то что есть, чтоб (может быть) автору было понятнее, а если он потом хочет упростить, то пусть делает уже сам smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.04.2025 17:35
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name