Государственное бюджетное профессиональное
Образовательное учреждение
«Нижегородский автомеханический техникум»
Специальность 09.02.03 Программирование в компьютерных системах
код и название специальности
ТЕХНИЧЕСКОЕ ЗАДАНИЕ
по МДК.03.01. Технология разработки программного обеспечения
Студент _______________/ Ю.С.Филиппова 23.09.2020
подпись И.О.Ф. дата
Руководитель _______________/ У.А.Никифорова 24.09.2020
подпись И.О.Ф. дата
Нижний Новгород
2020 г.
Содержание
Введение 2
1 Техническое задание 4
1.1 Основание для разработки 4
1.2 Назначение разработки 4
1.3 Требования к программе или программному изделию 4
1.3.1 Требования к фукциональным характеристикам 4
1.3.2 Требования к надежности 5
1.3.3 Требования к составу и параметрам технических средств 5
1.3.4 Требования к информационной и программной совместимости 5
1.4 Требования к программной документации 5
1.5 Этапы разработки 6
Список использованных источников 7
Приложение 1 8
Введение
Настоящее техническое задание распространяется на разработку системы разрешения комбинаторно-оптимизационных задач, предназначенной для ввода и хранения данных указанных задач, а также для их решения, хранния полученных результатов и использования разработчиками программных и аппаратных средств вычислительной техники.
Широкий круг задач проектирования различного рода технических объектов, в том числе компьютеров, относится к классу комбинаторно-оптимизационных задач, точные методы решения которых, как правило, имеют экспоненциальную вычислительную сложность и нереализуемы даже на современных компьютерах. В настоящее время для решения таких задач широко используются приближенные методы и алгоритмы, требующие различных вычислительных ресурсов и дающие неодинаковую точность решения.
При этом данные методы и алгоритмы не систематизированы, оценки их вычислительной и емкостнгой сложности и сведения о возможной точности получаемых решений не полны и разбросаны по многиим источникам. В рамках единой системы не существует программной реализации даже для ограниченного круга алгоритмов решения основных кмбинаторно-оптимизационных задач проектирования.
Создание системы, в рамках которой были бы реализованы наиболее часто упоминаемые методы и алгоритмы решения указанных задач, позволит как оценивать и исследовать отдельные методы и алгоритмы, так и сранвивать их с точки зрения затрат вычислительных ресурсов и точности получаемых решений.
Техническое задание
1.1 Основание для разработки
Основанием для разработки является задание преподавателя Никифоровой У.А. по МДК.03.01. Технология разработки программного обеспечения.
Наименование работы: Даны вещественные вектора A, B, C. В каждом из векторов все компоненты, следующие за первой по порядку компонентой с максимальным значением заменить на абсолютное значение минимальной компоненты.
1.2 Назначение разработки
Изменение всех компонетов векторов, следующих за первой по порядку компонентой с максимальным значением, на абсолютное значение минимальной компоненты. Система должна обеспечивать рещение небольшого круга комбинаторно-оптимизационных задач. Обработка комбинаторно-оптиимзационных задач вручную занимает много времени. Система обеспечивает возможность решения комбинаторно-оптимизационных задач, предназаначенной для ввода и хранения данных указанных задач, а ткаже для их решения, хранения полученных результатов и использования разработчиками программных и аппаратных средств вычислительной техники.
1.3 Требования к программе или программному изделию
1.3.1 Требования к функциональным характеристикам
Система должна обеспечивать возможность выполнения перечисленных ниже функций:
- ввод и вывод данных;
- обработка данных по условию задачи;
- возможность производить расчеты многкратно;
- диалог с пользователем.
1.3.2 Требования к надежности
Программный продукт должен соответствовать современному уровню требований к надежности программного обеспечения:
- предусматривать контроль вводимой информации и блокировку некорректных действий пользователя при работе с системой;
- обеспечивать корректное завершение вычислений с соответсвующей диагностикой при превышении имеющихся вычислительных ресурсов;
- обеспечивать целостночть вводимой информации.
1.3.3 Требования к составу и параметрам технических средств
Системные требования для работы программного продукта должны быть следующими: тактовая частота процессора – 1000 Гц; объем оперативной памяти 64 Мб; объемсвободного дискового пространства 20 Мб; разрешение монитора 1024 х 768; наличие устройства чтения компакт дисков; принтер.
1.3.4 Требования к информационной и программной совместимости
Программа должна работать в операционных системах Windows 2000/XP.
1.4 Требования к программной документации
Разрабатываемая система должна включать справочную информацию о работе системы и подсказки польователю. В состав сопровождающей документации должны входить: расчетно-пояснительная записка, содержащая описание системы; руководство пользователя; руководство системного программиста.
1.5 Этапы разработки
После утверждения технического задания - разработчик непосредственно приступает к созданию програмного обеспечения.
Таблица 1 – этапы разработки
Номер этапа | Название этапа | Срок | Отчетность |
Разработка ядра системы | 21.09.2020-21.09.2020 | Описание внутренних форматов. Реализация системы | |
Разработка методов и алгоритмов ихреализации для задачи | 22.09.2020-22.09.2020 | Описание методов и алгоритмов. Програмные модули, реализующие методы | |
Разработка методов и алгоритмов их реализации для задачи | 23.09.2020-23.09.2020 | Описание методов и алгоритмов. Программные модули, реализующие методы | |
Тестирование программного продукта и составления программной документации | 24.09.2020-24.09.2020 | Тесты. Докусентация. Пронрамный продукт |
Список использованных источников
1 ГОСТ 19.102-77 Стадии разработки
2 ГОСТ 19.103-77 Обозначения программ и программных документов
3 ГОСТ 19.104-78 Основные надписи
4 ГОСТ 19.105-78 Общие требования к программным документам
5 ГОСТ 19.106-78 Требования к программным документам, выполненным печатным способом
6 ГОСТ 19.201-78 Техническое задание. Требования к содержанию и оформлению
7 Стандарт предприятия, 2017.
8 Рудаков А.В. Технология разработки программных продуктов: учеб. пособие для студ. сред. проф. образования / А.В Рудаков. – 4-е изд., стер. – М.: Издательский центр «Академия», 2016. – 208 с.
9 Рудаков А.В. Технология разработки программных продуктов. Практикум: учеб. пособие для студ. сред. проф. образования / А.В Рудаков, Г.Н. Федорова. – 4-е изд., стер. – М.: Издательский центр «Академия», 2018. – 192 с.
10 Специальное программное обеспечение [https://www.ngpedia.ru/]
Приложение 1
Код программы
#include<stdio.h>
#include<math.h>
#include<stdbool.h>
#define R 100
int i;
//Функция для ввода размерности вектора
int razmer(char sim) {
int r;
do {
printf("\n\nВедите размерность вектора %c (1-100)=>", sim);
scanf_s("%d", &r);
if (((r > 0) && (r <= R)))
break;
system("cls");
printf("\tРазмерность вне диапозона");
continue;
} while (true);
return r;
}
//Функция для ввода элементов вектора
void vvod(int r, float x[R], char sim)
{
printf("\n\tВведите вектор \n");
for (i = 0; i < r; i++)
{
printf("%c[%d]=>", sim, i + 1);
scanf_s("%f", &x[i]);
}
}
//Функция для вывода элементов вектора
void vyvod(char stroka[R], char sim, int r, float x[R])
{
printf("\n\t%s вектор %c:\n", stroka, sim);
for (i = 0; i < r; i++)
printf("%.2f ", x[i]);
}
//Функция для обработки вектора в соответсвии с условиями задачи
void change(float x[R], int r)
{
int numb_max;
float max, min;
max = x[1];
numb_max = 1;
min = x[1];
for (i = 0; i < r; i++)
{
if (x[i] > max)
{
max = x[i];
numb_max = i;
}
if (x[i] < min) min = x[i];
}
for (i = numb_max + 1; i < r; i++)
x[i] = min;
}
void main()
{
system("chcp 1251>nul");
char answer;
do
{
float a[R], b[R], c[R];
system("cls");
printf("Даны вещественные вектора A, B, C. \nВ каждом из векторов все компоненты, следующие за первой по порядку компонентой \nс максимальным значением заменить на абсолютное значение минимальной компоненты.");
//Ввод размерности и элементов вектора A
int ra = razmer('A');
vvod(ra, a, 'A');
system("cls");
//Ввод размерности и элементов вектора B
int rb = razmer('B');
vvod(rb, b, 'B');
system("cls");
//Ввод размерности и элементов вектора C
int rc = razmer('C');
vvod(rc, c, 'C');
system("cls");
//Вывод исходных векторов A, B, C
vyvod("Исходный", 'A', ra, a);
vyvod("Исходный", 'B', rb, b);
vyvod("Исходный", 'C', rc, c);
printf("\n");
//Обработка векторов A, B, C в соответсвии с условиями задачи
change(a, ra);
change(b, rb);
change(c, rc);
//Вывод измененных векторов A, B, C
vyvod("Измененный", 'A', ra, a);
vyvod("Измененный", 'B', rb, b);
vyvod("Измененный", 'C', rc, c);
printf("\n\nХотите продолжить? y/n\n");
scanf_s(" %c", &answer);
}
while (answer == 'y');
system("pause>nul");
}
collect[i].data,
collect[i].obr,
collect[i].adr,
collect[i].prof);
}
printf("|---------------------------------------------------------------------------------------------------------------------------|\n");
printf("\nСлужащие с высшим образованием:\n");
for (int i = 0; i < k; i++)
{
if ((strcmp(collect[i].obr, "высшее")) == 0 || (strcmp(collect[i].obr, "Высшее")) == 0)
printf("%s %s\n", collect[i].fam, collect[i].name);
}
printf("\nСлужащие с профессией %s:\n", oprProf);
for (int i = 0; i < k; i++)
{
if ((strcmp(collect[i].prof, oprProf))==0)
printf("%s %s %s %s, %s, %s \n%s\n",
collect[i].fam,
collect[i].name,
collect[i].oth,
collect[i].data,
collect[i].obr,
collect[i].prof,
collect[i].adr);
}
printf("\nХотите продолжить (y/n)? ");
scanf_s(" %c", &answer);
getchar();
system("pause>nul");
system("cls");
} while (answer == 'y');
system("pause>nul");
}
Протокол работы:
Лабораторная работа №15
«Разработка и отладка программ с использованием функций»
Постановка задачи:
Даны две вещественные матрицы A(M, N) и C (M, N). Сформировать новую матрицу D того же размера, каждый элемент которой равен минимальному из элементов массивов A и C с теми же индексами.
При вводе элементов исходных массивов организовать проверку на ввод символов, т.е. если при вводе элемента будет введен символ, то необходимо вывести соответствующее сообщение.
Формализация:
· Исходные данные:
ri-размерность матрицы по строкам
rj-размерность матрицы по столбцам
a(ri, rj) – исходная матрица A
c(ri, rj) – исходная матрица C
· Результаты:
d(ri, rj) – полученная матрица D
· Порядок расчета:
начало цикла по i
начало цикла по j
если (x[i][j] > y[i][j])
то z[i][j] = y[i][j];
иначе z[i][j] = x[i][j]
конец цикла по j
конец цикла по i
Код программы:
#include <stdio.h>
#define M 20
#define N 20
int i, j, res;
int razmer(char sim, char sim2);
int razmer2(char sim, char sim2);
void vvod(int ri, int rj, float x[M][N], char sim);
void vivod(int ri, int rj, float x[M][N], char sim, char stroka[M]);
void novaya(int ri, int rj, float x[M][N], float y[M][N], float z[M][N]);
int razmer(char sim, char sim2)
{
int ri;
printf("Введите размерность матриц %c и %c по строкам: ", sim, sim2);
while (1)
{
res = scanf_s("%d", &ri);
while (getchar()!= '\n');
if (res == 1) break;
printf("Вводить можно только числа. Повторите ввод.\n");
}
return(ri);
}
int razmer2(char sim, char sim2)
{
int rj;
printf("Введите размерность матриц %c и %c по столбцам: ", sim, sim2);
while (1)
{
res = scanf_s("%d", &rj);
while (getchar()!= '\n');
if (res == 1) break;
printf("Вводить можно только числа. Повторите ввод.\n");
}
return(rj);
}
void vvod(int ri, int rj, float x[M][N], char sim)
{
printf("\n\t Введите матрицу %c:\n", sim);
for (i = 0; i < ri; i++)
for (j = 0; j < rj; j++)
{
printf("%c[%d][%d]=", sim, i + 1, j + 1);
scanf_s("%f", &x[i][j]);
}
}
void vivod(int ri, int rj, float x[M][N], char sim, char stroka[M])
{
printf("\n\t %s матрица %c: \n", stroka, sim);
for (i = 0; i < ri; i++)
{
for (j = 0; j < rj; j++)
printf("%5.2f ", x[i][j]);
printf("\n");
}
}
void novaya(int ri, int rj, float x[M][N], float y[M][N], float z[M][N])
{
for (i = 0; i < ri; i++)
for (j = 0; j < rj; j++)
{
if (x[i][j] > y[i][j]) z[i][j] = y[i][j];
else z[i][j] = x[i][j];
}
}
void main()
{
system("cls");
system("chcp 1251 > nul");
char answer;
do {
int p, x;
float a[M][N], c[M][N], d[M][N];
system("cls");
p = razmer('A', 'C');
x = razmer2('A', 'C');
system("cls");
vvod(p, x, a, 'A');
system("cls");
vvod(p, x, c, 'C');
system("cls");
vivod(p, x, a, 'A', "Исходная");
vivod(p, x, c, 'C', "Исходная");
novaya(p, x, a, c, d);
vivod(p, x, d, 'D', "Полученная");
printf("\n\nХотите продолжить (y/n)? ");
scanf_s(" %c", &answer);
system("cls");
} while (answer == 'y');
system("pause>nul");
}
Лабораторная работа №1
«Язык С# как инструмент системного программирования. Работа с символьными строками.»
Цель: научиться работать с символьными строками.
Вариант №3
При помощи метода Split() разобрать исходную строку на слова в виде массива строк. Затем объединить в новые строки каждую пару четных и нечетных строк и сравнить их на наличие одинаковых элементов.
Код программы:
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string phrase = "Я про одно и то же два раза думать не умею!";
string[] words = phrase.Split(' ');
Console.WriteLine("Исходная строка: Я про одно и то же два раза думать не умею!");
Console.WriteLine("Измененная строка: ");
foreach (var word in words)
{
System.Console.WriteLine($"'{word}'");
}
}
}
}
Протокол работы:
Лабораторная работа №2
«Представление в памяти одномерных массивов»
Цель работы: изучить порядок размещения в памяти одномерных массивов.
1. Дан массив размера N и целые числа K и L (1 < K <= L <= N). Найти среднее арифметическое всех элементов массива, кроме элементов с номерами от K до L включительно.
2. s=0;
ch=0;
Цикл от 1 до k-1
s = s + a[i];
ch++;
конец цикла
цикл от l+1 до n
s = s + a[i];
ch++;
конец цикла
sr=s/ch;
3. Блок-схема:
4. Код программы:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#define R 100
void main()
{
system("chcp 1251>nul");
char answer = 'y';
do {
float a[R], s = 0, sr;
int i, n, k, l, ch=0;
printf("\nДан массив размера N и целые числа K и L (1 < K <= L <= N). Найти среднее арифметическое всех элементов массива, кроме элементов с номерами от K до L включительно.");
printf("\nВведите размерность вектора (от 1 до 100): ");
scanf_s("%d", &n);
if ((n <= 0) || (n > R)) { system("cls"); printf("Вводить можно толь-ко целое число от 1 до 100"); continue; };
printf("\nВведите два числа от 1 до %d по возрастанию:", n);
scanf_s("%d\n%d", &k, &l);
if ((k <= 1) || (l > n) || (k > l)) { system("cls"); printf("Числа введены вне диапазона или не по возрастанию"); continue; };
printf("Введите вектор:\n");
for (i = 1; i <= n; i++)
{
printf("a[%d]=>", i);
scanf_s("%f", &a[i]);
}
for (i = 1; i <= k - 1; i++)
{
s = s + a[i];
ch++;
}
for (i = l + 1; i <= n; i++)
{
s = s + a[i];
ch++;
}
sr = s / ch;
system("cls");
printf("Дан массив размера N и целые числа K и L (1 < K <= L <= N). Найти среднее арифметическое всех элементов массива, кроме элементов с номерами от K до L включительно.");
printf("\n\nИсходный вектор: ");
for (i = 1; i <= n; i++)
printf("%.2f ", a[i]);
printf("\n\nВведенные числа = %d и %d", k, l);
printf("\nСр.арифметическое всех эл-ов массива, кроме эл-ов с номерами от K до L включительно = %.2f", sr);
printf("\n\nХотите продолжить? y/n");
scanf_s(" %c", &answer);
system("cls");
} while (answer == 'y');
system("pause>nul");
}
5. Протокол работы:
Лабораторная работа №3
«Представление в памяти одномерных массивов»
Цель работы: изучить порядок размещения в памяти одномерных массивов.
1. Дана матрица размера M*N. Найти количество ее столбцов, элементы которых упорядочены по убыванию.
2. Порядок расчета:
Нц по j
n = 0;
нц по i
если (a[i][j] > a[i - 1][j]) то n++
кц по i
если (n==ri) то k++
кц по j
3. Код программы:
#include <stdio.h>
#include <math.h>
#define R 100
void main()
{
int ri, rj, i, j, k=0, n;
float a[R][R], b[R];
system("chcp 1251>0");
while (1)
{
system("cls");
while (1)
{
printf("Введите размерность матрицы по строкам (от 1 до 100): ");
scanf_s("%d", &ri);
if ((ri > 0) && (ri <= R)) break;
printf("Размерность матрицы находится вне диапазона,повторите ввод\n");
}
while (1)
{
printf("Введите размерность матрицы по столбцам (от 1 до 100): ");
scanf_s("%d", &rj);
if ((rj > 0) && (rj <= R)) break;
printf("Размерность матрицы находится вне диапазона,повторите ввод\n");
}
printf("\n\tВведите матрицу\n");
for (i = 1; i < ri + 1; i++)
for (j = 1; j < rj + 1; j++)
{
printf("a[%d][%d] => ", i, j);
scanf_s("%f", &a[i][j]);
}
system("cls");
printf("\n\tИсходная матрица:\n");
for (i = 1; i < ri + 1; i++)
{
for (j = 1; j < rj + 1; j++)
printf(" %7.2f", a[i][j]);
printf("\n");
}
for (j = 1; j < rj + 1; j++)
{
n = 0;
for (i = 1; i < ri + 1; i++)
if (a[i][j] > a[i - 1][j]) n++;
if (n==ri) k++;
}
printf("\nКоличество столбцов: %d \n",k);
printf("\nХотите продолжить? y/n");
if (getch()!= 'y') break;
system("cls");
}
"pause > nul";
}
4. Протокол работы: