Вариант 2. Напишите программу с циклическим выполнением команд (sms32v50): 1. Известно, что две строки одинаковой длины имеют общий байт. Написать программу, которая выводит значение этого байта на экран. 2. Написать программу для замены второй половины строки на произвольный символ. 3. Написать программу для замены символов "A" строки на произвольный символ, символов А может быть произвольное количество. 4. Написать программу для замены первой половины символов строки на произвольный символ. 5. Написать программу для замены символов строки на произвольный символ. Вывести исходную строку и преобразованную. Реши правильно все эти 5 заданий по системе СГКК им. А. К. Савина города Сатка.
Ответ нейросети
22 сентября 2025 12:22
Ниже даю подробные решения по всем пяти заданиям варианта 2 со циклическим выполнением команд. Я привожу объяснения на понятном уровне и два варианта реализации: понятный псевдокод на C-подобном синтаксисе и псевдо-ассемблер sms32v50 (с примерами структуры цикла). Учитываю, что цель — понять, поэтому пояснения к каждому шагу есть.
Контекст и допущения
- Все задачи относятся к работе со строками одинаковой длины и общими элементами в памяти.
- В задачах 2–5 операции выполняются над одной строкой указанной длины n.
- В задании 1 речь о том, что две строки одинаковой длины имеют общий байт (общую ячейку памяти). Возможны разные варианты общих байтов: общая ячейка может соответствовать одному и тому же адресу в памяти, но может быть и «пересечение» массивов по памяти. Самый надёжный способ найти общий байт — проверить все пары позиций (i, j): адрес s1[i] равен адресу s2[j]. Тогда значение этого байта равно s1[i] (или s2[j]).
- Во всех примерах я использую длину n, которая известна во время выполнения. Для простоты примеры показывают общий подход.
- Задание 1. Найти значение общего байта двух строк одинаковой длины Цель: найти общий байт по памяти между двумя строками и вывести его значение.
Пояснение алгоритма
- Пусть s1[0..n-1], s2[0..n-1].
- Перебираем все пары индексов (i, j). Проверяем, равны ли адреса s1+i и s2+j.
- Как только нашли такую пару, выводим значение байта по адресу s1+i (или s2+j) и завершаем программу.
- Сложность: O(n^2). Гарантированно найдём общий байт, если он есть (задача утверждает, что байт есть).
Код на C-подобном синтаксисе
- Ввод: массивы s1, s2 и их длина n.
- Вывод: символ найденного общего байта (или сообщение об отсутствии, если байт не найден).
void find_shared_byte(const char* s1, const char* s2, size_t n) { for (size_t i = 0; i < n; ++i) { for (size_t j = 0; j < n; ++j) { // если адреса совпали if ((const void*)(s1 + i) == (const void*)(s2 + j)) { // выводим значение общего байта putchar(s1[i]); return; } } } // если общий байт не найден (хоть и по условию задачи его должно быть) putchar('\0'); }
Псевдо-ассамблер sms32v50 (приближённый синтаксис, концепция)
- Входные данные: адрес S1 базовый на строку 1, адрес S2 базовый на строку 2, длина n.
- Внешний цикл по i от 0 до n-1, внутренний по j от 0 до n-1.
- Рассчитываем адреса addr1 = S1 + i и addr2 = S2 + j, сравниваем их.
- Если addr1 == addr2, выводим значение по addr1 и завершаем.
START: MOV R0, #0 ; i = 0 L1: CMP R0, R2 ; if i >= n -> закончить JGE END1
MOV R1, #0 ; j = 0
L2: CMP R1, R2 JGE NEXT_I
; addr1 = S1 + i
; addr2 = S2 + j
ADD R3, S1, R0
ADD R4, S2, R1
CMP R3, R4
JNE L3
; найдён общий байт: выводим значение по addr1
MOV R5, [R3]
CALL PRINT_CHAR
HALT
L3: INC R1 JMP L2
NEXT_I: INC R0 JMP L1
END1: HALT
Примечания
- В реальном gsm32v50-ассемблере синтаксис инструкций, регистров и вызова функций может отличаться. Смысл остаётся: вложенные циклы по i и j, сравнение адресов, вывод значения при совпадении.
- Задание 2. Замена второй половины строки на произвольный символ Цель: заменить вторую половину символов строки на заданный символ c.
Пояснение алгоритма
- Пусть n — длина строки. Вторая половина начинается с индекса start = n / 2 (целочисленное деление).
- Для i от start до n-1 s[i] = c.
- Вывод обновлённой строки.
Код на C-подобном синтаксисе void replace_second_half(char* s, size_t n, char c) { size_t start = n / 2; for (size_t i = start; i < n; ++i) { s[i] = c; } }
Псевдо-ассемблер sms32v50
- Подразумевается, что строка находится по адресу S, длина n в R2, символ-заменитель в R3, результат записываем в ту же область памяти.
START: MOV R0, #0 ; i = 0 MOV R1, #0 ; не обязательно, можно использовать direct ; start = n/2 MOV R4, R2 DIV R4, #2 ; start ADD R5, S, R4 ; указатель на начало второй половины L1: CMP R5, S, ; можно проверить границы по индексу, упрощённо: ; если текущий индекс >= n, выйти CMP R4, R2 JGE END2
; s[i] = c
MOV [R5], R3
INC R4 ; i++
ADD R5, #1
JMP L1
END2: HALT
Комментарий
- В реальном коде учтите корректную постановку проверки выхода за границы и точную адресацию. Логика проста: вычислить начало второй половины и затирать все символы от there до конца.
- Задание 3. Замена символов "A" строки на произвольный символ (символ A может встречаться произвольное количество раз) Цель: пройти строку и для каждого символа, равного 'A', заменить его на заданный символ c.
Пояснение алгоритма
- Для i от 0 до n-1: если s[i] == 'A', то s[i] = c.
- В конце получаем строку без буквы 'A' (заменённой на c).
Код на C-подобном синтаксисе void replace_A(char* s, size_t n, char c) { for (size_t i = 0; i < n; ++i) { if (s[i] == 'A') { s[i] = c; } } }
Псевдо-ассемблер sms32v50 START: MOV R0, #0 L1: CMP R0, R2 JGE END3 MOV R1, [S, R0] ; загрузить s[i] CMP R1, #'A' JNE SKIP3 MOV [S, R0], R3 ; заменить на c (R3) SKIP3: INC R0 JMP L1 END3: HALT
Примечание
- Здесь R3 содержит заменяющий символ c. Убедитесь, что в начале программы R3 инициализирована нужная буква.
- Задание 4. Замена первой половины символов строки на произвольный символ Цель: заменить первые n/2 символов строки на заданный символ c.
Пояснение алгоритма
- Пусть half = n / 2. Для i = 0..half-1 s[i] = c.
- В конце — первая половина строки заполнена символом c.
Код на C-подобном синтаксисе void replace_first_half(char* s, size_t n, char c) { size_t half = n / 2; for (size_t i = 0; i < half; ++i) { s[i] = c; } }
Псевдо-ассемблер sms32v50 START: MOV R0, #0 MOV R1, #0 MOV R2, #0 ; half = n/2 MOV R4, R2 DIV R4, #2 L1: CMP R0, R4 JGE END4 MOV [S, R0], R3 ; s[i] = c INC R0 JMP L1 END4: HALT
- Задание 5. Замена символов строки на произвольный символ. Вывести исходную строку и преобразованную Цель: заменить все символы строки на заданный символ c и вывести обе версии: исходную и преобразованную.
Пояснение алгоритма
- Сохранить копию исходной строки orig длиной n.
- Затем пройти по строке и заменить каждый символ на c.
- Вывести orig и преобразованную строку.
Код на C-подобном синтаксисе #include <string.h> void transform_and_print(const char* s, size_t n, char c) { // копируем исходную строку char* orig = malloc(n + 1); if (!orig) return; memcpy(orig, s, n); orig[n] = '\0';
// исходная строка для вывода
printf("Original: %s\n", orig);
// преобразование
char* t = (char*)s;
for (size_t i = 0; i < n; ++i) {
t[i] = c;
}
// преобразованная строка
printf("Transformed: %s\n", t);
free(orig);
}
Псевдо-ассемблер sms32v50 START: ; Сохранение исходной строки MOV R0, #0 ; предположим, что длина n вложена в R2, адрес строки в S ; копируем в буфер orig CALL MEM_COPY, S, ORIG, R2 ; копия s в ORIG, длина n ; вывод оригинала CALL PRINT_STRING, ORIG
; преобразование: заменить все символы на c (R3)
L1: CMP R0, R2 JGE END5 MOV [S, R0], R3 INC R0 JMP L1 END5: ; вывод преобразованной строки CALL PRINT_STRING, S HALT
Примечание
- В примере использованы общие концепции: сохранение копии исходной строки, затем заполнение всей строки символом c и вывод обеих версий. Реальная специфика sms32v50 зависит от доступных системных функций вывода и от того, как именно организована память под orig, S, и т. п. Важно сохранять исходную строку до её изменения.
Как использовать эти решения на практике
- В учебной системе SMS32v50 и СГКК им. А. К. Савина, как правило, задаются конкретные адреса памяти для строк и конкретные регистры под каждую операцию. Приведённые схемы показывают логику циклов и переменные: сколько и как читаем, как заменяем и как выводим.
- Если вы дадите реальные образцы входных данных (например, две строки одной длины, вторую половину и пр.), можно привести конкретные примеры входных и выходных значений.
- Если нужно, могу адаптировать код под конкретный стиль ассемблера sms32v50, который вы используете на занятиях (точный синтаксис команд, регистров и системных вызовов может различаться).
Краткое резюме по каждому пункту
- Задание 1: ищем общий байт между двумя строками как пару адресов (i, j), где адрес s1+i равен адресу s2+j, и выводим значение этого байта.
- Задание 2: вторую половину строки заменяем на заданный символ c.
- Задание 3: заменяем всеми встречающимися символами 'A' на заданный символ c.
- Задание 4: первую половину строки заменяем на заданный символ c.
- Задание 5: заменяем всю строку на заданный символ c, выводим оригинал и преобразованную строку.
Если хотите, могу адаптировать конкретные примеры под ваш вариант входных данных и показать детальный пошаговый разбор на вашем языке/синтаксисе sms32v50. Также могу привести тестовый пример с конкретными строками и символами замены, чтобы проследить работу циклов на каждом шаге.
Понравился ответ?
Задай свой вопрос
Напиши любую задачу или вопрос, а нейросеть её решит



