Вычислительные машины,системы и сети

Автор работы: Пользователь скрыл имя, 27 Ноября 2012 в 13:53, реферат

Описание работы

Задание 1. Выполнить арифметические действия, рассматривая операнды как ЧФЗ справа от МЗР в формате 1-го байта. Определить модуль результата. Формат результата – 2 байта.
Выполним операцию сложения Z = X+Y = 15(10) + 33(10) = 48(10).
X = 15(10) = 0000 1111(2);
Y = 33(10) = 0010 0001(2).

Файлы: 1 файл

_РГР_отчет.doc

— 432.94 Кб (Скачать файл)

(листинг программы)

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsFormsApplication1

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void button1_Click(object sender, EventArgs e)                       //10->2

        {

            textBox2.Clear();

            if (textBox1.Text.ToString().Length!=0)

            {

                double x;                                                   //изначальное число

                int whole;                                                  //целая часть

                float fract;                                                //дробная часть числа

                Stack<int> stack = new Stack<int>();                        //сюда разложится целая часть

                try

                {

                    x = Convert.ToDouble(

                        textBox1.Text.ToString().Replace('.', Convert.ToChar(44)));         //пробуем конвертнуть в double, иначе в catch

 

                    if (x < 0)                                              //если есть минус, то просто допишем его в ответ и возьмем модуль числа

                    {

                        textBox2.AppendText("-");

                        x = Math.Abs(x);

                    }

 

                    whole = (int)x;                                         //выделили целую часть

                    fract = (float)(x - Math.Truncate(x));                  //вычислили дробную

 

                    ////////////////////////////////////////////////////    разложение целой части

                    while (whole > 1)

                    {

                        stack.Push(whole % 2);

                        whole /= 2;

                    }

                    stack.Push(whole);

                    ////////////////////////////////////////////////////    вывод соджержимого стека в текстбокс2 

 

                    while (stack.Count != 0)

                        textBox2.AppendText(stack.Pop().ToString());

 

                    ////////////////////////////////////////////////////    //если дробная часть > 0

                    if ((float)(fract - Math.Truncate(fract)) != 0)

                        textBox2.AppendText(".");                           //то дописываем точечКУ)

 

                    ////////////////////////////////////////////////////    разложение дробной части сразу  в текстбокс2

                    while ((float)(fract - Math.Truncate(fract)) != 0)      //пока дробная часть не будет равна 0

                    {

                        fract = (float)(fract - Math.Truncate(fract)) * 2;  //умножаем дробную часть на 2

                        textBox2.AppendText(((int)fract).ToString());       //в ответ записываем целую часть числа - 0 или 1

                    }

                    ////////////////////////////////////////////////////

                }

                catch (System.Exception ex)

                {

                    MessageBox.Show(ex.ToString());

                }

            }

        }

 

        private void button2_Click(object sender, EventArgs e)                       //2->10

        {

            textBox1.Clear();

            if (textBox2.Text.ToString().Length != 0)

            {

                string str;                                                              //исходная строка

                str = textBox2.Text.ToString();

 

                str = str.Replace(" ", string.Empty);                                    //Заменяем все пробелы на НИЧТО)

 

                if (str.Length != 0 && str[0] == '-')                                    //если первый минус

                {

                    str = str.Replace("-", string.Empty);                                //убираем его

                    textBox1.AppendText("-");                                            //и дописываем в ответ, в текстбок1

                }

 

                double temp = 0;                                                         //результат

                int i = 0;                                                               //число для хранения степени (для умножения)

 

                if (str.Length != 0)                                                     //если строка не нулевая

                {

                    if (str.LastIndexOf(".") >= 0)                                       //если нашли точку -> число вещественное                    

                    {

                        for (int j = str.LastIndexOf(".") - 1; j >= 0; j--)              //от точки до начала строки (справа налево) конвертим целую часть

                        {

                            temp += Convert.ToDouble(str[j].ToString()) * Math.Pow(2, i);//число умножаем на 2 в степени разряда, начиная с нулевого

                            i++;

                        }

                        i = -1;                                                          //конвертим дробную часть

                        for (int j = str.LastIndexOf(".") + 1; j < str.Length; j++)      //от точки до конца строки

                        {

                            temp += Convert.ToDouble(str[j].ToString()) * Math.Pow(2, i);//число умножаем на 2 в степени разряда, начиная с -1

                            i--;

                        }

                    }

                    else                                                                 //если не было точки и число целое

                    {

                        for (int j = str.Length - 1; j >= 0; j--)                         //справа налево по строке

                        {

                            temp += Convert.ToDouble(str[j].ToString()) * Math.Pow(2, i);//число умножаем на 2 в степени разряда, начиная с нулевой

                            i++;

                        }

                    }

                    textBox1.AppendText(temp.ToString());                                //пишем результат temp в текстбокс1

                }

            }

        }

 

        private void textBox2_KeyDown(object sender, KeyEventArgs e)                 //обработка нажатия enter во втором текстбоксе

        {

            if (e.KeyCode == Keys.Enter)

            {

                button2_Click(sender, e);                                              //2->10

            }

        }

 

        private void textBox1_KeyDown(object sender, KeyEventArgs e)                 //обработка нажатия enter в первом текстбоксе

        {

            if (e.KeyCode == Keys.Enter)

            {

                button1_Click(sender, e);                                              //10->2

            }

        }

 

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)           //не пускаем буквы и прочее ненужное

        {

            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) &&

                e.KeyChar != '-')                                                    //если не цифра и не управляющая клавиша и не минус

            {

                if (e.KeyChar != '.' || textBox1.Text.IndexOf(".") != -1)            //и если не точка (или вторая точка)

                {

                    e.Handled = true;                                                //то нажатие идет лесом

                }

            }

        }

 

        private void textBox2_KeyPress(object sender, KeyPressEventArgs e)           //не пускаем буквы и прочее ненужное

        {

            if (char.ToString(e.KeyChar) != "1" && char.ToString(e.KeyChar) != "0"

                && !Char.IsControl(e.KeyChar) && e.KeyChar != '-')                   //если не 0, 1, управляющая клавиша, не минус

            {

                if (e.KeyChar != '.' || textBox2.Text.IndexOf(".") != -1)            //и если не точка (или вторая точка)

                {

                    e.Handled = true;                                                //то нажатие идет лесом

                }

            }

        }

 

        private void button1_MouseEnter(object sender, EventArgs e)                  //при наведении мыши на кнопку1

        {

            button1.Image = (System.Drawing.Image)Properties.Resources.arrowLargeDECTOBIN;  //меняем картинку на большую

            button1.Refresh();

        }              

 

        private void button1_MouseLeave(object sender, EventArgs e)                  //мышь покинула кнопку1

        {

            button1.Image = (System.Drawing.Image)Properties.Resources.arrowSmallDECTOBIN;  //меняем обратно на маленькую

            button1.Refresh();

        }

 

        private void button2_MouseEnter(object sender, EventArgs e)                  //при наведении мыши на кнопку2

        {

            button2.Image = (System.Drawing.Image)Properties.Resources.arrowLargeBINTODEC;  //меняем картинку на большую

            button2.Refresh();

        }

 

        private void button2_MouseLeave(object sender, EventArgs e)                  //мышь покинула кнопку2

        {

            button2.Image = (System.Drawing.Image)Properties.Resources.arrowSmallBINTODEC;  //меняем картинку обратно

            button2.Refresh();

        }

 

        private void Form1_Load(object sender, EventArgs e)

        {

 

        }

 

        private void label1_Click(object sender, EventArgs e)

        {

 

        }

    }

}

 

 

 

 

 

 






Информация о работе Вычислительные машины,системы и сети