Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Терновой_КДЗ_БИ_371(2).doc
Скачиваний:
2
Добавлен:
22.09.2019
Размер:
1.49 Mб
Скачать

40

Национальный исследовательский университет «Высшая школа экономики»

Факультет бизнес-информатики

Кафедра Архитектуры программных систем

Контрольное домашнее задание

По дисциплине

«Стандартизация, сертификация и управление качеством

программного обеспечения»

Вариант №30

Выполнил:

Студент Терновой Н.Н.

Группа 371(2)

Проверил:

Преподаватель Черников Б.В.

Москва – 2012

Формулировка задания 3

Описание программы 4

Постановка задачи 4

Характеристики комплекса задач 4

Выходная информация 4

Входная информация 4

Алгоритм задачи 5

Исходный текст программы 5

MainWindow.xaml.cs 5

FirstTask.xaml.cs 6

SecondTask.xaml.cs 7

GeneralMethods.cs 9

Task1MethodContainer.cs 10

Task2MethodContainer.cs 11

Оценка характеристик на основе метрик Холстеда 14

Вывод 26

26

Оценка структурной сложности трех критериев и метрики Маккейба 27

Исходный граф 27

Модифицированный граф 28

Первый критерий 28

Второй критерий 29

Третий критерий 30

Алгоритмическая сложность на основе метрики Маккейба 31

Оценка характеристик программы на основе модели функциональных указателей 33

Оценочные элементы программы f1..f5 33

Значения коэффициентов регулировки сложности 34

Расчет показателей 35

Расчет силы связности 35

Расчет силы сцепления 36

Вывод 37

Оценка надежности программы 39

Оценка надежности программы на основе модели Джелински-Моранды: 39

Оценка надежности программы на основе модели Миллса: 39

Формулировка задания

  1. Совершенное число – число, равное сумме своих правильных (т.е. меньших самого числа) делителей (пример: число 6 = 1 + 2 + 3). Вывести на экран совершенное число, ближайшее к числу, задаваемому с клавиатуры по запросу программы.

  2. Изобразить на экране рисунок паутины с центром в произвольной точке с координатами XY, с заданным числом лучей K. Числа K, X и Y вводятся с клавиатуры по запросу программы. Паутина должна быть образована лучами, выходящими из её центра и многоугольниками на равном расстоянии друг от друга. Количество многоугольников обратно пропорционально количеству лучей (больше лучей – меньше многоугольников).

Описание программы Постановка задачи Характеристики комплекса задач

Назначение комплекса задач

Комплекс задач, реализованный в данной программе, направлен на решение задания (сформулировано ранее).

Перечень объектов, в интересах которых решаются задачи

Задачи решаются в интересах любого заинтересованного в этом человека (т.е. человека, запустившего программу).

Периодичность решения задач

Задачи могут решаться практически с любой периодичностью (), необходимой пользователю.

Условия, при которых прекращается решение задач автоматизированным способом

Поставленные задачи решаются только автоматизированным способом.

Связи разрабатываемого программного средства

Данное приложение доступно для заявителей при условии наличия в их распоряжении исполняемого файла программы. Приложение не требует доступа в сеть Интернет и доступно только с локальной системы.

Выходная информация

Основной выводимой информацией являются решения поставленных задач. Однако, помимо них, программа выводит сообщения о некорректном вводе.

Входная информация

Входной информацией являются параметры и значения, необходимые для решения поставленных задач.

Алгоритм задачи

Рис. 1 Алгоритм разработанной программы

Исходный текст программы

Программа состоит из нескольких файлов:

MainWindow.xaml.cs

using System.Windows;

namespace KDZ_Ternovoy

{

/// <summary>

/// Логика взаимодействия для Window1.xaml

/// </summary>

public partial class MainWindow : Window

{

public MainWindow()

{

InitializeComponent();

}

private void FirstTaskButton_Click(object sender, RoutedEventArgs e)

{

FirstTask Task1_Window = new FirstTask();

Task1_Window.Show();

}

private void SecondTaskButton_Click(object sender, RoutedEventArgs e)

{

SecondTask Task2_Window = new SecondTask();

Task2_Window.Show();

}

}

}

FirstTask.xaml.cs

using System;

using System.Windows;

using System.Windows.Controls;

namespace KDZ_Ternovoy

{

/// <summary>

/// Логика взаимодействия для FirstTask.xaml

/// </summary>

public partial class FirstTask : Window

{

public FirstTask()

{

InitializeComponent();

// Сразу же отключаем кнопку

searchForNearestPerfectButton.IsEnabled = false;

}

// Обработчик изменения текста в поле

private void inputNumberTextBox_TextChanged(object sender, TextChangedEventArgs e)

{

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

changeFormElementStates(GeneralMethods.validateInputTextAsInteger(inputNumberTextBox.Text) && Convert.ToInt64(inputNumberTextBox.Text) > 0);

}

// Вызов метода поиска ближайшего совершенного числа

private void searchForNearestPerfectButton_Click(object sender, RoutedEventArgs e)

{

// Еще раз провалидируем входные данные (мало ли)

if (GeneralMethods.validateInputTextAsInteger(inputNumberTextBox.Text) && Convert.ToInt64(inputNumberTextBox.Text) > 0)

{

Int64 nearest = Task1MethodContainer.searchForNearestPerfect(Convert.ToInt64(inputNumberTextBox.Text));

outputTextBox.Content = nearest.ToString();

}

}

// Изменение состояний элементов на форме

private void changeFormElementStates(bool validateState)

{

if (!validateState)

{

wrongInputNumberLabel.Visibility = Visibility.Visible;

searchForNearestPerfectButton.IsEnabled = false;

}

else

{

wrongInputNumberLabel.Visibility = Visibility.Hidden;

searchForNearestPerfectButton.IsEnabled = true;

}

}

// Выход

private void closeFirstTaskButton_Click(object sender, RoutedEventArgs e)

{

this.Close();

}

}

}

SecondTask.xaml.cs

using System;

using System.Collections.Generic;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

namespace KDZ_Ternovoy

{

/// <summary>

/// Логика взаимодействия для SecondTask.xaml

/// </summary>

public partial class SecondTask : Window

{

public SecondTask()

{

InitializeComponent();

XTextBox.Text = "0";

YTextBox.Text = "0";

KTextBox.Text = "5";

drawPicture.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));

}

private void changeFormElementStates(bool validateState, Button button, Label label)

{

if (!validateState)

{

label.Visibility = Visibility.Visible;

button.IsEnabled = false;

}

else

{

label.Visibility = Visibility.Hidden;

button.IsEnabled = true;

}

}

private void XTextBox_TextChanged(object sender, TextChangedEventArgs e)

{

changeFormElementStates(GeneralMethods.validateInputTextAsInteger(XTextBox.Text), drawPicture, wrongXLabel);

}

private void YTextBox_TextChanged(object sender, TextChangedEventArgs e)

{

changeFormElementStates(GeneralMethods.validateInputTextAsInteger(YTextBox.Text), drawPicture, wrongYLabel);

}

private void KTextBox_TextChanged(object sender, TextChangedEventArgs e)

{

changeFormElementStates(GeneralMethods.validateInputTextAsInteger(KTextBox.Text) && (Convert.ToInt64(KTextBox.Text) > 2 && Convert.ToInt64(KTextBox.Text) < 16), drawPicture, wrongKLabel);

}

private void drawPicture_Click(object sender, RoutedEventArgs e)

{

if (GeneralMethods.validateInputTextAsInteger(KTextBox.Text) && GeneralMethods.validateInputTextAsInteger(XTextBox.Text) && GeneralMethods.validateInputTextAsInteger(YTextBox.Text))

{

MyCanvas.Children.Clear();

int X = Convert.ToInt32(XTextBox.Text);

int Y = Convert.ToInt32(YTextBox.Text);

List<List<Point>> polyLineList = Task2MethodContainer.getPolylineList(Convert.ToInt32(KTextBox.Text), 250);

int numberOfFigures = polyLineList.Count - 1;

//Добавим основы

foreach (Point pointList in polyLineList[numberOfFigures])

{

MyCanvas.Children.Add(Task2MethodContainer.getLine(X, Y, X + pointList.X, Y + pointList.Y));

}

//Добавим многоугольники

for (int i = 0; i < numberOfFigures; i++)

{

MyCanvas.Children.Add(Task2MethodContainer.getPolyline(X, Y, polyLineList[i]));

}

}

}

private void closeSecondTaskButton_Click(object sender, RoutedEventArgs e)

{

this.Close();

}

}

}

GeneralMethods.cs

using System;

namespace KDZ_Ternovoy

{

/// <summary>

/// Общие методы

/// </summary>

class GeneralMethods

{

// Проверка на корректность строки (число ли там)

static public bool validateInputTextAsInteger(string inputText)

{

Int64 number;

try

{

number = Convert.ToInt64(inputText);

}

catch (FormatException)

{

return false;

}

return true;

}

}

}

Task1MethodContainer.cs

using System;

namespace KDZ_Ternovoy

{

/// <summary>

/// Методы для первого задания

/// </summary>

public class Task1MethodContainer

{

// Проверка на совершенность числа

static private bool isPerfect(Int64 number)

{

Int64 sum = 0;

if ( number <= 0 )

return false;

for ( int i = 1; i < number; i++ )

{

// Суммируем все делители числа

if ( number % i == 0 )

sum += i;

}

return ( number == sum ) ? true : false;

}

// Поиск ближайшего совершенного числа

static public Int64 searchForNearestPerfect( Int64 basicNumber )

{

// Отколнение от нашего числа

Int64 delta = 0;

try

{

while (true)

{

if (isPerfect(basicNumber - delta))

{

return basicNumber - delta;

}

else if (isPerfect(basicNumber + delta))

{

return basicNumber + delta;

}

delta++;

}

}

catch

{

}

return 0;

}

}

}

Task2MethodContainer.cs

using System;

using System.Collections.Generic;

using System.Windows.Shapes;

using System.Windows.Media;

namespace KDZ_Ternovoy

{

/// <summary>

/// Методы для второй задачи

/// </summary>

class Task2MethodContainer

{

// Получение количества многоугольников в зависимости от количества лучей

static private int getNumberOfPolyLines(int K)

{

return (int)(18/(K + 2) + 2);

}

// Получение всех необходимых для пострения координат

static public List<List<Point>> getPolylineList(int K, int length)

{

List<List<Point>> polylineList = new List<List<Point>>();

List<Point> pointList;

// Считаем расстояние между многоугольниками

int numberOfPolylines = getNumberOfPolyLines(K);

double deltaLength = length / (numberOfPolylines + 1);

double tempDeltalength = deltaLength;

// Отклонение каждого луча в радианах

double cornerDelta = 2 * Math.PI / K;

// Собственно, получение координат

for (int degree = 0; degree < numberOfPolylines ; degree++)

{

pointList = new List<Point>();

for (int i = 1; i < K + 1; i++)

{

pointList.Add(new Point((int)(tempDeltalength * Math.Cos(cornerDelta * i)), (int)(tempDeltalength * Math.Sin(cornerDelta * i))));

}

polylineList.Add(pointList);

tempDeltalength += deltaLength;

}

//Получим фиальные точки (это будут концы лучей)

pointList = new List<Point>();

for (int i = 1; i < K + 1; i++)

{

pointList.Add(new Point((int)(length * Math.Cos(cornerDelta * i)), (int)(length * Math.Sin(cornerDelta * i))));

}

polylineList.Add(pointList);

return polylineList;

}

// Получение объекта линии по заданным точкам

static public Line getLine(int X, int Y, int X1, int Y1)

{

Line line = new Line();

line.StrokeThickness = 2;

line.Stroke = new SolidColorBrush(Colors.Black);

line.X1 = X;

line.X2 = X1;

line.Y1 = Y;

line.Y2 = Y1;

return line;

}

// Получение объекта ломанной линии по точкам

static public Polyline getPolyline(int X, int Y, List<Point> pointList)

{

Polyline polyline = new Polyline();

polyline.StrokeThickness = 2;

polyline.Stroke = new SolidColorBrush(Colors.Black);

PointCollection points = new PointCollection();

foreach (Point point in pointList)

{

points.Add(new System.Windows.Point(X + point.X, Y + point.Y));

}

points.Add(new System.Windows.Point(X + pointList[0].X, Y + pointList[0].Y));

polyline.Points = points;

return polyline;

}

}

/// <summary>

/// Класс точки

/// </summary>

class Point

{

private int m_X;

private int m_Y;

public Point()

{

}

public Point(int X, int Y)

{

this.X = X;

this.Y = Y;

}

public int X

{

get { return m_X; }

set { m_X = value; }

}

public int Y

{

get { return m_Y; }

set { m_Y = value; }

}

}

}