Question

[EDIT] Oups il y avait une erreur dans le code, et maintenant toutes les réponses à la question semblent bizarres, mais fondamentalement la boucle for était, pour (i = 0; i < 15; i ++ ). J'ai également édité pour rendre la question plus claire. [/ EDIT]

J'essaie de créer une boucle for, qui vérifie un tableau de 16 éléments. Elle passe donc de 0 à 15. J'utilise ensuite la variable i plus tard, mais parfois i == 16, ce qui pose des problèmes en étant hors limites. .

J'ai une solution mais elle ne semble pas élégante, ce qui me fait penser qu'il me manque quelque chose. J'ai essayé de faire des boucles while, mais je ne peux jamais obtenir de boucle allant de 0 à 15 et ne jamais terminer à une valeur supérieure à 15.

Existe-t-il un moyen de créer une boucle pour vérifier les 16 éléments du tableau sans jamais dépasser 15 à la fin de la boucle?

int i;

for(i=0; i<16; i++)
{
    someClass.someMethod(i);

    if(someClass.Test())
    {
        break;
    }
}



if (i == 16)
{
    i = 15;
}
Était-ce utile?

La solution

Je suggère d'utiliser une autre variable que i une fois votre boucle terminée. Le critère d'utilisation d'une boucle for au lieu d'une boucle while est que vous savez à l'avance combien de fois une boucle for s'exécutera. Si vous le savez déjà, définissez une autre variable sur la valeur de fin de votre boucle et utilisez-la au lieu de donner <=> un double objectif.

int j = 15;

for(int i=0; i <= j; i++)
{
    someClass.array[i];
}

// continue on using j, which value hasn't changed

Autres conseils

Eh bien, pour commencer, votre exemple de code passe de 0 à 14 en boucle. Mais si vous passez de 0 à 15 en boucle, vous devez bien sûr avoir 16 ans avant que la boucle puisse se terminer. Qu'est-ce qui se passe est qu'il devient 16, alors votre boucle remarque qu'il est hors limites et éclate. Si vous voulez que cela se termine à 15, honnêtement, la meilleure chose à faire est de décrémenter juste après la fin de la boucle.

i est incrémenté à la dernière vérification pour être 16, ce qui n’est pas inférieur à 15, donc la boucle se termine avec i étant 16.

Peut-être qu'il est utile de savoir que:

for (before; check; after) { body } 

c'est la même chose que:

before 
while(check) { 
  body 
  after 
} 

Si vous y réfléchissez bien, vous comprendrez peut-être facilement pourquoi, à la sortie, j'ai 16 ans.

Il semble y avoir des défauts fondamentaux dans votre approche.

  1. Vous ne devriez pas vraiment utiliser une variable d'index en dehors de la portée de la boucle.
  2. Vous devez utiliser une variable ou une fonction pour déterminer la limite de la boucle.
  3. Il serait préférable d'utiliser des itérateurs plutôt que des index numériques.
  4. Les algorithmes génériques peuvent supprimer le besoin de boucles.

Seulement mes 0,02 $.

Donc, si vous vérifiez un tableau de 16 éléments, vous ferez normalement ceci:

for(i=0; i<16; i++)

Comment pour les travaux, commence-t-il par la première déclaration de trois:

i=0

Ensuite, votre chèque, dans la deuxième déclaration:

i < 16 // True here, since 0 < 16

Cela se produit avant votre boucle. Ensuite, il exécute le bloc de votre boucle avec cet ensemble:

someClass.array[i]; //0

Enfin, il fait la déclaration finale:

i++

Ensuite, il répète les deuxième et troisième déclarations, dans une séquence.

Avant la dernière exécution, i == 14, il exécute ensuite i ++, lui attribuant la valeur 15, et exécute le bloc. Enfin, il fait i ++, paramètre:

i==16

À ce stade, la condition n'est plus vraie:

i < 16 // False, since i==16

À ce stade, votre bloc ne s'exécute pas mais i est toujours défini sur 16.

Vous devez avoir oublié quelque chose.

Dans cette boucle, il ne serait même pas frappé 15, vous auriez besoin de dire i < = 15, dès que je = 14, il courait une fois et sous caution.

La boucle for équivaut à la while boucle suivante:

i = 0;
while(i < 16) {
    someClass.array[i];

    i++;
} // while

i doit atteindre 16 ans pour sortir de la boucle correctement.

Techniquement, il est possible d’écrire la boucle de telle sorte que i soit 15 à la sortie de la boucle, mais vous ne devriez pas les faire:

int i = 0;
while (1) {
    someclass.someMethod(i);
    if (i < 15) {
        i++;
    } else {
        break;
    }
}

Oui, c'est ce que vous demandez. Mais le flux est horrible.

Vous ne pouvez pas accomplir cela avec les structures de boucle intégrées et, comme l'a dit Bill The Lizard, vous ne voulez probablement pas vraiment réutiliser la variable for-loop.

Mais si vous voulez vraiment, voici une façon de le faire. L'astuce consiste à placer la condition de boucle au milieu de la boucle:

int i = 0;
while (true)
{
    someclass.array[i];
    if (i == 15)
        break;
    ++i;
}

Le problème clé à comprendre ici est qu’il ya 17 réponses différentes à la question & "Quelle valeur de i fait-elle réussir le test? &"; Soit je peux être dans {0, 1, ..., 15}, soit aucune valeur de i ne provoque le test, ce qui est noté i == 16 dans ce cas. Donc, si i est limité à 16 valeurs, il est impossible de répondre à la question.

Il existe des cas légitimes où vous ne voulez pas aller au-delà de la dernière valeur valide. Par exemple, si vous avez 256 valeurs et pour une raison quelconque, vous ne pouvez compter qu'avec un octet. Ou, comme cela m'est arrivé récemment, vous souhaitez examiner uniquement chaque élément d'un tableau, et le dernier ajout à votre itérateur vous emmène au-delà de la fin du tableau. Dans ces cas, il est nécessaire d’effectuer un déroulement de la boucle .

Cependant, pour ce problème, il serait préférable d'utiliser un indicateur:

bool flag = false;
for (int i = 0; i < 15; ++i) 
{
    someClass.someMethod(i);

    if (someClass.Test())
    {
        flag = true;
        break;
    }
}

Ensuite, il est clair si le test a réussi ou non.

Si votre boucle se termine naturellement, plutôt que par une pause, i sera égal à 16. Il n'y a aucun moyen d'éviter cela. Votre code est parfaitement acceptable si ce que vous voulez, c’est que j’ai 15 ans ou moins:

int i;
for (i=0; i<16; i++) {
    someClass.someMethod(i);
    if (someClass.Test())
        break;
}
if (i == 16)
    i = 15;

Tout ce qui change someClass.Test() de 16 à 15 après le corps de la boucle fera:

if (i == 16) i = 15;
i = (i == 16) ? 15 : i;
i = MAX (15,i); /* where MAX is defined :-) */

et ainsi de suite.

Cependant, cela suppose que i == 15 sera utilisé pour quelque chose de significatif en tant que post-condition par rapport à cette boucle. Je trouve que c'est rarement le cas, les gens ont tendance à le réinitialiser avant de le réutiliser (comme un autre pour la boucle).

De plus, ce que vous faites rend très difficile (impossible, même) de déterminer comme post-condition, si votre boucle s'est terminée normalement ou si elle s'est terminée prématurément car <=> est retourné à vrai pour <=>. Cela signifie que l'utilisation de i pour prendre d'autres décisions est semée d'embûches.

Ma question serait la suivante: Pourquoi pensez-vous que vous devez laisser <=> 15 ou moins?

  

J'essaie de faire une boucle, que   vérifie un tableau de 16 éléments, donc il boucle   de 0 à 15. J'utilise ensuite le i   variable plus tard, cependant parfois i ==   16, ce qui cause des problèmes en étant dehors   des limites.

Vous devez vérifier le cas où votre boucle for ne s'est pas cassée, car cette information détermine si ce que vous voulez faire avec i est valide ou non.

Il y a plusieurs façons de procéder. La première consiste à en garder la trace dans un bool, tel que & "FoundClass &"; ou " testSucceeded " ;. Définissez la valeur par défaut sur false, puis définissez-la sur true lors de votre pause. Indiquez toute utilisation de i plus tard dans la fonction dans & "; If (foundClass) {} &"; des blocs.

Une autre consiste à faire ce que vous avez fait. Bien que votre solution de rechange ne semble pas correcte du tout. Si vous définissez i sur 15, vous mentez à votre code en lui disant que someClass.Test () a réussi pour i == 15, ce qui n'est pas vrai. Évitez de définir une valeur incorrecte pour que votre code ne commette pas d'erreur ultérieurement. Il est bien mieux de mettre des limites à l'utilisation réelle de i plus tard dans le code.

for(int i=0; i<17; i++)
{    
  if(i<16)
  {
     someClass.someMethod(i); 
     if(someClass.Test())   
     {        
       break;    
     }
  }
  else if(i==16)
  {
     i=15;
  }
}

Si vous dites que vous avez un tableau de 16 éléments, vous n'avez pas à le définir. Utilisez le tableau pour obtenir cette information (NE PAS LES INFORMATIONS EN DOUBLE)

si vous souhaitez récupérer le dernier index, utilisez le tableau pour obtenir ces informations.

for(int i = 0; i < myArray.length; ++i){
       myArray[i].somemethod();
}
// lastindex = myArray.length-1;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top