martes, 14 de mayo de 2013

Punteros y archivos en c++

En una entrada anterior, hable acerca de los array dinamicos con punteros. Sin embargo, no puse un ejemplo muy avanzado si no algo realmente sencillo. Para remediar eso, traigo este ejemplo usando C++. Algo si, hay un error en la función imprimir dado que no me quería recibir los parámetros tal cual lo declare para iterar sobre el array, entonces esa la dejo para que ustedes la corrijan.

En cuanto al resto, pueden leer y analizar el código a continuación.

El programa solicita nombres y apellidos de una persona, los guarda en un archivo de texto y posteriormente los imprime tras leerlos desde el archivo.

Sin más preámbulo.

#include <iostream>
#include <fstream>
#include <cstdlib>
#include "split_class.h"
using namespace std;
string* datos=NULL;
struct Persona
{
    string Nombre;
    Persona * cargar_personas(int &n, Persona lista_personas[])
    {
    }
    /*void imprimir(Persona * plista_personas, int n)
    {
        cout<<lista_personas[i].Nombre<<" "<<lista_personas[i].Apellido<<" "<<lista_personas[i].Cedula<<endl;
    }
}
*/
void guardar(Persona lista_personas[], int n, char nombre_archivo[])
{
    fstream archivo(nombre_archivo, ios::in |
    archivo.close();
    void leer_archivo(char nombre_archivo[], int n)
    {
        fstream archivo(nombre_archivo, ios::in |
        char letra=NULL;
        int main()
        {
            int n=0;
            lista_personas= new Persona[n];
            char nombre_archivo[50];
            string Apellido;
            int Cedula;
        }
        ;
        cout<<"||Bienvenido||"<<endl;
        cout<<"Por favor ingrese los datos de la Persona n"<<endl;
        for(int i=0;
        i<n;
        i++)
        {
            cout<<"Nombre: "<<endl;
            cin>>lista_personas[i].Nombre;
            cout<<"Apellido: "<<endl;
            cin>>lista_personas[i].Apellido;
            cout<<"Cedula: "<<endl;
            cin>>lista_personas[i].Cedula;
        }
        Persona * p_lista_personas=lista_personas;
        return p_lista_personas;
        cout <<"pos"<<* plista_personas[0].Nombre;
        Persona * lista_personas=NULL;
        lista_personas=new Persona[n];
        lista_personas= plista_personas;
        cout<<"Imprimo "<< n <<endl;
        for (int i=0;
        i<n;
        i++)
        {
            ios::out | ios::trunc);
            for(int i=0;
            i<n;
            i++)
            {
                archivo << lista_personas[i].Cedula <<"||"<<lista_personas[i].Nombre<<"||"<<lista_personas[i].Apellido<<"n"<<flush;
            }
        }
        ios::out);
        string linea="";
        datos= new string[n];
        //string datos[n];
        archivo.seekg(0L, ios::end);
        //int longitud = archivo.tellg();
        int j=0;
        for(int i=0L;
        i<n;
        i++)
        {
            linea="";
            while(letra!='n')
            {
                //cout << letra;
                archivo.seekg(j,ios::beg);
                archivo.get(letra);
                //cout << letra;
                linea=linea+letra;
                j++;
            }
            letra=NULL;
            datos[i]=linea;
            cout<<datos[i]<<endl;
        }
        string * p_datos=datos;
        cout<<"imprimiendo antes de enviar"<<endl;
        /*for(int i=0;
        i<n;
        i++)
        {
            cout<<datos[i]<<endl;
        }
        */
    }
    Persona * lista_personas=NULL;
    cout<<"Este programa solicita los datos de dos personas y luego los muestra en pantallar"<<endl;
    cout<<"Cuantas personas desea registrar: "<<endl;
    cin>>n;
    Persona * p_lista_persona=cargar_personas(n, lista_personas);
    lista_personas=p_lista_persona;
    cout <<"Ingrese el nombre del archivo: ";
    cin >> nombre_archivo;
    guardar(lista_personas, n, nombre_archivo);
    leer_archivo(nombre_archivo, n);
    cout<<"---------------------------------"<<endl;
    cout<<"Imprimiendo la salida del archivo"<<endl;
    for(int i=0;
    i<n;
    i++)
    {
        //cout <<"se pego el for";
        splitstring cadena(datos[i]);
        vector<string> campos=cadena.split('|',1);
        lista_personas=NULL;
        lista_personas=new Persona[n];
        /*
        cout<<"Depuracion"<<endl;
        for (int k = 0;
        k < campos.size();
        k++)
        cout << k << " => " << campos[k] << endl;
        cout<<"Fin_Depuracion"<<endl;
        */
        for(int j=0;
        j<campos.size();
        j++)
        {
            if(j==0)
            {
                // caso de cedula
                lista_personas[i].Cedula=atoi(campos[j].c_str());
            }
            else if(j==2)
            {
                // caso de nombre
                const char* nombre_char = campos[j].c_str();
                lista_personas[i].Nombre= nombre_char;
            }
            else if(j==4)
            {
                // caso de apellido
                lista_personas[i].Apellido=campos[j].c_str();
            }
        }
        cout<<i<<")"<<lista_personas[i].Cedula<<";
        "<<lista_personas[i].Nombre<<";
        "<<lista_personas[i].Apellido<<endl;
    }
    //imprimir(lista_personas,n);
    cout<<""<<endl;
}

domingo, 28 de abril de 2013

Array Dinámico con C++

Leyendo a Fred Swartz en sus notas acerca de c++ consigo algo que me traía cabezón desde hace días, aunque me la llevo bastante bien con lenguajes de programación como python y php, mi dolor de cabeza siempre ha sido C/C++ con su manejo de memoria a bajo nivel y los benditos punteros que tanto detesto. 

Una de las cosas que siempre me ha costado es manejar array dinámicos a mi completo y total antojo. Siempre se cometía errores como:


  • Declarar el array con una cantidad de elementos en exceso (100000 posiciones) lo que constituye perdida de memoria y que si por andanzas de los ángeles de la programación son 100.001 posiciones a ser ocupadas aparecerá un error como "overflow memory ....  no seas bruto chico".(Recordando a mi profesor† de matemáticas(2014))
  • Declarar el array de esta forma conllevara a malgastar memoria y que existan colisiones entre los valores de memoria.  
Debo primero inicializar un puntero del tipo que deseo utilizar, luego proceder a solicitar al usuario el tamaño de mi array usando cin o scanf (según los gustos), colocar todas las posiciones en 0, luego usarlo como normalmente y por ultimo eliminarlo.
  
   int* a = NULL;   
   int n;           
   cin >> n;        
   a = new int[n];  
   for (int i=0; i<n; i++){

   a[i]=0;
   
   }
   delete []  a;
   a=NULL;
   
   

Espero les sea de utilidad.
/*
Comentario del Autor. Esta es la página más vista del blog.!!!!
*/

lunes, 31 de diciembre de 2012

Objetos dinamicos con javascript

Por un proyecto el cual no viene al caso me toco programar un formulario dinámico  dado que si el usuario seleccionaba una opción las demás se bloquearan, como algunos campos venían directamente de la base de datos, y era necesario bloquearlos les puse un prefijo y con una expresión regular de javascript los obtuve recorriendo los nodos del formulario con un for, algo así

En el formulario tengo algo como:


                       
<?php for ($i=0; $i<count($productos); ++$i) {?>
                       
<label class="checkbox">
<input type="checkbox" 
       value="<?php echo $productos[$i]["id_producto"];?>" 
       id="chk_pro_<?php echo str_replace(" ", "_", $productos[$i]["nombre_produ"]);?>" 
       name="chk_pro_<?php echo str_replace(" ", "_", $productos[$i]["nombre_produ"]);?>">
       <?php echo $productos[$i]["nombre_produ"];?>
</label>
<?php }?>


Mientras que en el javascript:


for(i=0; i<document.forms[0].length;++i){
 var chk_pro_campo= new RegExp(/^chk_pro_\w+$/); 

        if(chk_pro_campo.test(document.forms[0].elements[i].name)){

            chk_objetos[i]=document.forms[0].elements[i].name;

        } 

Después puedo recorrer el array chk_objetos y hacer lo necesite con él y sus elementos, como por ejemplo bloquearlos a elección.


function chk_buscar(obj){
var chk_buscar = document.getElementById(obj.id);
var id=chk_buscar.id;

if(chk_buscar.checked){
         document.getElementById(input_buscar).readOnly=false;

        /*Recorrer el formulario de elementos, buscar los elementos que tengan el

        patrón al igual que en el php, activar o desactivar según criterios*/
    
         cadena='';

         for(i=1;i<chk_objetos.length; ++i){

             name=chk_objetos[i];

             ob=document.getElementById(name)

             ob.disabled=true;

         }



else

        {

        document.getElementById(input_buscar).readOnly=true;

        for(i=1;i<chk_objetos.length; ++i){

             name=chk_objetos[i];

             ob=document.getElementById(name)

             ob.disabled=false;

             }

        }
}
Bueno, eso es todo feliz año 2013.