Pratique de la programmation en zig-zag en C

J’ai un exercice avec Objective-C en utilisant for , if-else et printf un zig-zag comme celui-ci sur la console:

S’il vous plaît voir l’image:

entrez la description de l'image ici

J’ai essayé un code avec la programmation en C et imprimer un sortingangle puis essayer de l’éditer, mais je ne peux rien faire de plus pour obtenir mon Zig-Zag.


J’ai déjà résolu mes problèmes. Merci beaucoup les gars.

  for (int i = 0; i < 5; i++) { for(int j = 1; j<= 21; j++ ){ if(j<=9){ if(j - i == 5 || j+ i == 5){ printf("*") ; }else{ printf(" "); } }else{ if(j+i == 13 || j - i == 13 || j + i == 21){ printf("*") ; } else{ printf(" "); } } } printf("\n"); } 

OK, essayez 2 en fonction de votre question mise à jour. Commençons par la structure de base. Définissez des constantes pour la largeur et la hauteur – nous y ferons référence à plusieurs endroits, afin que les constantes apportent de jolis changements faciles – et créent une boucle avec une logique de base pour commencer à obtenir l’affichage souhaité.

 const int numRows = 5; const int numCols = 21; for (int row = 0; row < numRows; ++row) { for (int col = 0; col < numCols; ++col) { if (col == row) { printf("X"); } else { printf(" "); } } printf("\n"); } 

Cela nous donne:

 XXXXX 

ce qui est le mauvais sens et ne nous donne qu'une "descente", mais c'est un bon début. Utilisons la fonction module pour que le motif se répète. La répétition se produit sur le neuvième caractère, ce qui suggère que nous devons utiliser ((numRows - 1) * 2) pour notre module.

 const int modulusVal = ((numRows - 1) * 2); for (int row = 0; row < numRows; ++row) { for (int col = 0; col < numCols; ++col) { int modCol = (col % modulusVal); if (modCol == row) { printf("X"); } else { printf(" "); } } printf("\n"); } 

Alors maintenant nous avons:

 XXXXXXXXXXXXXXX 

qui commence à se rapprocher de ce que nous voulons. Donc, passons aux courses ascendantes. Les courses descendantes sont affichées lorsque modCol est dans la plage de la ligne, qui est 0-4. Lorsque modCol a dépassé cette plage, nous le remettons dans la plage en lui soustrayant le nombre de lignes.

Ensuite, nous "l'inversons" en le soustrayant de la valeur maximale de la ligne, numRows - 1. Cela signifie que lorsque modCol est 0, il devient 4, lorsqu'il est 1 il devient 3, lorsqu'il est 2 sera inchangé.

 for (int row = 0; row < numRows; ++row) { for (int col = 0; col < numCols; ++col) { int modCol = (col % modulusVal); if (modCol >= numRows) { modCol -= numRows; modCol = ((numRows - 1) - modCol); } if (modCol == row) { printf("X"); } else { printf(" "); } } printf("\n"); } 

Maintenant nous avons:

 XXXXXXXXXXXXXXXX XX XX X 

Proche, mais pas de cigare. La colonne 5 est traitée en tant que colonne 0, mais nous avons besoin qu'elle soit traitée en tant que colonne 1. Apportez cette modification pour la corriger:

 modCol = ((numRows - 1) - (modCol + 1)); Output: XXXXXXXXXXXXXXXXXXXXX 

Cela a le modèle que nous voulons, mais commence en haut à gauche lorsque nous voulons en bas à gauche. Solution facile. Inverser modCol après qu'il ait été calculé de la même manière, nous l'inversons quand il est supérieur / égal à / en numRows.

 for (int row = 0; row < numRows; ++row) { for (int col = 0; col < numCols; ++col) { int modCol = (col % modulusVal); if (modCol >= numRows) { modCol -= numRows; modCol = ((numRows - 1) - (modCol + 1)); } modCol = ((numRows - 1) - modCol); if (modCol == row) { printf("X"); } else { printf(" "); } } printf("\n"); } 

Enfin, nous obtenons le résultat souhaité:

  XXX XXXXXXXXXXXXXXXXXX 

J'espère que cela aide et est assez facile à comprendre.

Je ne suis pas familier avec la programmation de console utilisant Objectionable C et vous n’avez pas expliqué exactement ce que vous avez essayé, ce qui a fonctionné et ce qui n’a pas fonctionné.

En supposant que votre problème est le code pour choisir la position appropriée pour afficher le caractère ‘+’ et ne pas afficher le texte à un emplacement particulier sur la console, voici ce que je ferais:

 int currentY = MIN_Y; int incrementY = 1; for (int currentX = MIN_X; currentX <= MAX_X; ++currentX) { SetCursorPosition(currentX, currentY); printf("+"); currentY += incrementY; if (currentY == MAX_Y) { incrementY = -1; } else if (currentY == MIN_Y) { incrementY = 1; } } 

Cela suppose que vous ayez une fonction pour SetCursor () et consts / define pour MIN / MAX X / Y.

La déclaration 'if' pourrait être optimisée pour:

 if (currentY == MAX_Y || currentY == MIN_Y) { incrementY -= incrementY; } 

mais vous aviez besoin de l'utilisation de l'instruction 'else'. Espérons que ce code est assez explicite et utile pour vous.