Эксперты, помогите, пожалуйста. Всё время что-нибудь не получается, все варианты я показывать не буду, так что помогите, пожалуйста, с программой. Вот условие: Текст закодирован с помощью сетки размером n*n, где цифрой 0 обозначено отверстие. Для того чтобы декодировать (расшифровать) сообщение, нужно наложить сетку на текст так, чтобы в отверстия можно было видеть символы закодированного текста. Постепенно сетка поворачивается по часовой стрелке на 90 градусов так далее до полного оборота сетки на 360 градусов. Исходные данные: Текст и сетка в виде квадратных таблиц. Выходные данные: Результат выводится одной строкой на экран. Пример: П Б К Г 1 1 0 1 М Р Т В 1 0 1 1 Д М Р О 1 1 1 1 И А А З 0 1 1 1 Результат: криптограмма
Добрый день, Дима! В приложении текст решения Вашей задачи. Только есть одно НО. На мой взгляд Вы дали не совсем верный тест и она выдаёт КРИПТОГРАММЗ. Если тест правильный, то напишите, буду смотреть где я ошибся. input.txt должен иметь следующий формат: первая строка: целое число N, размер сетки далее N строк из N символов без пробелов далее N строк из N чисел через пробел Пример приведён в приложении. Удачи :)
Приложение: Ответ отправлен: 22.12.2003, 20:22 Отправитель: Strory Отвечает fC
Приветствую Вас, Дима! Покажи хоть один вариант, двоечник! :) Ответ отправлен: 21.12.2003, 20:14 Отправитель: fC Отвечает Vitally
Доброе время суток, Дима! Мне бы твои проблемы! :) Программа в приложении.
Приложение: Ответ отправлен: 22.12.2003, 12:02 Отправитель: Vitally Отвечает sir henry
Доброе время суток, Дима! Непонятен вопрос. Вам нужно создать матрицу, которая рашифровывает слово, содержащееся в матрице с буквами или вы просто не знаете, как поворачивать матрицу на 90 градусов? Ответ отправлен: 22.12.2003, 15:12 Отправитель: sir henry Отвечает Boriss
Добрый день, Дима! Вот варант с простейшим вращением маски
Приложение: Ответ отправлен: 24.12.2003, 17:06 Отправитель: Boriss
Вопрос № 381
Доброго времени суток! 1) Именно это я и писал. 2) Об этом не шло и речи. В скобках указано-оба. Я имел в виду и метод родителя и метод потомка. Дело не в замене виртуального метода статическим(компилятор и не даст это сделать) а в том, что предок может иметь статический метод с таким же именем, как потомок (и,соответственно, наоборот), но с различными параметрами. 3.1)Спасибо! Хоть и с трудом, но понял! Правда,ерунда получается! :( 3.2)А я что с этого имею? Плохо это или хорошо?! 4)Нуууу... опечатка это! Все все поняли! И последнее - кто знает - может именно ЭТОГО мне и не хватает для счастья!!!
Доброе время суток, Vitally! Чтобы определиться, нужно ли Вам использовать виртуальный или статический метод, можно использовать правило: если есть вероятность, что понадобится из метода предка вызов переопределённого метода потомка, то целесообразно делать метод виртуальным. Преимущества виртуальных методов: 1) позднее связывание позволяет связать новые методы с существующими во время выполнения программы, требуя лишь небольшого увеличения ТВМ(Таблица Виртуальных Методов, VMT - Virtual Method Table). 2) можно не задумываться о том, включать или не включать метод в объект, который может быть использован или не использован в конкретной программе. Неиспользуемые методы не влияют на быстродействие программы, ни на размер EXE-файла: если они не используются, то они не включаются в него(!!!). В общем случае многие авторы рекомендуют использовать виртуальные
методы, НО: 1) они (используемые) требуют ОП для ТВМ; 2) каждый вызов виртуального метода проходит через ТВМ и требует для этого дополнительное время. Использование статических методов имеет смысл, если надо получить оптимальную эффективность программы по скорости её выполнения и использованию ОП. Статические методы вызываются непосредственно. Поэтому вызов статического метода более быстрый, чем вызов виртуального. Если в объекте нет виртуальных методов, в сегменте данных отсутствует ТВМ и программа будет работать быстрее. Однако в этом случае теряется вариант расширения возможностей на этапе выполнения программы, при позднем связывании. Что выбирать, решать Вам. Надеюсь, ответ исчерпывающий. И для полного счастья Вам нужно заняться динамическими методами. Это те, которые: Function NameFunc: NameType; Virtual index(1..65535); Их я не использовал ни разу в жизни
(за ненадобностью), но знаком с людьми, которые этим занимались(поистине психи :) !!!). Удачи :) Ответ отправлен: 22.12.2003, 18:44 Отправитель: Strory
Вопрос № 382
Уважаемые эксперты, не могу решить такую проблему: в программе создается массив из целочисленных элементов, затем эти элементы нужно вывести в файл; после выполнения программы создается файл, но вместо цифр в нем непонятные знаки, а вместо пробелов квадратики. Текст программы ниже: PROGRAM VOL1226; USES CRT; VAR i,j,m,n,r :integer; f1 :file of integer; a,b,btrans,bquatro,bxbtrans:array[1..30,1..30] of integer; BEGIN CLRSCR; assign(f1,'C:1226.txt'); for i:=1 to 3 do for j:=1 to 3 do begin write('введи элемент матрицы: b[',i,'][',j,']='); readln(b[i,j]); end; for i:=1 to 3 do for j:=1 to 3 do btrans[i,j]:=b[j,i]; {<---------------------------------->} for i:=1 to 3 do for j:=1 to 3 do
begin bquatro[i,j]:=0; bxbtrans[i,j]:=0; end; {<---------------------------------->} n:=0; for j:=1 to 3 do begin n:=n+1; m:=1; for r:=1 to 3 do begin for i:=1 to 3 do begin bquatro[m,n]:=bquatro[m,n]+b[i,j]*b[m,i]; end; m:=m+1; end; end; {<---------------------------------->} n:=0; for j:=1 to 3 do begin n:=n+1; m:=1; for r:=1 to 3 do begin for i:=1 to 3 do begin bxbtrans[m,n]:=bxbtrans[m,n]+b[j,i]*btrans[i,m]; end; m:=m+1; end; end; {<---------------------------------->} for i:=1 to 3 do for j:=1 to 3 do a[i,j]:=bquatro[i,j]+bxbtrans[i,j]-b[i,j]; {<---------------------------------->}
for i:=1 to 3 do begin for j:=1 to 3 do write(a[i,j]:4,' '); writeln; end; {<---------------------------------->} rewrite(f1); for i:=1 to 3 do for j:=1 to 3 do write(f1,a[i,j]); {<---------------------------------->} writeln('Вывод элементов массива можно найти в файле по адресу "C:1226.txt"'); readln; END.
Здравствуйте, Дмитрий! К счастью Ваша проблема элементарно решается. Во-первых, чтобы Вы могли понять, что вывела Ваша программа в файл, он (файл) должен быть текстовым. Для этого замените объявление файла: f1: file of integer; на: f1: TEXT; Во-вторых, чтобы числа в файле были написаны отдельно друг от друга (как и на экране) измените строчку: write(f1, a[i,j]); на write(f1, a[i,j],#32); {#32 - это ASCII-код пробела} В третьих, обязательно закрывайте файл в конце программы, иначе он может не сохраниться и остаться пустым (так получилось на моём компе): Close(f1); Ниже прилагаю Вашу программу со всеми перечисленными изменениями. Если возникнут вопросы по работе с файлами, пишите. Удачи :)
Приложение: Ответ отправлен: 22.12.2003, 18:44 Отправитель: Strory Отвечает vitya
Доброе время суток, Дмитрий! Ву создаете бинарный файл и пишете в него целые числа. Создайте файл типа TEXT и тогда все будет писаться нормально. Ответ отправлен: 22.12.2003, 11:15 Отправитель: vitya Отвечает Boriss
Добрый день, Дмитрий! :)) Это не значки, это настоящие цифры. А значки - это символы с этим кодом. Если измените fl: file of Integer; на fl: Text, то увидите символы То есть в файл Вы записали цифры, а когда смортите их ТЕКСТОВЫМ редакторам, то он "думает", что там записаны коды символов Ответ отправлен: 22.12.2003, 11:35 Отправитель: Boriss Отвечает sir henry
Доброе время суток, Дмитрий! Если Вы хотите просматривать Ваш файл как текстовый, то и создавать его надо текстовый, а не типизированый: f1 :file of integer; {Здесь будет видна всякая фигня} f1 :text; {Здесь будет виден нормальный текст}
Ответ отправлен: 22.12.2003, 11:36 Отправитель: sir henry Отвечает Vitally
Доброе время суток, Дмитрий! Просто ты открываешь файл как текстовый, а записываешь как файл с integer елементами. Вобщем, нужно преобразовывать данные в текстовый формат. Иначе, записав число 255 - ты увидешь символ, номер которого 255 т.е - пробел. и т.д. Стандартной процедуры для преобразования вроде нет. Можешь воспользоваться моей (она в приложении), можешь написать свою. :) ЗЫ: И тип файла нужно будет сменить.
Приложение: Ответ отправлен: 22.12.2003, 13:59 Отправитель: Vitally Отвечает Drahus
Добрый день, Дмитрий! То есть результат должен быть читабельным? Нужно конвертировать значения переменных (integer) (массива) в тип char. Для этого есть функция в Паскале, правда я забыл название. См. в справке. А вообще, если результат нужно только хранить, то лучше так и оставить, меньше места занимать будет. Это пригодится при работе с объёмными данными.
Ответ отправлен: 22.12.2003, 17:13 Отправитель: Drahus
Вопрос № 383
Здравствуйте, Boriss! Если Вам интересно - объясню: Я создал кнопку и мне совершенно не известно и не интересно что она будет делать. Но, хотелось бы иметь метод.. Что-то типа Button1.Pressed. Так вот, в процедуре Pressed будет только один оператор. Что-то типа begin a; end; где "а" - это переменная процедурного типа, которой, при вызове конструктора например, присваивается адрес нужной нам процуры! А вот Virtual - действительно почти бессмысленная штука. ЗЫ: В любом случае спасибо! :)
Добрый день, Vitally! Лично я, когда мне что-то непонятно, стараюсь разобраться, а не объявлять бессмысленным (впрочем, Вы поступайте, как хотите :)) ). На самом деле механизм виртуальных методов - очень мощная штука. В частности, деструктор ДОЛЖЕН быть виртуальным. Ну а решение Вашей задачи очень простое (см. в приложении). И кстати, создание меню с помощью виртуальных методов выглядит лучше ;))
Приложение: Ответ отправлен: 22.12.2003, 12:23 Отправитель: Boriss
Вопрос № 384
Уважаемые эксперты, в предыдущем сообщении я пожаловался на некорректный вывод символов в файл. Благодарю за ответы, все вы посоветовали одно и то же, но проблема не решилась. Поменяв тип файла у меня теперь в йайл вообще ничего не выводится, размер файла - 0 Кб. В чем проблема? В уважением, Дмитрий.
Здравствуйте, Дмитрий! Не успевает выводиться. В текстовый файл вывод идет медленно, сначала информация (цифры) преобразуются к виду, который "понимает" комп (числа - в строки), а затем выводится. Ваша прога к моменту окончания преобразования успевает завершиться (END.) - и при этом закрываются все файлы! Нужно перед END. написать FLUSH(fl); - эта команда заставляет проц ждать (не переходить к выполнению след. команды), пока не завершится вывод в файл Ответ отправлен: 22.12.2003, 12:28 Отправитель: Boriss Отвечает sir henry
Доброе время суток, Дмитрий! Не забывайте закрывать файл после использования :). Close(f1); У меня, по тексту Вашей программы все записывается без проблем. Изменения в следующем: 1. Изменен тип f1 с type of integer на text, 2. В конец файла программы добавлена строка закрытия файла: Close(f1); Если нужно, чтобы запись в файл переодически переводил строку на новую, то воспользуйтесь вместо Write - WriteLn. Ответ отправлен: 22.12.2003, 14:04 Отправитель: sir henry Отвечает Vitally
Приветствую Вас, Дмитрий! Посылаю исправленный вариант программы...
Приложение: Ответ отправлен: 22.12.2003, 14:32 Отправитель: Vitally Отвечает Drahus
Доброе время суток, Дмитрий! У меня то же самое. Я сам не знаю. :) В этом случае вроде нужно вместо WRITE использовать BLOCKWRITE.
Ответ отправлен: 22.12.2003, 17:14 Отправитель: Drahus
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.