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

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

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

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> Матрица
сообщение
Сообщение #21


Уникальный
**

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

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


volvo
Цитата
Jahnerus
Я бы добавил еще кое-что:

var
x: longint;
...
Readln(s);
val(s, x, er);
if (er<>0) or (er < -maxint) or (er > maxint)
then writeln('Error');

Хе ! только щас увидел один нюанс ! smile.gif
Насколько я знаю процедура val возвращает код ошибки следующим образом,
код ошибки -
Цитата
позиция в которой произошла ошибка при преобразовании, или нуль, если ошибки не было.

а тогда встаёт вопрос нафига нужны два последних условия er < -maxint и er > maxint
первое так ваще не понятно, потому что позиция по определению не может быть отрецательной, а второе (это что защита от запаршей клавиши или от дурака набирающего число длиной больше 32767 символов blink.gif ) - кажется в строку и так больше 128 символов не введёшь с клавиатуры.
поэтому на мой взгляд оптимальный вариант это:
Код
var
x: longint;
...
Readln(s);
val(s, x, er);
if er<>0 then writeln('Error');


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


--------------------
Век живи, век учи С © by Jahnerus
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Гость






Jahnerus
Ошибка, конечно... Зачем er сравнивать с maxInt? Вот, что я имел в виду...
Код

var
x: longint;
...
Readln(s);
val(s, x, er);
if (er<>0) or (x < -maxint) or (x > maxint)
then writeln('Error');


Просто если задана матрица Integer-ов, то я бы и оставил integer (а для этого надо проверить, не выходит ли введенное пользователем число из допустимого диапазона...)

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Уникальный
**

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

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


Теперь всё встало на свои места ;)
Да и простите меня за мелочность:
Integer -32768..32767
следовательно не (x < -maxint), а (x < (-maxint-1)).


--------------------
Век живи, век учи С © by Jahnerus
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


Новичок
*

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

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


Что-то не могу понять что за "er" такое, в идентификаторах его нет.
А как-бы в этой проге сделать так, чтобы можно было вводить матрицу А такого размера, какого захочет пользователь (в разумных пределах), а не только 6х6.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


Гость






ghost
По-моему, так...
Код

const
   max_n = 30;
var
 a,b:array[1..max_n,1..max_n] of integer;
 i,j,n1,n2:integer;
 s: string; x: longint; er: integer;
 bn: boolean;
begin
   repeat
     write('matrix width = '); readln(n1);
   until (n1 <= max_n);
   repeat
     write('matrix height = '); readln(n2);
   until (n2 <= max_n);

   for i := 1 to n1 do
   for j := 1 to n2 do
     begin
       repeat
         write('a[', i, ',', j, '] = '); Readln(s);
         val(s, x, er);
         bn := (er<>0) or (x < -Pred(maxint)) or (x > maxint);
         if bn then writeln('Error');
       until not bn;
       a[i,j] := x;
     end;

   for i := 1 to n1 do
   for j := 1 to n2 do
   begin
        if a[i,j] > 0 then b[i,j] := a[i,j]
        else
        b[i,j] := 0;
   end;
   for i := 1 to n1 do
   begin
        writeln;
        for j := 1 to n2 do
        Write(a[i,j]:3);
   end;
   for i := 1 to n1 do
   begin
        WriteLn;
        for j := 1 to n2 do
        Write(b[i,j]:3);
   end;
end.


Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Новичок
*

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

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


А можно сделать так чтобы число строк не обязательно было равно числу стобцов. И ещё, при выводе матриц происходит что-то не понятное, их не видно. Выводится лишь часть матрицы А, а в В тоже выводится часть, но если нажать enter, то остальные строки будут выводится по одной.

Сообщение отредактировано: ghost -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #27


Гость






ghost
Исправлено...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #28


Новичок
*

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

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


Как будет выглядет б/с к этой немного переделанной проге
Код

uses crt;
const
  max_n = 9;
var
a,b:array[1..max_n,1..max_n] of integer;
i,j,n1,n2,error:integer;
s: string; x: longint; er: integer;
bn: boolean;
label e1;
begin
clrscr;
gotoxy  (3,10);
  writeln ('Данная программа задаёт матрицу А. После чего создаёт');
   gotoxy  (57,10);
  writeln ('новую матрицу B, где ');
   gotoxy  (12,11);
  writeln ('а) B(i,j) = A(i,j), если A(i,j) > 0');
   gotoxy  (12,12);
  writeln ('б) B(i,j) не равно 0, если A(i,j) <= 0');
   gotoxy  (7,14);
  writeln ('Элементами матрицы могут быть только целые числа от -32768 до 32767,');
   gotoxy  (18,15);
  writeln ('максимальный размер матрицы 9х9!');
   gotoxy  (12,17);
  writeln ('текст');
   gotoxy  (27,18);
  writeln ('текст');
   gotoxy  (18,20);
  writeln ('Нажмите любую клавишу для продолжения');
   readkey;
e1:
clrscr;
  repeat
    write('Введите кол-во строк = ');
{$I-} readln(n1);
error:=ioresult;{$I+}
IF (n1<2) or (n1>max_n) or (error<>0)
then  writeln ('Кол-во строк от 2 до 9!');
  until (n1 >= 2) and (n1<=max_n) and (error=0);

  repeat
    write('Введите кол-во столбцов = ');
    {$I-} readln(n2);
    error:=ioresult;{$I+}
    IF (n2<2) or (n2>max_n) or (error<>0)
    then writeln ('Кол-во столбцов от 2 до 9!');
  until (n2 >= 2) and (n2<=max_n) and (error=0);


  for i := 1 to n1 do
  for j := 1 to n2 do
    begin
      repeat
        write('a[', i, ',', j, '] = '); Readln(s);
        val(s, x, er);
        bn := (er<>0) or (x < -Pred(maxint)) or (x > maxint);
        if bn then writeln('Введённый вами символ вне диапозона от -32768 до 32767');
      until not bn;
      a[i,j] := x;
    end;

  for i := 1 to n1 do
  for j := 1 to n2 do
  begin
       if a[i,j] > 0 then b[i,j] := a[i,j]
       else
       b[i,j] := 0;
  end;
  clrscr;
  write('matrix A');
  for i := 1 to n1 do
  begin
       writeln;
       for j := 1 to n2 do
       Write(a[i,j]:7);
  end;

  writeln;
  write('matrix B');
  for i := 1 to n1 do
  begin
       writeln;
       for j := 1 to n2 do
       Write(b[i,j]:7);
       end;
       writeln ('');
       write('Вы хотите сделать ещё одну матрицу? y/n');
       case readkey of
   #89: goto  e1;
   #121: goto e1;
   #78: exit;
   #110: exit;
  end;
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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