Матрица в типизированном файле |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
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 - |
iFool |
Сообщение
#3
|
Гость |
Ну пусть integer...
матрица получается выглядит в файле как строка?? Ввели..... а как эту самую пресловутую диагональ выделить??? |
volvo |
Сообщение
#4
|
Гость |
А тебе надо не только диагональ выделять... Надо всю таблицу проверять:
... P.S. Понятно что N - это размер строки, т.е., в данном случае N = 100 ... Сообщение отредактировано: volvo - |
Гость |
Сообщение
#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 Пол: Мужской Репутация: 0 |
Вот, что получилось у меня:
Объяснение "(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(бонус ). Прикрепленные файлы EMATRIX.rar ( 30.07 килобайт ) Кол-во скачиваний: 225 |
volvo |
Сообщение
#11
|
Гость |
Volvo, можно тогда увидеть весь исходник? Можно... В качестве бонуса Незнайке - здесь Goto на фиг не сдался, даже один, а уж тем более - два. Вот исходник вместе с матрицей, на которой тестировался: (* Добавлено через 4 мин. Кстати, можно и вообще без Break-а обойтись: while (not eof(f)) and ok do begin ... |
Neznaika |
Сообщение
#12
|
Пионер Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: 0 |
volvo, так бы сразу и написали
а раньше было (X <>... кажется условный оператор здесь тоже не нужен:
P.S. Просто мне деление на каждом шаге не нравится. Кажется только через 2 года Intel обещает ускорение выполнения команд div/idiv. |
volvo |
Сообщение
#13
|
Гость |
Цитата условный оператор здесь тоже не нужен: Угу... Если хочешь увеличить время работы программы - то так и сделай. Я где-то приводил тест скорости выполнения такой конструкции против If-а, полюбопытствуй... |
Neznaika |
Сообщение
#14
|
Пионер Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: 0 |
volvo, извините, но мне кажется, что (Ord(I<>J) + K) <> 1 быстрее чем i mod (n + 1) = 0 + if.
Деление - последний оставшийся тормоз АЛУ. |
Neznaika |
Сообщение
#15
|
Пионер Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: 0 |
слепил тест
Интересно, правда компилятор TP, для единичной матрицы лучше вариант с MOD(от volvo), для не единичной с (Ord(I<>J) + K) <> 1). Наверно правильнее проверять на Delphi... if также может быть преобразован в CMOV... ----------------------------------------------------------- Хмм, для TP почти нет никакой разницы. Сообщение отредактировано: Neznaika - Прикрепленные файлы RDTSC.rar ( 26.76 килобайт ) Кол-во скачиваний: 224 |
volvo |
Сообщение
#16
|
Гость |
Цитата Наверно правильнее проверять на Delphi... Только в соответствующем разделе Я говорил именно о 16-битах... С 32-битными компиляторами кое-что меняется... |
Neznaika |
Сообщение
#17
|
Пионер Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: 0 |
Тьфу, чёрт!
Если посмотреть в отладчике(Turbo Debugger), то можно увидеть, что при трансляции Ord(I<>J) компилятор TP использует команды условных переходов, то есть он фактически Ord превращает в IF. |
Neznaika |
Сообщение
#18
|
Пионер Группа: Пользователи Сообщений: 51 Пол: Мужской Репутация: 0 |
Один вопрос, volvo. Ещё неделю назад хотел спросить.
Цитата Я говорил именно о 16-битах... С 32-битными компиляторами кое-что меняется... Можно узнать, что Вы имеете в виду. Turbo Debugger мне подсказал, что TP компилирует boolA := intB = intC и if intB = intC then boolA := TRUE else boolA := FALSE в почти одинаковый набор команд. P.S. div на моём PIII выполняется за 18 тактов. Очень медленно... |
Текстовая версия | 25.04.2024 18:53 |