Клас для роботи в кільці многочленів, визначених над кільцем цілих чисел по модулю

Автор работы: Пользователь скрыл имя, 29 Апреля 2013 в 01:32, курсовая работа

Описание

Теорія перетворень в кільцях багаточленів знайшла широке застосування при вирішенні задач перешкодостійкого кодування, шифрування, передачі даних сигналами з великою базою (шумоподібних сигналів - ШПС) і т.п. В цих системах інформація передається блоками (кадрами, пакетами), в зв’язку з чим кожний блок може бути представлений багаточленом (вектором) фіксованої розмірності.
Метою даного курсового проекту є розробка класу для роботи в кільці многочленів над цілими числами. Для роботи з многоченами був розроблений програмний інтерфейс. Клас Zm дозволяє реалізувати функції додавання, віднімання та множення многочленів. Щоб представити результати операції в стандартному вигляді розроблена додаткова функція приведення подібних одночленів многочлена та сортування по збільшеню.

Содержание

Реферат .....................................................................................................................................
Перелік умовних позначень,символів ,скорочень та термінів...............................................
Вступ…………............................................................................................................................
1. Аналіз предметної області....................................................................................................
1.1 Математичний опис задачі.............................................................................................
1.2 Обґрунтування вибору програмних засобів…………………………………………
1.2.1 Огляд особливостей мови програмування...........................................................
1.2.2 Огляд особливостей обраного компілятору …………………………………...
1.2.3Створення візуального інтерфейсу………………………………………………
1.3 Аналіз структури стандартної бібліотеки шаблонів STL...........................................
1.4 Висновки до розділу ………………………………………………………………...
2. Рішення шодо розробки програми…………………………………………………………..
2.1 Основні рішення щодо уявлення даних системи ….………………………………...
2.2 Опис розроблених алгоритмів.....................................................................................
2.3 Основні рішення щодо модульного уявлення системи..............................................
2.4 Результати тестування програмного забезпечення.....................................................
3. Посібник програміста............................................................................................................
4. Інструкція користувача.........................................................................................................
5. Інформаційний листок……………………………………………………………………..
6.Література...............................................................................................................................
Висновки……………………………………………

Работа состоит из  1 файл

KURSOVAYa.doc

— 1.43 Мб (Скачать документ)

5 ІНФОРМАЦІЙНИЙ ЛИСТОК

 

 

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

Програма має простий і зручний інтерфейс, базовий для всіх  Windows-систем. Робота з програмою не вимагає високого рівня володіння комп’ютером. Процес розрахунку простий і швидкий, не потребує заглиблюватись в деталі математичних наук.

Програмне забезпечення не захищене паролем, тобто його може застосовувати будь-який користувач.

Програмне забезпечення займає 2 МБ на жорсткому диску, не потребує установки,

складається тільки з одного виконавчого файлу з розширенням .exe

6 Література

1. Шилдт, Г. C# 3.0: полное руководство [Текст] / Г. Шилдт. – М.: Вильямс, 2009. – 992 c.

2. Табунщик, Г.В. Методичні вказівки до виконання курсової роботи з дисципліни“Об’єктно-орієнтоване програмування” для студентів професійного напрямку 6.050103 «Програмна інженерія» всіх форм навчання. Частина 1. Основні теоретичні відомості [Текст] / Г.В. Табунщик, Г.В. Неласа, Н.О. Миронова. – Запоріжжя: ЗНТУ, 2010. – 78 с.

              3.Табунщик, Г.В. Методичні вказівки до виконання курсової роботи з дисципліни “Об’єктно-орієнтоване програмування” для студентів професійного напряму 6.050103 «Програмна інженерія» всіх форм навчання. Частина 2. Організаційна частина [Текст] / Г.В. Табунщик, Г.В. Неласа, Н.О. Миронова – Запоріжжя: ЗНТУ, 2010. – 22 с.

3. ДСТУ 3008-95 «Документація. Звіти у сфері науки і техніки. Структура і правила оформлення ». – К. –1995.

4. ГОСТ 19.701-90. Схемы алгоритмов, программ, данных и систем. Условное обозначение и правила выполнения. – М., 1990. – 25 с.

 

 

ВИСНОВКИ

 

В даній роботі реалізована задача «Ставорення класу для виконання арифметичних операцій з многочленами в кільці з діленням по модулю».Здійснено математичний опис задачі, постановку задачі та розробку програмного пакету згідно з постановкою. Роботу програми перевірено на контрольному прикладі, одержано результати, що співпадають з теоретичними.

Подальшим розвитком теми може бути створення «формульного редактора», який спрощував би довільні математичні вирази, до складу яких входять многочлени.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Додаток А

Технічне завдання

 

                            

 

КЛАС  ДЛЯ РОБОТИ В КІЛЬЦІ МНОГОЧЛЕНІВ  НАД Zm

 

 

ЛИСТ  ЗАТВЕРДЖЕННЯ

Технічне завдання

13.02070849.00014-01 01-1-ЛУ

 

 

5 листів

 

 

 

 

Керівник

___________Г.В.  Неласа

“___”___________2010

 

Розробила

ст. гр. ІОТ – 429

___________К.А. Мринська

“___”___________2010

 

Нормоконтролер

___________Г.В.  Неласа

“___”___________2010

 

 

 

 

 

2010

ЗАТВЕРДЖЕНИЙ

13.02070849.00014 -01 01-1-ЛУ

 

 

 

 

 

 

 

 

 

 

 

КЛАС  ДЛЯ РОБОТИ В КІЛЬЦІ МНОГОЧЛЕНІВ  НАД Zm

 

 

Технічне завдання

13.02070849.00014 -01 01-1

 

 

5 листів

 

 

 

 

 

 

 

 

 

 

 

 

 

2010

Додаток Б

Код програми

Б.1 Form1.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace CourseWork_OOP

{

   public partial class Form1 : Form

   {

      public Form1()

      {

         InitializeComponent();

      }

 

      Zm.Monominal Monominal;

 

      // Проверка вводимых значений

      private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)

      {

         e.Cancel = true;

         if (e.FormattedValue.ToString().Length == 0) return;

         foreach (char Ch in e.FormattedValue.ToString())

         {

            if ((Ch < 48) || (Ch > 57)) return;

         }

         e.Cancel = false;

      }

 

      // Очистка таблицы 1 по нажатию кнопки

      private void buttonClear1_Click(object sender, EventArgs e)

      {

         labelOperation.Text = "  Действие :";

         dataGridView1.Rows.Clear();

      }

 

      // Очистка таблицы 2 по нажатию кнопки

      private void buttonClear2_Click(object sender, EventArgs e)

      {

         labelOperation.Text = "  Действие :";

         dataGridView2.Rows.Clear();

      }

 

      // Очистка таблицы 3 по нажатию кнопки

      private void buttonClear3_Click(object sender, EventArgs e)

      {

         labelOperation.Text = "  Действие :";

         dataGridView3.Rows.Clear();

      }

 

      // Обработка нажатий на кнопки  арифм. действий

      private void buttonAdd_Click(object sender, EventArgs e)

      {

         labelOperation.Text = "  Действие : ";

         //dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Descending);

         //dataGridView2.Sort(dataGridView2.Columns[0], ListSortDirection.Descending);

         dataGridView3.Rows.Clear();

        

         // Подготовка таблицы 1 ------------------------------

         List<Zm.Monominal> Polynom1 = new List<Zm.Monominal>();

         for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)

         {

            if ((dataGridView1.Rows[i].Cells[1].Value == null) ||       //пустое поле

                (dataGridView1.Rows[i].Cells[1].Value == (object)"0"))  //коэфф = 0

               continue;

            if (dataGridView1.Rows[i].Cells[0].Value == null)         //пустое поле

               dataGridView1.Rows[i].Cells[0].Value = "0";

            Monominal.Pow = int.Parse(dataGridView1.Rows[i].Cells[0].Value.ToString());

            Monominal.Coeff = int.Parse(dataGridView1.Rows[i].Cells[1].Value.ToString());

            Polynom1.Add(Monominal);

         }

         Zm Zm1 = new Zm(Polynom1, (byte)numericUpDownMod.Value);

 

         // Подготовка таблицы 2 ------------------------------

         List<Zm.Monominal> Polynom2 = new List<Zm.Monominal>();

         for (int i = 0; i < dataGridView2.Rows.Count - 1; i++)

         {

            if ((dataGridView2.Rows[i].Cells[1].Value == null) ||

                (dataGridView2.Rows[i].Cells[1].Value == (object)"0"))

               continue;

            if (dataGridView2.Rows[i].Cells[0].Value == null)

               dataGridView2.Rows[i].Cells[0].Value = "0";

            Monominal.Pow = int.Parse(dataGridView2.Rows[i].Cells[0].Value.ToString());

            Monominal.Coeff = int.Parse(dataGridView2.Rows[i].Cells[1].Value.ToString());

            Polynom2.Add(Monominal);

         }

         Zm Zm2 = new Zm(Polynom2, (byte)numericUpDownMod.Value);

 

         // Вызов арифметич. операций

         Zm Zm3 = new Zm();

         switch (sender.ToString())

         {

            case "System.Windows.Forms.Button, Text: +" :

               Zm3 = Zm1 + Zm2;

               labelOperation.Text = "  Действие : + ";

               break;

            case "System.Windows.Forms.Button, Text: -":

               Zm3 = Zm1 - Zm2;

               labelOperation.Text = "  Действие : - ";

               break;

            case "System.Windows.Forms.Button, Text: X":

               Zm3 = Zm1 * Zm2;

               labelOperation.Text = "  Действие :  x ";

               break;

            default :

               return;

               break;

         }

 

         // Вывод данных в таблицу 3 ------------------------------

         for (int i = 0; i < Zm3.Polynom.Count; i++)

         {

            dataGridView3.Rows.Add();

            dataGridView3.Rows[i].Cells[0].Value = Zm3.Polynom[i].Pow.ToString();

            dataGridView3.Rows[i].Cells[1].Value = Zm3.Polynom[i].Coeff.ToString();

         }

         //dataGridView3.Sort(dataGridView3.Columns[0], ListSortDirection.Descending); ;

      }

 

      private void dataGridView3_CellContentClick(object sender, DataGridViewCellEventArgs e)

      {

 

      }

 

   }

}

 

Б.2 Zm.cs

using System;

using System.Collections.Generic;

using System.Text;

using System.Collections;

 

 

namespace CourseWork_OOP

{

   class Zm

   {

// Модуль

 

      public byte Mod; 

 

// Одночлен

       

      public struct Monominal          {

         public int Pow;

         public int Coeff;

 

         public static Monominal operator + (Monominal lhs, Monominal rhs) 

 

// Сложение одночленов

 

         {

            Monominal Result;

            if (lhs.Pow == rhs.Pow) Result.Coeff = lhs.Coeff + rhs.Coeff;

            else Result.Coeff = lhs.Coeff;

            Result.Pow = lhs.Pow;

            return Result;

         }

 

// Вычитание одночленов

public static Monominal operator - (Monominal lhs, Monominal rhs)

         {

            Monominal Result;

            if (lhs.Pow == rhs.Pow) Result.Coeff = lhs.Coeff - rhs.Coeff;

            else Result.Coeff = lhs.Coeff;

            Result.Pow = lhs.Pow;

            return Result;

         }

 

// Умножение одночленов

public static Monominal operator * (Monominal lhs, Monominal rhs)

        {

            Monominal Result;

            Result.Pow = lhs.Pow + rhs.Pow;

            Result.Coeff = lhs.Coeff * rhs.Coeff;

            return Result;

         }

 

// Сравнение одночленов >

public static bool operator > (Monominal lhs, Monominal rhs)     

 

         {

            if ((lhs.Pow > rhs.Pow) || ((lhs.Pow == rhs.Pow) && (lhs.Coeff >= rhs.Coeff)))

               return true;

            else return false;

         }

 

   // Сравнение одночленов <

         public static bool operator < (Monominal lhs, Monominal rhs)

 

    {

            if ((lhs.Pow < rhs.Pow) || ((lhs.Pow == rhs.Pow) && (lhs.Coeff < rhs.Coeff)))

               return true;

            else return false;

         }

      }

 

  // Многочлен

      public List<Monominal> Polynom; 

 

// Сортировка многочлена

      private void SortPolynom(List<Monominal> Polynom)         {

         Monominal Min;

         for (int i = 0; i < Polynom.Count - 1; i++)

         {

            Min = Polynom[i];

            for (int j = i + 1; j < Polynom.Count; j++)

            {

               if (Polynom[j] < Min)

               {

                  Min = Polynom[j];

                  Polynom.RemoveAt(j);

                  Polynom.Insert(i, Min);

               }

            }

         }

        

      }

 

// Конструктор  по умолчанию 

      public Zm()          {

         this.Polynom = new List<Monominal>();

         this.Mod = 2;

      } 

 

// Перегрузка конструктора

      public Zm(List<Monominal> Polynom, byte Mod)

      {

         this.Polynom = Polynom;

         this.Mod = Mod;

      }

 

// Перегрузка операции сложения

      public static Zm operator + (Zm lhs, Zm rhs)      {

         List<Monominal> PX = new List<Monominal>();

         PX = lhs.Polynom;

         List<Monominal> PY = new List<Monominal>();

         PY = rhs.Polynom;

         Monominal Mono;

         List<Monominal> Poly = new List<Monominal>();

 

         for (int i = 0; i < PX.Count; i++)

         {

            Mono = PX[i];

            for (int j = i + 1; j < PX.Count; j++)

            {

               if (PX[i].Pow == PX[j].Pow)

               {

                  Mono += PX[j];

                  PX.RemoveAt(j);

                  j--;

               }

            }

            for (int j = 0; j < PY.Count; j++)

            {

               if (PX[i].Pow == PY[j].Pow)

               {

                  Mono += PY[j];

                  PY.RemoveAt(j);

                  j--;

               }

            }

            Mono.Coeff %= lhs.Mod;

            Poly.Add(Mono);

         }

 

         for (int i = 0; i < PY.Count; i++)

         {

            Mono = PY[i];

            for (int j = i + 1; j < PY.Count; j++)

            {

               if (PY[i].Pow == PY[j].Pow)

               {

                  Mono += PY[j];

                  PY.RemoveAt(j);

                  j--;

               }

            }

            Mono.Coeff %= lhs.Mod;

            Poly.Add(Mono);

         }

        

         Zm Result = new Zm(Poly, lhs.Mod);

         Result.SortPolynom(Poly);

         return Result;

      }

 

// Перегрузка операции вычитания

      public static Zm operator - (Zm lhs, Zm rhs)   

{

         List<Monominal> PX = new List<Monominal>();

         PX = lhs.Polynom;

         List<Monominal> PY = new List<Monominal>();

         PY = rhs.Polynom;

         Monominal Mono;

         List<Monominal> Poly = new List<Monominal>();

 

         for (int i = 0; i < PX.Count; i++)

         {

            Mono = PX[i];

            for (int j = i + 1; j < PX.Count; j++)

            {

               if (PX[i].Pow == PX[j].Pow)

               {

                  Mono += PX[j];

                  PX.RemoveAt(j);

                  j--;

               }

            }

            for (int j = 0; j < PY.Count; j++)

            {

               if (PX[i].Pow == PY[j].Pow)

               {

                  Mono -= PY[j];

                  PY.RemoveAt(j);

                  j--;

               }

            }

            Mono.Coeff %= lhs.Mod;

// Из модуля вычесть число

            if (Mono.Coeff < 0) Mono.Coeff = lhs.Mod - Mono.Coeff; 

             Poly.Add(Mono);

         }

 

         for (int i = 0; i < PY.Count; i++)

         {

            Mono = PY[i];

            for (int j = i + 1; j < PY.Count; j++)

            {

               if (PY[i].Pow == PY[j].Pow)

               {

                  Mono += PY[j];

                  PY.RemoveAt(j);

                  j--;

               }

            }

            Mono.Coeff %= lhs.Mod;

// Из модуля вычесть  число

            if (Mono.Coeff < 0) Mono.Coeff = lhs.Mod - Mono.Coeff;               Poly.Add(Mono);

         }

 

         Zm Result = new Zm(Poly, lhs.Mod);

         Result.SortPolynom(Poly);

         return Result;

      }

// перегрузка оператора умножения

      public static Zm operator * (Zm lhs, Zm rhs)      {

         //Monominal Mono;

         List<Monominal> Poly = new List<Monominal>();

         foreach (Monominal Mono1 in lhs.Polynom)

            foreach (Monominal Mono2 in rhs.Polynom)

               Poly.Add(Mono1 * Mono2);

         Zm Result = new Zm(Poly, lhs.Mod);

         List<Monominal> MonoEmpty = new List<Monominal>();

         Zm ZmEmpty = new Zm();

         Result += ZmEmpty;

         Result.SortPolynom(Poly);

         return Result;

      }

 

   }

}

 

 

 

 

 

 

 

 

 

 

Информация о работе Клас для роботи в кільці многочленів, визначених над кільцем цілих чисел по модулю