Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: i-node en 29 Abril 2016, 18:29 pm



Título: Ejercicio iteraciones
Publicado por: i-node en 29 Abril 2016, 18:29 pm
Hola,

Estoy aprendiendo C++ y llevo toda la tarde devanandome los sesos, pensando cual es la forma mas elegante de realizar este ejercicio. Solo se me ha ocurrido esta, pero estoy seguro de que hay una forma menos guarra de hacerlo.

Solo se pueden utilizar estas tres instrucciones de salida:

cout << "*";
cout << " ";
cout << endl;

Código:
#include <iostream>

using std::cout;
using std::cin;

int main() {
        for(int linea = 1;linea <= 8;linea++) {
                if(linea % 2 != 0)
                        for(int i = 0; i <= 15; i++)
                                if(i % 2 == 0)
                                        cout << '*';
                                else
                                        cout << ' ';

                else
                        for(int i = 0; i <= 16; i++)
                                if(i % 2 == 0)
                                        cout << ' ';
                                else
                                        cout << '*';
                cout << "\n";
        } // Fin de bucle for
        return 0;
} // Fin de main

El resultado ha de ser exactamente igual al de este ejercicio.

Código:
* * * * * * * * 
 * * * * * * * *
* * * * * * * *
 * * * * * * * *
* * * * * * * *
 * * * * * * * *
* * * * * * * *
 * * * * * * * *

Para que nos entendamos.. No me sirve esto:

Código:
* * * * * * * *
 * * * * * * *
* * * * * * * *
 * * * * * * *
* * * * * * * *
 * * * * * * *
* * * * * * * *
 * * * * * * *

Seguro que es culpa mia que no doy para mas, pero se tiene que poder hacer de una manera mas elegante que como lo he hecho yo seguro.

Muchas gracias!


Título: Re: Ejercicio iteraciones
Publicado por: HardForo en 29 Abril 2016, 19:42 pm
Otra forma:

Código
  1. #include <stdio.h>      /* printf */
  2.  
  3. void print_n(char *c,int n) {  
  4. int i;
  5. for (i=0;i<n;i++)
  6.   printf ("%s",c);
  7. }
  8.  
  9. int main ()
  10. {
  11. int i;
  12. for (i=0;i<8;i++){
  13. if (i % 2) printf(" ");
  14. print_n("* ",8);
  15. printf("\n");
  16. }
  17.  
  18.  return 0;
  19. }
  20.  

Obvio se pude reducir el numero de lineas de codigo y no faltará quien lo haga con un solo bucle hasta 64 y un mod


Título: Re: Ejercicio iteraciones
Publicado por: class_OpenGL en 29 Abril 2016, 20:15 pm
Otra forma bastante intuitiva es imprimir fila por fila, y cuando se imprima una columna, que sea columna por columna; en función de si la fila que se está imprimiendo es par o impar, pues una columna equivale a "* " o " *" respectivamente:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4. register unsigned int row, col;
  5. for(row = 0; row < 8; row++) {
  6. for(col = 0; col < 8; col++) {
  7. if(row%2 == 0)
  8. printf("* ");
  9. else
  10. printf(" *");
  11. }
  12.  
  13. printf("\n");
  14. }
  15.  
  16. return 0;
  17. }


Título: Re: Ejercicio iteraciones
Publicado por: geeke en 29 Abril 2016, 21:10 pm
Usando puro C++

Código
  1. #include <iostream>
  2. #using std::cout;
  3. #using std::string;
  4.  
  5. int main()
  6. {
  7.    int n = 8;
  8.    for(int i = 0; i < n; i++)
  9.        cout << string(i % 2 ? 1 : 0, ' ') << string(n, '*') << "\n";
  10.    return 0;
  11. }


Título: Re: Ejercicio iteraciones
Publicado por: class_OpenGL en 29 Abril 2016, 21:25 pm
using no es una directiva de preprocesador, así que los '#' sin inválidos xD

Además, ese código no realiza la función que pide el enunciado. Lo que hace ese código es imprimir n asteriscos precedida de un espacio si el número de línea en la que se imprime es par, pero el enunciado dice que debe de haber un espacio entre cada asterisco.


Título: Re: Ejercicio iteraciones
Publicado por: geeke en 29 Abril 2016, 21:39 pm
Jaja es verdad lo que provocan las prisas y el escribir desde el móvil, con respecto al enunciado no me había fijado en ése detalle cuando llegue a casa lo reviso


Título: Re: Ejercicio iteraciones
Publicado por: i-node en 29 Abril 2016, 21:51 pm
Chicos. Siento el fallo. El enunciado del problema dice que solo se pueden utilizar estas instrucciones de salida:

cout << "*";
cout << " ";
cout << endl;

Lo añado en el OP tambien.


Título: Re: Ejercicio iteraciones
Publicado por: HardForo en 29 Abril 2016, 21:56 pm
Y no sabes la equivalencia entre cout() y printf() ?

Código
  1. #include <iostream>    
  2.  
  3. int main ()
  4. {
  5. int i,j;
  6. for (i=0;i<8;i++){
  7. if (i % 2) std::cout << " "; // printf(" ")
  8. for (j=0;j<8;j++){
  9. std::cout << "*"; std::cout << " "; // printf("* ")
  10. }
  11. std::cout << std::endl; // printf("\n")
  12. }
  13.  
  14.  return 0;
  15. }
  16.  


Título: Re: Ejercicio iteraciones
Publicado por: geeke en 29 Abril 2016, 23:10 pm
Algo así tal vez:

Código
  1. #include <iostream>
  2. #include <iterator>
  3.  
  4. int main()
  5. {
  6.    int n = 8;
  7.    for(int i = 0; i < n; i++)
  8.    {
  9.        if(i % 2) std::cout << " ";
  10.        std::fill_n(std::ostream_iterator < const char* >( std::cout ), n, "* ");
  11.        std::cout << std::endl;
  12.    }
  13.    return 0;
  14. }


Título: Re: Ejercicio iteraciones
Publicado por: class_OpenGL en 29 Abril 2016, 23:26 pm
Eso no es un poco romperse la cabeza cuando hay soluciones más simples?? XDD
No digo que esté mal, pero dudo que eso lo acepte un profesor que está enseñando a un alumno en su primer trimestre XDD


Título: Re: Ejercicio iteraciones
Publicado por: HardForo en 29 Abril 2016, 23:32 pm
Esta bien para aprender iteradores

Código
  1. std::fill_n(std::ostream_iterator < const char* >( std::cout ), n, "* ");

Por otro lado la linea: equivale a un for(hasta 8) con un cout << "* " dentro :)


Título: Re: Ejercicio iteraciones
Publicado por: MAFUS en 29 Abril 2016, 23:33 pm
Recojo el guante.  :D
Solución rebuscada al canto  ::)
Como siempre en C  :silbar:
Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.    char c = '*';
  5.    const char s = c ^ ' ';
  6.    const int n = 8;
  7.    int i = n*2*n;
  8.  
  9.    while(i--) {
  10.        putchar(c);
  11.        if(!(i%(n*2)))
  12.            putchar('\n');
  13.        else
  14.            c ^= s;
  15.    }
  16.    return 0;
  17. }


Título: Re: Ejercicio iteraciones
Publicado por: Gunhack en 30 Abril 2016, 20:24 pm
Eso no es un poco romperse la cabeza cuando hay soluciones más simples?? XDD
No digo que esté mal, pero dudo que eso lo acepte un profesor que está enseñando a un alumno en su primer trimestre XDD

Algo para primer trimestre sería así... :)

Código
  1. #include <iostream>
  2.  
  3. int main() {
  4.  
  5.    int n = 8;
  6.  
  7.    for(int i = 0; i < n; i++) {
  8.  
  9.        for(int j = 0; j < n; j++) {
  10.  
  11.            cout << "* ";
  12.        }
  13.        cout << endl;
  14.  
  15.        if(i%2 != 0) cout << " ";
  16.    }
  17. }


Título: Re: Ejercicio iteraciones
Publicado por: i-node en 1 Mayo 2016, 19:22 pm
Muy interesantes todos los ejemplos. Muchas gracias a todos.