Problemas resueltos de capítulos 1 a 6

Problemas

Veamos ahora algunos ejemplos que utilicen los conocimientos que ya tenemos sobre C++.

Pero antes introduciremos, sin explicarlo en profundidad, dos elementos que nos permitirán que nuestros programas se comuniquen con nosotros. Se trata de la salida estándar, cout y de la entrada estándar cin. Estos objetos nos permiten enviar a la pantalla o leer desde el teclado cualquier variable o constante, incluidos literales. Lo veremos más detalladamente en un capítulo dedicado a ellos, de momento sólo nos interesa cómo usarlos para mostrar o leer cadenas de caracteres y variables.

Nota: en realidad cout es un objeto de la clase ostream, y cin un objeto de la clase istream pero los conceptos de clase y objeto quedarán mucho más claros en capítulos posteriores.

El uso es muy simple:

#include <iostream>
using namespace std;

cout << <variable|constante> [<< <variable|constante>...];
cin >> <variable> [>> <variable>...];

Veamos un ejemplo:

#include <iostream>
using namespace std;

int main()
{
   int a;

   cin >> a;
   cout << "la variable a vale " << a; 
   return 0;
}

Un método muy útil para cout es endl, que hará que la siguiente salida se imprima en una nueva línea.

cout << "hola" << endl;

Otro método, este para cin es get(), que sirve para leer un carácter, pero que nos puede servir para detener la ejecución de un programa.

Esto es especialmente útil cuando trabajamos con compiladores como Dev-C++, que crea programas de consola. Cuando se ejecutan los programas desde el compilador, al terminar se cierra la ventana automáticamente, impidiendo ver los resultados. Usando get() podemos detener la ejecución del programa hasta que se pulse una tecla.

A veces, sobre todo después de una lectura mediante cin, pueden quedar caracteres pendientes de leer. En ese caso hay que usar más de una línea cin.get().

#include <iostream>
using namespace std;

int main()
{
   int a;

   cin >> a;
   cout << "la variable a vale " << a; 
   cin.get();
   cin.get();
   return 0;
}

Las líneas #include <iostream> y using namespace std; son necesarias porque las declaraciones que permiten el uso de cout y cin están en una biblioteca externa. Con estos elementos ya podemos incluir algunos ejemplos.

Te aconsejo que intentes resolver los ejemplos antes de ver la solución, o al menos piensa unos minutos sobre ellos.

Ejemplo 6.1

Primero haremos uno fácil. Escribir un programa que muestre una lista de números del 1 al 20, indicando a la derecha de cada uno si es divisible por 3 o no.

// Este programa muestra una lista de números, 
// indicando para cada uno si es o no múltiplo de 3.
// 11/09/2000 Salvador Pozo

#include <iostream> // biblioteca para uso de cout
using namespace std;

int main() // función principal
{
   int i; // variable para bucle

   for(i = 1; i <= 20; i++) // bucle for de 1 a 20
   { 
      cout << i; // muestra el número
      if(i % 3 == 0) cout << " es múltiplo de 3"; // resto==0
      else cout << " no es múltiplo de 3"; // resto != 0
      cout << endl; // cambio de línea
   } 

   return 0;
}

El enunciado es el típico de un problema que puede ser solucionado con un bucle for. Observa el uso de los comentarios, y acostúmbrate a incluirlos en todos tus programas. Acostúmbrate también a escribir el código al mismo tiempo que los comentarios. Si lo dejas para cuando has terminado el programa, probablemente sea demasiado tarde, y la mayoría de las veces no lo harás. ;-)

También es una buena costumbre incluir al principio del programa un comentario extenso que incluya el enunciado del problema, añadiendo también el nombre del autor y la fecha en que se escribió. Además, cuando hagas revisiones, actualizaciones o correcciones deberías incluir una explicación de cada una de ellas y la fecha en que se hicieron.

Una buena documentación te ahorrará mucho tiempo y te evitará muchos dolores de cabeza.

Ejemplo 6.2

Escribir el programa anterior, pero usando una función para verificar si el número es divisible por tres, y un bucle de tipo while.

// Este programa muestra una lista de números, 
// indicando para cada uno si es o no múltiplo de 3.
// 11/09/2000 Salvador Pozo

#include <iostream> // biblioteca para uso de cout
using namespace std;

// Prototipos:
bool MultiploDeTres(int n);

int main() // función principal
{
   int i = 1; // variable para bucle

   while(i <= 20) // bucle hasta i igual a 20
   { 
      cout << i; // muestra el número
      if(MultiploDeTres(i)) cout << " es múltiplo de 3";
      else cout << " no es múltiplo de 3";
      cout << endl; // cambio de línea
      i++;
   } 

   return 0;
}

// Función que devuelve verdadero si el parámetro 'n' en 
// múltiplo de tres y falso si no lo es
bool MultiploDeTres(int n)
{
   if(n % 3) return false; else return true;
}

Comprueba cómo hemos declarado el prototipo de la función MultiploDeTres. Además, al declarar la variable i le hemos dado un valor inicial 1. Observa que al incluir la función, con el nombre adecuado, el código queda mucho más legible, de hecho prácticamente sobra el comentario.

Por último, fíjate en que la definición de la función va precedida de un comentario que explica lo que hace. Esto también es muy recomendable.

Ejemplo 6.3

Escribir un programa que muestre una salida de 20 líneas de este tipo:

1
1 2
1 2 3
1 2 3 4
...
// Este programa muestra una lista de números
// de este tipo:
// 1
// 1 2
// 1 2 3
// ...

// 11/09/2000 Salvador Pozo

#include <iostream> // biblioteca para uso de cout
using namespace std;

int main() // función principal
{
   int i, j; // variables para bucles

   for(i = 1; i <= 20; i++) // bucle hasta i igual a 20
   {
      for(j = 1; j <= i; j++) // bucle desde 1 a i
         cout << j << " "; // muestra el número
      cout << endl; // cambio de línea
   }

   return 0;
}

Este ejemplo ilustra el uso de bucles anidados. El bucle interior, que usa j como variable toma valores entre 1 e i. El bucle exterior incluye, además del bucle interior, la orden de cambio de línea, de no ser así, la salida no tendría la forma deseada. Además, después de cada número se imprime un espacio en blanco, de otro modo los números aparecerían amontonados.

Ejemplo 6.4

Escribir un programa que muestre una salida con la siguiente secuencia numérica:

1, 5, 3, 7, 5, 9, 7, ..., 23

La secuencia debe detenerse al llegar al 23.

El enunciado es rebuscado, pero ilustra el uso de los bucles do..while.

La secuencia se obtiene partiendo de 1 y sumando y restando 4 y 2, alternativamente. Veamos cómo resolverlo:

// Programa que genera la secuencia: 
// 1, 5, 3, 7, 5, 9, 7, ..., 23
// 11/09/2000 Salvador Pozo

#include <iostream> // biblioteca para uso de cout 
using namespace std;

int main() // función principal 
{ 
   int i = 1; // variable para bucles 
   bool sumar = true; // Siguiente operación es suma o resta
   bool terminado = false; // Condición de fin 

   do { // Hacer
      cout << i; // muestra el valor en pantalla
      terminado = (i == 23); // Actualiza condición de fin
      // Puntuación, separadores
      if(terminado) cout << "."; else cout << ", "; 
      // Calcula siguiente elemento
      if(sumar) i += 4; else i -= 2; 
      sumar = !sumar; // Cambia la siguiente operación
   } while(!terminado); // ... mientras no se termine
   cout << endl; // Cambio de línea

   return 0;
}

Ejemplo 6.5

Escribir un programa que pida varios números, hasta que el usuario quiera terminar, y los descomponga en factores primos.

No seremos especialmente espléndidos en la optimización, por ejemplo, no es probable que valga la pena probar únicamente con números primos para los divisores, podemos probar con algunos que no lo sean, al menos en este ejercicio no será una gran diferencia.

Piensa un momento en cómo resolverlo e inténtalo, después puedes continuar leyendo.

Lo primero que se nos ocurre, al menos a mi, cuando nos dicen que el programa debe ejecutarse mientras el usuario quiera, es implementar un bucle do..while, la condición de salida será que usuario responda de un modo determinado a cierta pregunta.

En cada iteración del bucle pediremos el número a descomponer y comprobaremos si es divisible entre los números entre 2 y el propio número.

No podemos empezar 1, ya que sabemos que todos los números son divisibles por 1 infinitas veces, por eso empezamos por el 2.

Pero si probamos con todos los números, estaremos intentando dividir por todos los pares entre 2 y el número, y sabremos de antemano que ninguno de ellos es un factor, ya que sólo el 2 es primo y par a la vez, por lo tanto, podemos probar con 2, 3 y a partir de ahí incrementar los factores de dos e dos.

Por otra parte, tampoco necesitamos llegar hasta el factor igual al número, en realidad sólo necesitamos alcanzar la raíz cuadrada del número, ya que ninguno de los números primos entre ese valor y número puede ser un factor de número.

Supongamos que tenemos en número 'n', y que la raíz cuadrada de 'n' es 'r'. Si existe un número 'x' mayor que 'r' que es un factor primo de 'n', por fuerza debe existir un número 'h', menor que 'r', que multiplicado por 'x' sea 'n'. Pero ya hemos probado todos los números por debajo de 'r', de modo que si existe ese número 'h' ya lo hemos extraído como factor de 'n', y si hemos llegado a 'r' sin encontrarlo, es que tampoco existe 'x'.

Por ejemplo, el número 257. Su raíz cuadrada es (aproximada), 16. Es decir, deberíamos probar con 2, 3, 5, 7, 11 y 13 (nuestro programa probará con 2, 3, 5, 7, 9, 11, 13 y 15, pero bueno). Ninguno de esos valores es un factor de 257. El siguiente valor primo a probar sería 17, pero sabemos que el resultado de dividir 257 por 17 es menor que 17, puesto que la raíz cuadrada de 257 es 16.031. Sin embargo ya hemos probado con todos los primos menores de 17, con resultado negativo, así que podemos decir que 17 no es factor de 257, ni tampoco, por la misma razón, ningún número mayor que él.

Ya tenemos dos buenas optimizaciones, veamos cómo queda el programa:

// Programa que descompone números en factores primos
// 26/07/2003 Salvador Pozo

#include <iostream> // biblioteca para uso de cout 
using namespace std;

int main()
{
   int numero;
   int factor;
   char resp[12];
   
   do {
      cout << "Introduce un número entero: ";
      cin >> numero;
      factor = 2;
      while(numero >= factor*factor) {
         if(!(numero % factor)) {
            cout << factor << " * ";
            numero = numero / factor;
            continue;
         }
         if(factor == 2) factor++;
         else factor += 2;
      }
      cout << numero << endl;
      cout << "Descomponer otro número?: ";
      cin >> resp;
   } while(resp[0] == 's' || resp[0] == 'S');
   return 0;
}

Vemos claramente el bucle do..while, que termina leyendo una cadena y repitiendo el bucle si empieza por 's' o 'S'.

En cada iteración se lee un numero, y se empieza con el factor 2. Ahora entramos en otro bucle, este while, que se repite mientras el factor sea menor que la raíz cuadrada de numero (o mientras numero sea mayor o igual al factor al cuadrado).

Dentro de ese bucle, si numero es divisible entre factor, mostramos el factor, actualizamos el valor de numero, dividiéndolo por factor, y repetimos el bucle. Debemos probar de nuevo con factor, ya que puede ser factor primo varias veces. Para salir del bucle sin ejecutar el resto de las sentencias usamos la sentencia continue.

Si factor no es un factor primo de numero, calculamos el siguiente valor de factor, que será 3 si factor es 2, y factor + 2 en otro caso.

Cuando hemos acabado el bucle while, el valor de numero será el del último factor.

Puedes intentar modificar este programa para que muestre los factores repetidos en forma exponencial, en lugar de repetitiva, así, los factores de 256, en lugar de ser: "2 * 2 * 2 * 2 * 2 * 2 * 2 * 2", serían "28".

Comentarios de los usuarios (89)

Arnaudh
2010-07-09 01:41:54

Una pregunta en el ejemplo 6.2 hay una parte que pone:

if(n % 3) return false; else return true;

¿No hay que saltar línea obligatoriamente después de un if?

Steven
2010-07-23 06:33:32

El salto de línea no es obligatorio para ninguna sentencia. Indicamos la terminación de una sentencia con un punto y coma, por lo que el salto de línea no es necesario. De hecho, podríamos escribir casi todo el código fuente en una misma línea, si quisiéramos. Por ejemplo,

bool MultiploDeTres(int n){if(n%3) return false; else return true;}

Obviamente, esto no es muy legible para nosotros, los programadores, y por tanto no es nada aconsejable escribir programas de esta manera.

Donde sí es obligatorio realizar un salto de línea es al terminar las directivas del precompilador (o preprocesador). Hablaremos más de ellas en el capítulo 23: http://c.conclase.net/curso/index.php?cap=023#inicio Por ejemplo,

#include <iostream>

Lo siguiente sería un error:

#include <iostream> using namespace std;

El precompilador espera un salto de línea para terminar cada una de sus directivas.

frn
2010-08-09 20:24:37

Una pregunta, en el ejemplo 6.5 hay una parte en que despues del bucle while anidado al bucle do while, dice

if (factor==2) factor++

else factor+=2

Porque se vuelve a repetir el bucle while anidado con los valores actualizados si la actualizacion de valores no esta dentro del bucle while?

Steven
2010-08-10 08:40:41

Hola frn,

Esa sentencia "if" sí pertenece al cuerpo del bucle "while". Si quieres, te reescribo el bucle "while" para que veas el código mejor:

while( numero >= factor*factor )
{
  if( !(numero % factor) )
  {
    cout << factor << " * ";
    numero = numero / factor;
    continue;
  }
  if( factor == 2 )  factor++;
  else  factor += 2;
}
aaronmcresh
2010-08-13 03:18:31

Te complicaste al cuete con el ejemplo que hay que calcular +4 y -2 desde 1 hasta 23. Está bien que haya que manejar muchas fórmulas, pero este código arroja lo mismo sin poner tanta complicadera!

# include 
using namespace std; // inicio inclusion


int main () // principal
{
    int a = 1; // única variable en main
    do   // hacer
    {
        cout << a << " "; // que muestre a y un espacio
         a += 4;             // que haga la cuenta +4
         cout << " " ;    // que ponga espacio
         a -= 2;             // cuenta -2
         cout << " " ;     // espacio
    }
    while ( a <= 23 );       // condición para terminar
    
    cin.get();                 // espere a pulsar tecla
    cout << "pulse para terminar" ;   // una chuchería
    return 0;
}

mil gracias por el curso, sos un genio!

Me parece que ya estoy marcando un estilo de programación!

PD: No sé por qué pero cuando sale la vista previa me atraviesa barras donde hay comillas, esas barras no van.

b0ch0n
2010-09-06 19:51:24

Yo también dejo mi aporte

#include  // biblioteca para uso de cout 
using namespace std;

int main() // función principal 
{ 
 bool salir=false;//centinela o bandera del bucle
 for(int i=1; !salir; i++)
  {
   if(i%2) cout<

Saludos desde Santa Fe-Argentina

Kiske
2010-12-14 18:18:48

Yo en el Ejemplo 6.4, lo hice de esta manera, el resultado es el mismo, pero lo hice de otra manera yo.

#include 
using namespace std;

int main()
{
	int i = 1;

	while( i + 4 )
	{
		if( i == 1 )
		{
			cout << i;
			cout << " ";
		}

		i += 4;
		cout << i;
		cout << " ";

		if( i >= 23 ) break;

		i -= 2;
		cout << i;
		cout << " ";
	}

	cin.get();
	return 0;
}
José
2011-01-23 14:10:56

Hola,

Filicitaciones por el sitio y gracias por las clases de c++.

Bueno, tengo un problema, instalé CodeBlocks y estoy haciendo los ejercicios con el el compilador GCC en Windows pero las tildes no me aparecen, aaprecen unos caracteres extraños:

cout << "Sí"

aparece como Sý...

...no sabrás a quese deba esto? sera por el ANSI?

txesmi
2011-03-15 16:36:14

Enhorabuena por este excelente curso. Me está resultando muy ameno dar mis primeros pasos con C++.

No me he podido resistir al reto de modificar el ejemplo 6.5 y dibujar las potencias. He llegado a esto:

#include <iostream> // biblioteca para uso de cout
using namespace std;

int main()
{
   int numero, factor, potencia, productoFactor;
   char resp[12];

   do {
      cout << "Introduce un número entero: ";
      cin >> numero;
      factor = 2;
      potencia = 0;
      cout << 1;
      while ( numero != 1 ) {
         productoFactor = 1;
         while ( !( numero % ( productoFactor * factor ) ) ) {
             potencia ++;
             productoFactor *= factor;
         }
         if ( potencia > 0 ) {
             numero /= productoFactor;
             cout << " * ";
             cout << factor;
             if ( potencia > 1 ) cout << "^" << potencia;
             potencia = 0;
         }
         if(factor == 2) factor++;
         else factor += 2;
      }
      cout << endl << "Descomponer otro número?: ";
      cin >> resp;
   } while(resp[0] == 's' || resp[0] == 'S');
   return 0;
}

Salud!

Carlos
2011-03-28 23:54:53

queria preguntar, una vez desarrollado el macro, lo guardo como ".c" o como ".C". Ahora como es que hago correr los macros en los compiladores?

gracias

Steven
2011-03-29 03:01:29

Hola Carlos,

Una macro realmente es código para el precompilador (o preprocesador) ya que usamos la directiva #define. Por lo tanto, el compilador jamás llega a saber de tal macro, pero sí de su "contenido". Por lo tanto, puedes definir una macro donde quieras: ".h" o ".c", o ".cpp", si es C++. Por ejemplo,

// "main.cpp"

#define mayor(a,b) ((a) > (b) ? (a) : (b))

Para "invocar" o expandir una macro, lo hacemos como si fuera una función. Esto es,

int main()
{
  cout << "Mayor de 10 y 13 es: " 
       << mayor(10,13) << endl;

  return 0;
}

Lo que realmente ocurre es que el precompilador expande la macro y básicamente reescribe tu código fuente para que el compilador pueda realizar su trabajo. Esto es lo que ve el compilador:

int main()
{
  cout << "Mayor de 10 y 13 es: " 
       << ((10) > (13) ? (10) : (13)) << endl;

  return 0;
}

Como puedes ver, la macro nunca llega al compilador, y por tanto éste nunca sabe que existe.

Hablamos de esto en el capítulo 13: http://c.conclase.net/curso/index.php?cap=013#OP2_define

Espero haber aclarado la duda.

Steven

dehm
2011-05-06 22:38:24

He intentado hacer el ejercicio 6.1 sin mirar.

Aunque intuía por donde iba la forma más correcta de hacerlo, he querido enfocarlo de manera distinta, para experimentar más cosas de lo aprendido hasta ahora. (de verdad que es mi primer programa).

Pero algo no va bien.

Lo pongo por si alguien me quiere ayudar:

#include <iostream>
using namespace std;

int main()
{
	short int x = 0;
	char Divisible[] = " El número es divisible por 3";
	char NoDivisible[] = " El número NO es divisible por 3";

	while (x<20)
        x++;
	    if (x%3 == 0)
	    {
	    cout << x << Divisible << endl;
	    }
	    else
	    {
	    cout << x << NoDivisible << endl;
	    }
        return 0;
}
dehm
2011-05-06 22:53:21

Perdón.

Mi "aporte personal" era resolver el problema con "while", pero no había llegado al ejercicio 2 dónde se resuelve de ésta forma.

Esto me pasa por no mirar hasta el final antes de plantear las dudas :-(

dehm
2011-05-07 18:20:02

He resuelto el ejercicio 6.3 de ésta forma, pero no sé si es muy legible o aceptable en cuanto a la lógica o sintaxis.¿Qué opináis?

#include <iostream>
using namespace std;

int main()
{
	short int x,y;                  // declaro las variables "x" y "y"
	while (x<20)                    // qué pasa si x es menor que 20
        {x++;                       // 1º.-incrementa el valor de x en una unidad
        while (y<x)                 // 2º.-otro bucle que se ejecuta si y es menor que x
            {                       // empieza el sub-bucle
            y++;                    // 2.2º.- incrementa el valor de y en una unidad
            cout << y << " ";       // 2.1º saca el valor de y y un espacio
            }                       // termino el sub-bucle
        y=0;                        // pongo el valor de y a 0
        cout << endl;               // retorno de carro
        }                           // 3º.-vuelve a ejecutar la acción, hasta que x sea igual a 20
        return 0;
}
Steven
2011-05-07 18:35:01

Hola David,

Te hago un análisis del programa y te comento a medida que vaya viendo el código fuente.

- Defines correctamente 'x' e 'y', pero al llegar al bucle 'while', date cuenta que 'x' NO tiene ningún valor conocido y por tanto no se trata de un valor válido. En otras palabras, 'x' puede contener cualquier valor; a esto se le suele llamar "basura" y de aquí el lema: "basura que entra, basura que sale". Tu bucle 'while' puede o no funcionar debidamente.

La solución es inicializar 'x' o asignar un valor inicial, antes de pasar al bucle 'while'. Por ejemplo,

int x=0;

- Tienes un problema similar con la variable 'y'. La defines correctamente, pero la usas sin haber dado un valor inicial. Seguramente, querías que fuese 0 (cero), inicialmente; o sea,

y = 0;
while( y < x )

- Como deberías asignar el valor de 0 (cero) a 'y' antes del segundo bucle 'while', no necesitas la misma asignación después del bucle 'while'.

Por lo demás, todo bien :)

Hasta pronto,

Steven

dehm
2011-05-08 13:36:52

Muchas gracias! :-)

Hasta pronto

jadr
2011-06-02 20:28:35

Esta es una solución para el ejemplo 6.4 usando el bucle while y viendo la lista de número a imprimir como 2 series intercaladas.

/* ********************
 * Programa que imprime la secuencia:
 * 1, 5, 3, 7, 5, 9, 7, ..., 23
 *
 * Se detiene en el 23
 *
 * 02/06/11 jadr
 * ********************/

#include <iostream>
using namespace std;

// Prototipos:

// Varibles globales

int main()
    {
    int serieImpar=1, seriePar=5;

    cout<<serieImpar<<" ,"<<seriePar;
    serieImpar+=2;
    seriePar+=2;
    while (seriePar<=23)
        {
        cout<<" ,"<<serieImpar<<", "<<seriePar;
        serieImpar+=2;
        seriePar+=2;
        }
        cout<<endl;
    return 0;   //siempre hay que devolver algo
    }
Angel
2011-06-08 02:29:36

El ultimo problema lo resolvi de la siguiente manera

// Descomprimir numeros en sus factores primos
// 06/06/2011 Angel Ortega

#include <iostream> // biblioteca para uso de cout
using namespace std;

int DescomponerFactoresPrimos(int n); // declaracion de la funcion que descompone los numeros

int main() // funcion principal
{
    bool terminado = false; // variable para indicar si se terminó de utilizar el programa
    int i = 0; // numero que se va a descomponer
    char resp[32]; // respuesta a la pregunta final
    do { // bucle para la descomposicion de primos
        system("CLS"); // limpiar la pantalla
        cout<<"Introduzca el numero que desea descomponer en sus factores primos: ";
        cin>>i; // obtener el numero
        cout<<endl; // nueva linea
        DescomponerFactoresPrimos(i); // funcion para descomponer el numero obtenido
        cout<<"\n"<<"\n"<<"Desea continuar descomponiendo? (si/no): ";
        cin>>resp; // obtener respuesta
    } while((resp[0] == 's' || resp[0] == 'S')); // si la respuesta es si o por lo menos comienza con s continuar descomponiendo
    cout<<endl; // nueva linea
    
    system("PAUSE");
    return 0;
}

int DescomponerFactoresPrimos(int n)
{
    int x = 0; // exponente del factor primo
    
    if(n==2 || n==3 || n==5 || n==7) {cout<<"Numero primo"; return 0;} // numeros primos de una cifra

    for(int i = 2; i <= 9; i++) { // bucle para la division del numero en sus factores primos
        if(n%i == 0) { // n divisible entre i
            if(x > 0) cout<<" * "; // separador entre los factores primos
            x = 1; // indicar el exponente del factor primo
            cout<<i; // mostrar el divisor
            n /= i; // dividir entre el factor primo
            while((n%i == 0)) { // si n sigue siendo divisible entre i
                n /= i; // dividir entre el factor primo
                x++; // aumentar la exponente del factor primo
            }
            if(x>1) cout<<"^"<<x; // si hay exponente mostrarlo
        }
    }
    if(x > 0 && n > 9) {cout<<" * "<<n; return 1;} // si el ultimo factor primo es mayor a 9 colocar el multiplicador para separarlo
    if(x > 0 && n != 1) {cout<<n; return 1;} // si el numero final no es igual a 1 agregarlo
    if(x == 0) {cout<<"Numero primo"; return 0;} // si no hay factores primos indicar que el numero es primo
    
    return 0; // no hay factores primos (numero primo)
}

La verdad que me quedo demasiado largo y me gustaria saber si alguien sabe como simplificar lo que hice

Francisco Andres
2011-11-11 01:18:13

hola como estan? me gustaría si me pudieran explicar que hace que en el ejempplo 6.3 tome esa forma.

saludos!!

Diego
2011-11-23 13:53:15

Para el 6.4:

int main()
{
    int i;
    for(i = 3; i <= 21; i += 2)
    {
          cout << i - 2 << " " << i + 2 << " ";
    }
    cin.get();          
}
Julian Farfan
2012-03-03 00:10:37

Buenas Tardes, en el ejemplo 6.3 no entiendo como el bucle imprime el numero de esa manera teniendo en cuenta que el primer ciclo no hace nada solo es un contador y el segundo ciclo lo que hace es imprimir 'y' & 'y' siempre esta cambiando de valor es decir como es que y imprime 1 luego vuelve imprime 1 2 me explico vuelve a imprimir el 1 cuando ya ha pasado a valer 2.

Julian Farfan
2012-03-03 00:12:14

#include<iostream>
using namespace std;

int main()
{
    
    int x,y,z,a,b,c;
    
    for(x=1;x<=20;x++)
    {
         for(y=1;y<=x;y++)
         {
             cout<<y<<" ";
             }
             cout<<endl;
             }
             system("pause");
             }

Me refiero a y en el comentario anterior siguiendo este codigo.

Steven R. Davidson
2012-03-03 00:48:30

Hola Julián,

Si te fijas en el bucle anidado, 'y' va de 1 á 'x'. Por lo tanto, no siempre realizará la misma cantidad de iteraciones cada vez.

Si miras algunas iteraciones, verás lo que sucede:

x = 1

y = 1 <= y := 1 á 1

x = 2

y = 1,2 <= y := 1 á 2

x = 3

y = 1,2,3 <= y := 1 á 3

x = 4

y = 1,2,3,4 <= y := 1 á 4

...

x = 20

y = 1,2,3,4,...,19,20 <= y := 1 á 20

Espero haber aclarado esta duda.

Steven

Julian Felipe
2012-03-03 00:56:06

Muchisimas gracias por la pronta respuesta y quedo resuelta la duda.

Felicitaciones por este gran proyecto

Julian Farfan
2012-03-03 01:12:59

El Ejercicio de la secuencia 1,3,7,5,9 realize el codigo de la siguiente manera me podrian decir si es lo ideal puesto que a mi me dio el mismo resultado.

Julian Farfan
2012-03-03 01:13:40
#include<iostream>
using namespace std;

int main()
{
    int x=1;
    cout<<x<<",";
    x+=4;
    do{
       x-=2;
       cout<<x<<",";
         x+=4;
         if(x==23)
         cout<<x<<".";
         else
         cout<<x<<",";
       }while(x!=23);

         system("pause");
         }
Robert Casellas
2012-03-05 23:42:35

Hola a todos... Antes que nada, gracias por el curso. Está muy bien. Estoy realizando las prácticas sin copiar los ejemplos. cout me está dando algunos problemas, ya que cuando le pongo carácteres acentuados no los reconoce como tal. Estoy usando Dev-C++ tal como nos aconsejais en otro apartado. Supongo que es algún tema de configuraciones. Si podeis echarme un cable os estaré muy agradecido.

JAVES
2012-03-06 07:25:23

hola soy nuevo en esto el ejemplo lo hice de la siguiente manera me gustaría saber si es correcto.

#include <iostream>
using namespace std;
int main(){
	int x=1;
	while(x <= 20){
		cout<<"numero "<< x <<((x % 3 ==0)?"si es divisible entre 3":" no es divisible entre 3")<<endl;
		x++;
	}
	return 0;
}
Robert Casellas
2012-03-09 11:33:24

Ups!!!! disculpen, pero algo hice mal porque mi úlimo mensaje se triplicó.... Disculpen las molestias.

Salvador Pozo
2012-03-12 17:16:47

Para Robert:

No te preocupes por la duplicidad de mensajes, ya he borrado dos de ellos.

En cuanto a tu consulta, el problema es que la consola usa una codificación de caracteres diferente del que se usa en el GUI (la interfaz gráfica).

Yo, al menos hasta ahora, no he sido capaz de corregir este problema, no he encontrado ningún parámetro de configuración que permita hacerlo.

Hay varios mensajes en la lista de correo sobre este tema:

http://listas.conclase.net/?gid=2&mnu=mensajes&ord=fecha&msg=15058

Hasta pronto.

Salvador Pozo
2012-03-12 17:39:28

Para JAVES:

Todo correcto.

dani
2012-03-22 16:19:39

me podriais decir xk no funciona esto?

#include <iostream>

using namespace std;

int main()

[ char a = '\a';

cout << a;

return 0]

Salvador Pozo
2012-03-22 16:40:50

Hola, Dani:

Hay varios errores:

1) No es [, sino {

2) Falta un ";" al final de "return 0"

3) No es ], sino }

#include <iostream>

using namespace std;

int main()
{  char a = '\a';
cout << a;
return 0;}
Cesar Faundez
2012-04-20 22:46:57

El ejercicio 6.3 lo hice con switch pero al ver el resultado me parecio mas rapido y optimo lo que se hace aca. En el ejercicio 6.4 me quede con ese razonamiento lo hice con for y tambien me funciono, aqui se los dejo...

#include <iostream>
using namespace std;

int main(){
    
    int a = 1, b;
    
    for(b=5;b<=23;b+=2){
               cout << a << " ";
               cout << b << " ";
               a +=2;     
                        }
    cin.get();
    return 0;    
    }
marcos
2012-08-16 19:08:19

Hola muchas gracias por el curso.

Queria hacer una pregunta, porque me esta costando muchisimo empezar, o sea entiendo las propuestas y hasta los ejemplos pero me sucede lo siguiente.

Abro el codebloks hago un proyecto nuevo, luego selecciono console aplication, y entro.

Pego un ejemplo cualquiera:

#include <iostream>

using namespace std;

int main()

{

int a;

cin >> a;

cout << "la variable a vale " << a;

return 0;

}

y no anda, sale process returned 0 pres any key to continue.

Pegue el ejemplo que pegue, como si faltara algo, aclaro que descargue la version de 72 megas, en fin no puedo si quiera poner un hellow worl. ¿me pueden orientar?

AndrésC
2012-08-27 17:08:46

Hola Marcos, la verdad el código está bien, hace lo que creo que quieres que haga que es capturar una variable entera "a" y luego mostrarla en pantalla, pero hace falta que agregues una pausa [system ("pause");] o [cin.get();] para que alcances a ver el resultado de tu código después de compilarlo... lo he hecho en "DEV C++" y anda bastante bien mira:

#include <iostream>
using namespace std;
 
int main()
{
 	int a;
 	cout <<"Ingrese variable a:" <<endl;
	cin >>a;
 	cout <<"La variable a vale:" <<endl <<a <<endl; 
	cin.get();
	cin.get();
	return 0;

Para este caso he tenido que ingresar dos veces "cin.get();" para simular la pausa ¿Por qué dos veces?, no tengo ni idea pero funciona jajaja con [system ("pause";)] tienes el mismo efecto... saludos :)

AndrésC
2012-08-27 17:12:43

Marcos, se me quedó una "}" por fuera, pero es obvio que debes finalizar la función principal main con "}"... saludos ;)

Luis Rivero
2012-09-02 05:14:27

Una pregunta en el ejemplo 6.1 declaramos un bucle for de este modo:

for (i = 1; i <= 20; i++) // bucle for de 1 a 20 

Por lo que entiendo tenemos la variable " i = 1 ", la condición " si i es menor o igual a 20 " y lo que hacemos si es cierta la condición " i++ " sumamos 1 a i, esto no haría que el bucle comenzara en 2?, la variable i no debería inicializarse en 0 (cero) para que el primer valor que tome i sea 1?

Espero sus respuestas, gracias.

Steven R. Davidson
2012-09-02 18:14:22

Hola Luis,

En un bucle 'for', tenemos el siguiente esquema gramatical de su "cabecera":

for( <expr1>; <expr2>; <expr3> ) <sentencias>

La secuencia de la ejecución de los pasos en un bucle 'for' es la siguiente:

1. Se evalúa <expr1>

2. Se evalúa <expr2> como condicional

3. Si <expr2> es falsa, nos salimos fuera del bucle 'for'

4. Si no, entonces,

5. Se ejecutan <sentencias>

6. Se evalúa <expr3>

7. Se evalúa <expr2> como condicional

8. Si <expr2> es falsa, nos salimos fuera del bucle 'for'

9. Si no, entonces,

10. Se ejecutan <sentencias>

11. Se evalúa <expr3>

y así sucesivamente. Visto de otra forma los pasos son:

<expr1>

<expr2>
<sentencias>
<expr3>

<expr2>
<sentencias>
<expr3>
...

<expr1> se evalúa una sola vez nada más entrar en el bucle 'for'; <expr2> se evalúa siempre; si <expr2> es verdadera, se ejecutan <sentencias> del bucle; y <expr3> se evalúa siempre, pero antes de comenzar la segunda iteración.

Espero haber aclarado la duda.

Steven

Silver
2012-11-01 13:35:20

Hola con clase, este curso es asombroso! estoy entendiendo todo hasta ahora y lo mejor es que soy nuevo en esto de programar!. Aqui muestro como hice el ejercicio 6.3... si es posible me gustaria saber si el comportamiento es el mismo al programa que hicieron uds.

#include <iostream>
using namespace std;

int main(); // funcion main
	{
	int j, i; // declaracion y valor de variables locales
	j = 1;
		{
		i = 1;
		cout << i; // muestro "i"
		while (j <= 20) j++;
			{
			while (i != j) i++; 
			cout << " ";
			if i == j; cout << endl;
			else continue;
			}
		}
	return 0;
	}
Lupin
2012-11-22 19:09:13

Hola buenos dias. Al momento de hacer el ejercicio 6.2 en donde usamos una funcion para calcular si un numero es divisible por 3, se me vino una duda, declarar prototipo algo asi "<tipo> funcion(int);" es valido, pero es valido delcarar definicion "<tipo> funcion(int){...}"?

Salvador Pozo
2012-11-23 18:58:31

Hola Lupin:

Si lo que preguntas es si es válido definir una función sin identificar los parámetros, la respuesta es: depende.

Puedes usar parámetros sin nombre en las definiciones de funciones, pero debes tener en cuenta que no podrás usar esos parámetros en la función, ya que no hay forma de referirse a ellos. Aunque tendrás que especificarlos en la llamada:

int funcion(int) {
    return 32;
}

Esta función es válida (y tonta, siempre devuelve 32). Para invocarla deberás usar un parámetro entero, da igual el valor:

funcion(3);

Si lo que preguntas es si se pueden especificar las llaves {} en la declaración del prototipo, la respuesta es: no. Si pones las llaves, aunque sean sin nada dentro, se considera una definición, no una declaración, y por lo tanto, si intentas definirla más tarde, el compilador se quejará diciendo que la función ya fue definida previamente.

Hasta pronto.

B. Amauri
2013-01-05 01:38:16

¡Hola a todos! Primero que nada quiero halagarlos por su labor , este curso está realmente bien diseñado.

Deseo hacerles una consulta y mostrarles mi trabajo.

Consulta: Ya me registré en la lista de correos y me di de alta desde el correo, pero no sé como comenzar a enviar correos para que me puedan responder. ¿Me indican por favor qué sigue?

Mi trabajo: Así resolví el problema 6.4, ¿qué opinan?.

// Mostrar una serie de números del 1 al 23 sumando
// y restando 4 y 2 alternadamente
// B.Amauri 04/01/12

#include <iostream>
using namespace std;

// Esta función evalúa al número como par
bool EsPar(int n)
{
	if(n%2) return false; else return true;
}

int main()
{
	int x; // Variable que coresponde a la posición en la serie
	for(x=1;x<=23;x++)
	{
          // Los pares aumentan en 2
	  // Sumamos 1 por ser pares (2==1+"1")
	  if(EsPar(x)) cout<<x+3; // x+2+1
	  else cout<< x;
	  if(x<23) cout<<","<<" ";
	}
	cout<<endl;
	
	return 0;
}
B. Amauri
2013-01-05 01:43:57

* Detalle: cree el archivo en 2013 no 2012

Daniel Andreani
2013-01-05 15:29:40
 if(MultiploDeTres(i)) cout << " es múltiplo de 3";
bool MultiploDeTres(int n)

en el comando en el if el valor de la variable "i" lo transfiere a la variable "n"?

es decir en la primera pasada del programa i=1 cuando va a la definicion de la funcion "MultiploDeTres" transfiere el valor 1 a la variable "n"?

Gracias, y muy buena la respuesta por medio de e-mail

B. Amauri
2013-01-05 23:45:53

¡Hola de nuevo!

Dos interrogantes: por favor respondan a mi primer pregunta del comentario anterior, acerca de las listas de correo.

La pregunta nueva, necesito ayuda con el siguiente ejercicio, quiero que el programa reciba un número y me indique si este es primo o no, pero sólo reconoce como no primos auquellos que son múltiplos de 2, los demás números los marca como primos:

// El siguiente programa contiene una función que evalúa un número como primo
// y genera una lista de los primeros n números primos (el usuario introduce  n)
// B. Amauri 05/01/13

#include <iostream>
using namespace std;

// Función que determina si ddo==dividendo es primo
bool EsPrimo(int ddo)
{
  bool primo;
  // Si número==1 es primo
  if(ddo==1||ddo==2) primo=true;
  else
  {
	int dsr; // dsr==divisor
	for(dsr=2;dsr<ddo;dsr++)
	{
	// Si un número!=1 se puede dividir entre  
        //2<=n<número, no es primo
	if(!(ddo%dsr)) primo=false; break; 
		
       // Si número!=1 no se puede dividir entre 
       //n<número^(1/2) sigue realizando iteraciones
	if(ddo%dsr&&dsr^2<=ddo) continue;
			
       // Si número!=1 no se puede dividir entre 
       //n>número^(1/2)entonces es primo
       if(ddo%dsr&&dsr^2>ddo) primo=true; break;
			
	continue;
  }
 }
 return primo;
}

int main()
{
	char salir;
	do{
	int x; 
	cin>>x;// El usuario introduce un número x
	
	if(EsPrimo(x)) cout<<"Primo"<<endl;
	else cout<<"No primo"<<endl;
    
	cout<<"Desea salir? Y/N "<<endl;
	cin>>salir;
	}
	while(salir!=89);
	return 0;
}
Steven R. Davidson
2013-01-05 23:46:57

Hola B.Amauri,

Te comento algunas mejoras para el código fuente.

Escribes:

if( n%2 ) return false; else return true;

Si reescribimos la sentencia para que el valor de retorno coincida con el valor booleano evaluado de la condición, obtendremos esto:

if( n%2 != 0 ) return true; else return false;

Si analizamos el comportamiento, vemos que el valor de la condición es igual que el retornado y por tanto, no necesitamos comprobar tal condición. Por tanto, reescribiríamos la sentencia simplemente así:

return n%2 != 0;

Luego, escribes:

for( x=1; x<=23; x++ )
{
  ...
  if(x<23) cout<<","<<" ";
}

Si analizamos el código fuente, nos damos cuenta de que sabemos de antemano su comportamiento. Por lo tanto, no tiene sentido obligar al programa a comprobar algo que ya sabemos su veracidad.

La solución es separar el caso general - el bucle - del caso particular. Podríamos reescribir el código así:

// Caso general: 1 <= x < 23
for( x=1; x<23; x++ )
{
  ...
  cout << ',';
}

// Caso particular: x = 23
...
cout << endl;  // en lugar de ' ';

Sé que en este ejemplo no parece que se necesite hacer todos estos cambios, pero si te acostumbras a hacer esto al principio, creas buenos hábitos programando con naturalidad.

Hasta pronto,

Steven

Steven R. Davidson
2013-01-06 00:00:47

Hola Daniel,

Efectivamente, esto es lo que ocurre. Técnicamente, se realiza una copia del valor original pasado por parámetro. Para entender mejor el proceso, puedes pensar que seguimos esta secuencia de pasos:

[MultiploDeTres(i)]

Salto a: MultiploDeTres()

int n = i;

...

Como puedes ver, realmente creamos el entero 'n' cada vez que invoquemos esta función, y por ello se destruye, cada vez que termine su ejecución.

Espero haber aclarado la duda.

Steven

Steven R. Davidson
2013-01-06 02:36:38

Hola B.Amauri,

Puedes entrar al foro, yendo a: http://listas.conclase.net/ Si quieres enviar mensajes por correo-e, puedes enviarlos a: cconclase@listas.conclase.net Deberías haber recibido un correo-e con toda la información.

El código fuente tiene algunos errores gramaticales. Primeramente, escribes:

if(!(ddo%dsr)) primo=false; break;

Sólo porque escribas varias sentencias en una sola línea no significa que sea una sola sentencia. En este caso, hay dos sentencias. Es como si escribieras:

if(!(ddo%dsr))
  primo=false;
break;

Es decir, siempre ejecutas 'break', irrelevantemente de lo que ocurre con la condición anterior.

Tienes otro error al intentar calcular el cuadrado de un número. Escribes:

dsr^2

Sin embargo, C/C++ no implementa ningún operador de potenciación. El operador ^ es a nivel de bits; lo veremos en el capítulo 18 ( http://c.conclase.net/curso/?cap=018#inicio ).

Si quieres calcular el cuadrado, lo más sencillo es multiplicando:

dsr*dsr

Luego, colocas 'continue' al final del bucle, cosa que no tiene sentido. En general, no es buena idea usar 'continue' ni 'break', al menos que no haya otra solución. Es decir, intenta pensar en otros diseños que no involucren estos dos vocablos.

Espero que esto te ayude.

Steven

B. Amauri
2013-01-08 01:51:41

Steven gracias por tu respuesta, me fue muy útil todo y ya mejoré el código.

Respecto al correo hubo una dificultad con mi proveedor, pero pronto me suscribiré por completo a la lista.

Quisiera solicitar tu ayuda de nuevo. Solucioné el asunto de los números primos e hice un cambio en este programa:

// El siguiente programa contiene una función que evalúa un número como primo
// y muestra el resultado en pantalla
// B. Amauri 05/01/13

#include <iostream>
using namespace std;

// Función que determina si ddo==dividendo es primo
bool EsPrimo(int ddo)
{
	bool primo;
	
	// Si número==1,2,3,5 o 7 es primo
	if(ddo==1||ddo==2||ddo==3||ddo==5||ddo==7) primo=true;
	else
	{
		//Si núm!=1,2,3,5,7 comienza a probar dividiendo 
		//entre dsr=2 y con dsr++, cuando sea divisible
		//primo=false. Si primo==false o dsr>(ddo)^(1/2)
		//deja de hacer pruebas

		int dsr=2; // dsr==divisor
		do
		{
			if(!(ddo%dsr)) primo=false;
			dsr++;
		}
		while(dsr*dsr<=ddo && primo!=false);
	}
	return primo;
}


int main()
{
	char salir[3];
	do
	{
		int x;
		cout<<"Introduzca un numero"<<endl;
		cin>>x;// El usuario introduce un número x

		if(EsPrimo(x)) cout<<"Primo"<<endl;
		else cout<<"No primo"<<endl; 
		cout<<"Desea salir? si/no ";
		cin>>salir;
	}
	while(salir[0]=='n' || salir[0]=='N');
	return 0;
}

El cual funciona perfectamente, pero quise darle otro uso, haciendo que genere una lista de números primos desde el 1 hasta el límite que el usuario elija, con filas de 15 elementos. Todo funciona bien menos la evaluación del número en la función que determina si es primo; sólo puedo obtener una lista de primos del 1 al 10 (1,2,3,5,7):

// El siguiente programa contiene una función que evalúa un número como primo
// y genera una lista de los primeros n números primos (el usuario introduce  n)
// B. Amauri 05/01/13

#include <iostream>
using namespace std;

// Función que determina si ddo==dividendo es primo
bool EsPrimo(int ddo)
{
	bool primo;
	
	// Si número==1,2,3,5 o 7 es primo
	if(ddo==1||ddo==2||ddo==3||ddo==5||ddo==7) primo=true;
	else
	{
		//Si núm!=1,2,3,5,7 comienza a probar dividiendo 
		//entre dsr=2 y con dsr++, cuando sea divisible
		//primo=false. Si primo==false o dsr>(ddo)^(1/2)
		//deja de hacer pruebas

		int dsr=2; // dsr==divisor
		do
		{
			if(!(ddo%dsr)) primo=false;
			dsr++;
		}
		while(dsr*dsr<=ddo && primo!=false);
	}
	return primo;
}


int main()
{
	//x==límite superior 
	//i==cantidad de números en una línea
	//n==iteraciones
	int x,n,i;
	cout<<"Introduzca el limite superior ";
	cin>>x;
	
	i=0;
	for(n=1;n<=x;n++)
	{
		if(EsPrimo(n))
		{	
			cout<<n;
			if(n<=9) cout<<"  ";
			else cout<<" ";
			i++;
		}
		if(i==15) {cout<<endl;i=0;}
	}
	return 0;
}

¿Me dirías qué está mal?

B.Amauri

B. Amauri
2013-01-08 20:31:29

¡Resuelto! Este es el cambio:

bool EsPrimo(int ddo)
{
bool primo;
...
else
{
int dsr=2; // dsr==divisor
primo=true; //ESTO FUE LO QUE AGREGUÉ
...	
if(!(ddo%dsr)) primo=false;
}
return primo;
}
Jhabriel
2013-01-24 12:42:11

Aquí va el ejercicio 6.4! Está funcional!

#include <iostream>

using namespace std;

int main()
{
	int i=1;	// Inicializa i con 1

	while (i<23)	// Mientras i sea menor a 23
	{
		
		// Imprime el '1' en la primera iteracion
		if (i == 1)	
		{
			cout << i << " ";
		}
		
		
		// Adiciona 4 e imprime 'i'
		i += 4;

		cout << i << " ";

		if (i == 23)
		{
			break;	// Sale del bucle si la suma = 23	
		}

		
		// Sustrae 2 e imprime 'i'
		i -= 2;
		
		cout << i << " ";
	}
	return 0;
}
Manuel Cerezo
2013-01-30 19:32:31

Llevo unos días visitando la página y me parece genial. He empezado el curso desde 0, y aunque tenía algunos conocimientos previos de C++, me está sirviendo para refrescarlo todo y entender cosas que antes se me escapaban sobremanera o directamente no entendía. Enhorabuena a los creadores! Seguiré ampliando conocimientos mientras os visito. Ahí dejo mi aportación para el Ejemplo 6.3:

#include <iostream>
using namespace std;

// Programa que genera la secuencia: 
// 1, 5, 3, 7, 5, 9, 7, ..., 23
// 30/01/2013 Manuel Cerezo Osorio

#include <iostream>
using namespace std;

int main () // Función Principal
{
	int x = 1; //Variable del bucle, controla que se llega al objetivo de 23
	bool Suma = true; // Variable para controlar si se suma 4 (o se resta 2)
	
	do
		{
		if (Suma){ // Se muestra el valor de x y se le suma 4
			cout << x << " ";
			x += 4;
			Suma = false; // Se cambia para que se reste 2 en la próxima pasada del bucle
			}
		else  { //Se muestra el valor de x 
			cout << x << " ";
			if (x == 23) break; // Se le resta 2 siempre que x no sea ya 23
			x -= 2; 			
			Suma = true; // Se cambia para que se sume en la próxima pasada
			}
		} while (x <= 23);
		
	cin.get(); // Espera la entrada de un carácter para salir
	return 0;
}
jose
2013-02-24 19:36:32

me podrian dar una explicacion a este tipo de variables

int formula(int numero, int pocision)

la verda que no entiemdo les agradeceria su respuesta lo mas pronto posible

gracias

Marcos
2013-07-25 13:39:59

Muchas felicidades y muchas gracias por un curso tan bueno, estoy empezando con C++ y me ha surgido una duda en el ejemplo 6.3, en el bucle for dentro del otro bucle for. Una vez que se ejecuta, j aumenta una unidad, entonces porque en la segunda linea (y en el resto) aparece un uno y no un dos? Gracias de antemano.

Saludos

John W.
2013-08-13 06:13:03

porque al copiar el codigo de cada uno de los ejemplos y al guardarlo en mi pc y ejecutarlo en (Dev C++)..los comentarios como "teclee un numero entero" 0 "el numero es divisible por 3" o "el numero no es divisible por 3"... no me aparece??? ..en todos los ejemplos me aparece: por ejemplo si ejecuto el numero 4 (al dar enter)..rta: la variable "a" vale 4.. ???

Manuel Sánchez
2013-09-09 16:19:41

Hola, aquí tengo el ejercicio 6.5 según me ha salido a mi...

#include <iostream>
using namespace std;

int main()
{
	char fin[12];  // Declaramos la variable para salir del primer bucle
	do
	{
		int num;  // Variable del numero a factorizar
		int factor = 2;    // Empezamos desde el factor 2
		int potencia = 0;  // Reseteamos a 0 potencia en cada nuevo numero
		int ast = 0;  // Para no poner el asterisco inicial
		cout << "Introduce el numero a factorizar: ";
		cin >> num;
		cout << num << " = ";
		while(num >= factor*factor)    // Segundo bucle, cuando factor*factor es > que num, no hay mas posibilidad de factorizar
		{
			while( !(num%factor) )  // Aqui comprobamos si el factor actual da resto 0
			{
				num /= factor;   // Dividimos num / factor para continuar en el siguiente bucle
				potencia++;  // Sumamos 1 potencia
			}
			if(potencia > 0)
			{
				if(ast)  // Si es distinto a 0, ponemos asterisco
					cout << " * ";
				cout << factor;
				ast++;  // Evitamos asterisco inicial
				if(potencia > 1) 
					cout << "^" << potencia;
				potencia = 0;
			}
			else
			{
				if(factor == 2)
					factor++;
				else
					factor += 2;
			}
			
		}
		if(num > 1)
			cout << " * " << num << endl << endl;
	cout << endl << "Otro numero? s/n  ";
	cin >> fin;
	}
	while(fin[0] == 's' || fin[0] == 'S');
   return 0;
}
jhon
2013-09-29 07:11:49

mmmmm...Me da tristeza, no logre resolver ningún ejercicio. los comenzaba y me confundía, pero bueno a seguir intentando con otros. excelente curso

Angie
2013-10-07 05:35:19

Buen Día:

Ustedes me puede ayudar a resolver este ejercicio, a la hora de compilar, me salen errores.

11.Escriba un diagrama de flujo que lea un número entero N y calcule la suma de la siguiente serie: 1^1+ 2^2+3^3+…N^n.

Agradezco su ayuda

José Luis
2013-11-28 18:49:30

Hola aqui mi codigo sobre el Ejemplo 6.4

#include <iostream>
using namespace std;

int main()
{
  int numero, factor, contador, factor_ant;
  char salir[12];
  do
  {
    factor = 2;
    cout << "Introduce un número entero: ";
    cin >> numero;
    contador = 0;
    factor_ant = 2;
    while (numero >= (factor*factor))
    {
      if (numero % factor == 0)
      {
        if(factor==factor_ant) contador++;
        else
        {
          if (contador!=0) if (contador==1) cout << factor_ant << " x "; else cout << factor_ant << "^" << contador << " x ";
          contador =1;
          factor_ant = factor;
        }
        numero /= factor;
        continue;
      }
      if (factor==2) factor++; else factor +=2;
    }
    cout << numero << endl;
    cout << "Descomponer otro número? ";
    cin >> salir;
    
  } while (!(salir[0]=='n' || salir[0]=='N'));
  return 0;
}

Saludos desde Villahermosa, Tabasco, México.

Jaime
2014-01-12 11:58:24

Buenos dias, no se si me pueden ayudar, debo hacer la media de las observaciones de X, tal que X>0,Y<=1. y no se desarrollar el comando. Muchas gracias

Steven R. Davidson
2014-01-12 18:01:15

Hola Jaime,

Me temo que no nos das suficiente información para poder ayudarte. No estoy seguro qué representa Y, pero supongo que quieres calcular la media aritmética de una serie de números. Para esto, necesitas calcular la suma total, que se puede realizar a partir de sumas parciales. Puedes ir sumando cada número dado por el usuario, a través del teclado, como hemos visto en los ejemplos completos del capítulo 6. Por ejemplo,

suma = 0;

for( ... )
{
  ...
  suma += num;
}

El promedio no es más que implementar la fórmula popular:

promedio = suma / N

donde N es la cantidad de números sumados.

Espero que esto te ayude.

Steven

Jaime
2014-01-12 18:14:29

Perdón, tiene razón. Muchas gracias por contestarme de todas maneras, me explico mejor a continuación:

**Tengo que crear un data frame con 100 observaciones y dos variables "X" y "C". Los elementos de X son de una v.c. N(nu=0,var=4), y C=>Bin(3,0.4)

**Hasta aquí si que he sabido llegar. Ahora bien, mi problema es cuando tengo que calcular la media y varianza de las observaciones de X tales que X>0 y C<=1 .

Si pudieran ayudarme les estaría muy agradecido.

Un saludo y gracias de anticipado.

Alvaro
2014-06-11 11:33:44

En los ejemplos no sé que pasa que escribo el programa pero cin y cout no funcionan, cuando corro el programa simplemente no muestra nada en consola.

He escrito bien:

#include <iostream> 
using namespace std;

Ahora mi pregunta es si debo añadir algún fichero a la carpeta del programa para que pueda utilizar la biblioteca o si sabéis de que es. También por si es de ayuda, cuando quiero montar el programa me salta este error:

mingw32-make.exe: *** [All] Error 2

Muchas gracias de antemano, una gran web ,si señor, perfecta para aprender C++!

Saludos.

Carlos
2014-10-09 21:29:44

Espero hagan las criticas pertinentes del codigo... supongo no es estructuralmente estetico por que debo mostrar nuevamente a X al final del bucle

// Programa que genera la secuencia: 
// 1, 5, 3, 7, 5, 9, 7, ..., 23
// Autor:Carlos Hernandez

#include <iostream>//biblioteca de cout

using namespace std;//uso de esapcio de nombres

int main()
{
	int x=1,y=5;
	
	do{
		cout<<x<<" "<<endl;
		if(x<y){
		x+=4;
		y-=2;
		}
		else {
		x=y;
		y+=4;
		}
	}while(x!=23);
	cout<<x;
	return 0;
Leonardo Gomez
2014-11-08 01:39:47

Quería enviar la forma en que resolví el ejercicio 6.4, es un poco distinto al dado como solución. Este es mi aporte.

#include <iostream>

using namespace std;

int main (){

int i=1;

int numero_mas;

int numero_menos;

do {

numero_mas= (i+4);

numero_menos= (numero_mas-2);

if (numero_mas<23){

cout <<""<<i;

cout <<", ";

cout <<""<< numero_mas;

cout <<", ";

}

else {

cout <<""<< numero_mas;

}

i=numero_menos;

}

while (numero_mas < 23);

return 0;

}

Adri
2014-12-22 17:57:31

He aqui mi solucion para ponerlo como forma de potencia.

No me pregunteis mucho que significa esto o lo otro, que

todavia no estoy seguro de como lo he hecho xD.

Bueno, ahi va:

#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;
int main()
{
	while(1)
	{
	cout<<"Escribe un numero entero igual o mayor a 2 para descomponer en factores primos"<<endl<<endl;
	int x, y = 2,z = 0,a=0,b=0;
	char c;
	while(1)
	{
	cin>>x;
	if(x>=2)
	{
		system("cls");
		cout<<"El resultado es..."<<endl<<endl<<x<<" = ";
		break;
	}
	else
	{
		system("cls");
		cout<<"Numero no valido. Por favor, escribe un numero entero mayor o igual a 2"<<endl<<endl;
	}
	}	
	while (x>=2)
	{
		while((x>=2) && ((x%y)!=0)) y++;
		if(y==a)
		{
			z++;
		}
		else
		{
			if (b)
			{
				if(z-1) cout<<"^"<<z<<" * ";
				else cout<<" * ";
			}
			z=1;
		}
		if (y!=a) cout<<y;
		x = x/y;
		b=1;
		a=y;
	}
	if (z-1) cout<<"^"<<z;
	getch();
	system("cls");
	cout<<"Desea factorizar en primos otro numero? [Y|N]";
	c = getch();
	if (c == 'y')
	{
	system("cls");
	}
	else
	{
	break;	
	}
	}
	return 0;
}

En realidad usé goto, pero me di cuenta de que es preferible no usarlo, asi que lo sustituí por while(1) y break;

Wilber
2015-02-13 02:39:58

En el ejercicio 6.5, porque en la parte del if se pone ! ?

if(!(numero % factor)) {

cout << factor << " * ";

numero = numero / factor;

continue;

}

PD: no pude escribir en la lista de correos

Steven R. Davidson
2015-02-13 03:52:08

Hola Wilber,

El operador lógico de NOT se aplica al resultado del cálculo: (numero % factor). Los operadores lógicos se aplican a valores booleanos. Sin embargo, aquí tenemos un valor entero que es el resultado del operador aritmético del módulo (o resto) de una división.

La explicación es que un valor entero se puede convertir implícitamente a uno booleano. Como explicamos en el capítulo 4 ( http://c.conclase.net/curso/?cap=004c#Op_logicasfrec ), 0 (cero) es convertido a \'false\' y cualquier otro valor representa \'true\'.

Podemos reescribir la expresión a su equivalente:

if( numero % factor == 0 )

Espero que esto aclare la duda.

Steven

wilber
2015-02-13 06:24:31

Gracias por la explicacion me estaba rompiendo la cabeza.

luis a. rasgado carrasco
2015-03-18 21:40:44

Me encargaron una tarea...Diseñar un programa que despliegue los numeros del 1 al 10 usando sentencias.

while, do-while y for. pero no entiendo el sentido de la pregunta...AYUDA POR FAVOR.

Steven R. Davidson
2015-03-19 04:59:02

Hola Luis,

Sospecho que te piden crear tres versiones diferentes del programa usando cada tipo de bucle para realizar la misma tarea. En otras palabras, crea un programa usando 'while', otro con 'do/while', y un tercero basado en el bucle 'for', para mostrar los enteros del 1 al 10.

Espero que esto te oriente.

Steven

carlos
2015-04-14 18:55:46

me ayudan con este programa porfavor! :(

Elaborar un programa en lenguaje C en donde le pida al usuario que ingrese un número X entero positivo. Luego el programa deberá mostrar en pantalla los primeros X números pares, empezando desde el 2.

seinch
2015-08-10 00:02:22

Hola, para el ejercicio 6.4 he realizado este código:

#include <iostream> // biblioteca para uso de cout

using namespace std;

int main ()

{

int i=1;

cout << i << " ";

do

{

i=i+4;

cout << i << " ";

i=i-2;

cout << i << " ";

}

while (i!=23);

return 0;

}

Viendo el código propuesto de la solución, el cual veo un poco rebuscado, te quiero preguntar: ¿Cómo ves este que he realizado?

Muchas gracias y enhorabuena por el curso!

seinch

Steven R. Davidson
2015-08-11 03:21:58

Hola Seinch,

Sí; el código del ejemplo es algo más pedante porque queremos mostrar los usos de tipo de datos, variables, y sentencias.

Tu código fuente está más claro, pero tiene un error: no se detiene al encontrar el primer 23 en la secuencia sino la segunda aparición de éste. Ejecutando tu código, obtenemos:

1 5 3 ... 19 23 21 25 23

Esto es debido a que tu algoritmo calcula dos elementos consecutivos de la secuencia en cada iteración, que al finalizar comprobamos el segundo elemento de la pareja. Al no comprobar el primer elemento (i+4), el algoritmo lo ignora siempre.

También te hago unos comentarios para tener en cuenta:

- Como sabemos que el comienzo es 1, no hace falta usar 'i'; podríamos usar 1 directamente.

- Procura acostumbrarte a usar los operadores de asignación y acumulación. Por ejemplo, usa el operador += en lugar de sumar y asignar; o sea,

i += 4;
i -= 2;

Espero que esto te oriente.

Steven

carrasco
2016-03-15 01:42:59

Por favor alguien que me ayude con este problema:

Escribir un programa que visualice la siguiente salida en donde el límite es variable (en el ejemplo el límite es 4, puede ser cualquier número positivo):

1

1 2

1 2 3

1 2 3 4

1 2 3

1 2

1

Nestor
2016-04-02 02:20:05

hola tengo una problema debido que al correr el programa se duplica la linea en pantalla como puedo solucionarlo.

#include <fstream.h>

#include <conio.h>

#include <stdio.h>

//estructura que se utiliza para leer y escribir en archivo binario.

struct datos{

int linea;

char* texto;

};

//Procedimiento que lee archivo binario.

void LeeBinario(){

//declaramos una estructura que lee los archivo de tipo dato.

datos linea;

//declaramos un archivo de entrada.

ifstream archivo;

//abrimos el archivo, nótese que para que sea binario debe llevar "ios::binary"

archivo.open("datos.dat",ios::binary);

//recorremos el archivo con un ciclo while mientras no se encuentre el fin del archivo (eof)

while(!archivo.eof()){//archivo.eof() esto nos devuelve verdadero si el archivo llego a su final.

//leermos el archivo lo leemos en la estructura que llamamos "linea" que esta despues del &

archivo.read((char*)&linea, sizeof(datos));

//escribimos los datos que vamos leyendo.

cout<<"linea: "<<linea.linea<<" Texto: "<<linea.texto<<endl;

}

//Importante: cerramos el archivo.

archivo.close();

}

//procedimiento que escribe en un archivo binario.

void EscribeBinario(int pNumero, char* pLinea){

//declarmos una estrucutra linea de tipo datos.

datos linea;

//asignamos los valores que vamos a leer a la estrucutra linea.

linea.linea = pNumero;

linea.texto = pLinea;

//declaramos un archivo de salida "ofstream"

ofstream archivo;

//abrimos el archivo en este caso vamos a abrir el archivo "datos.dat" en modo binario "ios::binary" y para agregar "ios::app"

archivo.open("datos.dat",ios::binary|ios::app);

//escribimos el contenido de la estrucutra "linea" que esta despues del "&" del tamaño de la estructura datos "sizeof(datos)"

archivo.write((char *)&linea, sizeof(datos));

//Importante: cerramos el archivo.

archivo.close();

}

//ahora en nuestro procedimiento principal podemos utilizar nuestras funciones.

void main(){

//escribimos en el archivo.

EscribeBinario(1,"Esta es la linea numero uno");

//escribimos mas en el archivo.

EscribeBinario(2,"Esta es la linea numero dos");

//leemos todo el archivo (nos va a imprimir lo que ingresamos en los dos comandos anteriores.)

LeeBinario();

//hacemos una pausa para poder visualizarlo.

getch();

}

Steven R. Davidson
2016-04-02 22:48:56

Hola Néstor,

El problema está en el uso de la función miembro, 'eof()'. Tu comentario afirma que sirve para determinar si se ha llegado al final del archivo. Esto no es correcto. La función, 'eof()', retorna verdadero si el banderín o bit de "fin de fichero" está activado. Es decir, internamente se guarda un valor para indicar si se ha llegado al final o no, pero 'eof()' no detecta el final sino el valor guardado internamente. Este valor se activa cuando se intenta mudar el cursor de fichero más allá del final. En tu caso, esto significa que si lees más allá del final del fichero, entonces se activa el banderín interno.

Todo esto implica que justo después de una lectura, deberías verificar su estado. Por ejemplo,

archivo.read( reinterpret_cast< char * >( &linea ), sizeof(datos) );
while( !archivo.eof() )
{
  cout << "linea: " << linea.linea << " Texto: " << linea.texto << endl;

  archivo.read( reinterpret_cast< char * >( &linea ), sizeof(datos) );
}

Sin embargo, tienes otro error de mayor importancia: el campo 'texto' es un puntero. Esto es un problema a la hora de escribir datos en un fichero como haces con:

archivo.write((char *)&linea, sizeof(datos));

Aquí guardas el entero en 'linea' y la dirección de memoria en 'texto' contiguamente en el fichero. Esto significa que no guardas el contenido apuntado; o sea, no guardas la cadena pasada por 'pLinea'.

Análogamente haces lo mismo para la lectura. Guardas la dirección de memoria en 'texto', cuando en realidad te interesa guardar una cadena de caracteres. Sin embargo, 'read()' guarda bytes de tipo 'char', pero usas 'texto', el cual es un puntero.

La solución es escribir la cadena apuntada por 'texto'; asimismo debemos crear memoria para 'texto' y copiar caracteres a tal memoria. Esto es,

archivo.write( reinterpret_cast< char * >(&pNumero), sizeof pNumero );
archivo.write( linea.texto, strlen(pTexto) );

Esto presenta otro problema, porque no se sabe cuántos caracteres hay en la cadena de caracteres en el fichero binario. Deberías guardar la cantidad de caracteres también. Por ejemplo,

struct datos
{
  int linea;
  int nCantidad;
  char *texto;
};
...
archivo.write( reinterpret_cast< char * >(&linea.linea), sizeof linea.linea );
archivo.write( reinterpret_cast< char * >(&linea.nCantidad), sizeof linea.nCantidad );
archivo.write( linea.texto, strlen(pTexto) );

Para la lectura, tenemos que hacer uso de la cantidad para poder crear memoria dinámicamente y luego escribir los caracteres a tal bloque de memoria. Esto es,

archivo.read( reinterpret_cast< char * >( &linea.linea ), sizeof linea.linea );
while( !archivo.eof() )
{
  archivo.read( reinterpret_cast< char * >(&linea.nCantidad), sizeof linea.nCantidad );

  linea.texto = new char[linea.nCantidad+1];
  archivo.read( linea.texto, linea.nCantidad );
  cout << "linea: " << linea.linea << " Texto: " << linea.texto << endl;
  delete[] linea.texto;

  archivo.read( reinterpret_cast< char * >( &linea.linea ), sizeof linea.linea );
}

Aquí mi raciocinio es que si la lectura del primer dato, 'linea', del registro se realiza sin problemas, entonces las lecturas de los demás campos tampoco tendrán problemas.

Espero que esto aclare la duda.

Steven

richard reina
2016-08-18 00:31:36

porque en el ejercicio 6.1 me sale no such file or direcroyu

Anxel
2016-11-26 09:11:15
/*Respuesta a carrasco, fecha 2016/03/15
Escribir un programa que muestre una salida de n numeros de lineas de este tipo:
ejemplo para n=4
1
1 2
1 2 3
1 2 3 4  //hasta aqui primer bucle for
1 2 3    //comienza segundo bucle for
1 2 
1     */ 
#include<iostream>
#include<conio.h> //usar getch()
using namespace std;

int main(){
    int numero,i,j;
    cout<<"Digite un numero cualquiera: ";
    cin>>numero;
    //primer bucle for
    for(i=1;i<=numero;i++{
        for(j=i;j<=i;j++{
            cout<<j<<" ";
        }
        cout<<endl;
    }
    /*segundo bucle for
      iteraciones desde penultimo numero:
      numero-1, para que no aparezca repetida
      la ultima serie.
    */
    for(i=numero-1;i>=1;i--){
        for(j=1;j<=i;j++){
            cout<<j<<" ";
            cout<<endl;
        }
    }
    getch();
    return 0;    
}
[/code)
The_RiPPeR
2017-02-22 14:26:34

lo que no entiendo es la lógica de la expresión del ejercicio 6.4 que dice sumar=!sumar, el cual es para que el programa vuelva y ejecute el else y le reste 2.

The_RiPPeR
2017-02-22 20:43:42

en el ej 6.5 el if destinado a a los números impares no entiendo la condicional por que es == y no >=, yo lo compile y da lo mismo y se entiende mejor, eso es uno lo otro es por que la variable resp[12] y por ultimo si puedes explica la condicional del ultimo while.

Salvador Pozo
2017-02-22 22:18:28

Hola The_RiPPeR:

En cuanto a la primera duda, cuando el objeto, como en este caso "sumar" es de tipo bool, la expresión sumar=!sumar hace que cambie alternativamente de valor true a false, y viceversa.

Esto hace que cada vez que se ejecute el bucle, el valor de sumar es alternativamente true y false.

En cuanto a la segunda, se trata de una optimización. No nos interesa probar con todos los factores. En el caso ideal, nos interesa probar sólo con los primos, pero una primera aproximación es probar con 2 y después sólo con los impares.

Por eso sólo sumamos 1 cuando factor vale 2, y en el resto de los casos sumamos 2. Con la modificación que planteas, el programa funciona igual, pero prueba con todos los factores, pares o impares, a partir de 2.

rafael blanco
2017-03-23 16:45:56

alguien sabe en que me he equivocado, no me sale bien

int main()

{

int numero,PARAR,PREGUNTA;

cout << "¿cuantas veces quiere imprimir hola?";

cin >> numero;

do

(

cout << "HOLA\n";

numero=numero-1;

)

while (numero>0);

cin >> PARAR;

return 0;

}

Steven R. Davidson
2017-03-23 17:24:19

Hola Rafael,

Has usado paréntesis en lugar de llaves. Reescribe el código así:

do
{
  cout << "HOLA\n";

  numero--;
}
while (numero>0);

Como puedes ver, usamos el operador de decremento, en lugar de realizar dos operadores de resta y asignación.

Espero que esto te oriente.

Steven

Mapaor
2017-06-27 16:38:01

Hola, no entiendo el ejemplo 6.3

Que se incremente la variable "i" y "j" y que se escriba el numero de la "j" cada vez como puede lograr algo así?:

1

12

123

1234...

Perdón si es algo muy obvio pero no lo entiendo :(

Steven R. Davidson
2017-06-27 17:46:23

Hola Mapaor,

Si analizamos el resultado que queremos, vemos que cada fila tiene una secuencia de números empezando por 1 hasta una cantidad N. La cantidad de números de una secuencia depende de la fila. Esto es, en la primera fila, tenemos una secuencia de una sola cantidad; o sea, N = 1 para la fila #1. Para la segunda fila, tenemos la secuencia: 1, 2, por lo que su cantidad es de 2 y por tanto, N = 2 para la fila #2; y así sucesivamente. Viendo este patrón, existe una dependencia entre la cantidad de números en la secuencia y la fila que mostrará tal secuencia.

En general, la fórmula para mostrar una secuencia sería por ejemplo,

for( int j=1; j<=N; j++ )
{
  cout << j << ' ';
}
cout << endl;

Sin embargo, 'N' va variando porque depende de la fila. Si usamos la variable 'i' para representar la fila, entonces 'i' y 'N' serán iguales, y por tanto, podemos sustituir 'N' por 'i', que es la fila. Por ejemplo,

for( int i=1; i<=20; i++
{
  for( int j=1; j<=i; j++ )
  {
    cout << j << ' ';
  }
  cout << endl;
}

Lo más fácil para entender el código fuente es siguiendo paso a paso las sentencias y evaluando las expresiones, para determinar el comportamiento del algoritmo.

Espero que esto aclare la inquietud.

Steven

beth
2017-10-23 03:31:21

me gustaria saber como poner la condicion en while para que pare cuando de numeros continuos por ejemplo a,b o b,a

#include<iostream>

#include<ctime>

#include<cstdlib>

using namespace std;

int main() {

char x,y;

srand(time(NULL));

do{

x=rand()%26+65;

y=rand()%26+65;

cout<<x<<","<<y<<",";

} while();

return 0;

Steven R. Davidson
2017-10-23 16:57:56

Hola Beth,

Echando mano a las matemáticas, lo que quieres es obtener dos números enteros contiguos. Esto implica que la diferencia entre ambos es de 1 (o de -1). Por lo tanto, podríamos escribir el código fuente así,

int diferencia = 0;

do {
  ...
  diferencia = x - y;
} while( 1 == diferencia || -1 == diferencia );

Supongo que podrías usar la función 'abs()' para aplicar el valor absoluto a 'diferencia'; por ejemplo,

do {...} while( 1 == abs(diferencia) );

La otra opción es comparar 'x' e 'y' directamente, sin usar 'diferencia'. Esto es,

do {...} while( x+1 == y || x == y+1 );

Espero que esto te oriente.

Steven