2 votes

(Problème avec une boucle For imbriquée) Plusieurs colonnes 2 par colonne 1

Je n'arrive pas à comprendre comment mettre en œuvre CETTE boucle for imbriquée PARTICULIÈRE (je l'ai déjà utilisée pour une tâche similaire). J'ai besoin de 4 entrées utilisateur (plage de longueur et de rayon) et ensuite je dois afficher un tableau de valeurs calculées comme suit :

Radius Length Volume Area
1      1      *.**   *.**
1      2      *.**   *.**
1      3      *.**   *.**
2      1      *.**   *.**
2      2      *.**   *.**
2      3      *.**   *.**

Comme vous pouvez le constater, j'ai besoin de plusieurs longueurs pour chaque rayon. J'ai passé des heures à essayer de comprendre ce qui suit comment Je pourrais éventuellement obtenir plusieurs valeurs de la "colonne 2" pour la même valeur de la "colonne 1". Mon code n'affiche pas ce qui précède, mais plutôt ce qui suit :

[ Enter only positive integers! ]
Enter starting length: 1
Enter end length: 3
Enter starting radius: 1
Enter end radius: 3
Radius  Length  Volume  Area
1       1       3.14    6.28
1.00    1       3.14    6.28
1.00    1       3.14    6.28
1.00    1       3.14    6.28

Voici mon code (à l'origine, je voulais en mettre moins et suivre les lignes directrices du "code minimal", mais j'avais peur de manquer des informations importantes si je me contentais d'omettre tout ce qui se trouve en dehors de la boucle for. Je m'en excuse).

#include <iostream>
#include <iomanip>

using namespace std; 

// func prototyping
float volCalc(float pi, float rad, float len);
float surfCalc(float pi, float rad, float len);

int main()
{

    float pi = 3.14159265;
    int radStart, radEnd, lenStart, lenEnd;

    // data i/o
    cout << "[ Enter only positive integers! ]" << endl
         << "Enter starting length: ";
    cin  >> lenStart;
    cout << "Enter end length: ";
    cin  >> lenEnd; 
    cout << "Enter starting radius: ";
    cin  >> radStart;
    cout << "Enter end radius: ";
    cin  >> radEnd;

    cout << "Radius Length  Volume  Area" << endl;

    // for each radius, there will be lenStart to lenEnd calculations
    int totalRows = (radEnd - radStart) * (lenEnd - lenStart);

    for (int rows = 0; rows < totalRows; rows++) // iterate through all rows
    {

        // column iterator
        for (int i = lenStart; i < (lenEnd - lenStart); i++) 
        {
            float radius = radStart, length = lenStart;

            // outputting each row
            cout << radius << setprecision(2) << fixed << " "
                 << length << " " << volCalc(pi,radius,length) << " "
                 << surfCalc(pi,radius,length) << " " << endl;
            radius++;
            length++;
        }

    }

    return 0;
}

float volCalc(float pi, float rad, float len)
{
    return (pi*rad*rad*len);
}

float surfCalc(float pi, float rad, float len)
{
    return (2.0f*pi*rad*len);
}

(P.S. Oui, cela fait partie du programme d'études que je suis en train d'apprendre. J'ai essayé de faire des recherches sur Stack Overflow, sur d'autres forums, et j'ai essayé de passer au crible un peu plus de documentation sur la boucle for, mais je n'arrive pas à trouver la solution).

1voto

John Kugelman Points 108754

Je pense que ce qui vous fait trébucher, c'est d'essayer de raisonner en termes de lignes et de colonnes. Les boucles dont vous avez besoin ne correspondent pas à des lignes et des colonnes. Ce problème est plus facile à résoudre si vous travaillez directement avec les rayons et les longueurs.

L'astuce avec les boucles imbriquées est que pour chaque itération de la boucle extérieure, vous obtenez plusieurs itérations de la boucle intérieure. La boucle interne boucle plus rapidement que la boucle externe. En regardant la sortie, lorsque le rayon est de 1, nous imprimons trois lignes, une pour chaque longueur. Ensuite, nous passons à un rayon de 2 et nous imprimons à nouveau trois lignes. Le rayon se déplace lentement, la longueur rapidement.

Cela signifie que la boucle extérieure lente doit être bouclée sur les rayons :

for (int radius = radStart; radius <= radEnd; radius++)

Et la boucle intérieure rapide sur les longueurs :

for (int length = lenStart; length <= lenEnd; length++)

Vous obtenez une combinaison :

for (int radius = radStart; radius <= radEnd; radius++)
{
    for (int length = lenStart; length <= lenEnd; length++)
    {
        cout << radius << setprecision(2) << fixed << " "
             << length << " " << volCalc(pi,radius,length) << " "
             << surfCalc(pi,radius,length) << " " << endl;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X