
Шафеева О.П., ИВТ, прога на СИ / дз / 7 / дз7
.docxДомашняя работа №7 к 23.12.24
Сдвиг элементов массивов вправо и влево
#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;
}
Сложение двух двоичных массивов. Оформила операцию сложения в виде столбика (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;
}
Умножение двух двоичных массивов
#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;
}
Сложение чисел с плавающей запятой с разными порядками
#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;
}
Перевод в доп. код
#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;
}