Объектно-орентир. программирование

3 курс 2 семестр
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 367
Стаж: 2 года 9 месяцев
Откуда: Вологодская область
Контактная информация:

Объектно-орентир. программирование

Сообщение Артём Мамзиков »

Архив 200руб
Содержимое архива
Содержимое архива
Содержимое архива
учеб. Павловская Т.А.
Программирование на языке высокого уровня С#
Лабораторная работа № 8
Вариант по журналу 1-1, 2-2, 20-20, 21-1, 22-2.


Готовый 10 вариант

СОДЕРЖАНИЕ
1 Введение 3
2 Задание на курсовой проект 4
3 Написание листинга вещественной матрицы 5
4 Заключение 12
5 Список использованной литературы 13

Введение
Объектно-ориентированные языки программирования пользуются в последнее время большой популярностью среди программистов, так как они позволяют использовать преимущества объектно-ориентированного подхода не только на этапах проектирования и конструирования программных систем, но и на этапах их реализации, тестирования и сопровождения.
Наиболее распространенным объектно-ориентированным языком
программирования, безусловно, является C. Свободно распространяемые коммерческие системы программирования C существуют практически на любой платформе.
Внедрение в практику написания программ объектно-ориентированной парадигмы дает развитие новых областей информатики, значительное повышение уровня технологичности создаваемых программных средств, сокращение затрат на разработку и сопровождение программ, их повторное использование, вовлечение в процесс расширения интеллектуальных возможностей ЭВМ.
С# является языком программирования общего назначения. Именно этот язык хорошо известен своей эффективностью, экономичностью, и переносимостью. Указанные преимущества С# обеспечивают хорошее качество разработки почти любого вида программного продукта.
Использование С# в качестве инструментального языка позволяет получать быстрые и компактные программы. Во многих случаях программы, написанные на С#, сравнимы по скорости с программами, написанными на языке ассемблера.

Задание на курсовой проект
Классы и операции
Описать класс, реализующий тип данных «вещественная матрица» и работу с ними. Класс должен реализовывать следующие операции над матрицами:
• Умножение, деление (как на другую матрицу, так и на число);
• Комбинированные операции присваивания ( *=, /= );
• Операции воздействия в степень;
• Методы вычисления детерминанта и нормы;
• Доступ к элементам по индексам
Написать программу , демонстрирующую все разработанные элементы класса.

Ход выполнения работы:
1. Запускаем Microsoft Visual C# 2010 Express, создаем проект «Консольное Приложение»
2. Листинг приложения на C#:
Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace probasharp
{
public class Matrix
{
public float[,] matrix = null;

public int CountColumn { get; private set; }
public int CountRow { get; private set; }

public Matrix(int x = 1, int y = 1, bool autoGeneration = true, int startGen = 1)
{
if (autoGeneration) generator(x, y, startGen);
else
matrix = new float[x, y];

CountColumn = y;
CountRow = x;
}

public float this[int x, int y]
{
get { return matrix[x, y]; }
set { matrix[x, y] = value; }
}

public static Matrix operator *(Matrix x1, Matrix x2)
{
if (x1.CountColumn != x2.CountRow) throw new ArgumentException("Число столбцов матрицы А не равно числу строк матрицы В.");
Matrix ret = new Matrix(x1.CountRow, x2.CountColumn, false);

for (int i = 0; i < x1.CountRow; i++)
for (int j = 0; j < x2.CountColumn; j++)
for (int k = 0; k < x2.CountRow; k++)
ret[i, j] += x1[i, k] * x2[k, j];

return ret;
}

public static Matrix operator *(Matrix x1, int constNum)
{
Matrix ret = new Matrix(x1.CountRow, x1.CountColumn, false);
for (int i = 0; i < x1.CountColumn * x1.CountRow; i++)
{
int X = i / x1.CountColumn;
int Y = i - x1.CountColumn * X;
ret[X, Y] = x1[X, Y] * constNum;
}

return ret;
}

public static Matrix operator /(Matrix x1, Matrix x2)
{
if (x1.CountColumn != x2.CountRow) throw new ArgumentException("Число столбцов матрицы А не равно числу строк матрицы В.");
Matrix ret = new Matrix(x1.CountRow, x2.CountColumn, false);

ret = x1 * x2.Inverse();

return ret;
}

public static Matrix operator /(Matrix x1, int constNum)
{
Matrix ret = new Matrix(x1.CountRow, x1.CountColumn, false);
for (int i = 0; i < x1.CountColumn * x1.CountRow; i++)
{
int X = i / x1.CountColumn;
int Y = i - x1.CountColumn * X;
ret[X, Y] = x1[X, Y] / constNum;
}

return ret;
}


public Matrix POW(int constNum)
{
Matrix ret = new Matrix(this.CountRow, this.CountColumn, false);
for (int i = 0; i < this.CountColumn * this.CountRow; i++)
{
int X = i / this.CountColumn;
int Y = i - this.CountColumn * X;
ret[X, Y] = (float)Math.Pow((double)this.matrix[X, Y],(double)constNum);
}

return ret;
}

public float[] GetRow(int row)
{
if (row >= CountRow) throw new IndexOutOfRangeException("Индекс строки не принадлежит массиву.");
float[] ret = new float[CountColumn];
for (int i = 0; i < CountColumn; i++)
ret = matrix[row, i];

return ret;
}

public void SetRow(float[] values, int row)
{
if (row >= CountRow) throw new IndexOutOfRangeException("Индекс строки не принадлежит массиву.");
for (int i = 0; i < (CountColumn > values.Length ? values.Length : CountColumn); i++)
matrix[row, i] = values;
}

public Matrix Inverse()
{
if (CountRow != CountColumn) throw new ArgumentException("Обратная матрица существует только для квадратных, невырожденных, матриц.");
Matrix ret = new Matrix(CountRow, CountColumn, false);
ret.matrix = (float[,])this.matrix.Clone();
float determinant = ret.Determinant();

if (determinant == 0) return ret; //Если определитель == 0 - матрица вырожденная

for (int i = 0; i < CountRow; i++)
{
for (int t = 0; t < CountColumn; t++)
{
Matrix tmp = ret.Exclude(i, t);
ret[t, i] = tmp.Determinant() / determinant;
}
}
return ret;
}


public float Determinant()
{
if (CountColumn != CountRow) throw new ArgumentException("Вычисление определителя возможно только для квадратных матриц.");
Matrix _matrix = new Matrix(CountRow, CountColumn, false);
_matrix.matrix = (float[,])this.matrix.Clone();

float det = 1;
int order = CountRow;

for (int i = 0; i < order - 1; i++)
{
float[] masterRow = _matrix.GetRow(i);
det *= masterRow;
if (det == 0) return 0;
for (int t = i + 1; t < order; t++)
{
float[] slaveRow = _matrix.GetRow(t);
float[] tmp = MulArrayConst(masterRow, slaveRow / masterRow);
float[] source = _matrix.GetRow(t);
_matrix.SetRow(SubArray(source, tmp), t);
}
}
det *= _matrix[order - 1, order - 1];
return det;
}

public float Norma()
{
float s = 0;
for (int i = 0; i <CountColumn ; i++)
{
float max = matrix[0,i];
for (int j = 1; j < CountRow; j++)
{
if(matrix[i,j]>max)
max=matrix[i,j];
}
s += max;
}
return s;
}

public Matrix Exclude(int row, int column)
{
if (row > CountRow || column > CountColumn) throw new IndexOutOfRangeException("Строка или столбец не принадлежат матрице.");
Matrix ret = new Matrix(CountRow - 1, CountColumn - 1, false);
ret.matrix = (float[,])this.matrix.Clone();
int offsetX = 0;
for (int i = 0; i < CountRow; i++)
{
int offsetY = 0;
if (i == row) { offsetX++; continue; }
for (int t = 0; t < CountColumn; t++)
{
if (t == column) { offsetY++; continue; }
ret[i - offsetX, t - offsetY] = this[i, t];
}
}
return ret;
}

public override string ToString()
{
StringBuilder ret = new StringBuilder();
if (matrix == null) return ret.ToString();

for (int i = 0; i < CountRow; i++)
{
for (int t = 0; t < CountColumn; t++)
{
ret.Append(matrix[i, t]);
ret.Append("\t");
}
ret.Append("\n");
}
return ret.ToString();
}


float[] SubArray(float[] A, float[] B)
{
float[] ret = (float[])A.Clone();
for (int i = 0; i < (A.Length > B.Length ? A.Length : B.Length); i++)
ret -= B;
return ret;
}

float[] MulArrayConst(float[] array, float number)
{
float[] ret = (float[])array.Clone();
for (int i = 0; i < ret.Length; i++)
ret *= number;
return ret;
}

void generator(int x, int y, int startGen)
{
matrix = new float[x, y];
Random rnd = new Random(startGen);

for (int i = 0; i < x * y; i++)
{
int X = i / y;
int Y = i - y * X;
matrix[X, Y] = rnd.Next(-10, 10);
}
}
}


}

main

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace probasharp
{
using System;
using System.Text;
class Program
{

static void Main(string[] args)
{
Matrix m1 = new Matrix(3, 3, true, 22);
Matrix m2 = new Matrix(3, 3, true, 28);
Console.WriteLine("{0}\n{1}", m1, m2);
Console.WriteLine(m1 * m2);
Console.WriteLine(m1 * 4);
Console.WriteLine(m1 / m2);
Console.WriteLine(m1 / 2);
Console.WriteLine(m1 *= m2);
Console.WriteLine(m1 /= m2);
Console.WriteLine(m1.POW(2));
Console.WriteLine(m1.Determinant());
Console.WriteLine(m1.Norma());
Console.WriteLine(m1[1,1]);
Console.ReadKey();
}
}
}


3. После написания кода приложения, проводим отладку
1
1
Рисунок 2 – Результат работы приложения


Заключение
На языке объектно-ориентированного программирования в программе C# написав листинг программы, мы создали вещественную матрицу.
Реализовывав следующие операции матрицы:
Умножение, деление, комбинированные операции присваивания ( *=, /= ),
операции воздействия в степень, методы вычисления детерминанта и нормы, доступ к элементам по индексам.

Список использованной литературы
1. Павловская Т.А., C#. Программирование на языке высокого уровня. Учебник для вузов, СПб.: Питер, 2009. – 432с.:ил.
2. Джейсон, Прайс; Майк, Гандэрлой Visual C# .NET. Полное руководство; КОРОНА принт, 2004. - 960 c.
3. . Нейгел, К. C# 2005 для профессионалов; Вильямс, 2006. - 763 c.
4. Рихтер, Джефри CLR via C#. Программирование на платформе Microsoft .NET Framework 2.0 на языке C#; Питер, 2007. - 656 c.
5. Робинсон, С.; Корнес, О.; Глинн, Д. и др. C# для профессионалов; М.: Лори, 2005. - 396 c.
количество слов: 930

Вернуться в «Объектно-орентир. программирование»