Hola,acá les traigo un programa que hice hace unas semanas atras, la verdad es que tiene pocas lineas de código ,pero es funcional ,para los que trabajen con las matemáticas y necesitan descomponer un numero en factores,tal vez se les resulte aburrido andar dividiéndolo , hace poco cuando estaba estudiando matemáticas me sirvió,quisas a alguien le sirva.
/*
Autor : ThePinkPanther(nick) , nombre : Santiago Díaz
12/02/2013
*/
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
int i=0;
int contador=0;
int *factores=NULL;
int aux=0;
int descomponer=0;
cout<<"Factorizar un numero.."<<endl;
cout<<endl<<"Numero a factorizar : " ; cin>>descomponer;
aux=descomponer;
factores=(int *)calloc(32,sizeof(int));
cout<<endl;
for(i=2;i<=descomponer;i++)
{
while(descomponer%i==0)
{
factores[contador]=i;
contador++;
descomponer=descomponer/i;
};
}
cout<<"########"<<endl;
cout<<aux<<" = " <<" ";
cout<<factores[0];
int x=1;
do
{
cout<<".";
cout<<factores[x];
x++;
}while(factores[x]!=0);
cout<<endl<<"########"<<endl;
free(factores);
}
Ejemplo entrada : 8
Salida : 2.2.2 , que esto es .. base 2 potencia 3.
Saludos.
factores=(int *)calloc(32,sizeof(int));
...
free(factores);
Porque usas funciones de C? Sería más apropiado usar los new y delete:
factores = new int[32];
...
delete[] factores;
Quisas tengas razón , pero recien empiezo con c++ me pase de ansi a c++ , por lo que se que los operadores new y delete me permiten reservar memoria dinamica y liberarla, pero estoy acostumbrado a usar calloc o malloc porque con realloc puedo hacer una reasignación, en c++ no se como seria una reasignacion de memoria..
Para reasignaciones de memoria lo mejor es usar la clase vector:
#include <vector>
vector<tipo> Variable;
Si quieres hacer un vector de enteros:
vector<int> Variable;
Y para añadir elementos al vector:
vector<int> Variable;
Variable.push_back(1); // Añade un elemento nuevo
Luego hay más funciones internas (busqueda, obtener tamaño del vector...). Las puedes consultar aquí:
http://www.cplusplus.com/reference/vector/vector/
No es necesario borrar el vector, puesto que se borra solo cuando termina su ambito. Aunque si eres un esceptico lo puedes hacer explicitamente:
Variable.clear(); // Limpiamos los valores
Variable.resize(0); // Cambiamos su tamaño a 0
Cita de: amchacon en 12 Febrero 2013, 14:54 PM
Porque usas funciones de C? Sería más apropiado usar los new y delete:
Como yo también soy nuevo en esto del C++, planteo una dudita; ¿otra forma más "inmediata" de inicializar factores a cero?:
#include <iostream>
#include <cstdlib>
using namespace std;
int main(){
int i=0;
int contador=0;
int aux=0;
int descomponer=0;
int *factores=new int[32];
for (i=0;i<32;i++)
factores[i]=0;
cout <<"Factorizar un numero.."<<endl;
cout<<endl<<"Numero a factorizar : " ;
cin>>descomponer;
aux=descomponer;
cout<<endl;
for(i=2;i<=descomponer;i++) {
while(descomponer%i==0) {
factores[contador]=i;
contador++;
descomponer=descomponer/i;
}
}
cout<<"########"<<endl;
cout<<aux<<" = " <<" ";
cout<<factores[0];
int x=1;
do{
cout<<"x";
cout<<factores[x];
x++;
}while(factores[x]!=0);
cout<<endl<<"########"<<endl;
delete[] factores;
return EXIT_SUCCESS;
}
Saluditos!.
Yo usaba la funcion calloc de c.
que automaticamente la memoria reservada es inicializada a 0 .
ahora pruebo con new.
Citar
Y para añadir elementos al vector:
vector<int> Variable;
Variable.push_back(1); // Añade un elemento nuevo
Luego hay más funciones internas (busqueda, obtener tamaño del vector...). Las puedes consultar aquí:
http://www.cplusplus.com/reference/vector/vector/
No es necesario borrar el vector, puesto que se borra solo cuando termina su ambito. Aunque si eres un esceptico lo puedes hacer explicitamente:
Variable.clear(); // Limpiamos los valores
Variable.resize(0); // Cambiamos su tamaño a 0
gracias voy a tratar de familiarisarme con esto..
Cita de: leosansan en 12 Febrero 2013, 22:23 PM
Como yo también soy nuevo en esto del C++, planteo una dudita; ¿otra forma más "inmediata" de inicializar factores a cero?:
#include <iostream>
#include <cstdlib>
using namespace std;
int main(){
int i=0;
int contador=0;
int aux=0;
int descomponer=0;
int *factores=new int[32];
for (i=0;i<32;i++)
factores[i]=0;
cout <<"Factorizar un numero.."<<endl;
cout<<endl<<"Numero a factorizar : " ;
cin>>descomponer;
aux=descomponer;
cout<<endl;
for(i=2;i<=descomponer;i++) {
while(descomponer%i==0) {
factores[contador]=i;
contador++;
descomponer=descomponer/i;
}
}
cout<<"########"<<endl;
cout<<aux<<" = " <<" ";
cout<<factores[0];
int x=1;
do{
cout<<"x";
cout<<factores[x];
x++;
}while(factores[x]!=0);
cout<<endl<<"########"<<endl;
delete[] factores;
return EXIT_SUCCESS;
}
Saluditos!.
Segun mis pruebas, cuando usas new , la memoria ya es inicializada en 0. un saludo.
for (i=0;i<32;i++)
factores[i]=0;
no es necesario.
Cita de: leosansan en 12 Febrero 2013, 22:23 PM¿otra forma más "inmediata" de inicializar factores a cero?
En array estáticos se puede usar esto:
char Variable[256] = {0};
Cita de: ThePinkPanther en 12 Febrero 2013, 22:29 PMint *factores=new int[32];
for (i=0;i<32;i++)
factores[i]=0;
Segun mis pruebas, cuando usas new , la memoria ya es inicializada en 0.
for (i=0;i<32;i++)
factores[i]=0;
no es necesario.
Es necesario (en ese caso) ya que el valor inicial de cada elemento depende de su tipo.
Una discusión algo técnica (y en ingles) donde se explica el porque y se da una alternativa es Is new int[10]() valid c++? (http://stackoverflow.com/questions/2468367/is-new-int10-valid-c).
Un saludo
Cita de: rir3760 en 13 Febrero 2013, 02:50 AM
Una discusión algo técnica (y en ingles) donde se explica el porque y se da una alternativa es
En resumen, con paréntesis al final SÍ se inicializan a cero, comprobado:int *factores=new int[32]();//con parentesis se inicializan a cero
No siendo necesario:for (i=0;i<32;i++)
factores[i]=0;
Saluditos!. . .... y gracias n-ésimas amigo rir.
Al colocar los paréntesis lo que haces es llamar al constructor por defecto. Es decir que si hay constructor predeterminado o definido por el usuario, vamos a poder inicializar la variable a la hora de declararla.
CitarIf T is a const-qualified type, or a (possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of const-qualified type, the program is ill-formed.
Cita de: BatchianoISpyxolo en 13 Febrero 2013, 22:43 PMCitarIf T is a const-qualified type, or a (possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of const-qualified type, the program is ill-formed.
No entiendo el sentido de la cita. ¿Puedes aclararlo por favor?
Un saludo
Cita de: rir3760 en 14 Febrero 2013, 02:02 AM
No entiendo el sentido de la cita. ¿Puedes aclararlo por favor?
Un saludo
A mi entender, es que si tienes estructuras o clases básicas (PODS), éstos carecen de inicializadores y, por tanto, el programa está mal formado.
Cita de: BatchianoISpyxolo en 14 Febrero 2013, 02:15 AMsi tienes estructuras o clases básicas (PODS), éstos carecen de inicializadores y, por tanto, el programa está mal formado.
No. Si revisamos el tema que mencione con cuidado:
CitarParagraph 5.3.4/15 states that
A new-expression that creates an object of type T initializes that object as follows:
[...]
* If the new-initializer is of the form (), the item is value-initialized (8.5)
where value initialized for POD means zero-initialize.
[...]
If the new-initializer is omitted:
* If T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is default-initialized (8.5). If T is a const-qualified type, the underlying class type shall have a user-declared default constructor.
* Otherwise, the object created has indeterminate value. If T is a const-qualified type, or a (possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of const-qualified type, the program is ill-formed;
En resumen:
* Si se utiliza el inicializador "()" en el caso de PODs su resultado es la asignación del valor 0.
* Si se omite el inicializador el valor almacenado es no determinado.
"ill-formed" solo aplica si 1) Se omite el inicializador y 2) el objeto esta calificado (directa o indirectamente) con el calificador const.
Un saludo
me acuerdo que yo había usado una lógica parecida anteriormente..
http://foro.elhacker.net/programacion_cc/atoi_itoa_personalizadas-t358459.0.html;msg1734670#msg1734670
http://foro.elhacker.net/programacion_cc/aportacion_programas_en_c_basicos-t365766.0.html;msg1769441#msg1769441