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

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

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

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> Матрица
Jahnerus
сообщение 5.12.2004 1:04
Сообщение #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 - 5.12.2004 1:10


--------------------
Век живи, век учи С © by Jahnerus
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.12.2004 1:07
Сообщение #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 - 5.12.2004 1:10
 К началу страницы 
+ Ответить 
Jahnerus
сообщение 5.12.2004 1:16
Сообщение #23


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

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

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


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


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


Новичок
*

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

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


Что-то не могу понять что за "er" такое, в идентификаторах его нет.
А как-бы в этой проге сделать так, чтобы можно было вводить матрицу А такого размера, какого захочет пользователь (в разумных пределах), а не только 6х6.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 14.12.2004 15:09
Сообщение #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 - 14.12.2004 17:48
 К началу страницы 
+ Ответить 
ghost
сообщение 14.12.2004 16:56
Сообщение #26


Новичок
*

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

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


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

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


Гость






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

Сообщение отредактировано: volvo - 14.12.2004 17:41
 К началу страницы 
+ Ответить 
ghost
сообщение 15.12.2004 21:33
Сообщение #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

 



- Текстовая версия 26.07.2025 12:41
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"