ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ № 7 «Поразрядная обработка целых чисел». ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ № 7. Отчет о лабораторной работе 7 Поразрядная обработка целых чисел
Скачать 174.1 Kb.
|
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное автономное образовательное учреждение высшего образования «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ» ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ Кафедра аэрокосмических компьютерных и программных систем (кафедра 14) ОЦЕНКА ПРЕПОДАВАТЕЛЬ
РАБОТУ ВЫПОЛНИЛ(А)
Санкт-Петербург 2021 Цель работы:Ознакомление с поразрядными операциями и сдвигами. ЗаданиеЗадача 7.16 В длинном целом числе N все серии единиц, состоящие из трёх и более единиц, заменить на нули. Формализация задачиНа вход поступает положительное целое число, не превышающее 2147483647. На выход получаем двоичное представление числа, где обнулены все единицы, удовлетворяющие условию. При вводе отрицательного числа оно будет обработано, как положительное. Для извлечения разрядов из исходного числа, а также подсчёта единиц используем маски и логическое умножение. В ходе задачи мы используем ещё несколько переменных: i– исходное число, i2 – изменённое число , d– результат логического умножения исходного числа на единицу. Их тип определяем как «long int».one – счётчик единиц, two– счетчик который в который записывается номер текущего бита числа, с права на лево,if3 – переменная в двоичную форму которого записываются необходимое число единиц,l – счетчик для цикла for. Их тип определяем как «int», так как данные переменные имеют только целочисленные значения. Так же несколько вспомогательных массивов типа «char» для вывода двоичной формы чисел, buffer – для вывода исходного числа, buffer2 – для вывода изменённого числа. Их размерность 33. Набор тестовых примеров для проверки задачиТаблица 1 «Тестовые примеры для проверки задачи»
На лист 2 A На лист 2 Схемы алгоритмаИз Листа 2 Н Рисунок 1 – схема алгоритма На лист 2 B if3<<1 И (d=1 или i=1) i!=1 C l+1 if3|1 l one=>1 one+1 d=1 d=i&1 two+1 “ ” i=-i i<0 i НАЧАЛО Лист 1 i2 i А Н i>>1 С if =0 i2^if3 i=1 В Из Листа 1 Лист 2 one-1 if3<<(two-one-1) Из Листа 1 d=0 one=0 На лист 1 Из Листа 1 НАЧАЛО Рисунок 1 Листинг программы#include #include #include int main(void) { long int i, d, i2 = 0; int one = 0, two = 0, if3 = 0; char buffer[33], buffer2[33]; printf("Enter a number1: "); scanf_s("%ld", &i); setlocale(LC_ALL, "RUS"); if (i < 0) { printf("числобует обработанно как положительное \n"); i = -i; } itoa(i, buffer, 2); i2 = i; while (i != 0) { two++; d = i & 1; if (d == 1) { one++; } if (one >= 3 && (d == 0 || i == 1 )) { for (int l = 0; l < one; l++) { if3 <<= 1; if3 |= 1; } if (i == 1) one--; if3 <<= (two - one - 1); i2 ^= if3; if3 = 0; } if (d == 0) { one = 0; } i >>= 1; } itoa(i2, buffer2, 2); printf("binary start: %s\n", buffer); printf("binary final: %s\n", buffer2); } Вывод. Доказательство правильности работыРисунок 2 – Тестовый пример 1 Рисунок 3 – Тестовый пример 2 Рисунок 4 – Тестовый пример 3 Программа работает без ошибок, мы вводим целое число, после чего на экране появляется двоичное представление числа, где обнулены все единицы, удовлетворяющие условию. Программа справляется с задачей, что подтверждает совпадение результатов на практике с тестовыми примерами. ВыводВ ходе проведения лабораторной работы мы ознакомились с поразрядными операциями и сдвигами. А именно: решили типовую задачу на обнуление элементов удовлетворяющих условию, представив её в виде схемы алгоритма, предварительно описав все ограничения и тонкости в формализации. Затем перенесли данный алгоритм на язык Си, реализовав его с помощью оператора «if», циклов «while», «for» и использования масок, получив программу и доказав ее правильность в предыдущем пункте лабораторной работы. |