Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
21.01.2025
Размер:
25.3 Кб
Скачать

Домашняя работа №7 к 23.12.24

  1. Сдвиг элементов массивов вправо и влево

#include <stdio.h>

#include <locale.h>

#define MAX_SIZE 10000

void right(int arr[], int size) {

if (size <= 1) {

return;

}

int last = arr[size - 1];

for (int i = size - 1; i > 0; i--) {

arr[i] = arr[i - 1];

}

arr[0] = last;

}

void left(int arr[], int size) {

if (size <= 1) {

return;

}

int first = arr[0];

for (int i = 0; i < size - 1; i++) {

arr[i] = arr[i + 1];

}

arr[size - 1] = first;

}

int main() {

setlocale(LC_ALL, "rus");

int arr1[MAX_SIZE], arr2[MAX_SIZE], arr3[MAX_SIZE];

int n, g;

printf("Введите размер массивов (максимум 10000): ");

scanf_s("%d", &n);

if (n <= 0 || n > MAX_SIZE) {

printf("Некорректный размер массива\n");

return 1;

}

printf("Введите элементы для массива 1:\n");

for (int i = 0; i < n; i++) {

scanf_s("%d", &arr1[i]);

}

printf("Введите элементы для массива 2:\n");

for (int i = 0; i < n; i++) {

scanf_s("%d", &arr2[i]);

}

printf("Введите элементы для массива 3:\n");

for (int i = 0; i < n; i++) {

scanf_s("%d", &arr3[i]);

}

printf("\nИсходные массивы:\n");

printf("Массив 1: ");

for (int i = 0; i < n; i++) printf("%d ", arr1[i]);

printf("\n");

printf("Массив 2: ");

for (int i = 0; i < n; i++) printf("%d ", arr2[i]);

printf("\n");

printf("Массив 3: ");

for (int i = 0; i < n; i++) printf("%d ", arr3[i]);

printf("\n");

printf("Введите направление сдвига: вправо-0, влево-1. ");

scanf_s("%d", &g);

if (g == 0) {

right(arr1, n);

right(arr2, n);

right(arr3, n);

}

else {

left(arr1, n);

left(arr2, n);

left(arr3, n);

}

printf("\nМассивы после сдвига:\n");

printf("Массив 1: ");

for (int i = 0; i < n; i++) printf("%d ", arr1[i]);

printf("\n");

printf("Массив 2: ");

for (int i = 0; i < n; i++) printf("%d ", arr2[i]);

printf("\n");

printf("Массив 3: ");

for (int i = 0; i < n; i++) printf("%d ", arr3[i]);

printf("\n");

return 0;

}

  1. Сложение двух двоичных массивов. Оформила операцию сложения в виде столбика (void form)

#include <stdio.h>

#include <locale.h>

#define MAX_SIZE 10000

// Функция сложения двух двоичных массивов

void sum(int a[], int b[], int result[], int size) {

int carry = 0;

for (int i = size - 1; i >= 0; i--) {

int sum = a[i] + b[i] + carry;

result[i] = sum % 2;

carry = sum / 2;

}

}

//Функция вывода результата в столбик

void form(int a[], int b[], int result[], int size) {

printf(" ");

for (int i = 0; i < size; i++) printf("%d", a[i]);

printf("\n");

printf("+ ");

for (int i = 0; i < size; i++) printf("%d", b[i]);

printf("\n");

printf("--");

for (int i = 0; i < size; i++) printf("-");

printf("\n");

printf(" ");

for (int i = 0; i < size; i++) printf("%d", result[i]);

printf("\n");

}

int main() {

setlocale(LC_ALL, "rus");

int arr1[MAX_SIZE], arr2[MAX_SIZE], result[MAX_SIZE];

int n;

printf("Введите размер двоичных массивов (максимум %d): ", MAX_SIZE);

scanf_s("%d", &n);

if (n > MAX_SIZE) {

printf("Некорректный размер массива\n");

return 1;

}

printf("Введите элементы первого массива (0 или 1):\n");

for (int i = 0; i < n; i++) {

scanf_s("%d", &arr1[i]);

}

printf("Введите элементы второго массива (0 или 1):\n");

for (int i = 0; i < n; i++) {

scanf_s("%d", &arr2[i]);

}

sum(arr1, arr2, result, n);

form(arr1, arr2, result, n);

return 0;

}

  1. Умножение двух двоичных массивов

#include <stdio.h>

#include <locale.h>

#define MAX_SIZE 10000

void mul(int a[], int b[], int result[], int size) {

for (int i = 0; i < 2 * size; i++) {

result[i] = 0;

}

//Умножение по правилам двоичной арифметики

for (int i = size - 1; i >= 0; i--) {

if (b[i] == 1) {

int carry = 0;

for (int j = size - 1; j >= 0; j--) {

int temp = a[j] + result[i + j + 1] + carry;

result[i + j + 1] = temp % 2;

carry = temp / 2;

}

if (carry) result[i] = carry;

}

}

}

void print_array(int arr[], int size) {

for (int i = 0; i < size; i++) {

printf("%d", arr[i]);

}

printf("\n");

}

int main() {

setlocale(LC_ALL, "rus");

int a[MAX_SIZE], b[MAX_SIZE], result[2 * MAX_SIZE];

int n;

printf("Введите размер двоичных чисел (максимум %d): ", MAX_SIZE);

scanf_s("%d", &n);

if (n > MAX_SIZE) {

printf("Некорректный размер\n");

return 1;

}

printf("Введите первое число (0 и 1):\n");

for (int i = 0; i < n; i++) scanf_s("%d", &a[i]);

printf("Введите второе число (0 и 1):\n");

for (int i = 0; i < n; i++) scanf_s("%d", &b[i]);

mul(a, b, result, n);

printf("Первое число: "); print_array(a, n);

printf("Второе число: "); print_array(b, n);

printf("Результат умножения: "); print_array(result, 2 * n);

return 0;

}

  1. Сложение чисел с плавающей запятой с разными порядками

#include <stdio.h>

#include <string.h>

#include <math.h>

#include <locale.h>

#define M_SIZE 8 // Размер мантиссы

#define P_SIZE 4 // Размер порядка

// Функция для сложения чисел с плавающей точкой

void sum(int mant1[], int por1[], int mant2[], int por2[], int resultMant[], int resultPor[]) {

// Приведение к одинаковому порядку

int diff = por1[0] - por2[0];

int smallerP;

if (diff > 0) {

smallerP = por2[0];

}

else {

smallerP = por1[0];

}

int biggerM[M_SIZE], biggerP[P_SIZE];

int smallerM[M_SIZE];

//Сдвиг мантиссы меньшего числа

for (int i = 0; i < abs(diff); i++) {

int temp = smallerM[M_SIZE - 1];

for (int j = M_SIZE - 1; j > 0; j--) {

smallerM[j] = smallerM[j - 1];

}

smallerM[0] = temp;

}

int sumM[M_SIZE];

int carry = 0;

for (int i = M_SIZE - 1; i >= 0; i--) {

int temp = biggerM[i] + smallerM[i] + carry;

sumM[i] = temp % 2;

carry = temp / 2;

}

}

int main() {

setlocale(LC_ALL, "rus");

int mant1[M_SIZE], por1[P_SIZE];

int mant2[M_SIZE], por2[P_SIZE];

int resultMant[M_SIZE], resultPor[P_SIZE];

printf("Введите мантиссу первого числа (0 и 1):\n");

for (int i = 0; i < M_SIZE; i++) scanf_s("%d", &mant1[i]);

printf("Введите порядок первого числа:\n");

for (int i = 0; i < P_SIZE; i++) scanf_s("%d", &por1[i]);

printf("Введите мантиссу второго числа (0 и 1):\n");

for (int i = 0; i < M_SIZE; i++) scanf_s("%d", &mant2[i]);

printf("Введите порядок второго числа:\n");

for (int i = 0; i < P_SIZE; i++) scanf_s("%d", &por2[i]);

sum(mant1, por1, mant2, por2, resultMant, resultPor);

printf("\nРезультат:\n");

printf("Мантисса: ");

for (int i = 0; i < M_SIZE; i++) printf("%d", resultMant[i]);

printf("\n");

printf("Порядок: ");

for (int i = 0; i < P_SIZE; i++) printf("%d", resultPor[i]);

return 0;

}

  1. Перевод в доп. код

#include <stdio.h>

#include <locale.h>

#define MAX_SIZE 10000

// Функция перевода в дополнительный код

void cod(int binary[], int size) {

// Инверсия

for (int i = 0; i < size; i++) {

binary[i] = (binary[i] == 0) ? 1 : 0; //меняем 0 на 1 и 1 на 0

}

// Добавляем единицу в младший разряд

int carry = 1; // Перенос

for (int i = size - 1; i >= 0; i--) {

int sum = binary[i] + carry;

binary[i] = sum % 2;

carry = sum / 2;

}

}

// Функция вывода массива

void printArray(int arr[], int size) {

for (int i = 0; i < size; i++) {

printf("%d", arr[i]);

}

printf("\n");

}

int main() {

setlocale(LC_ALL, "rus");

int bin[MAX_SIZE];

int n;

printf("Введите размер двоичного числа (максимум %d): ", MAX_SIZE);

scanf_s("%d", &n);

if (n > MAX_SIZE) {

printf("Некорректный размер\n");

return 1;

}

printf("Введите двоичное число:\n");

for (int i = 0; i < n; i++) {

scanf_s("%d", &bin[i]);

}

printf("Исходное число: "); printArray(bin, n);

cod(bin, n);

printf("Дополнительный код: "); printArray(bin, n);

return 0;

}

Соседние файлы в папке 7