Individual de trabajo del proyecto de ingeniería de software - el número de intersecciones de avión

  1. clases de enseñanza dedicadas al comienzo del artículo y se pueden clonar las direcciones del proyecto Github. (1 ')
proyecto contenido
Esta obra pertenece Primavera 2020 Computer Software Engineering Institute (Roger Ren Jian)
Este es un requisito de trabajo proyecto de trabajo individual
Mis clases de enseñanza 006
GitHub dirección del proyecto IntersectProj
Mi objetivo para esta operación es programa de desarrollo personal para mejorar la calidad del programa de alto rendimiento de escritura

PSP

  1. Antes de empezar la aplicación del programa, en el siguiente formulario para registrar tu PSP se estima que se gasta en el desarrollo de los diversos módulos del período del programa. (0,5 ')
  2. Después de implementar su programa, su tiempo en cada módulo del programa que se gastó en la siguiente tabla de registro de PSP. (0,5 ')
  • PSP
PSP2.1 Etapas del Proceso de Software Personal Estimado de consumo de tiempo (minutos) Los que consumen mucho tiempo reales (minutos)
Planificación plan
- Estimación - ¿Cuánto tiempo se estima que la tarea requiere 10 10
Desarrollo desarrollar
- Análisis - análisis de necesidades (incluyendo el aprendizaje de nuevas tecnologías) 75 120
- Diseño de especificaciones - Generar documentos de diseño 10 15
- Revisión de diseño - Diseño de la crítica (y sus colegas revisaron los documentos de diseño) 5 10
- Estándar de Codificación - especificación de códigos (para desarrollar una especificación apropiada para el desarrollo actual) 5 2
- Diseño - diseño específico 30 30
- Codificación - codificación específica 60 180
- Revisión de código - Opiniones de Código 15 60
- Prueba - prueba (autocomprobación, modificar el código, enviar modificaciones) 45 240
la presentación de informes informe
- Informe de prueba - Informe de prueba 10 10
- Medición de Tamaño - esfuerzo computacional 5 5
- Postmortem & Process Plan de Mejora - retrospectiva, y proponer plan de mejora de procesos 10 15
total 280 697
  • reflexión
    • El tiempo de codificación real es aproximadamente tres veces el plan de
    • El problema principal es que el primero en escribir programación orientada a objetos con C ++, no entienden las diferentes herramientas y consejos VS plataforma, la escala del problema no son los juicios de derecho.
    • Esto también llevó a la idea inicial detrás de un problema muy grande, después de cambiar varias veces las ideas, modificar el programa
    • Perdido mucho tiempo, máxima eficiencia y la exactitud del programa son difíciles de proteger.

idea

Ideas de resolución de problemas

  1. Ideas para resolver problemas descritos. Es decir, después de comenzar a conseguir el título, cómo pensar, cómo encontrar la información en el proceso. (3 ')
  • Ideas para resolver problemas divididos en dos partes
    1. método de cálculo específica
    2. Calcular la idea óptima

método de cálculo específica

  1. Buscando ecuación lineal
  • El puntos de línea, matemáticas de secundaria recordó, con referencia a Bowen después de fórmula general utilizando ecuaciones lineales $ Ax + By + C = 0 $, y $ O (1) complejidad del tiempo de la ecuación lineal $ calculado
  1. Calcula la intersección
  • Intersección punto fórmula de cálculo es también ser (1) derivados en el tiempo complejidad $ O $
  • Sin embargo, las nuevas líneas y calcular la intersección de la línea recta al preámbulo, está fuertemente influenciado por el paso del tiempo la complejidad
  • Es fácil pensar en una solución violenta:
    • Cada nueva línea recta n, se añade el número de intersecciones $ n-1-N (número de líneas paralelas) -N (a través de la intersección de las líneas) $, manteniendo al mismo tiempo un conjunto paralelo de la pendiente y la intersección de la colección existente
    • La complejidad temporal del algoritmo es $ O (n ^ 2) $
  1. Sobre la intersección de problemas de precisión
  • Pruebe una clase personalizada para representar puntos

código de diseño

  1. El diseño y proceso de implementación. Incluyendo la forma de diseñar la organización del código, tales como tener varias clases, varias funciones, cómo la relación entre ellos, si las funciones de teclas deben dibujar un diagrama de flujo? Prueba de la unidad es de diseño, ¿cómo? (4 ')
  • Los elementos básicos (clase)
    • 点 Point
      • Constructor de puntos Los puntos (x, y)
      • relación de puntos Los puntos con la función de mantenimiento (igual)
      • Straight punto de intersección pertenece función de mantenimiento (add, contiene, tamaño)
    • línea línea
      • Dos línea recta constructor (point1, punto2)
      • El análisis de la relación entre la función lineal (paralelo, de intersección, igual)
    • Lineales de tubería de cobre colección
    • La intersección del conjunto Interset
    • clase de cálculo del puntaje Radio
      • La suma, resta, minimizando el numerador y el denominador
  • Cada vez que se añade una nueva línea de diagrama de flujo
gráfico TD A [New configuración recta] -> B [determinación de intersección, y el mantenimiento de intersección] B -> C [colección de líneas de intersección obtenido delset] C -> D [rectilíneo que atraviesa el preámbulo de entrada distinta de delset recopilación y mantenimiento de la nueva colección-cruz]

Mejoras en el rendimiento

  1. Mejorar el rendimiento del tiempo de grabación del programa dedicado a, usted describe las ideas de mejora y mostrar un gráfico de análisis de rendimiento (VS generado automáticamente por una herramienta de análisis de rendimiento de 2019), y mostrar que consume la función de programa máximo. (3 ')
  • Durante la programación, me enfrentaba a dos problemas principales, estas dos cuestiones tienen un grave impacto en el rendimiento global

    • No está familiarizado con el código C ++
    • No hay en la profundidad y la comprensión exacta de los problemas cuando la idea
  • Especialmente la segunda pregunta, dirigida a la primera gran rendimiento en tiempo de ejecución es bajo, el tiempo que requiere múltiples refactorización de código,

  1. fracciones basada en la radio fue diseñado originalmente, algunas de las cuales la mayor huelga comunes múltiples funciones de los resultados en el programa anormalmente bajo rendimiento que sólo se ejecuta 1min líneas rectas 500+
  • clase Radio que la fracción ocupada aproximadamente 50% de uso de la CPU, y la obtención del máximo común divisor que es una función de la mayor
  • Después de la referencia operación de bit - el máximo común divisor algoritmo eficiente optimizar, pero el efecto final es mediocre, abandonar el uso de la radio empleada para mejorar el flotador clase de precisión

Eficacia Análisis 2Radio

  1. Programa fue diseñado originalmente con el recorrido, junto con la eliminación de líneas paralelas, la intersección de la poda, para mejorar el rendimiento del programa, pero en última instancia, cuando el diseño delset utilización inicial de diseño de la CPU
  • Atravesar la intersección, sino también mirar el conjunto de intersección de la línea recta, haciendo que toda la eficacia de los programas sólo pueden llegar a 1min600 + línea recta, por lo que la eliminación de estos dos optimización
  • Reflexión: Ambos métodos no puede mejorar el rendimiento, pero no me utilizar mejores estructuras de datos y algoritmos en la concepción y preparación de la
  1. El diagrama de análisis de rendimiento final
  • El programa más grande en el consumo es una función del punto de intersección de inserción para cruzar la función principal de la operación de recogida de inserción, que me hace pensar que intento más unordered_set Optimizar, pero desafortunadamente DDL inminente; seguida de la función de consumo es la función principal de la antigua para el grupo de línea de recorrido, que se reunirá en nuestro análisis inicial

2 análisis final eficacia

La revisión de código

  1. Código Descripción. Proyecto demostró el código de la llave y explicar ideas y notas explicativas. (3 ')

código Descripción

  • pensamiento de utilizar para ilustrar mi código de arriba hacia abajo
gráfico TD A [intersección de la línea recta y la operación colectiva] -> B [recta tipo intersección] B -> C [garantizar la exactitud de números de punto flotante] B -> D [intersectado por computación paralela]
  • main.cpp línea recta en la operación de conjunto intersección
    • una tal lista enlazada lineal que atraviesa conjunto de preámbulos y la adición de una secuencia de cola puede emplearse Estructura de datos de lista
    • Intersección de conjuntos necesidad de evitar la duplicación, sino también para encontrar una alta velocidad, por lo que el uso del conjunto de estructura de datos de árbol rojo y negro (también se puede tratar de la estructura de índice hash unordered_set)
// 直线和交点集合
vector<Line> lineList;
set<Point> interSet;

// 遍历
for (i = 0; i < n; i++) {
		input >> c;
		if (c == 'L') {
			input >> x1 >> y1 >> x2 >> y2;
			Line l(x1, y1, x2, y2);
			
			for (auto iter = lineList.begin(); iter != lineList.end(); iter++) {
				Line lit = (Line)* iter;
				if (lit.isParallel(l)) {	
					continue;
				}
				// 交点计算和新增
				Point pInter = l.getIntersect(lit);
				interSet.insert(pInter);
			}
			lineList.push_back(l);
		}
	}
  • Graph.h y CPP clase de puntos y líneas
    • El cual para el punto de pedido operator<y operator==de alta resistencia, que es el lugar más importante
class Point
{
public:
	float x;
	float y;

	Point(float xNew, float yNew);
	bool equal(Point p);
	float getX();
	float getY();
	// 重载
	bool operator<(const Point& p) const {
		if (!EQFLOAT(x, p.x))
			return x < p.x;
		else
			return y < p.y;
	}
	bool operator==(const Point& p) const {
		return EQFLOAT(x, p.x) && EQFLOAT(y, p.y);
	}
	
private:
};
  • parámetros de la línea, pendiente, si contienen un cierto punto, obtener la intersección, son importantes
class Line
{
public:

	Line(int x1, int y1, int x2, int y2);
	float getA();
	float getB();
	float getC();
	float getslope();
	bool isParallel(Line l);
	bool containsPoint(Point p);
	Point getIntersect(Line l);	
	bool equal(Line l);

private:
	// line: Ax + By + C = 0;
	float A;
  float B;
	float C;
	float slope;
};

// 计算直线参数极其斜率
Line::Line(int x1, int y1, int x2, int y2) {
	A = (float) y2 - y1;
	B = (float) x1 - x2;
	C = (float) x2 * y1 - x1 * y2;
	if (x1 - x2 == 0) {
		slope = FLT_MAX;
	}
	else {
		slope = (float)(y1 - y2) / (x1 - x2);
	}
}
  • En el juicio de si la intersección de la superposición de dos en la necesidad de introducir número de coma flotante de precisión
#define EQS (1e-8)
#define EQFLOAT(a,b) (fabs((a) - (b)) < EQS)

bool Point::operator==(const Point& p) const {
		return EQFLOAT(x, p.x) && EQFLOAT(y, p.y);
	}
  • Si la última línea recta hasta llegar a la intersección de la línea recta paralela al juicio es la clave
Point Line::getIntersect(Line l) {
	float a2 = l.getA();
	float b2 = l.getB();
	float c2 = l.getC();
	float x = (B * c2 - C * b2) / (A * b2 - B * a2);
	float y = (C * a2 - A * c2) / (A * b2 - B * a2);
	Point p(x, y);
	return p;
}

bool Line::containsPoint(Point p) {
	float res = A * p.getX() + B * p.getY() + C;
	return EQFLOAT(res, 0);
}

Prueba y depuración

  • prueba de la unidad
    • cobertura de la prueba funcional de las funciones miembro de dos clases Punto y línea
		TEST_METHOD(TestMethodPoint1) {
			Point p(0.5, 3);
			Assert::AreEqual(p.getX()== 0.5, true);
			Assert::AreEqual(p.getY()==3, true);
			Point m(0.5, -3);
			Assert::AreNotEqual(p.equal(m), true);
		}

		TEST_METHOD(TestMethodLine1) {
			Line l1(0, 0, 1, 1);
			Line l2(0, 2, 1, 0);
			Line l3(0, -45, 45, 0);
			Line lr(1, 0, 5, 0);
			Line bt(1, 1, 1, 10);
			Assert::AreEqual(l2.getA()== -2, true);
			Assert::AreEqual(l2.getB()== -1, true);
			Assert::AreEqual(l2.getC()==2, true);
			Assert::AreEqual(l2.getslope()==-2, true);
			// parallel
			Assert::AreEqual(l1.isParallel(l3), true);
			Assert::AreEqual(lr.isParallel(bt), false);
			// containsPoint
			Point e(0.5,1);
			Point base(0,0);
			Assert::AreEqual(l2.containsPoint(e), true);
			Assert::AreNotEqual(l1.containsPoint(e), true);
			Assert::AreEqual(l1.containsPoint(base), true);
			// get intersect
			Point inter12((float)2/3,(float)2/3);
			Assert::AreEqual(l1.getIntersect(l2).equal(inter12), true);
			Point inter3lr(45, 0);
			Point inter3tb(1, -44);
			Assert::AreEqual(l3.getIntersect(lr).equal(inter3lr), true);
			// equal
			Assert::AreEqual(l1.equal(l2), false);
		}
  • La depuración de ayudas
    • GeoGebra es una interfaz visual a sofisticadas herramientas de dibujo ligeros matemáticos, usarlo me encontré con un programa de ayuda de errores

2 de interfaz gráfica de depuración

  • cobertura de las pruebas de estrés
    • Llama estudiantes generados al azar código de matriz de puntos, se generó una gran cantidad de miles de negro caja fija la cantidad de datos a prueba de ayuda
    • Pero el problema es que el negro cuadro de la sobrecarga de datos, una vez para disparar inconsistencia es difícil encontrar el problema.

programación de reflexión

  • Casi escribí fuera del trabajo durante dos días, debido a la plataforma y no están familiarizados con C ++ y artículos de invierno no hay demasiadas tareas de desarrollo de software, por lo que esta vez desde la finalización de los resultados del trabajo y el punto de vista del proceso, no son satisfactorios. La ingeniería de software, así como detrás de la pesada carga.

  • Las siguientes preguntas y registrar algunas áreas de mejora

  • problema

    • Los documentos de diseño que deben ser refinados a un grano fino? Lo que se necesita tipo de trabajo para completar el código?
    • Al escribir código para cambiar el documento de diseño es algo evitable? ¿Cómo evitar
  • mejorar

    • Dado que el problema de la programación de capacidad, entonces necesito aprender una variedad de métodos, dejando más tiempo para la programación, con el fin de garantizar la calidad del trabajo, como esta asignación, un día antes de tiempo si podemos empezar a escribir, usted debe ser mejorado mucho
    • C ++ necesidad de ser más familiarizado con el lenguaje, y VS IDE, desarrollada después de más de asegurar la eficiencia

Supongo que te gusta

Origin www.cnblogs.com/yzy11235/p/12457866.html
Recomendado
Clasificación