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ú

Mensajes - rir3760

#621
Programación C/C++ / Re: programa tarjetas
9 Noviembre 2013, 15:59 PM
Cita de: m@o_614 en  9 Noviembre 2013, 06:02 AMTengo el siguiente programa que dice:

Tengo n tarjetas numeradas en cierto orden(al azar), y hay que eliminar algunas de esas tarjetas, de tal forma que las que queden esten ordenadas ascendentemente,  y cuyos valores esten entre el rango 1 <= valores <= 100,000, esto ya lo codifique pero el problema que tengo es que me pide encontrar el menor numero de tarjetas que se pueden eliminar y es lo que no entiendo como hacerlo
El problema que te piden resolver es Wikipedia: Longest increasing subsequence

Un saludo
#622
Programación C/C++ / Re: Problema de puntero
7 Noviembre 2013, 16:55 PM
Cita de: vangodp en  7 Noviembre 2013, 14:47 PM¿Entonces aquí  se esta pasando a dereferenciado
Casi. La indirección no se aplica a "a", se aplica al puntero resultante de evaluar "a" (ya se que raya en la pedantería pero mejor ser tan precisos como sea posible).

Un saludo
#623
Un problema en ese fragmento es utilizar fgets indicando una capacidad de tres caracteres, como la función reserva uno para el avance de linea y otro para el terminador de la cadena (el '\0') solo resta un carácter para la linea y difícilmente se leerá esta completa.

Otro problema es no verificar si la linea leída termina con '\n' indicando que se leyó la linea completa, de no ser así tendrás, de todos modos, que utilizar un bucle para descartar el resto de la linea.

En tu caso es mejor tratar de leer el numero de tipo int con scanf y a continuación utilizar un bucle para descartar el resto de la linea:
int opciones;
int dd;
int ok;
int ch;

/* ... */

if (opciones == 1){
   do {
      puts("Ingrese dia:"); /* las lineas TERMINAN en '\n', no al reves */
      ok = scanf("%d", &dd) == 1 && dd >= 1 && dd <= 31;
     
      /* Se descarta el resto de la linea */
      while ((ch = getchar()) != EOF && ch != '\n')
         ;
   }while (!ok);
}


Un saludo
#624
Programación C/C++ / Re: Problema de puntero
7 Noviembre 2013, 14:37 PM
Cita de: erest0r en  7 Noviembre 2013, 12:25 PMlo que no entiendo es por qué si es un arreglo unidimensional se le pasa a la funcion

funcion( arreglo );

En cambio para arreglo de 2 dimensiones se le pasa

funcion( *arreglo );

Y cuando se asigna la direccion de memoria de un arreglo unidimensional se suele hacer
Código (cpp) [Seleccionar]
int a[2];
int *b;
b = a;


En cambio en este ejemplo
Código (cpp) [Seleccionar]
int a[2][6];
int *b;
b = *a;


Se supone "b" debe contener la direccion de memoria de "a" y pareciese que le estoy es asignando su valor
La regla que aplica en este escenario es: en C y C++ cuando se nombra a un array de tipo "T [N]" mediante su identificador o una expresion ello resulta (salvo excepciones, por ejemplo sizeof) en la direccion en memoria del primer elemento del array y este puntero es de tipo "T *".

Los pasos al evaluar la expresion "b = *a" son:

1) "a" es una array de tipo "int [2][6]" y resulta en la direccion en memoria del elemento "a[0]" y es de tipo "int (*)[6]", un puntero a array.

2) Al aplicar indireccion con "*a" ya no tratamos con el puntero a array sino con el array. Este es de tipo "int [6]" y aplica lo mismo: la expresion denotando un array resulta en la direccion en memoria de su primer elemento (de a[0][0]) y el tipo del puntero es "int *".

3) La direccion en memoria de a[0][0] y de tipo "int *" se almacena en la variable "b", como los tipos coinciden no hay problema.

Por ultimo hay que tener mucho cuidado y no confundir arrays con punteros, tienen una relación estrecha pero son distintos. Una buena analogía aquí es el trabajo del cartero: nunca confunde la dirección de una casa (de nuestro lado un puntero) con la casa en si (para nosotros el objeto apuntado).

Un saludo
#625
Hay varias formas de realizar la operación, para ello puedes utilizar las funciones atof, strtod o sscanf. El uso de esta ultima seria mas o menos así:
char ejemplo[] = "algun texto";
double numero;

/* ... */

if (sscanf(ejemplo, "%lf", &numero) == 1){
   printf("Es un numero (%f)\n", numero);
}


Un saludo
#626
Programación C/C++ / Re: fwrite y estructuras
6 Noviembre 2013, 02:33 AM
Cita de: m@o_614 en  5 Noviembre 2013, 03:11 AMpero ahora el problema que tengo es con el fread() que me tiene que recibir los datos leidos del stream y almacenarlos en un buffer o una estructura, pero me aparece basura todavia
El programa funciona correctamente, ¿A que te refieres con "basura"?

Un saludo
#627
Programación C/C++ / Re: fwrite y estructuras
4 Noviembre 2013, 16:46 PM
Cita de: m@o_614 en  4 Noviembre 2013, 02:14 AMsi tengo la siguiente estructura en la que tengo campos de tipo cadena y campos de tipo entero, cual es la manera para poder escribirlos en un archivo utilizando a fuerzas la funcion fwrite()?
Como ya te comentaron debes imprimir utilizando una sola llamada a fwrite:
fwrite(&p, sizeof p, 1, fd);

Cita de: m@o_614 en  4 Noviembre 2013, 02:14 AMel problema que tengo es con el campo int me imprime basura  a la hora de escribir en el archivo
Si con ello te refieres a que el contenido del archivo es ilegible eso es normal ya que la función fwrite escribe un bloque de memoria tal cual, si lo que quieres es texto plano debes utilizar fprintf.

Un saludo
#628
Cuando publiques el código fuente de un programa por favor utiliza las etiquetas GeSHi: en la pagina de composición de mensajes hay un cuadro desplegable con ese nombre y ahí puedes seleccionar el lenguaje adecuado (C o C++).

Problemas con el programa hay bastantes.

* No necesitas de un array de arrays, por sencillez deberías utilizar un array y con un numero de elementos pequeño. Por ejemplo:
Código (cpp) [Seleccionar]
struct carros registro[8];

* Al pedir la entrada en la función "ingresar" tienes bloques como este:
Código (cpp) [Seleccionar]
cout << "registro " << x + 1 << endl;
cout << "ingrese placa" << endl;
cin >> placa;
registro[x][1].placa;

Ellos no tienen efecto y se deberían cambiar a:
Código (cpp) [Seleccionar]
cout << "registro " << x + 1 << endl;
cout << "ingrese placa" << endl;
cin >> registro[x][1].placa;

Y si se utiliza un array de ocho elementos seria mas o menos así:
Código (cpp) [Seleccionar]
cout << "registro " << x + 1 << endl;
cout << "ingrese placa" << endl;
cin >> registro[x].placa;


* En la función "mostrar" la variable "x" controla la ejecución del bucle con un valor inicial de 1 cuando debería ser 0 (como en la función ingresar).

* En la función "main" en la sentencia de selección "switch" todos los casos inician con:
Código (cpp) [Seleccionar]
system("cls");
Hay que eliminar esa sentencia de todos los casos, en su lugar basta con llamar a system justo antes del "switch".

Un saludo
#629
Programación C/C++ / Re: cambiar for a do-while
2 Noviembre 2013, 16:25 PM
Cita de: m@o_614 en  2 Noviembre 2013, 06:27 AMla funcion me imprimiria correctamente si en la funcion fin cambiara el p->sig!= NULL por p!=NULL, tal como me dijiste:

void imprimirLista(Nodo *cabeza)
{
    Nodo *p,*ult;
    for(p = cabeza,ult = fin(cabeza);p!=ult;p = p->sig)
       printf("%d\t",p->elemento);
}

Nodo *fin(Nodo *cabeza)
{
    Nodo *ptr = cabeza;
    while(ptr!=NULL)
        ptr = ptr->sig;
    return ptr;
}
Con todo respeto tu función "fin" no tiene sentido ya que ella siempre retornara NULL y para ese caso y como ya te comente antes simplemente usa "p != NULL".

Cita de: m@o_614 en  2 Noviembre 2013, 06:27 AMsolo que como tambien quiero hacer un CASE  para que tenga la opcion de ingresarme por el final
Para agregar un nodo al final de una lista bien la recorres hasta encontrar el ultimo o tomas nota de los nodos primero y ultimo cuando agregas/eliminas un nodo. En tu caso lo mejor por sencillo es utilizar la primera forma.

Y como ya te comente en mi mensaje anterior ponte a practicar el uso de listas, empieza con la introducción (Linked List Basics) y continuas con los ejercicios (Linked List Problems).

Un saludo
#630
Programación C/C++ / Re: cambiar for a do-while
2 Noviembre 2013, 03:00 AM
Tu función "fin" esta mal implementada ya que reventara si la lista esta vacía y la función para imprimir una lista con un bucle for:
void imprimirLista(Nodo *cabeza)
{
   Nodo *p,*ult;
   for(p = cabeza,ult = fin(cabeza);p!=ult;p = p->sig)
   {
       printf("%s\t",p->nombre);
       printf("%d\t",p->edad);
       printf("%s\n\n",p->ciudad_residencia);
   }
}

Imprimirá el contenido de todos los nodos menos el ultimo, en lugar de la función "fin" es mejor simplemente la comparación habitual "p != NULL").

Tampoco es una buena idea utilizar un bucle "do .. while" para imprimir la lista ya que el programa reventara en el mismo caso (lista vacía).

Si no tienes un curso de calidad sobre listas vinculadas puedes descargar uno cortesía de la Universidad de Stanford.

Un saludo