génie logiciel BUAA travail individuel de projet
projet | teneur |
---|---|
Cours: 2020 des cours de génie logiciel de blog Spring (Roger, Ren Jian) | Parc lien de blog de classe |
Job: génie logiciel BUAA travail individuel de projet | exigences opérationnelles |
Objectifs du cours | L'apprentissage des compétences et des méthodes de développement de logiciels à grande échelle, la formation et les capacités de développement |
objectif d'emploi | Terminez le premier projet solo |
Classes | Vendredi matin classe 006 |
GitHub adresse de projet | lien GitHub |
PSP
PSP2.1 | Etapes du processus Logiciels personnels | consommatrice de temps estimé (minutes) | Les chronophages réelles (minutes) |
---|---|---|---|
Planification | plan | ||
· Estimation | • Estimez combien de temps cette tâche exige | 60 | 80 |
Développement | développer | ||
· Une analyse | · Analyse des besoins (y compris l'apprentissage de nouvelles technologies) | 40 | 32 |
· Conception Spec | Générer des documents de conception | 30 | 45 |
· Examen de la conception | · Design Review (et ses collègues ont examiné les documents de conception) | 20 | 16 |
· Norme de codage | · Les spécifications du Code (élaboration de normes appropriées pour le développement en cours) | 5 | 3 |
· Conception | · Conception spécifique | 60 | 48 |
· codage | · Codage spécifique | 360 | 373 |
· Code Review | · Code Review | 60 | 49 |
· test | · Test (auto-test, modifier le code, présenter des modifications) | 60 | 83 |
rapports | rapport | ||
· Rapport d'essai | · Rapport d'essai | 50 | 68 |
· Taille de mesure | · La charge de travail de l'informatique | 5 | 5 |
· Postmortem et processus plan d'amélioration | · Hindsight et processus proposer plan d'amélioration | dix | 24 |
total | 760 | 826 |
idées de résolution de problèmes
Les questions de base
Au début, pour obtenir le titre, tout simplement regardé deux questions, trouver deux questions dans la deuxième question est comparée à la première question à se développer, et le sujet du problème à résoudre est de résoudre tangible de la vie réelle un ensemble de problèmes, de sorte que le départ a décidé d'utiliser des idées orientées objet pour concevoir le code. Titre petite description, le concept de valeurs de coordonnées de la ligne, la configuration suivante a décidé plusieurs catégories:
RationalNumber
: Classe rationnelleRationalPoint
: Point rationnel comme une valeur de coordonnéesLine
: Classe linéaireGeometryStatistic
: Classe statistique, enregistrement linéaire, le nombre de points.Reader
: La classe de traitement d'entrée.
Après avoir vu le titre, le titre est destiné à examiner la première question, un sommet au moins après deux droites intention est en fait l'intersection de la ligne. Pensez à l'intersection de la ligne, on trouve l'intersection de deux lignes sont connues pour, mais pour résoudre un ensemble d'équations linéaires, et sa solution peut être représentée par les paramètres d'une ligne droite. Ainsi , lorsque nous trouvons l'intersection des deux lignes droites, cette étape peut être fait \ (O (1) \) a. À savoir, deux lignes droites sont utilisées :
\ [Y_1 = k_1 x + b_1 \]
\ [Y_2 = k_2 x + B_2 \]
S'il y a une intersection entre une ligne droite, le point d' intersection supposé \ ((x_0, y_0) \) , les équations simultanées sont résolues pour donner
\ [X_0 = \ frac {B_2 - B_1} {k_1 - k_2} \]
\ [Y_0 = k_1 x + b_1 \]
Puis, quand donné deux sommets de chaque ligne, Simplifie d'expression algébrique
\ [X_0 = \ frac {(x_ {21} y_ {22} - y_ {21} x_ {22}) (x_ {11} - x_ {12}) - (x_ {11} y_ {12} - y_ { 11} x_ {12}) (x_ {21} - x_ {22})} {(y_ {11} - y_ {12}) (x_ {21} - x_ {22}) - (x_ {11} - x_ {12}) (y_ {21} - {22} y_)} \]
\ [Y_0 = k_1 x_0 + B_1 \]
Bien sûr, pour tenir compte des circonstances particulières dans lesquelles, si \ (k_1 \) à l' infini, alors \ (k_2 \) remplacer \ (k_1 \) (inévitable lorsque deux lignes se croisent \ (k_1 \) et \ (k_2 \) En même temps , impossible à l' infini).
Considérons le point de coordonnées des problèmes de précision, car la pente des deux lignes droites peut être peu de différence, intersection et très loin, afin d'éviter l' apparition d' une double précision ou suppressions, a décidé de construire une classe RationalNumber
, la classe pour décrire un nombre rationnel, sous la forme de scores représentation. La première question, toutes les coordonnées qui peuvent être exprimées par des nombres rationnels, qui doivent être en mesure d'assurer une comparaison précise de deux différentes intersection.
Mais la question nécessite solution est l'intersection de toutes les lignes, le plus grand nombre de lignes droites peut atteindre \ (1000000 \) barres, ce qui indique que si la meilleure façon tous les deux lignes se croisent la violence pour résoudre la complexité temporelle est \ (O ( 2 ^ n-) \) , le résultat de délai d' attente. Cependant, grâce à un meilleur algorithme d'optimisation ne s'attendait pas, il a été décidé dans la perspective de la structure de données pour résoudre ce problème.
Grâce à l' accès à l' information trouvée, cpp et il y a une Java- HashSet
comme la structure de données pour \ (unordered_set \) , qui existe lorsque les interfaces personnalisées de classe doivent passer outre hachage et de l' égalité, que je l'interface conçu suit le hachage et égale :
size_t my_hash::operator()(RationalPoint* const& a) const {
return hash<string>{}(a->hashstring);
}
bool my_equal::operator()(RationalPoint* const& a, RationalPoint* const& b) const {
return a->equals(*b);
}
Où RationalPoint
est la construction de classe de points, ses deux composantes de deux valeurs de coordonnées XY des nombres rationnels, puisque la fonction de hachage est définie dans les coordonnées d'une chaîne de nos connaissances, la chaîne de valeur de hachage de requête, égale en comparaison plus évidente, qui compare deux composants sont égaux, respectivement.
crédit supplémentaire
En raison du problème supplémentaire d'introduire le concept d'un cercle, il est nécessaire d'augmenter les catégories suivantes:
Circle
: Classe rondeUnRationalPoint
: Point de classe nombre irrationnel, à savoir un composant pour les deux sommets nombre irrationnel
Après l'intersection de la demande et linéaire De même, l'introduction du cycle, et l'intersection des situations suivantes:
- intersection de la ligne de fil
- intersection du cercle ligne
- intersection ronde
Dans lequel l'intersection de la première question de la ligne de la ligne a été obtenue, le cercle d'intersection de la ligne même, l'équation quadratique peut être résolu simultanée
\ [Y = kx + b \]
\ [(X - m) ^ 2 + (y - n) ^ 2 = r ^ 2 \]
Vous pouvez résoudre pour:
\ [X 1 = \ frac {- (2kb - 2kN - 2m) + \ sqrt {(2kb - 2kN - 2m) ^ 2 - 4 (k ^ 2 + 1) (m ^ 2 + (bn) ^ 2 - r ^ 2)}} {2 (k ^ 2 + 1)} \]
\ [X 2 = \ frac {- (2kb - 2kN - 2m) - \ sqrt {(2kb - 2kN - 2m) ^ 2 - 4 (k ^ 2 + 1) (m ^ 2 + (bn) ^ 2 - r ^ 2)}} {2 (k ^ 2 + 1)} \]
\ [Y_1 = k x 1 + b \]
\ [Y_2 = k x 2 + b \]
Dans lequel, dans le plus nombre d'expression peut être inférieure à 0, inférieure à 0 indique s'il n'y a pas d'intersection, pour revenir, k peut être infini, l'infini lorsque k, une ligne droite arbitraire x = x-valeur de coordonnée d'un sommet, y dans l'équation d'un cercle vous pouvez être calculé.
Calculé par le théorème suivant de longueur d'intersection dont deux pour l'équation de l'expression différentielle d'un cercle, d'une ligne circulaire d'intersection, la ligne d'intersection de la première demande ronde, puis amené dans une ligne de calcul d'intersection circulaire, le point d'intersection. Note complétée par la peine de circonstances particulières.
Calculé intersection, certaines valeurs de coordonnées rationnelles sont possibles, et certains peuvent être des nombres irrationnels, nombre rationnel et irrationnel est déterminé à savoir si l'ouverture est un nombre entier plus de résoudre les équations est déterminé en fonction du nombre d'autres. Si l'ouverture est un entier plus, par rapport à un nombre rationnel, en classe rationnelle, si elle est un nombre irrationnel, place les coordonnées d'un point représentant doubles, des nombres irrationnels en classes.
Compte tenu des problèmes de précision, en raison du rayon limité du cercle et le sommet, afin de ne pas franchir un point loin, de sorte que la précision de point d'intersection ligne droite et pas trop petite. Le sujet de la double précision comparée à 1E-10 à envisager.
processus de conception
Les questions de base
classe nombreRationnel
Ces nombres rationnels sont représentés, qui a deux valeurs d'attribut du numérateur et le dénominateur, les deux types long long
, il y a les fonctions membres suivantes:
- Constructor: passer le numérateur et le dénominateur, le plus grand commun diviseur euclidienne de simplification, les symboles de la molécule.
equals(RationalNumber a)
: Comparaison de deux nombres rationnels sont égauxtoString()
: Les nombres rationnels dans une chaîne
classe RationalPoint
Cette classe est utilisée pour représenter les coordonnées de point de sommet rationnels, à savoir, l'intersection de deux lignes droites avec x, y deux composants, le type de classe est un nombre rationnel, il existe une fonction membre:
- : Deux Constructors entrants composants
equals(RationalNumber a)
: Comparaison de deux nombres rationnels sommets sont égauxtoString()
: Les nombres rationnels dans un sommet de la chaîne
classe ligne
classe linéaire, soumis à stocker une ligne droite donnée, en raison de coordonnées à l'entier de valeurs, de sorte qu'il y a quatre éléments, respectivement, x1, x2, y1, y2, int, et ont des fonctions membres:
- Constructeur: deux coordonnées de sommet entrants
classe GeometryStatistic
Cette classe est les statistiques de classe, des graphiques en ligne droite, et l'intersection de la ligne, les membres de variables vector<Line> lines
choses au clair, et unordered_set<RationalPoint*, my_hash, my_equal>
sauver l'intersection a été obtenu, dans lequel my_hash
et my_equal
pour l'interface personnalisée, responsable de RationalPoint*
générer de la valeur de hachage et comparer spécifique défini Code dessus. Nous avons des fonctions membres:
feed(Line line)
: Ajoutez des lignes, et l'intersection de la nouveautéline_line_intersect(Line l1, Line l2)
: Calcul de l'intersection de deux lignes droites.getPointCount()
: Obtenez tout le nombre actuel d'intersection
classe lecteur
Une telle entrée et le traitement de sortie de la classe
programme débit
- la fonction principale lit les paramètres de ligne de commande, la configuration instance Reader, l'entrée d'initialisation et de fichiers de sortie, la configuration objet GeometryStatistic.
- Lecteur lit l'entrée, chaque fini de lire une ligne, appelez GeometryStatistic la fonction d'alimentation, les statistiques des Inject linéaires
- fonction d'alimentation en ligne droite, d' abord et avant que toutes les lignes ont été ajoutées une fois traversal, les appels
line_line_intersect
fonctionnent pour résoudre l'intersection line_line_intersect
En utilisant l'équation de la fonction dérivée ci - dessus, les coordonnées d'intersection de la construction de l' objet rationnel, l'objet et rationnellesinsert
pourunordered_set
la.- Après avoir lu le fichier d'entrée, lit les
Statistic
objets degetPointCount()
valeurs, sortie vers un fichier, la fin du programme.
Unité de test configuré
- Après avoir écrit la classe rationnelle, test rationnelle de l'unité de construction, vérifier s'il est nécessaire une configuration de simplification.
- Après avoir écrit le sommet rationnelle et rationnelle, dans lequel la surcharge
my_hash
etmy_equal
une interface, la configuration de l'essai de l' unité respective, instancier ununordered_set
test d'objet si deux interfaces pour répondre aux exigences - Après avoir écrit l'intersection résolu unité test configuré pour tester
Statistic
la classe, si l'intersection peut être précisément calculée et stockée.
crédit supplémentaire
Augmenter la classe:
classe cercle
Classe cercle, le rayon de sommet et le stockage du cercle
classe UnRationalPoint
nombre irrationnel classe de sommet, aussi longtemps que le composant de stockage sommet nombre irrationnel, à stocker.
À la fin de la classe, ont également besoin de recharger hash
et equal
interfaces. problèmes de précision qui ont besoin d' attention, en prenant en compte 1e-10
;
fonction croissante de la classe GeometryStatistic
line_circle_intersect(Line l, Circle c)
: Résolution de l'intersection des lignes et des cercles, pour résoudre la formule décrite ci-dessus dérivée. Dans lequel , lorsque la détermination de l' opportunité d'ouvrir nombre plus rationnelle, si elle est rationnelle pour construire l'RationalPoint
instance d'objet correspondant à coexister dans l'ensemble, si le nombre irrationnel est configuréUnRationalPoint
exemples existent pour définir le correspondantcircle_circle_intersect(circle c1, circle c2)
: De même, la nécessité de faire la distinction entre les nombres rationnels et irrationnels
programme débit
- la fonction principale lit les paramètres de ligne de commande, la configuration instance Reader, l'entrée d'initialisation et de fichiers de sortie, la configuration objet GeometryStatistic.
- Lecteur lit l'entrée:
- Après chaque lecture d'une ligne, appeler GeometryStatistic la fonction d'alimentation, les statistiques des Inject linéaires
- Chaque lecture d'un cercle complet, les appels GeometryStatistic la fonction d'alimentation qui statistique ronde Inject
- Dans la fonction d'alimentation:
- fonction d'alimentation en ligne droite, d' abord et avant que toutes les lignes ont été ajoutées une fois traversal, les appels
line_line_intersect
fonctionnent pour résoudre l'intersection, puis à travers tous les cercles, les appels deline_circle_intersect
résolution et l' intersection circulaire, et l'intersection à un ensemble correspondant de - fonction d'alimentation de cercle, d' abord et avant que toutes les lignes ont été ajoutées une fois traversal, les appels
line_circle_intersect
fonctionnent pour résoudre l'intersection, puis à travers tous les cercles, les appels decircle_circle_intersect
résolution et l' intersection circulaire, et l'intersection à un ensemble correspondant de
- fonction d'alimentation en ligne droite, d' abord et avant que toutes les lignes ont été ajoutées une fois traversal, les appels
- Après avoir lu le fichier d'entrée, lit les
Statistic
objets degetPointCount()
valeurs, sortie vers un fichier, la fin du programme.