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;
#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.
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
Para que nos entendamos.. No me sirve esto:
* * * * * * * *
* * * * * * *
* * * * * * * *
* * * * * * *
* * * * * * * *
* * * * * * *
* * * * * * * *
* * * * * * *
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!
Otra forma:
#include <stdio.h> /* printf */
void print_n(char *c,int n) {
int i;
for (i=0;i<n;i++)
printf ("%s",c);
}
int main ()
{
int i;
for (i=0;i<8;i++){
if (i % 2) printf(" ");
print_n("* ",8);
printf("\n");
}
return 0;
}
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
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:
#include <stdio.h>
int main() {
register unsigned int row, col;
for(row = 0; row < 8; row++) {
for(col = 0; col < 8; col++) {
if(row%2 == 0)
printf("* ");
else
printf(" *");
}
printf("\n");
}
return 0;
}
Usando puro C++
#include <iostream>
#using std::cout;
#using std::string;
int main()
{
int n = 8;
for(int i = 0; i < n; i++)
cout << string(i % 2 ? 1 : 0, ' ') << string(n, '*') << "\n";
return 0;
}
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.
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
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.
Y no sabes la equivalencia entre cout() y printf() ?
#include <iostream>
int main ()
{
int i,j;
for (i=0;i<8;i++){
if (i % 2) std::cout << " "; // printf(" ")
for (j=0;j<8;j++){
std::cout << "*"; std::cout << " "; // printf("* ")
}
std::cout << std::endl; // printf("\n")
}
return 0;
}
Algo así tal vez:
#include <iostream>
#include <iterator>
int main()
{
int n = 8;
for(int i = 0; i < n; i++)
{
if(i % 2) std::cout << " ";
std::fill_n(std::ostream_iterator < const char* >( std::cout ), n, "* ");
std::cout << std::endl;
}
return 0;
}
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
Esta bien para aprender iteradores
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 :)
Recojo el guante. :D
Solución rebuscada al canto ::)
Como siempre en C :silbar:
#include <stdio.h>
int main() {
char c = '*';
const char s = c ^ ' ';
const int n = 8;
int i = n*2*n;
while(i--) {
putchar(c);
if(!(i%(n*2)))
putchar('\n');
else
c ^= s;
}
return 0;
}
Cita de: 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
Algo para primer trimestre sería así... :)
#include <iostream>
int main() {
int n = 8;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
cout << "* ";
}
cout << endl;
if(i%2 != 0) cout << " ";
}
}
Muy interesantes todos los ejemplos. Muchas gracias a todos.