travaux de projet génie logiciel individuel - le nombre d'intersections de plan

  1. cours d'enseignement donnés au début de l'article et peuvent être clonés adresses projet Github. (1 « )
projet teneur
Ce travail appartient Spring Institute 2020 Computer Software Engineering (Roger Ren Jian)
Ceci est une exigence de l'emploi travail de projet individuel
Mon cours d'enseignement 006
Adresse GitHub du projet IntersectProj
Mon objectif pour cette opération est programme de développement personnel pour améliorer la qualité du programme d'écriture de haute performance

PSP

  1. Avant de commencer la mise en œuvre du programme, sous la forme suivante pour enregistrer votre PSP est estimé à consacrer à l'élaboration des différents modules de la durée du programme. (0,5 « )
  2. Après avoir implémenté votre programme, votre temps sur chaque module du programme effectivement passé dans le tableau ci-dessous dossier PSP. (0,5 « )
  • PSP
PSP2.1 Etapes du processus Logiciels personnels consommatrice de temps estimé (minutes) Les chronophages réelles (minutes)
Planification plan
- Estimation - Combien de temps est estimé que la tâche exige dix dix
Développement développer
- Une analyse - l'analyse des besoins (y compris l'apprentissage de nouvelles technologies) 75 120
- Spec Conception - Générer des documents de conception dix 15
- Examen de la conception - Revue de la conception (et ses collègues ont examiné les documents de conception) 5 dix
- Norme de codage - spécification de code (pour développer une spécification appropriée pour le développement en cours) 5 2
- Conception - conception spécifique 30 30
- codage - codage spécifique 60 180
- Revue de code - Revue de code 15 60
- essai - test (auto-test, modifier le code, présenter des modifications) 45 240
rapports rapport
- Rapport d'essai - Rapport d'essai dix dix
- Taille de mesure - l'effort de calcul 5 5
- Postmortem et processus plan d'amélioration - Avec le recul, et le processus de proposer plan d'amélioration dix 15
total 280 697
  • réflexion
    • Le temps de codage réel est d'environ trois fois le régime
    • Le principal problème est que le premier à écrire la programmation orientée objet avec C ++, ne comprennent pas les différents outils et conseils VS plate-forme, l'ampleur du problème ne sont pas les bonnes décisions.
    • Cela a également conduit à l'idée initiale derrière un très gros problème, après avoir changé à plusieurs reprises des idées, de modifier le programme
    • Perdu beaucoup de temps, l'efficacité ultime et la justesse du programme sont difficiles à protéger.

idée

idées de résolution de problèmes

  1. idées de résolution de problèmes décrits. C'est, après avoir commencé à obtenir le titre, comment penser, comment trouver des informations dans le processus. (3 « )
  • idées de résolution de problèmes divisés en deux parties
    1. Procédé de calcul spécifique
    2. Calculer l'idée optimale

Procédé de calcul spécifique

  1. Cherchant équation linéaire
  • Les points de lignes, de haute mathématique scolaire rappelé, en référence à Bowen après la formule générale en utilisant des équations linéaires $ Ax + By + C = 0 $, et $ O (1) la complexité du temps de l'équation linéaire calculé $
  1. Calculer l'intersection
  • formule de calcul du point d'intersection est également d'être (1) dérivée dans le temps de la complexité $ O $
  • Cependant, les nouvelles lignes et calculer l'intersection de la ligne droite au préambule, est fortement influencée par l'étape de la complexité du temps
  • Il est facile de penser à une solution violente:
    • Chaque nouvelle ligne droite n, le nombre d'intersections est ajouté n-1-N $ (en nombre de lignes parallèles) -N (par l'intersection des lignes) $, tandis que le maintien d'un ensemble parallèle de la pente et l'intersection de la collection existante
    • La complexité temporelle de l'algorithme est $ O (n ^ 2) $
  1. A propos de l'intersection des problèmes de précision
  • Essayez une classe personnalisée pour représenter des points

code de conception

  1. La conception et le processus de mise en œuvre. Y compris la façon de concevoir l'organisation du code, comme celles qui ont plusieurs classes, plusieurs fonctions, comment la relation entre eux, si les fonctions clés doivent dessiner un organigramme? Les tests unitaires est de savoir comment la conception? (4 « )
  • Les éléments de base (classe)
    • 点 point
      • Point Constructor point (x, y)
      • relation point à point avec la fonction de maintenance (égale)
      • point d'intersection droite appartient fonction de maintenance (add, contient, taille)
    • ligne ligne
      • Deux constructeur droite ligne (point1, point2)
      • L'analyse de la relation entre la fonction linéaire (parallèle, se croisent, égaux)
    • collection linéaire Lineset
    • L'intersection de l'ensemble Interset
    • classe de calcul de score Radio
      • Addition, soustraction, ce qui minimise le numérateur et le dénominateur
  • Chaque fois qu'une nouvelle ligne est ajoutée organigramme
TD graphique A [nouvelle configuration droite] -> B [détermination se coupent, et le maintien d'intersection] B -> C [collection des lignes d'intersection obtenues delSet] C -> D [rectiligne traversant le préambule de saisie autre que delSet la collecte et l'entretien de la nouvelle collection croisée]

Amélioration des performances

  1. L'amélioration de la performance du temps d'enregistrement du programme passé, vous décrivez des idées d'amélioration et de montrer un tableau d'analyse des performances (VS généré automatiquement par un outil d'analyse de la performance de 2019), et vous montrer consommer la fonction de programme maximum. (3 « )
  • Lors de la programmation, je faisais face à deux problèmes principaux, ces deux questions ont un impact important sur la performance globale

    • Vous n'êtes pas familier avec le code C
    • Non en profondeur et la compréhension précise des problèmes lorsque l'idée
  • En particulier, la deuxième question, conduit à la première performance d'exécution grave est faible, éventuellement nécessitant plusieurs codes refactoring,

  1. fraction à base de radio a été conçu à l'origine, dont certains frappent les plus multiples fonctions des résultats communs dans le programme anormalement bas de performances qui ne fonctionne que 1min lignes droites 500+
  • Radio classe dans laquelle la fraction occupée d'environ 50% de l'utilisation du processeur, et d'obtenir le plus grand diviseur commun qui est une fonction de la masse
  • Après la référence opération binaire - le plus grand algorithme efficace de diviseur commun pour optimiser, mais l'effet final est médiocre, abandonner l'utilisation de la radio utilisée pour améliorer le flotteur de classe de précision

2Radio Analyse de l'efficacité

  1. Programme a été conçu à l'origine avec traversal, ainsi que la suppression de lignes parallèles, l'intersection de la taille, pour améliorer les performances du programme, mais en fin de compte, lorsque la conception delSet de conception initiale utilisation élevée du processeur
  • L'intersection traversant, mais aussi regarder l'ensemble d'intersection de la ligne droite, ce qui provoque l'ensemble de l'efficacité du programme ne peut atteindre 1min600 + ligne droite, donc la suppression de ces deux optimisation
  • Réflexion: Les deux méthodes ne peut pas améliorer les performances, mais je ne pas utiliser de meilleures structures de données et algorithmes dans la conception et la préparation du
  1. Le tableau d'analyse de la performance finale
  • Le plus important programme de la consommation est fonction du point d'insertion d'intersection pour traverser la fonction principale de l'opération d'insertion de collecte, il me fait penser que j'essaie de unordered_set plus optimize, mais malheureusement DDL imminente, suivie par la fonction de la consommation est la fonction principale de l'ancien ordre groupe de lignes de traversal, qui doit se réunir dans notre analyse initiale

2 analyse d'efficacité finale

révision du code

  1. Code Description. Projet a démontré le code clé et expliquer les idées et les notes explicatives. (3 « )

code description

  • Descendante pensée d'utiliser pour illustrer mon code
TD graphique A [intersection de la ligne droite et le fonctionnement collectif] -> B [Type d'intersection droite] B -> C [assurer la précision des nombres à virgule flottante] B -> D [coupée par le calcul parallèle]
  • main.cpp ligne droite dans l'opération d'établissement d'intersection
    • Linéaire traversant ensemble de préambule et l'ajout d'une séquence de queue peut être utilisé une telle liste liée Liste Structure de données
    • Intersection ensemble nécessité d'éviter les doubles emplois, mais aussi de trouver une grande vitesse, donc l'utilisation de la structure de données arbre rouge et noir set (peut aussi essayer de structure d'index de hachage 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);
		}
	}
  • classe de points et de lignes Graph.h & cpp
    • Ce qui pour la commande de point de consigne operator<et operator==robuste, il est place plus 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:
};
  • Paramètres de la ligne, la pente, si elles contiennent un certain point, obtenir l'intersection, sont importants
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);
	}
}
  • Dans l'arrêt si l'intersection de deux qui se chevauchent sur la nécessité d'introduire un nombre à virgule flottante
#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);
	}
  • Que ce soit la dernière ligne droite pour obtenir l'intersection de la ligne droite parallèle au jugement est la clé
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);
}

Test et débogage

  • tests unitaires
    • couverture de test fonctionnel des fonctions membres de deux classes Point et ligne
		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);
		}
  • aides débogage
    • GeoGebra est une interface visuelle à des outils de dessin légers mathématiques sophistiqués, utilisant je l' ai trouvé un programme d'aide bug

2 interface graphique débogage

  • couverture de test de stress
    • Dessine les étudiants du code à matrice de points généré au hasard, généré beaucoup de milliers de boîte noire définit la quantité de données à l'aide de tests
    • Mais le problème est que la surcharge de données de la boîte noire, une fois à l'incohérence shoot est difficile de trouver le problème.

réflexion de programmation

  • J'ai presque écrit en dehors du travail pendant deux jours, en raison de la plate-forme et ne sont pas familiers avec C ++, et les articles d'hiver ne sont pas trop de tâches de développement de logiciels, cette fois de l'achèvement des résultats des travaux et point de vue du processus, ne sont pas satisfaisantes. Le génie logiciel ainsi que derrière la charge lourde.

  • Voici des questions et enregistrer quelques points à améliorer

  • problème

    • Les documents de conception qui doivent être affinés à un grain fin? Quel genre de travail est nécessaire pour compléter le code?
    • Lorsque le code écrit pour modifier le document de conception est une chose évitable? Comment éviter
  • améliorer

    • Étant donné que le problème de la capacité de programmation, alors je dois apprendre une variété de méthodes, tout en laissant plus de temps pour la programmation, afin d'assurer la qualité du travail, comme cette mission, un jour à l'avance si nous pouvons commencer à écrire, vous devriez être beaucoup amélioré
    • besoin de C pour être plus familier avec la langue, et VS IDE, développé après plus d'assurer l'efficacité

Je suppose que tu aimes

Origine www.cnblogs.com/yzy11235/p/12457866.html
conseillé
Classement