Бесплатный урок с нашим репетитором!

Узнать подробнее

Новая Школа - онлайн-школа подготовки к ЕГЭ
При поддержке
Посмотреть все вопросы нейросети
Бесплатный пробный урок с репетитором

Узнай больше про репетиторов Новой Школы и запишись на бесплатный пробный урок. Мы проверим твой уровень знаний и составим план обучения по любому предмету и классу

Вопрос от Анонимного юзера 22 сентября 2025 12:22

Вариант 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. Задание 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, сравнение адресов, вывод значения при совпадении.
  1. Задание 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 до конца.
  1. Задание 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 инициализирована нужная буква.
  1. Задание 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

  1. Задание 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. Также могу привести тестовый пример с конкретными строками и символами замены, чтобы проследить работу циклов на каждом шаге.

Задай свой вопрос

Напиши любую задачу или вопрос, а нейросеть её решит

Похожие вопросы 15

Бесплатно Мобильное приложение ГДЗ
Мобильное приложение ГДЗ

Задавай вопросы искуcственному интеллекту текстом или фотографиями в приложении на iPhone или Android

qr-codegoogle-playapp-store

Саша — ассистент в телеграмме

Вариант 2. Напишите программу с циклическим выполнением команд (sms32v50): 1. Известно, что две строки одинаковой длины имеют общий байт. Написать программу, которая выводит значение этого байта на экран. 2. Написать программу для замены второй половины строки на произвольный символ. 3. Написать программу для замены символов "A" строки на произвольный символ, символов А может быть произвольное количество. 4. Написать программу для замены первой половины символов строки на произвольный символ. 5. Написать программу для замены символов строки на произвольный символ. Вывести исходную строку и преобразованную. Реши правильно все эти 5 заданий по системе СГКК им. А. К. Савина города Сатка.
Ниже даю подробные решения по всем пяти заданиям варианта 2 со циклическим выполнением команд. Я привожу объяснения на понятном уровне и два варианта реализации: понятный псевдокод на C-подобном синтаксисе и псевдо-ассемблер sms32v50 (с примерами структуры цикла). Учитываю, что цель — понять, поэтому пояснения к каждому шагу есть. Контекст и допущения - Все задачи относятся к работе со строками одинаковой длины и общими элементами в памяти. - В задачах 2–5 операции выполняются над одной строкой указанной длины n. - В задании 1 речь о том, что две строки одинаковой длины имеют общий байт (общую ячейку памяти). Возможны разные варианты общих байтов: общая ячейка может соответствовать одному и тому же адресу в памяти, но может быть и «пересечение» массивов по памяти. Самый надёжный способ найти общий байт — проверить все пары позиций (i, j): адрес s1[i] равен адресу s2[j]. Тогда значение этого байта равно s1[i] (или s2[j]). - Во всех примерах я использую длину n, которая известна во время выполнения. Для простоты примеры показывают общий подход. 1) Задание 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) Задание 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) Задание 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) Задание 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) Задание 5. Замена символов строки на произвольный символ. Вывести исходную строку и преобразованную Цель: заменить все символы строки на заданный символ c и вывести обе версии: исходную и преобразованную. Пояснение алгоритма - Сохранить копию исходной строки orig длиной n. - Затем пройти по строке и заменить каждый символ на c. - Вывести orig и преобразованную строку. Код на C-подобном синтаксисе #include 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. Также могу привести тестовый пример с конкретными строками и символами замены, чтобы проследить работу циклов на каждом шаге.