IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Sélection de points parmis une table + Création de spline encastré


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 3
    Par défaut Sélection de points parmis une table + Création de spline encastré
    Tout d'abord, excusez-moi pour le titre qui ne reflète pas totalement ce dont j'ai besoin. Je vais essayer d'être un peu plus explicite dans sa description.

    Dans le cadre d'un stage, je dois réaliser un projet qui demande de réaliser un algorithme en C (chose dont je ne suis pas capable puisque ce n'est "pas" un enseignement dispensé par mon école).

    Ce projet (programme) a pour but de lier grâce à une fonction, le mouvement d'un axe maitre à celui d'un axe secondaire (en gros :bad: ). L'utilisateur qui utilise ce programme doit fournir une liste de points (position axe maitre, position axe secondaire) afin qu'on puisse définir une fonction capable de relier ces points.

    Voila donc les problèmes qui se posent.
    Dans un premier temps, l'utilisateur peut donner autant de points qu'il le souhaite, cependant, le robot qui va utiliser la fonction ne peut en mémoriser que 32. Ainsi, une première partie de l'algorithme servirait à "choisir" les 32 points les "plus représentatifs" (ou les points donnés s'il y en a moins de 32) de la table de points fournie. Pour se faire, je propose ici de calculer un "écart relatif" entre deux points consécutifs. (Plus d'explication sur l'image)



    Ensuite vient le gros du problème : la résolution du système. En effet, pour construire la fonction j'utilise la méthode des splines cubiques encastrés (puisque j'ai besoin d'avoir des dérivées nulles aux bords de "la" fonction), or, cette méthode demande de résoudre qui varie forcément en fonction du nombre de points choisis auparavant. Après résolution du système, on trouve les "principaux" coefficients des splines qui nous permettent de trouver les coefficients manquants.

    En sortie, on doit obtenir n-1 fonctions (ou leur dérivée qui représentent donc la vitesse) qui puissent etre utilisées par un variateur pour définir la vitesse à adopter par l'axe secondaire.



    Comme vous l'aurez compris, le problème n'est pas la représentation de la fonction finale mais bien son "écriture".

    Merci d'avance pour votre aide et bonne journée!
    (Je reste disponible pour toute précision)

    Je viens de me rendre compte d'une petite erreur dans mon "premier" ordinogramme. Dans la condition k=31, il faut en fait écrire k=n qui signifie que si on a atteint de dernier point (donc de coordonnée (xn,yn)) alors on repart du début (sans les points qui ont donc étés supprimés).

    A l'heure actuelle voila ce que je pensais faire pour la première partie, je sèche...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include <iostream>
    #include <cmath>
     
     
    const int m = 2;
    using namespace std;
     
    int main()
    {
        int n,r=200,u,v ;
     
        cout << "Saisissez le nombre de points de votre table"<< endl;
        cin >> n;
        int t[n][m], i, j, k=0;
        for (i=0; i<n; i++)
            for (j=0; j<m; j++)
            {
                cout << "Tapez t["<<i<<"]["<<j<<"] : ";
                cin >> t[i][j];
     
            }
       if (n>=3)
        {
            i=0;
           while (i<n)
            {
     
                u=abs((t[i][0]-t[i+1][0]));
                u=u/t[i][0];
                u=u*100;
                v=abs((t[i][1]+t[i+1][1]));
                v=v/t[i][1];
                v=v*100;
     
                if  (r<=(u+v)/2)
                {
             //   t[k][0]=t[i][0];
             //   t[k][1]=t[i][1];
                k++;
                }
                else
                {
                    i++;
                }
            }
            i=0;
            r=r+5;
        }
     
            cout<<"Voici le tableau :"<<endl;
            for (i=0; i<n; i++)
                {
                for (j=0; j<m; j++) cout<<"|"<<t[i][j] <<"|";
                cout<<endl;
                }
     
        return 0;
    }
    Merci d'avance !

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par Coqp-ox Voir le message
    Tout d'abord, excusez-moi pour le titre qui ne reflète pas totalement ce dont j'ai besoin. Je vais essayer d'être un peu plus explicite dans sa description.
    Allez, c'est bon pour une fois
    Dans le cadre d'un stage, je dois réaliser un projet qui demande de réaliser un algorithme en C (chose dont je ne suis pas capable puisque ce n'est "pas" un enseignement dispensé par mon école).
    Mais qu'est-ce qu'ils sont ch...ts ces maîtres de stage à essayer de t'apprendre de nouveaux trucs !!!!

    Non... Le boulot de développeur est un boulot dans lequel tu devras apprendre en permanence et être en mesure de t'adapter rapidement.

    Tu n'as pas appris quelque chose la solution est simple : tu retrousses tes manches et tu te colles à l'apprentissage. En plus, C est un langage sur lequel tu trouveras plein de tutos et de cours

    Ceci dit : Un algorithme représente une logique. La logique est indépendante de tout langage (qu'elle soit écrite en Français, en Anglais ou même en Chinois, la même recette donnera le même résultat si elle est bien suivie quelle que soit la langue utilisée )

    Le langage n'est qu'un moyen qui nous permet de faire comprendre à quelque chose d'aussi bête qu'un ordinateur ce que l'on attend de sa part et l'ordre logique de faire les choses.

    Tu n'as pas appris un langage particulier Comme tout le reste, il faudra que tu l'apprennes si tu veux obtenir le résultat que tu veux (ou que l'on attend de ta part)... Sans cette étape indispensable, nous ne pourrons pas grand chose pour toi
    Ce projet (programme) a pour but de lier grâce à une fonction, le mouvement d'un axe maitre à celui d'un axe secondaire (en gros :bad: ). L'utilisateur qui utilise ce programme doit fournir une liste de points (position axe maitre, position axe secondaire) afin qu'on puisse définir une fonction capable de relier ces points.
    Au moins, tu comprend déjà ce que tu cherches à faire... C'est déjà un très bon début

    Voila donc les problèmes qui se posent.
    Dans un premier temps, l'utilisateur peut donner autant de points qu'il le souhaite, cependant, le robot qui va utiliser la fonction ne peut en mémoriser que 32. Ainsi, une première partie de l'algorithme servirait à "choisir" les 32 points les "plus représentatifs" (ou les points donnés s'il y en a moins de 32) de la table de points fournie. Pour se faire, je propose ici de calculer un "écart relatif" entre deux points consécutifs. (Plus d'explication sur l'image)



    Ensuite vient le gros du problème : la résolution du système. En effet, pour construire la fonction j'utilise la méthode des splines cubiques encastrés (puisque j'ai besoin d'avoir des dérivées nulles aux bords de "la" fonction), or, cette méthode demande de résoudre qui varie forcément en fonction du nombre de points choisis auparavant. Après résolution du système, on trouve les "principaux" coefficients des splines qui nous permettent de trouver les coefficients manquants.

    En sortie, on doit obtenir n-1 fonctions (ou leur dérivée qui représentent donc la vitesse) qui puissent etre utilisées par un variateur pour définir la vitesse à adopter par l'axe secondaire.



    Comme vous l'aurez compris, le problème n'est pas la représentation de la fonction finale mais bien son "écriture".


    Tu as tout fait!!!
    Tu bloques finalement sur un problème de simple traduction. C'est fou non

    Bon, on peut remettre le choix du flowchart pour représenter ton algorithme en question (personnellement, je préfères le Nassi-Schneiderman) mais ce n'est qu'un détail
    [quote]Je viens de me rendre compte d'une petite erreur dans mon "premier" ordinogramme. Dans la condition k=31, il faut en fait écrire k=n qui signifie que si on a atteint de dernier point (donc de coordonnée (xn,yn)) alors on repart du début (sans les points qui ont donc étés supprimés).
    A l'heure actuelle voila ce que je pensais faire pour la première partie, je sèche...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include <iostream>
    #include <cmath>
     
     
    const int m = 2;
    using namespace std;
     
    int main()
    {
        int n,r=200,u,v ;
     
        cout << "Saisissez le nombre de points de votre table"<< endl;
        cin >> n;
        int t[n][m], i, j, k=0;
        for (i=0; i<n; i++)
            for (j=0; j<m; j++)
            {
                cout << "Tapez t["<<i<<"]["<<j<<"] : ";
                cin >> t[i][j];
     
            }
       if (n>=3)
        {
            i=0;
           while (i<n)
            {
     
                u=abs((t[i][0]-t[i+1][0]));
                u=u/t[i][0];
                u=u*100;
                v=abs((t[i][1]+t[i+1][1]));
                v=v/t[i][1];
                v=v*100;
     
                if  (r<=(u+v)/2)
                {
             //   t[k][0]=t[i][0];
             //   t[k][1]=t[i][1];
                k++;
                }
                else
                {
                    i++;
                }
            }
            i=0;
            r=r+5;
        }
     
            cout<<"Voici le tableau :"<<endl;
            for (i=0; i<n; i++)
                {
                for (j=0; j<m; j++) cout<<"|"<<t[i][j] <<"|";
                cout<<endl;
                }
     
        return 0;
    }
    Merci d'avance !
    Attention!

    Si tu dois coder en C, tu ne peux pas utiliser std::cout et std::cin. Tu dois utiliser printf scanf et autres fonctions associées.

    La première question est donc : veux tu programmer en C ou en C++ Si c'est en C, il faudra que je déplace la discussion (et tu te feras taper sur les doigts à cause de cin et cout), si c'est en C++, je la laisserai ici, mais tu te fera taper sur les doigts pour d'autres raisons

    Sinon, je peux déjà faire quelques remarques d'ordre générale :
    La première chose à laquelle tu dois penser quand tu écris ton code, c'est qu'il doit pouvoir être lu : Par les types du forums qui essayeront de te répondre mais surtout (et d'abord) par toi, pas forcément demain ou après demain, mais dans six mois ou un an!

    Tu dois donc essayer de rendre ton code le plus facile à lire et à comprendre possible.

    Pour cela, il y a trois grandes règles à respecter en priorité :

    Ton code doit être explicite : Tu dois essayer de faire en sorte que tous les noms (de variable, de fonction, ...) que tu utilises exprimes clairement le but et / ou la raison d'être de ce qu'ils représentent. Tu as déclaré les variables m, n, u, v, r, t, i, j et k... Même toi, tu auras du mal, d'ici trois à six mois, à te souvenir de ce à quoi ils correspondent.

    En renommant tes variables pour qu'elles représentent quelque chose d'explicite, tu obtiendrais un code proche de
    const int dimensions = 2;
    using namespace std;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    int main()
    {
        int maxPoint,r=200,u,v ;
     
        cout << "Saisissez le nombre de points de votre table"<< endl;
        cin >> maxPoint;
        int allPoints[maxPoint][dimensions ], count, dimCount, pointCount=0;
        for (count=0; count<maxPoint; count++)
            for (dimCount=0; dimCount<dimensions ; dimCount++)
            {
                cout << "Tapez t["<<count<<"]["<<dimCount<<"] : ";
                cin >> allPoints[count][dimCount];
     
            }
       if (maxPoint>=3)
        {
            count=0;
           while (count<maxPoint)
            {
     
                u=abs((allPoints[count][0]-allPoints[count+1][0]));
                u=u/allPoints[count][0];
                u=u*100;
                v=abs((allPoints[count][1]+allPoints[count+1][1]));
                v=v/t[count][1];
                v=v*100;
     
                if  (r<=(u+v)/2)
                {
             //   allPoints[pointCount][0]=allPoint[count][0];
             //   allPoints[pointCount][1]=allPoint[count][1];
                pointCount++;
                }
                else
                {
                    count++;
                }
            }
            count=0;
            r=r+5;
        }
     
            cout<<"Voici le tableau :"<<endl;
            for (count=0; count<maxPoint; count++)
                {
                for (dimCount=0; dimCout<dimensions ; dimCount++) cout<<"|"<<allPoints[count][count] <<"|";
                cout<<endl;
                }
     
        return 0;
    }
    Il y a quelque variables que je n'ai pas renommées parce que je n'ai pas vraiment su déterminer à quoi elles correspondaient et le code tel que je l'ai corrigé produira un exécutable strictement identique au code d'origine, mais tu avouera que c'est déjà beaucoup plus lisible, non

    La deuxième règle est d'avoir une instruction et une déclaration par ligne.

    Nous pourrions donc faire une deuxième passe de correction en ce sens. Le code ressemblerait donc à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    const int dimensions = 2;
    using namespace std;
     
    int main()
    {
        int maxPoint ;
        int r=200 ;
        int u ;
        int v ;
     
        cout << "Saisissez le nombre de points de votre table"<< endl;
        cin >> maxPoint;
        int allPoints[maxPoint][dimensions ];
        int count; 
        int dimCount;
        int  pointCount=0;
        for (count=0; count<maxPoint; count++)
            for (dimCount=0; dimCount<dimensions ; dimCount++)
            {
                cout << "Tapez t["<<count<<"]["<<dimCount<<"] : ";
                cin >> allPoints[count][dimCount];
     
            }
       if (maxPoint>=3)
        {
            count=0;
           while (count<maxPoint)
            {
     
                u=abs((allPoints[count][0]-allPoints[count+1][0]));
                u=u/allPoints[count][0];
                u=u*100;
                v=abs((allPoints[count][1]+allPoints[count+1][1]));
                v=v/t[count][1];
                v=v*100;
     
                if  (r<=(u+v)/2)
                {
             //   allPoints[pointCount][0]=allPoint[count][0];
             //   allPoints[pointCount][1]=allPoint[count][1];
                pointCount++;
                }
                else
                {
                    count++;
                }
            }
            count=0;
            r=r+5;
        }
     
            cout<<"Voici le tableau :"<<endl;
            for (count=0; count<maxPoint; count++)
                {
                for (dimCount=0; dimCout<dimensions ; dimCount++) 
                    cout<<"|"<<allPoints[count][count] <<"|";
                cout<<endl;
                }
     
        return 0;
    }
    Cela ne change toujours rien au code binaire généré, mais nous avons maintenant facile à repérer les différentes variable et à suivre la logique suivie

    La troisième règle est de respecter des règles d'indentation stricte et constantes tout au long de ton projet.

    Ce n'est pas le cas entre les lignes (dans ton code d'origine)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            for (j=0; j<m; j++)
            {
                cout << "Tapez t["<<i<<"]["<<j<<"] : ";
                cin >> t[i][j];
     
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                if  (r<=(u+v)/2)
                {
             //   t[k][0]=t[i][0];
             //   t[k][1]=t[i][1];
                k++;
                }
                else
                {
                    i++;
                }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            for (i=0; i<n; i++)
                {
                for (j=0; j<m; j++) cout<<"|"<<t[i][j] <<"|";
                cout<<endl;
                }
    Ce n'est pas catastrophique, mais cela nuit à la lecture du code, et donc à la facilité avec laquelle on pourra comprendre ton code.

    En outre, même si le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        for (i=0; i<n; i++)
            for (j=0; j<m; j++)
            {
                cout << "Tapez t["<<i<<"]["<<j<<"] : ";
                cin >> t[i][j];
     
            }
    est tout à fait légal ( AKA autorisé par le compilateur) en soi, il reste toujours conseillé de placer les accolades non requises lorsque tu commences à imbriquer les instructions.

    On peut être souple ici comme pour les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                for (dimCount=0; dimCout<dimensions ; dimCount++) 
                    cout<<"|"<<allPoints[count][count] <<"|";
    à la condition que l'instruction soit simple et de respecter une indentation stricte

    Au final, ton code corrigé pourrait ressembler à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    const int dimensions = 2;
    using namespace std;
     
    int main()
    {
        int maxPoint ;
        int r=200 ;
        int u ;
        int v ;
     
        cout << "Saisissez le nombre de points de votre table"<< endl;
        cin >> maxPoint;
        int allPoints[maxPoint][dimensions ];
        int count; 
        int dimCount;
        int  pointCount=0;
        for (count=0; count<maxPoint; count++)
        {
            for (dimCount=0; dimCount<dimensions ; dimCount++)
            {
                cout << "Tapez t["<<count<<"]["<<dimCount<<"] : ";
                cin >> allPoints[count][dimCount];
            }
        }
        if (maxPoint>=3)
        {
            count=0;
            while (count<maxPoint)
            {
                u=abs((allPoints[count][0]-allPoints[count+1][0]));
                u=u/allPoints[count][0];
                u=u*100;
                v=abs((allPoints[count][1]+allPoints[count+1][1]));
                v=v/t[count][1];
                v=v*100;
                if  (r<=(u+v)/2)
                {
                    //allPoints[pointCount][0]=allPoint[count][0];
                    //allPoints[pointCount][1]=allPoint[count][1];
                    pointCount++;
                }
                else
                {
                    count++;
                }
            }
            count=0;
            r=r+5;
        }
     
        cout<<"Voici le tableau :"<<endl;
        for (count=0; count<maxPoint; count++)
        {
            for (dimCount=0; dimCout<dimensions ; dimCount++) 
                cout<<"|"<<allPoints[count][count] <<"|";
            cout<<endl;
        }
     
        return 0;
    }
    Je n'ai toujours pas changé une seule virgule au code binaire qui sera généré par le compilateur!!!

    Mais le code dans l'état dans lequel il se trouve maintenant est beaucoup plus lisible, donc beaucoup plus facile à comprendre et donc... beaucoup plus facile à analyser, à maintenir et à débuger pour celui dont ce sera la tâche.

    En dehors des intervenants du forum, il le sera donc... Pour toi en priorité.

    Je n'ai pas vérifié si ton code correspond à ton algorithme, mais, maintenant, tu te trouves dans une situation dans laquelle il te sera facile de le faire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. En SQL à la carte, invite qui pointe sur une table
    Par jean_paul.briaud dans le forum Designer
    Réponses: 3
    Dernier message: 17/11/2009, 14h35
  2. [DOM] Script de sélection de row dans une table
    Par Alain G dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 22/08/2007, 21h58
  3. Réponses: 3
    Dernier message: 21/05/2007, 15h31
  4. sélection de champs d'une table
    Par OBIWAN64 dans le forum Access
    Réponses: 2
    Dernier message: 23/01/2007, 17h07
  5. Ordre de sélection des lignes sur une table DB2
    Par Pierre Formosa dans le forum DB2
    Réponses: 1
    Dernier message: 26/04/2006, 20h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo