Progtwigción C Práctica Zig-Zag

Tengo un ejercicio en Objective-C haciendo uso de for , if-else y printf para imprimir un Zig-Zag como este en la consola:

Por favor vea la imagen:

introduzca la descripción de la imagen aquí

He intentado un código con progtwigción en C e imprimo un triángulo, luego trato de editar este, pero no puedo hacer nada más para obtener mi Zig-Zag.


Ya he resuelto mis problemas. Muchísimas gracias chicos.

  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, intente 2 basado en su pregunta actualizada. Empecemos por la estructura básica. Establezca algunas constantes para el ancho y la altura; nos referiremos a ellas en múltiples lugares, por lo que las consts hacen cambios agradables y fáciles, y crearemos un bucle con lógica básica para comenzar a obtener la pantalla que desea.

 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"); } 

Esto nos da:

 XXXXX 

que es el camino equivocado hacia arriba y solo nos da una "carrera descendente", pero es un buen comienzo. Usemos la función de módulo para hacer que el patrón se repita. La repetición ocurre en el noveno carácter, lo que sugiere que necesitamos usar ((numRows - 1) * 2) para nuestro módulo.

 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"); } 

Así que ahora tenemos:

 XXXXXXXXXXXXXXX 

que está empezando a acercarse mucho más a lo que queremos. Así que, a las pinceladas. Las pulsaciones descendentes se muestran cuando modCol está en el rango de la fila, que es 0-4. Cuando modCol está más allá de este rango, lo traemos de nuevo al rango restando el número de filas.

Luego lo "invertimos" restándolo del valor más alto que puede ser la fila, que es numRows - 1. Esto significa que cuando modCol es 0 se convertirá en 4, cuando sea 1 se convertirá en 3, cuando sea 2 se se mantendrá sin cambios.

 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"); } 

Ahora tenemos:

 XXXXXXXXXXXXXXXX XX XX X 

Cerca, pero no hay cigarro. La columna 5 se trata como la columna 0, pero necesitamos que se trate como la columna 1. Haga este cambio para corregirlo:

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

Esto tiene el patrón que queremos, pero comienza en la parte superior izquierda cuando queremos la parte inferior izquierda. Solución fácil. Invertir modCol después de que se haya calculado de la misma manera que lo invertimos cuando es mayor / igual que / a 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"); } 

Finalmente obtenemos la salida que queremos:

  XXX XXXXXXXXXXXXXXXXXX 

Espero que esto ayude y sea razonablemente fácil de entender.

No estoy familiarizado con la progtwigción de la consola con Objectionable C y no ha explicado exactamente qué ha intentado, qué ha funcionado y qué no.

Suponiendo que su problema es el código para elegir la posición adecuada para mostrar el carácter ‘+’ y no mostrar texto en una ubicación particular en la consola, esto es lo que haría:

 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; } } 

Esto supone que tiene una función para SetCursor () y consts / define para MIN / MAX X / Y.

La statement 'if' podría optimizarse para:

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

pero requería el uso de la statement 'else'. Esperemos que este código sea bastante explicativo y de alguna utilidad para usted.