Заполнение матрицы случайными числами |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
Заполнение матрицы случайными числами |
18192123 |
Сообщение
#1
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
Объясните пожалуйста, как можно инициализировать матрицу случайными числами??
|
18192123 |
Сообщение
#2
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
вот что у меня получилось...только матрица инициализируется совершенно различными символами, а хотелось бы, чтобы только числами..Объясните пожалуста, как это сделать?
и ещё не срабатывает переход на следующую строку при выводе матрицы.. |
andriano |
Сообщение
#3
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
1. Я уже навскидку не помню, 40/43 - это порты таймера? Если "да", то алгоритм получения случайного числа принципиально неверный. Он подходит либо для получения ОДНОГО случайного числа, либо инициализации ДПСЧ, но никак не для получения серии случайных чисел.
2. Что хранится у тебя в массиве: числа или символы? Если числа, то это одно - тогда у тебя в массиве то, что надо, но при выводе на экран их надо преобразовывать в числа от 0 до 255. Если же - символы, причем требуется, чтобы символы были цифрами (не числами), то необходимо дополнительное преобразование для приведения символов к нужному диапазону, т.е. к 30h-39h. |
18192123 |
Сообщение
#4
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
1. Я уже навскидку не помню, 40/43 - это порты таймера? Если "да", то алгоритм получения случайного числа принципиально неверный. Он подходит либо для получения ОДНОГО случайного числа, либо инициализации ДПСЧ, но никак не для получения серии случайных чисел. 2. Что хранится у тебя в массиве: числа или символы? Если числа, то это одно - тогда у тебя в массиве то, что надо, но при выводе на экран их надо преобразовывать в числа от 0 до 255. Если же - символы, причем требуется, чтобы символы были цифрами (не числами), то необходимо дополнительное преобразование для приведения символов к нужному диапазону, т.е. к 30h-39h. 1. насколько я поняла, да - это порты таймера.. 2. array db 3 dup(3 dup(?)) в матрице символы.. а как вообще нужно преобразовывать к нужному диапазону? Сообщение отредактировано: 18192123 - |
andriano |
Сообщение
#5
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
1. Тогда у тебя последовательность явно не случайных чисел.
2. Например, делением на 26 (частное) или на 10 (остаток) с последующим прибавлением 30h, т.е. кода символа "0". |
18192123 |
Сообщение
#6
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
|
andriano |
Сообщение
#7
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Нет. В IBM PC нет встроенного датчиа случайных чисел, поэтому пытаться извлечь их откуда-то - задача не из простых.
Обычно вместо случайных чисел используют псевдослучайные - т.е. вполне конкретную циклическую последовательность чисел, формируемых по определенному алгоритму, которая по статистическим характеристикам близка к последовательности случайных чисел. Но т.к. числа формируются алгоритмически, последовательность их жестко предопределена. Чтобы избавиться от этой предопределенности вводят дополнительную процедуру инициализации алгоритма, при которой та же самая циклическая последовательность уже будет начинаться не с первого члена, а с какого-то другого. Т.е. при разных запусках программы последовательность не будет повторяться, а будет каждый раз другая. Для инициализации обычно берут текущее время. Т.е. порядок работы такой (примеры, извини, в Паскаль - оболочке): пишем сам генератор ПСЧ (простой и быстрый, но не уверен, что пройдет все статистические тесты): var iax,ibx:word;где в переменных хранится текущее состояние ДПСЧ. Эти переменные надо инициализировать. Вот это можно сделать при помощи таймера: procedure randomize; Теперь перед первым использованием мы вызываем randomize, а затем используем random |
18192123 |
Сообщение
#8
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
Вот к чему я пришла..генерацию вставила, но программа зацикливается..(вообще программа выводит 10 раз матрицу, заполненную случайными числами и ждёт нажатия клавиши)
|
andriano |
Сообщение
#9
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Ты пытаешься использовать регистр bx сразу для двух целей: участие в генерации ПСЧ и для адресации в массиве. Естественно, его содержимое при этом портится. Ты уж либо сохраняй его содержимое в стеке (кстати, посмотри, нельзя ли вместно него использовать dx), либо, что лучше, вынеси генерацию ПСЧ в отдельную процедуру с сохранением регистров.
|
18192123 |
Сообщение
#10
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
Я вынесла генерацию ПСЧ в отдельную процедуру (значение регистра bx сохраняется в стеке перед её вызовом)..Но программа по-прежнему не работает..Объясните пожалуста, в чём дело?
|
andriano |
Сообщение
#11
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
1. Вместо "не работает" хотелось бы узнать конкретные симптомы, по которым ты определяешь отсутствие работоспособности. Тем более, что у меня сейчас нет ни одного установленного Ассемблера, следовательно, проверить никак не могу - могу лишь полагаться на твои слова.
2. push/pop принято помещать внутри процедуры. Т.е. те регистры, которые процедура портит, она и должна сохранять, а вызывающая программа об этом ничего знать не обязана. 3. si ты увеличиваешь 3 раза по 2, после чего si возвращаешь в 0, а bx увеличиваешь лишь на 4. Т.е. пишешь в то место, которое было заполнено на предыдущем проходе. У тебя какие размеры массива? Обычно их указывают как именованную константу в дальнейшем уже прибавляют к регистру константу по имени, а не конкретное число. Так проще и отлаживать и изменять программу, если в дальнейшем потребуется. |
18192123 |
Сообщение
#12
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
1. Вместо "не работает" хотелось бы узнать конкретные симптомы, по которым ты определяешь отсутствие работоспособности. Тем более, что у меня сейчас нет ни одного установленного Ассемблера, следовательно, проверить никак не могу - могу лишь полагаться на твои слова. 2. push/pop принято помещать внутри процедуры. Т.е. те регистры, которые процедура портит, она и должна сохранять, а вызывающая программа об этом ничего знать не обязана. 3. si ты увеличиваешь 3 раза по 2, после чего si возвращаешь в 0, а bx увеличиваешь лишь на 4. Т.е. пишешь в то место, которое было заполнено на предыдущем проходе. У тебя какие размеры массива? Обычно их указывают как именованную константу в дальнейшем уже прибавляют к регистру константу по имени, а не конкретное число. Так проще и отлаживать и изменять программу, если в дальнейшем потребуется. 1. курсорчик мигает на одном и том же месте (начало 15-й строчки), ничего не выводится, предусмотренный выход по нажатию кнопки не работает 2. спасибо, учту 3. у меня матрица 3 на 3, соответственно 2 цикла, но bx действительно изменяется на 4 (типа переход на следующую строку.. ) и кажется с 4-кой я ошиблась.. Сообщение отредактировано: 18192123 - |
andriano |
Сообщение
#13
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Программы целиком на ассемблере писал лет 10-15 назад, так что сейчас уже не вспомню, что какое прерывание делает.
Кроме того, непривычный синтаксис самого ассемблера. В свое время пользовался MASM. У тебя программа начинатся с begin? Как она знает, что начинать надо именно отсюда? Эо где-то прописывается? Что делает первый цикл в 10 повторений? 10 раз подряд заполняет матрицу? |
18192123 |
Сообщение
#14
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
У тебя программа начинатся с begin? Как она знает, что начинать надо именно отсюда? Эо где-то прописывается? Что делает первый цикл в 10 повторений? 10 раз подряд заполняет матрицу? Да, выполнение программы начинается с begin. А узнаёт, т.к в самом конце прописываем end begin. Да, 10 раз производится заполнение и вывод матрицы, потом вызывается макрокоманда задержки dely, далее курсор переводится в начало строки. |
andriano |
Сообщение
#15
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Ты располагаешь какими-либо средствами трассировки программы?
Если "да", попытайся выполнить пошагово, если "нет", то замени перевод курсора в начало строки его переводом на следующую строку. В общем, ошибку надо как-то локализовывать, а просмотр текста глазками - не самый эффективный путь. |
18192123 |
Сообщение
#16
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
|
18192123 |
Сообщение
#17
|
Профи Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: 2 |
Появился ещё один вариант генерации..но снова неудачный..Объясните мне пожалуста, как организовать генерацию чисел?!
Сообщение отредактировано: 18192123 - |
viagra versus levitra versus cia |
Сообщение
#18
|
Гость |
Urologia Priligy
|
Текстовая версия | 24.04.2024 4:41 |