0 / 0 / 0
Регистрация: 06.04.2016
Сообщений: 6
|
||||||
1 | ||||||
Вывести на экран символы, которые содержатся в обеих строках16.09.2017, 21:15. Показов 1487. Ответов 12
Здравствуйте! Нужна помощь с программой. Пишу под DOS. Условие: С клавиатуры вводятся две строки, вывести на экран символы, которые содержатся в обеих строках. Вот мой код, работает неправильно, не совсем разобрался с регистром si, а точнее тем, как с ним взаимодействовать.
0
|
16.09.2017, 21:15 | |
Ответы с готовыми решениями:
12
Ввести с клавиатуры две строки. Вывести на экран все символы, которые содержатся в обеих строках Ввести с клавиатуры две строки. Вывести на экран все символы, которые содержатся в обеих строках. Вывести на экран только те символы, которые встречаются в обеих строках одновременно Вывести на экран слова, которые встречаются в обеих строках |
Эксперт Hardware
|
|
16.09.2017, 21:53 | 2 |
сам алгоритм программы неправильный. лучше организовать так..
1. вводишь строку(1) своей функцией(0Ah) сервиса DOS. Эта fn. возвращает длину введённой строки во втором байте входного буфера(1). Кстати он у тебя оформлен не правильно. 2. вводишь строку(2), но теперь посимвольно в цикле, пока юзверь не нажмёт Enter. Внутри цикла, каждый\введённый символ сразу ищешь в строке(1), длина которой у тебя уже есть. Если находишь этот символ, но сразу сохраняешь его в выходном буфере(2). Строку(2) даже сохранять не нужно.. Это проще реализуется, поскольку для поиска соответствий нужна будет одна инструкцией REPNE SCASB
1
|
0 / 0 / 0
Регистрация: 06.04.2016
Сообщений: 6
|
|
16.09.2017, 22:01 [ТС] | 3 |
Подскажите пожалуйста, я в институте начал проходить эту дисциплину, не разобрался особо с вводом, поэтому так коряво написано. С циклом тоже не знаком. Вашу схему понял, понравилась, но сам не смогу реализовать. Можете дать хотя бы какие-нибудь наброски? Буду очень благодарен!
0
|
Модератор
|
|
16.09.2017, 23:00 | 4 |
Посмотрите в https://www.cyberforum.ru/asm-... 05284.html разделы 13 и 17.
Добавлено через 7 минут Есть ещё вариант. Создаёте два битовых массива на 256 бит (8 байт). 1. Вводите 1-ю строку. 2. Просматриваете её в цикле и в 1-ом битовом массиве устанавливаете бит с номером очередного символа. 3. Вводите 2-ю строку. 4. Просматриваете её в цикле и в 2-ом битовом массиве устанавливаете бит с номером очередного символа. 5. Выполняете побитовое AND с битовыми массивами 6. Просматриваете битовый массив, и если бит установлен - выводите символ с кодом, равным номеру этого бита. Данный вариант хорош тем, что выполняется за линейное время. А также - что пункты 1, 2 повторяют пункты 3, 4 - т.е. можно организовать в виде подпрограммы (на крайний случай скопировать). Добавлено через 1 минуту На этапе отладки сами строки можно задать в программе - чтобы не отвлекаться на ввод.
1
|
0 / 0 / 0
Регистрация: 06.04.2016
Сообщений: 6
|
|
16.09.2017, 23:46 [ТС] | 5 |
Хотел добавить, что не правильно выразился в своем ответе... с циклами знаком конечно, не знаю как реализовать посимвольный ввод через цикл. За все Ваши варианты, спасибо! Буду пробовать пока)
0
|
Модератор
|
||||||
17.09.2017, 00:44 | 6 | |||||
Попробуйте через множества. Такие структуры есть и в Pascal и в C++.
Битовый массив представляется через массив байт. Бит номер N находится в (N/8) байте по маске (1 << (N%8)) Где % - взятие остатка от деления, а << - сдвиг влево. Кликните здесь для просмотра всего текста
Добавлено через 2 минуты Это можно сделать и значительно короче, но у меня нет уверенности в том, что вы изучали команды битовых операций и в том, что ваш эмулятор DOS их будет поддерживать.
1
|
Эксперт Hardware
|
||||||
17.09.2017, 06:58 | 7 | |||||
вот тебе набросок на FASM'е, под масм переделай сам.
это сом-файл, поэтому не нужно определять сегментные регистры в начале. и посмотри на буфер для строки(1) под fn.0Ah. он состоит из 3-х составляющих, а не двух как у тебя: - в нулевом байте(80) указывается макс.длина строки; - в первом байте(0) после твоего ввода будет лежать реальная длина; - начиная со-второго байта разворачивается сам буфер (DUP) - повторить нуль 80-раз. знак($) - это маркер конца строки для fn.09h. т.к. заранее не известно, сколько ляжет в выходной буфер, то логично забить весь буфер(2) маркерами конца и затирать их найденными символами. в конце получим этот\злополучный маркер автоматически:
1
|
0 / 0 / 0
Регистрация: 06.04.2016
Сообщений: 6
|
|
17.09.2017, 11:26 [ТС] | 8 |
Павел, спасибо! Можете пояснить, что такое segment stack и почему, когда вводишь только буквы, вывод происходит в обратном порядке, а когда выводятся цифры, в прямом ?) видел работу со стеком, но так и не понял, почему через раз это все происходит.
0
|
0 / 0 / 0
Регистрация: 06.04.2016
Сообщений: 6
|
|
17.09.2017, 11:28 [ТС] | 9 |
R71MT, спасибо! Подскажите, в чем может быть ошибка, скопировал Ваш код, записал в .com и запускаю на win7 x32, вот скрин ошибки
0
|
Модератор
|
|
17.09.2017, 15:45 | 11 |
Silentium666, вряд ли в моём исходнике такой эффект
Вывод происходит в порядке расположения кодов ASCII.
Т.к. программа имеет тип exe, то обязательно объявление сегмента стека. Если бы программа была типа com - то явное объявление не требуется. Пока примите это, как заклинание. Переработайте собственную программу по совету R71MT и в случае ошибки работы приводите исходник. Смысл поступить так в том, что вы разберётесь с темой. Добавлено через 18 минут Есть смысл доработать программу R71MT - поиск символа выполнять не только в первой строке, но и в результирующей - чтобы исключить повторы символов в ответе. Эта доработка - буквально несколько строк.
1
|
0 / 0 / 0
Регистрация: 06.04.2016
Сообщений: 6
|
||||||
17.09.2017, 23:59 [ТС] | 12 | |||||
Очень помогли коды R71MT и ФедосеевПавел, не смог доработать Ваши коды, однако добавил в свой код некоторые Ваши идеи)) В итоге получилось, возможно громоздко, некоторые моменты так и не понял, на данном этапе своих знаний. Однако все работает, правда есть небольшой косячек с повторениями в выходной строке. Есть идеи, как легче и лучше реализовать?
0
|
Модератор
|
||||||
18.09.2017, 07:56 | 13 | |||||
Добавьте описание сегмента стека.
Для работы цепочечных строковых команд настройте регистр ES.
repne scasb . Описание команды в Электронном учебнике. Сам смысл лабы - в изучении строковых команд.
1
|
18.09.2017, 07:56 | |
18.09.2017, 07:56 | |
Помогаю со студенческими работами здесь
13
Строка: Вывести все символы, которые встречаются в обеих строках, в порядке возрастания их ASCII-кодов Получить третью строку, состоящую из слов, которые содержатся в обеих строках Вывести слова, которые встречаются в обеих строках Вывести слова, которые встречаются в обеих строках Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |