2017-07-06 1 views
2

J'ai donc ce code que j'ai créé pour CS50 pset1 Mario problème. Le code se comporte correctement et fait exactement ce qu'il est censé faire, mais je ne comprends pas l'une des parties. Pourquoi se comporte-t-il de cette façon?Pourquoi ma boucle for C fonctionne-t-elle correctement?

Voici le code que je l'ai écrit en C:

#include <cs50.h> 
#include <stdio.h> 

int main (void){ 
int height, row, space, hash; 

    do { 
     printf("Height: "); 
     height = get_int(); 
    } while(height<0 || height>23); 

    for (row=0; row<height; row++){ 

     for (space=height-(row+1); space>0; space--){ 
      printf("-"); 
     } 

     for (hash=height-row; hash<=height; hash++){ 
      printf("#"); 
     } 

     printf("#\n"); 
    } 

} 

Ainsi, par exemple lorsque l'utilisateur entre 3 à la hauteur, je reçois

--## 
-### 
#### 

Ce que je ne comprendre pourquoi ce n'est pas:

--#### 
-### 
## 

Cette partie est ce qui me jetant:

for (hash=height-row; hash<=height; hash++){ 
      printf("#"); 
     } 

Si hachage = hauteur ligne devrait alors pas être 3-0 = 3 et l'ont imprimer le signe dièse 3 fois? Puis 3-1 = 2 et imprimez-le deux fois, et ainsi de suite? Pourquoi le fait-il en sens inverse?

Quelqu'un peut-il expliquer ce qui ne va pas avec ma logique?

+0

S'il vous plaît tourner ceci dans un débogueur premier :( – KevinDTimm

Répondre

4

La réponse est dans la partie conditionnelle et incrément de la boucle for.

Vous avez raison de dire que la valeur initiale de hachage serait 3. La partie conditionnelle de la boucle for vérifiera que le hachage (3) est inférieur ou égal à la hauteur (3). Donc, est 3 < = 3? Oui.

La partie d'incrément de la boucle for détermine les modifications à chaque itération. Dans votre cas, le hash sera incrémenté de 1, donc la prochaine fois que la boucle sera exécutée, hash aura une valeur de 4. Le conditionnel vérifie: hash (4) < = height (3)? Cela renvoie false, et la boucle for sera terminée. Lorsque la prochaine itération de la boucle "ligne" se produit, la valeur initiale du hachage est 2 (puisque 3 - 1 = 2). Cela continuera à ajouter 1 à hachage jusqu'à ce que "hash < = height" renvoie false. Au fur et à mesure que la "rangée" augmente, plus de "#" sont imprimés.

+0

Maintenant, il est logique. Merci pour l'explication. –

2

Décomposons la boucle:

 for (hash=height-row; hash<=height; hash++){ 
     printf("#"); 
     } 

Lorsque la hauteur est 3:

for row = 0 (less than 3): 
    for (hash = 3 - 0; hash <= 3 (true); hash++ (hash will be 4 next iteration)) 
     print # 

Ensuite,

for (has = 4; hash <= 3 (false); hash ++) 
     (does not print #) 

et enfin,

print #\n 

Vous obtenez deux hachages au total, par ex.

--##