![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
iFool |
![]()
Сообщение
#1
|
Гость ![]() |
Задача.
Пусть матрица А целых чисел размером 100*100 записана по строкам в файле. Определите, является ди она единичной. Мне не понятно как запихнуть матрицу в типизированный файл и, самое главное, как потом проверить условие.... Помогите, пожалуйста... |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата как запихнуть матрицу в типизированный файл Это какой файл? Файл целыхvar f: file of integer или файл векторов type vector = array[1 .. 100] of integer;? Оба - типизированные... Выбирай. Сообщение отредактировано: volvo - 25.09.2007 20:17 |
iFool |
![]()
Сообщение
#3
|
Гость ![]() |
Ну пусть integer...
матрица получается выглядит в файле как строка?? Ввели..... а как эту самую пресловутую диагональ выделить??? |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
А тебе надо не только диагональ выделять... Надо всю таблицу проверять:
... P.S. Понятно что N - это размер строки, т.е., в данном случае N = 100 ... Сообщение отредактировано: volvo - 25.09.2007 20:59 |
Гость |
![]()
Сообщение
#5
|
Гость ![]() |
А можно ещё вопрос....
как мне осуществить ввод... Код for i:=1 to n do for j:=1 to n do begin read(a[i,j]); write(f,a[i,j]); end; так я думаю не правильно будет... |
Горсть |
![]()
Сообщение
#6
|
Гость ![]() |
Красиво конечно, но оно не будет работать. Перебор ![]() Это должно работать:
|
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Цитата Красиво конечно, но оно не будет работать. Перебор Понимаешь, в чем дело... Если б оно не отработало (представь себе) - я бы не запостил это... И если ты не смог правильно это вызвать - это только твоя проблема... ![]() Добавлено через 2 мин. P.S. Учи логические операции... В том коде, что я привел нет НИЧЕГО противоречащего ни синтаксису, ни логике... |
Горсть |
![]()
Сообщение
#8
|
Гость ![]() |
Хорошо, например все элементы матрицы равны 2.
Тогда ok := ok and (X <> 0) == ok and (2 <> 0) = ok and TRUE = ok и ok := ok and (X <> 1) == ok and (2 <> 1) = ok and TRUE = ok Так как до while ok=TRUE, то в данном случае после while также будет ok=TRUE и далее writeln('yes'), что совершенно неверно, так как матрица явно не единичная. |
Гость |
![]()
Сообщение
#9
|
Гость ![]() |
|
Neznaika |
![]()
Сообщение
#10
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот, что получилось у меня:
Объяснение "(Ord(I<>J) + K) <> 1": I и J изменяются от 1 до 100. Для диагональных элементов матрицы I = J. K - соответствующий элемент матрицы. Возможны два ПРАВИЛЬНЫХ варианта: 1) I = J, K = 1. 2) I <> J, K = 0. Первые условия могут быть либо TRUE, либо FALSE и отрицают друг друга. Пусть (I=J) будет эквивалентно FALSE, тогда (I<>J) будет эквивалентно TRUE. Получим 1) FALSE, K = 1. 2) TRUE, K = 0. Здесь уже видна СИММЕТРИЯ(которая собственно и нужна для создания подобных выражений), а именно порядковые номера FALSE и TRUE равны соответственно 0 и 1(Ord(FALSE) = 0, Ord(TRUE) = 1). Получили 1) 0, K = 1. 2) 1, K = 0. Видно, что когда матрица ЕДИНИЧНАЯ, то (0 + 1) = (1 + 0) = 1. Когда матрица НЕ ЕДИНИЧНАЯ, то складывая 0(для 1)) или 1(для 2)) с K получить 1 не удастся. Следовательно if (Ord(I<>J) + K) <> 1 then МАТРИЦА НЕ ЕДИНИЧНАЯ В архиве простенькая программа генерации единичной матрицы и программа "простой" проверки(My_TEST1). P.S. Так используются два цикла for и оба они прерываются при первой ошибке(при появлении первого "неправильного" элемента матрицы), Break для выхода из циклов применить нельзя, поэтому используется оператор GOTO. Даже целых два GOTO(бонус ![]() Прикрепленные файлы ![]() |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Volvo, можно тогда увидеть весь исходник? Можно... В качестве бонуса Незнайке - здесь Goto на фиг не сдался, даже один, а уж тем более - два. Вот исходник вместе с матрицей, на которой тестировался: (* Добавлено через 4 мин. Кстати, можно и вообще без Break-а обойтись: while (not eof(f)) and ok do begin ... |
Neznaika |
![]()
Сообщение
#12
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: ![]() ![]() ![]() |
volvo, так бы сразу и написали
а раньше было (X <>... кажется условный оператор здесь тоже не нужен:
P.S. Просто мне деление на каждом шаге не нравится. Кажется только через 2 года Intel обещает ускорение выполнения команд div/idiv. |
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Цитата условный оператор здесь тоже не нужен: Угу... Если хочешь увеличить время работы программы - то так и сделай. Я где-то приводил тест скорости выполнения такой конструкции против If-а, полюбопытствуй... |
Neznaika |
![]()
Сообщение
#14
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: ![]() ![]() ![]() |
volvo, извините, но мне кажется, что (Ord(I<>J) + K) <> 1 быстрее чем i mod (n + 1) = 0 + if.
Деление - последний оставшийся тормоз АЛУ. |
Neznaika |
![]()
Сообщение
#15
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: ![]() ![]() ![]() |
слепил тест
Интересно, правда компилятор TP, для единичной матрицы лучше вариант с MOD(от volvo), для не единичной с (Ord(I<>J) + K) <> 1). Наверно правильнее проверять на Delphi... if также может быть преобразован в CMOV... ----------------------------------------------------------- Хмм, для TP почти нет никакой разницы. Сообщение отредактировано: Neznaika - 27.09.2007 14:06 Прикрепленные файлы ![]() |
volvo |
![]()
Сообщение
#16
|
Гость ![]() |
Цитата Наверно правильнее проверять на Delphi... Только в соответствующем разделе ![]() |
Neznaika |
![]()
Сообщение
#17
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: ![]() ![]() ![]() |
Тьфу, чёрт!
Если посмотреть в отладчике(Turbo Debugger), то можно увидеть, что при трансляции Ord(I<>J) компилятор TP использует команды условных переходов, то есть он фактически Ord превращает в IF. |
Neznaika |
![]()
Сообщение
#18
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: ![]() ![]() ![]() |
Один вопрос, volvo. Ещё неделю назад хотел спросить.
Цитата Я говорил именно о 16-битах... С 32-битными компиляторами кое-что меняется... Можно узнать, что Вы имеете в виду. Turbo Debugger мне подсказал, что TP компилирует boolA := intB = intC и if intB = intC then boolA := TRUE else boolA := FALSE в почти одинаковый набор команд. P.S. div на моём PIII выполняется за 18 тактов. Очень медленно... |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 14:21 |