Определить, составляют ли байты длинного целого числа N арифметическую прогрессию - C (СИ)
Формулировка задачи:
Добрый вечер!
Очень сильно прошу помощи, в си вообще ничего не понимаю, а работу надо как-то сдавать.. Буду очень признателен, если кто-нибудь сможешь сделать две задачки и расписать с комментариями, чтобы не тупо переписывать, а попытаться разобраться.
Заранее спасибо!
1)Определить, составляют ли байты длинного целого числа N арифметическую прогрессию.
Примечание: Обработку двоичного числа делать без преобразование к строковому массиву, только сдвигами и битовыми операциями (&, | и т.д.).
2)Скопировать содержимое текстового файла, удалив в каждой строке предпоследнее слово
Прим:Обработку символьной строки оформить в виде функции. Сканирование строки и доступк её элементам выполнить ТОЛЬКО с использованием команд адресной арифметики(работа с указателями). Это так же значит, что ЗАПРЕЩЕНО статически обьявлять любые строковые переменные!
Решение задачи: «Определить, составляют ли байты длинного целого числа N арифметическую прогрессию»
textual
Листинг программы
#include <stdio.h> int GetByte(long* value) { int byte = *value & 0xff; *value >>= 8; return byte; } int IsArithmeticalProgression(long value) { int first = GetByte(&value); int step = GetByte(&value) - first; return ((first == GetByte(&value) - 2*step) && (first == GetByte(&value) - 3*step)); } int main() { union { char byte[4]; long longint; } value; value.byte[0] = 0x01; value.byte[1] = 0x03; value.byte[2] = 0x05; value.byte[3] = 0x07; printf("%ld = %s\n", value.longint, IsArithmeticalProgression(value.longint) ? "yes" : "no"); value.byte[0] = 0x02; printf("%ld = %s\n", value.longint, IsArithmeticalProgression(value.longint) ? "yes" : "no"); return 0; }
Объяснение кода листинга программы
- Предполагается, что байты длинного целого числа N хранятся в массиве byte.
- Функция GetByte извлекает байт из массива и возвращает его значение.
- Функция IsArithmeticalProgression проверяет, является ли последовательность байтов арифметической прогрессией.
- В функции IsArithmeticalProgression первый байт сохраняется в переменной first.
- Затем извлекается второй байт и вычисляется шаг прогрессии (разность между вторым и первым байтом).
- Проверяется, равен ли первый байт разности второго и первого байта, умноженной на 2 и 3.
- Если условие выполняется, то функция возвращает
yes
, иначеno
. - В функции main создается структура union с именем value, которая содержит массив байтов и длинное целое число.
- Массив байтов инициализируется значениями 0x01, 0x03, 0x05 и 0x07.
- Вызывается функция IsArithmeticalProgression с аргументом value.longint.
- Выводится сообщение
yes
, так как байты образуют арифметическую прогрессию. - Массив байтов изменяется, и вызывается функция IsArithmeticalProgression с аргументом value.longint.
- Выводится сообщение
no
, так как байты больше не образуют арифметическую прогрессию. - Массив байтов изменяется, и вызывается функция IsArithmeticalProgression с аргументом value.longint.
- Выводится сообщение
no
, так как байты не образуют арифметическую прогрессию. - Функция main возвращает 0, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д