Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - milx86

#1
Hola a todos alguien sabe con que tipo de software puedo hacer este tipo de videos con animaciones, me gustaría hacer videotutoriales :)
[youtube=640,360]http://www.youtube.com/watch?v=7DXNmEwdGy4&spfreload=10[/youtube]
Gracias por leerme.
#2
Hola a todos, ando leyendo un poco sobre sistemas operativos y me surgió esta duda.


Mis razones para creen en la primera definición:
-El mismo libro de silverschatz en páginas anteriores pone como ejemplo de interfaz de usuario tipo GUI a GNOME y KDE.
-Se puede cambiar el entorno gráfico de una distribución gnu/linux y esta sigue siendo la misma.
-Si hablamos de interfaz de linea de comando, puedo instalarme otra shell a preferencia personal y la distro sigue siendo la misma..

Veo a la UI como un componente externo, no entiendo por que la definen como un servicio que ofrece el SO, ¿Ustedes que opinan?
#3
Hola a todos verán tengo que hacer una tarea de sistemas de ecuaciones y no manejo bien matlab  :-(
Para un for normal sería

Código (matlab) [Seleccionar]
for i=1:n
   vector(i)
end


Pero quiero recorrer del ultimo al primero para hacer la sustitución hacia atrás como sería?
Código (matlab) [Seleccionar]
for i=n:1
   vector(i)
end


Gracias.

Mod: Mensaje modificado, al publicar código usa etiquetas GeSHi
#4
Hola a todos, quizá la pregunta:"Recomienden un libro de linux" les paresca muy "común" pero espero me ayuden.

Hace tiempo que vengo usando gnu/linux, pero todo lo que e aprendido creo es muy "por encima" cosas. Usar algunas aplicaciones para instalación de software(yum,aptitude,apt), org. de archivos, permisos, grupos, procesos y cosas asi.

He visto videotutoriales y leí un libro llamado la "biblia de linux", como sabrán uds primero hace un introducción, conceptos básicos, moverse por la terminal, luego algo de scripting con bash y perl y los ultimos capitulos son networking.

Tengo interés a futuro meterme en temas de servidores, pero primero quiero aprender networking y conocer bien el sistema.

Siguiendo este esquema :
| Usuario
| Aplicaciones
| Sistema Operativo
v Kernel

Me gustaría encontrar algun libro sobre los 2 ultimos niveles de abajo.
Por ejemplo, en un capitulo de la "biblia" habla del sistema de archivos.
Pero me gustaría saber el porqué se diseño así su estructura y cómo funciona por dentro este maravilloso SO.

Pienso en Gnu/Linux como un rompecabezas y quisiera conocerlo.

Muchas gracias por leerme.
#5
Software / Lector pdf con modo nocturno para pc
28 Noviembre 2014, 00:30 AM
hola, espero se encuentren bien.
Como dice el titulo, ando buscando algun lector pdf, porque siento los ojos jodidos  :P
Sistema: win 7
Espero me puedan ayudar.
Saludos
#6
Buenas a todos.
Les cuento, tengo un archivo que almacena registros de longitud fija.

Mi archivo tiene un registro encabezado que almacena info sobre:
* El número de registros de datos del archivo
* La longitud de los registros de datos

+----------------------+
+ 5 + recordLength    +
+----------------------+
+ NR+ MAS CAMPOS  +
+----------------------+
+ 1 + ....   data  ........+
+ 2 + ....   data  ........+
+ 3 + ....   data  ........+
+ 4 + ....   data  ........+
+ 5 + ....   data  ........+

typedef struct Record{
    char firstName[20];
    char lastName[20];
    char nationality[20];
    char DNI[9];
    int age;
    int recordNumber;
}Record;

typedef struct Header{
    int numberOfRecords;
    int recordLength;
}Header;

Lo que hago al crear un archivo es inicializar los campos del registro encabezado y grabarlo:
void createFile(char* nameFile)
{
    FILE* fd;
    Header buffer;
    buffer.numberOfRecords = 0;
    buffer.recordLength = sizeof(Record);
    fd = fopen(nameFile,"wt");
    fseek(fd,0,0);
    fwrite(&buffer,1,sizeof(Header),fd);
    // Compruebo el valor inicial que se grabo en numberOfRecords y me da 0, es correcto
    printf("Valor: %d",buffer.numberOfRecords);
    fclose(fd);
}


Como se habrán dado cuenta cada registro Record tiene un campo el cual indica que  numero de registro es.
    int recordNumber;
Lo que hago para asignarle el valor al campo recordNumber, leo el encabezado(el numero de registros) y a ese le sumo uno, El cual seria el numero de registros actuales.
El problema es en la función para agregar un registro al archivo:
void addRecord(FILE** fd,Record data)
{
    struct Header buffer;
    fread(&buffer, 1,sizeof(Header) , *fd);
    buffer.numberOfRecords++;

    printf("Valor?: %d\n",buffer.numberOfRecords);

    data.recordNumber = buffer.numberOfRecords;
    // Compruebo el contenido del registro recibido.
    // Pero el campo NR no se actualizo... Sale un numero extrano
    printf("% 10d% 12s% 12s% 12s% 12s% 12d\n",
           data.recordNumber,
           data.firstName,
           data.lastName,
           data.nationality,
           data.DNI,
           data.age
          );
    printf("\n\t\t\t    Press enter key to continue");
    fgetchar();
//
//    int pos = (data.recordNumber-1) * buffer.recordLength + sizeof(Header);
//    fseek(*fd,2,0);
//    fwrite(&data,1, buffer.recordLength, *fd);
//    fseek(*fd,0,0);
//    fwrite(&buffer, 1,sizeof(Header), *fd);
}


Mi problema es que cuando creo el archivo e inicializo el encabezado (numero de registros igual 0) funciona perfecto, pero cuando voy a leer luego el encabezado en ese campo esta un valor "extraño".

Aqui les dejo mi programa:
#ifdef __linux__
#define CLEAN "CLEAR"
#endif

#ifdef __MINGW32__
#define CLEAN "CLS"
#endif

#ifdef __MINGW64__
#define CLEAN "CLS"
#endif

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define TAM_CADENA 20

typedef struct Record
{
    char firstName[20];
    char lastName[20];
    char nationality[20];
    char DNI[9];
    int age;
    int recordNumber;
}Record;

typedef struct Header
{
    int numberOfRecords;
    int recordLength;
}Header;

void readLine(char cadena[], int tam);
int readInt();
void addRecord(FILE** fd,Record data);
int getRecordNumber(FILE** fd);
void createFile(char* nameFile);
int subMenu(char* fileName);
void menu();

int main(int argc, char *argv[])
{
    menu();
    return 0;
}

void menu()
{
    int op = 0;
    char nameFile[TAM_CADENA];
    do{
        system(CLEAN);
        printf("\n\t\t# | > _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ < | #");
        printf("\n\t\t# | >                                                < | #");
        printf("\n\t\t# | >              [x1] Create File                  < | #");
        printf("\n\t\t# | >              [x2] Open file for...             < | #");
        printf("\n\t\t# | >              [x3] Dump File                    < | #");
        printf("\n\t\t# | >              [x4] Search Record                < | #");
        printf("\n\t\t# | >              [x5] Filter by Nationality        < | #");
        printf("\n\t\t# | >              [x6] Exit                         < | #");
        printf("\n\t\t# | >_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ < | #");
        printf("\n\t\t##                                                      ##");
        printf("\n\t\t\t        Enter option: ");
        op = readInt();
        switch(op){
            case 1: printf("\n\t\t\t    Enter the file name: ");
                    readLine(nameFile,TAM_CADENA);
                    createFile(nameFile);
                    printf("\n\t\t\t    Press enter key to continue");
                    fgetchar();
                    break;

            case 2: printf("\n\t\t\t    Enter the file name: ");
                    readLine(nameFile,TAM_CADENA);
                    subMenu(nameFile);
                    break;

            case 3: printf("\n\t\t\t    Enter the file name: ");
                    readLine(nameFile,TAM_CADENA);
                    seeAll(nameFile);
                    printf("\n\t\t\t    Press enter key to continue");
                    fgetchar();
                    break;

            case 4: printf("\n\t\t\t    Press enter key to continue");
                    fgetchar();
                    break;

            case 5: printf("\n\t\t\t    Press enter key to continue");
                    fgetchar();
                    break;

            case 6: printf("\n\t\t\t    Good bye :)");
                    printf("\n\t\t\t    Press enter key to continue");
                    fgetchar();
                    break;

            default:printf("\n\t\t\t    [msgError]: Invalid option.");
        }
    }while(op!=6);
}

int subMenu(char* fileName)
{
    FILE* fd;
    if( (fd=fopen(fileName,"a+t")) == NULL )
    {
        printf("\nCould not open the file.");
        return -1;
    }
    else
    {
        int op = 0, R;
        Record buffer;
        do{
            system(CLEAN);
            R = getRecordNumber(&fd);
            printf("\n\t\t##                                                      ##");
            printf("\n\t\t# | >>_ _ _++=[-> File: %s   R: %d<-]=++_ _ _ << | #", fileName,R);
            printf("\n\t\t# | >_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ < | #");
            printf("\n\t\t# | >                                                < | #");
            printf("\n\t\t# | >              [x1] Add new records.             < | #");
            printf("\n\t\t# | >              [x2] Change record                < | #");
            printf("\n\t\t# | >              [x3] Close file                   < | #");
            printf("\n\t\t# | >_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ < | #");
            printf("\n\t\t##                                                      ##");
            printf("\n\t\t\t        Enter option: ");
            op = readInt();
            switch(op){
                case 1: printf("\n\t\t\t    Enter First Name: ");
                        readLine(&buffer.firstName,TAM_CADENA);
                        printf("\n\t\t\t    Enter Last Name: ");
                        readLine(buffer.lastName,TAM_CADENA);
                        printf("\n\t\t\t    Enter Nationality: ");
                        readLine(buffer.nationality,TAM_CADENA);
                        printf("\n\t\t\t    Enter DNI: ");
                        readLine(buffer.DNI,9);
                        printf("\n\t\t\t    Enter Age: ");
                        buffer.age = readInt();
                        addRecord(&fd, buffer);
                        break;

                case 2: printf("\n\t\t\t    Press enter key to continue");
                        fgetchar();
                        break;

                case 3: fclose(fd);
                        printf("\n\t\t\t    File closed.");
                        break;

                default:printf("\n\t\t\t    [msgError]: Invalid option.");
            }
        }while(op!=3);
    }
    return 0;
}

void createFile(char* nameFile)
{
    FILE* fd;
    struct Header buffer;
    buffer.numberOfRecords = 0;
    buffer.recordLength = sizeof(Record);
    fd = fopen(nameFile,"wt");
    fseek(fd,0,0);
    fwrite(&buffer,1,sizeof(Header),fd);
    // Compruebo el valor inicial que se grabo en numberOfRecords
    // 0 es correcto
    printf("Valor de nr: %d",buffer.numberOfRecords);
    fclose(fd);
}


int getRecordNumber(FILE** fd)
{
    struct Header buffer;
    fread(&buffer, 1, sizeof(Header),*fd);
    return buffer.numberOfRecords;
}


void addRecord(FILE** fd,Record data)
{
    struct Header buffer;
    fread(&buffer, 1,sizeof(Header) , *fd);
    buffer.numberOfRecords++;

    printf("Valor de nr: %d\n",buffer.numberOfRecords);

    data.recordNumber = buffer.numberOfRecords;
    // Compruebo el contenido del registro recibido.
    // Pero el campo NR no se actualizo... Sale un numero extraño
    printf("% 10d% 12s% 12s% 12s% 12s% 12d\n",
           data.recordNumber,
           data.firstName,
           data.lastName,
           data.nationality,
           data.DNI,
           data.age
          );
    printf("\n\t\t\t    Press enter key to continue");
    fgetchar();
//
//    int pos = (data.recordNumber-1) * buffer.recordLength + sizeof(Header);
//    fseek(*fd,2,0);
//    fwrite(&data,1, buffer.recordLength, *fd);
//    fseek(*fd,0,0);
//    fwrite(&buffer, 1,sizeof(Header), *fd);
}

int seeAll(char* nameFile)
{
    FILE* fd;
    if( (fd=fopen(nameFile,"rt")) == NULL )
    {
        printf("\nCould not open the file.");
        return -1;
    }

    else
    {
        struct Record buffer;
        struct Header header;
        fread(&header,1,sizeof(Header), fd);
        while(fread(&buffer,1,header.recordLength,fd) == 1)
        {
            printf("% 10d% 12s% 12s% 12s% 12s% 12d\n",
                   buffer.recordNumber,
                   buffer.firstName,
                   buffer.lastName,
                   buffer.nationality,
                   buffer.DNI,
                   buffer.age
                  );
        }

        fclose(fd);
    }
    return 0;
}

int readInt()
{
  char buf[BUFSIZ];
  char *p;
  long int i;

  if (fgets(buf, sizeof(buf), stdin) != NULL)
  {
    i = strtol(buf, &p, 10);
    if (buf[0] != '\n' && (*p == '\n' || *p == '\0'))
      return i;
  }
}

void readLine(char cadena[], int tam)
{
    char c;
    fgets(cadena,tam,stdin);
    if (cadena[strlen(cadena)-1] == '\n')
        cadena[strlen(cadena)-1] = '\0';
    else
    {
        cadena[tam-1] = '\0';
        while((c = getchar()) != '\n'){};
    }
}


Gracias de antemano. :)
#7
Programación C/C++ / Curiosidad con printf en C
11 Octubre 2014, 19:18 PM
Hola a todos,
Les cuento algo curioso...
Estaba trabajando en un archivo con registros de longitud fija.
Aqui viene lo curioso, estuve desde anoche pensando porque no se mostraba el contenido, revisaba el archivo y si tenia los datos.
Mi codigo era este

        while(fread(&buffer,1,header.recordLength,fd) == 1)
        {
            printf("%d-%s-%s-%s-%s-%d\n",
                   buffer.recordNumber,
                   buffer.firsName,
                   buffer.lastName,
                   buffer.nationality,
                   buffer.DNI,
                   buffer.age);
        }

Justo ahora se me ocurrio hacerlo asi, y curiosamente funciono  ;-)

while(fread(&buffer,1,header.recordLength,fd) != NULL)
{
    printf("%d-%s-%s-%s-%s-%d\n",buffer.recordNumber,buffer.firsName,buffer.lastName,buffer.nationality,buffer.DNI,buffer.age);
}


Entonces si tengo un registro con 30 campos, tambien tendría que hacer el printf en una sola linea? Alguien sabe porque no funciona de la primera forma (Creo que en c++ y Java si funciona así).
Saludos
#8
Hola a todos, espero se cuentren bien.
Necesito de su ayuda, tengo una función que recibe una clave DNI, y va a buscar en un archivo con registros de longitud fija.
Si logra encontrar un registro que tenga ese DNI deve devolver una copia de ese registro, entonces ¿que debería de poner en lugar de esos NULL para el caso de que no se encuentre el registro? ¿Que tengo que devolver?


Record searchRecord(char* nameFile, char* DNI)
{
   FILE* fd;
   if( (fd=fopen(nameFile,"rt")) == NULL )
   {
       printf("\nCould not open the file.");
       return NULL;
   }
   else
   {
       struct Header header;
       struct Record tmp;

       fread(&header, 1, headerLength, fd);

       while(fread(&tmp, 1, recordLength, fd) != NULL)
       {
           if(strncmp(DNI,tmp.DNI,strlen(tmp.DNI)) == 0)
           {
               struct Record data = tmp;
               return data;
           }
       }
       printf("\nData not found");
       fclose(fd);
   }

   return NULL;
}


Gracias por su tiempo.




El compilador tambien me da una alerta en esta linea  :P.
while(fread(&tmp,recordLength, 1, fd) != NULL)
warning: comparison between pointer and integer [enabled by default]|

Edito:
Segun lo poco que entiendo, NULL se usa cuando trabajamos con punteros y fread devuelve un entero, pero no tengo idea que ponerle en lugar de NULL para evitar esos warnings.
Támbien estuve viendo que
fread el primer parámetro es un puntero. Creo eso no me cuesta nada crearlo para trabajar como se debe  :P
http://www.cplusplus.com/reference/cstdio/fread/
En fin, creo que me resulta hacer que devuelve un puntero de tipo Record.
No quería hacerlo, porque tenia la idea que solo necesito mostrar el registro y no editarlo XD pero que tonto, aunque mande un puntero y se llegase a modificar, el archivo sigue igual  :laugh:
#9
Hola a todos.
Sé que esta mal pedir codigo, o puedan pensar que quiero que me hagan la tarea, pero no es asi...

Verán, desde antes de entrar a la universidad yo usaba trisquel gnu/linux como S.O.
Pero cuando entre a la universidad me empezaron a asignar pequeños programitas de consola en C/C++ (hago menus con switch y requiero limpiar pantalla,etc) pero tengo que hacer mis programas usando system(cls) porque en la universidad solo hay pc's con windows xD!
Asi que desgraciadamente tuve que volver a windows, algunos dirán que es muy drástica esa decision  :-X
Lo que me gustaría es que me ayuden, si ustedes tienen algo para que mi programa reconozca que SO es y en base a eso, ejecute ciertas instrucciones
Ejemplo si el so es gnu/linux: que se ejecuten las ins. "clear" y si fuese windows "cls".
Otro ejemplo para hacer un programa que maneje archivos, el separador en la ruta en win es \ y en linux /.

Gracias de antemano.
#10
Buenas a todos, espero que esten bien.
Tengo el siguiente problema, agradecería que le den una ojeada y me den algun consejo.

Tengo un archivo .txt con algunos registros con delimitadores
La estructura de mi archivo seria algo asi...

01;user01;user01@hotmail.com^02;user02;user02@gmail.com^03;user03;user03@yahoo.com^04;user04;user04@hotmail.com^05;user05;user05@facebook.com^

Donde:
Citar';' delimitador de campo
'^' delimitador de registro
Lo que tengo que hacer por ahora es mostrar todo el registro de aquellos que tengan cuentas de hotmail

Lo que e hecho hasta ahora es

#include <stdio.h>
#include <string.h>

FILE *fd;

void mostrarHotmails(void);

int main(int argc, char *argv[]){
   mostrarHotmails();
   return 0;
}

void mostrarHotmails(void){
   char c;

   if( (fd=fopen("data_Prog_01.txt","rt")) == NULL ){
       printf("\nNo se pudo abrir el archivo.");
       exit(1);
   }

   else{
       char find[13] = "@hotmail.com"; // email que voy a buscar
       char email[13];                 // para almacenar el dominio de emails de los usuarios (para luego comparar con find)
       char contacto[30];              // para almacenar todo el registro del contacto
       int contC = 0;                  //este contador me indica si ya llegue al campo de email
       fseek(fd,0,0);

       while( !feof(fd) ){ // mientras no sea fin de archivo, leer un caracter.

           c = fgetc(fd);
           if( c == ';'){
               contC++;

               if(contC==2){   // Ya llegue al inicio del campo email.
                   c = fgetc(fd);
                   while(c!='^'){
                       int i=0; // indice para el arreglo contacto.
                       contacto[i++] = c;
                       if(c=='@'){
                           int ie = 0; // indice de email

                           while(c!='^'){
                               email[ie++] = c;
                               contacto[i++] = c;
                               c = fgetc(fd);
                           }

                           email[ie] = '\0';
                           contacto[i] = '\0';
                           if(strcmp(email,find)==0){
                               printf("%s\n",contacto);
                           }
                       }
                       c = fgetc(fd);
                   }
               }
           }
           if( c == '^'){ // Fin de registro, reinicio el contador de campos.
               contC = 0;
           }

       } // Fin de while
       fclose(fd);
   }
}


El resultado al ejecutar el programa es este...
Citar@@hotmail.com
@@hotmail.com

Como veran, me muestra dos veces el '@' y creo que es debido a que despues de guardar el caracter leido(linea 38) en la linea 44 lo vuelve a guardar.
Aun asi no entiendo porque solo me muestra los dominios y no toda la dirección de correo.

Me parece haber leido algo como "strcmp solo compara cadenas (no arrays de cadenas)", no se si por eso no me funcione el programa.

Gracias por su tiempo chicos  :D
#11
Hola a todos, espero esten bien.
Quisiera que me ayuden con esta duda:
Si tengo las siguientes estructuras


Código (cpp) [Seleccionar]

struct carta{
   int fig;
   int num;
};

struct nodo{
   struct carta naipe;
   struct nodo *sgte;
};

typedef struct nodo NODO;
typedef struct nodo* nodoPtr;
nodoPtr MAZO = NULL;


¿Cual seria la forma correcta de acceder a los datos fig y num? :-\

Código (cpp) [Seleccionar]
   
    nodoPtr nuevo;
    nuevo = new(NODO);
    (nuevo->naipe).fig = 0;
    (nuevo->naipe).num = 0;


Código (cpp) [Seleccionar]

   (nuevo->naipe)->fig = 0;


Código (cpp) [Seleccionar]

   nuevo->(naipe.fig) = 0;


Gracias  :)
#12
Hola a todos, espero esten bien.
Bueno, estoy estudiando estructura de datos y llegue al tema de pilas y colas.

Entonces pense: " :huh: ya aprendi a apilar, desapilar y eliminar una pila. y si quiero ordenarla?"
estuve googleando un poco y encontre a gente que decia que ordenar una pila no tenia sentido, pues ya no se cumpliria la politica LIFO, asi que lo deje ...(1)

Pasando al tema de colas llegue a la misma incognita:"Debere aprender a ordenar una cola?",
aqui ya empeze a dudar ya que si bien es cierto que en una cola el primero en ser atendido. que pasaria si quiero atender a alguien segun un "criterio" como en la vida real que aunque haya una cola a veces se les atiende primero a los mas viejitos :3 por lo que deberia reordenar la cola por edad(en este caso)...(2)
Segui buscando y encontre que para hacer eso, ya existian un tipo de colas : las cola de prioridades.

Quiza no tenga sentido ordenar una pila o una cola ó quiza deba hacerlo solo para practicar  :D
pero para hacerlo necesito un poco de motivación para empezar, asi que necesito su ayuda.

Podrian decirme si existen aplicaciones reales y utiles por el cual deberia ordenar una pila y una cola?

Gracias por su tiempo.