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

Прямий код числа

При записі числа в прямому коді старший розряд є знаковим розрядом. Якщо його значення дорівнює 0 – то число додатне, якщо 1 – то від’ємне. В інших розрядах ( які наз. Цифровими розрядами ) записується двійкове представлення модуля числа.

Функція кодування двійкових чисел (в тому числі цілих і змішаних дробів) в прямому коді має вигляд:

де n – номер знакового розряду. При кодуванні правильних двійкових дробів (тобто чисел – 1 < A < 1), n=0 і функція кодування приймає вигляд:

Величина числа А в прямому коді знаходиться по наступній формулі:

:

asign — значення знакового розряду

число A має k розрядів справа от коми (дробова частина) и n розрядів зліва (ціла частина), тут враховується тільки цифрові розряди.

Як видно із останньої формули, знаковий розряд в прямому коді не має розрядної ваги. При виконанні арифметичних операцій це призводить до необхідності окремої обробки знакового розряду в прямому коді.

Код програми

using System;

using System.Windows.Forms;

namespace WindowsFormsApplication1 {

public partial class Form1 : Form {

public Form1() {

InitializeComponent();

}

private void textBox1_TextChanged(object sender, EventArgs e) {

textBox3.Text = BynaryMaster.Deduction(textBox1.Text, textBox2.Text);

}

private void textBox4_TextChanged(object sender, EventArgs e) {

textBox5.Text = BynaryMaster.Convert(textBox4.Text,5,8);

textBox6.Text = BynaryMaster.Convert(textBox4.Text, 8, 5);

}

private void label2_Click(object sender, EventArgs e)

{

}

private void Form1_Load(object sender, EventArgs e)

{

}

}

public static class BynaryMaster {

public static string Deduction(string First, string Second) {

string result = "";

//перевырка на правильнысть вхыдних даних

if(BadValue(First) | (BadValue(Second)))

return "Неправильні аргументи";

First = Add32Symbols(First);

Second = Add32Symbols(Second);

//перетвор в зворотный код другого числа

Second = Complementary(Second);

result = Addition(First, Second);

return result;

}

private static string Addition(string First, string second) {

string result = "";

int f = 0, s = 0, mem = 0, tempRes = 0;

for(int i = 31;i >= 0;i--) {

f = ((int)First[i] - 48);

s = ((int)second[i] - 48);

tempRes = f + s + mem;

if(tempRes == 3) {

mem = 1;

tempRes = 1;

} else

if(tempRes == 2) {

mem = 1;

tempRes = 0;

} else

mem = 0;

result = tempRes + result;

}

//для видалення лишнььої 1 з старшого розряду

if(mem == 1) {

result = Addition(result, "00000000000000000000000000000001");

}

return result;

}

private static string Add32Symbols(string Value) {// заповнює в числі всі 32 розряди

int AddValue = 0;

if(((int)Value[0] - 48) == 1)

AddValue = 1;

while(Value.Length != 32)

Value = AddValue + Value;

return Value;

}

private static string Complementary(string Value) {//перетвор в зворотный код

string result = "";

if(((int)Value[0] - 48) == 1) //якшо число відємне , тобто 3-(-4) = 3+4

return Value;

result += Value[0];

for(int i = 1;i < 32;i++) {

if(((int)Value[i] - 48) == 1)

result += 1;

else

result += 0;

}

return result;

}

private static bool BadValue(string Value) {

if(Value.Length == 0 | Value.Length > 32)

return true;

for(int i = 0;i < Value.Length;i++) {

if(!((((int)Value[i] - 48) == 1) | (((int)Value[i] - 48) == 0)))

return true;

}

return false;

}

//converter

private static bool BadValue(string Value,int Capacity) {

if(Value.Length == 0 | Value.Length > 32)

return true;

for(int i = 0;i < Value.Length;i++) {

if(!( ((int)Value[i] >= 48) && ((int)Value[i] <=47+Capacity) ))

return false;

}

return true;

}

private static int ConvertTo10(string Value,int Capacity) {

int []OldValue = new int[Value.Length];

for(int i = 0;i<Value.Length;i++){

if((int)Value[i]<=57)

OldValue[i] = (int)Value[i]- 48;

else

OldValue[i] = (int)Value[i]- 55;

}

int result = 0;

int Index = Value.Length - 1;

for(int i = 0;i < Value.Length;i++) {

result +=(int)( OldValue[i] * Math.Pow(Capacity, Index));

Index--;

}

return result;

}

internal static string Convert(string value, int RealCapacity, int NewCapacity) {

if(!BadValue(value, RealCapacity))

return BadValueText;

int Decimal = ConvertTo10(value,RealCapacity);

string NewValue = ConvertToNewCapacity(Decimal,NewCapacity);

return NewValue;

}

private static string ConvertToNewCapacity(int Decimal, int NewCapacity) {

string result = "";

int Index = -1;

while(Decimal > 0) {

Index++;

if (Decimal >= NewCapacity)

result = Decimal % NewCapacity + result;

else

result = Decimal + result;

Decimal = Decimal / NewCapacity;

}

if(Index == -1)

result = "0";

return result;

}

const string BadValueText = "Неправильні аргументи.";

}

}

Робота програми

Висновок

В даній домашній роботі я закріпив свої навички щодо переводу чисел з однієї системи числення в іншу, також я закріпив свої навички щодо представлення операції „-” операцією „+” в прямому коді.

Перелік використаної літератури

  1. Каган Б.М. Электронные вычислительные машины и системы, М.: Энергоатомиздат, 1985.

  2. Самофалов К.Г., Романкевич А.М., Валуйский В.Н., Каневский Ю.С., Пиневич М.М. Прикладная теория цифровых автоматов. — К.: Вища школа, 1987. — 375 с.

  3. Фомин С.В. Системы счисления, М.: Наука, 1987.

14

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]