• Lunes 29 de Abril de 2024, 22:04

Mostrar Mensajes

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


Mensajes - cotolon

Páginas: [1]
1
C/C++ / Re:Lista enlazada simple (Insertar al Final)
« en: Jueves 6 de Diciembre de 2012, 19:37 »
Me ha servido gracias :P

lo probé y si la lista me quedo como (Numero*) 0x0, ya que es nula. Gracias

2
C/C++ / Re:Lista enlazada simple (Insertar al Final)
« en: Jueves 6 de Diciembre de 2012, 16:34 »
Disculpen el doble post.

Al final era porque estoy pasando lista por referencia, ya que declarar "**" estoy diciendo de un puntero a un puntero, pero como lista es un puntero a un nodo, entonces debe ser pasado por referencia, para que **primerNumero pueda apuntarlo correctamente.

P.D: Simplemente colocar *primerNumero, sería un puntero a un nodo y no a otro puntero.

Por favor corríjanme si estoy mal :S

Aquí dejo el código completo con varias cosas, según mi compilador funciona, pero espero que "teóricamente" también, es decir si no queda ningún nodo "volando" por ahí.

http://pastebin.com/1v25KeV2

Es largo el código (200 líneas) por eso lo dejo por pastebin.

3
C/C++ / Lista enlazada simple (Insertar al Final)
« en: Jueves 6 de Diciembre de 2012, 01:45 »
Hola buenas noches, necesito ayuda con un código de prueba que hago sobre listas enlazadas. Primero que nada tengo duda con el tema de los punteros, ya que no veo exactamente por qué sucede. Este es el código que funciona:

Código: C++
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4.  
  5. struct numero{
  6.     int dato; //valor del numero
  7.     numero *sig; //nodo al q apunta
  8. };
  9.  
  10. typedef struct numero Numero;
  11.  
  12. void ingresarNumero(Numero **); //puntero q recorrerá para insetar valor
  13. void mostrarNumeros(Numero *); //mostrar valores
  14. void eliminarNumero(Numero *); //eliminar valor segun posición
  15.  
  16. int main()
  17. {
  18.     int opcion = 4;
  19.     Numero *lista = NULL; //primer elemento de la lista vacia
  20.     do{
  21.         system("CLS");
  22.         cout << "1.- Ingresar Dato." << endl; cout << "2.- Mostrar Datos." << endl;
  23.         cout << "3.- Eliminar Dato." << endl; cout << "4.- Salir." << endl; cout << "--> ";
  24.         cin >> opcion; cout << endl;
  25.         switch(opcion){
  26.             case 1: ingresarNumero(&lista); break;
  27.             case 2: mostrarNumeros(lista); break;
  28.             case 3: eliminarNumero(lista); break;
  29.         }
  30.     }while(opcion!=4);
  31.     cout << "Nos vemos!" << endl;
  32.     return 0;
  33. }
  34.  
  35. void ingresarNumero(Numero **primerNumero){
  36.     Numero *nuevoNumero = new Numero; //reservamos memoria
  37.     int nuevoDato; //el dato
  38.     if (nuevoNumero == NULL){cout << "No se pudo reservar Memoria. " << endl;}
  39.     else{
  40.         cout << "Si se pudo reservar memoria. Direccion: " << nuevoNumero << endl << endl;
  41.         cout << "Ingrese nuevo numero: "; cin >> nuevoDato;
  42.         nuevoNumero->dato = nuevoDato; //Le asignamos el nuevo dato.
  43.         nuevoNumero->sig = NULL; //el siguiente es nulo
  44.        //Si la lista esta vacia:
  45.        if (*primerNumero == NULL) {*primerNumero = nuevoNumero;}
  46.        else{
  47.             //si no esta vacia
  48.             Numero *ptr = *primerNumero;
  49.             while(ptr->sig != NULL) ptr = ptr->sig; // avanza al siguiente nodo
  50.             // el nodo encontrado es no vacio pero el siguiente es nulo.
  51.             ptr->sig = nuevoNumero; //el nodo sgte nulo toma la direccion de nuevo numero
  52.        }
  53.     }
  54.     cout << endl;
  55.     system("pause");
  56. }
  57.  
  58. void mostrarNumeros(Numero *ptr){
  59.     if (ptr == NULL) cout << "La Lista esta Vacia." << endl << endl;
  60.     else {
  61.         while(ptr!=NULL){
  62.             //mientras el nodo sgte no sea nulo muestra el dato del nodo actual.
  63.             cout << ptr->dato << " ";
  64.             ptr = ptr->sig; // avanza al sgte nodo
  65.         }
  66.         cout << endl << endl;
  67.     }
  68.     system("pause");
  69. }
  70.  
  71. void eliminarNumero(Numero *ptr){
  72.  
  73. }
  74.  
  75.  

Bueno el tema es que el código de arriba es la solución, y la función ingresar número posee un parámetro de "puntero a un puntero" (**primerNumero), y exactamente no sé como arregla el problema, por el tema de las direcciones, ya que yo tenía este código (pondré solo la función) que realmente no funcionaba, porque cada vez que quería mostrar me salia "Lista vacia" y no se si realmente los números se añadían o no. Espero me puedan explicar cuales son las diferencias, gracias. Aquí el código de la función que tenía yo:

Código: C++
  1. void ingresarNumero(Numero *ptr){
  2.     Numero *nuevoNumero = new Numero; //reservamos memoria
  3.     int nuevoDato; //el dato
  4.     if (nuevoNumero == NULL){cout << "No se pudo reservar Memoria. " << endl;}
  5.     else{
  6.         cout << "Si se pudo reservar memoria. Direccion: " << nuevoNumero << endl << endl;
  7.         cout << "Ingrese nuevo numero: "; cin >> nuevoDato;
  8.         nuevoNumero->dato = nuevoDato; //Le asignamos el nuevo dato.
  9.         nuevoNumero->sig = NULL; //el siguiente es nulo
  10.        //Si la lista esta vacia:
  11.        if (ptr == NULL) {ptr = nuevoNumero;}
  12.        else{
  13.             //si no esta vacia
  14.             while(ptr->sig != NULL) ptr = ptr->sig; // avanza al siguiente nodo
  15.             // el nodo encontrado es no vacio pero el siguiente es nulo.
  16.             ptr->sig = nuevoNumero; //el nodo sgte nulo toma la direccion de nuevo numero
  17.        }
  18.     }
  19.     cout << endl;
  20.     system("pause");
  21. }
  22.  


Gracias a todos por pasar!

4
C/C++ / Re:[Dudas] Sobre lectura de ficheros y arrays
« en: Lunes 26 de Noviembre de 2012, 02:31 »
gracias! de a poco lo veré entonces xd

5
C/C++ / [Dudas] Sobre lectura de ficheros y arrays
« en: Viernes 23 de Noviembre de 2012, 16:36 »
Hola Buenos tardes a todos! Tengo 2 dudas y espero puedan resolver, es sobre ficheros. Aquí mi primera duda:

1 - Resulta que tengo un archivo.txt con esto:

Código: [Seleccionar]
4
10
6
2
1
20
-102
43
23
65
2
10
1
-5
-10
102
85
97

Son varios números xd. Y este es mi código (funciona bien):

Código: C++
  1. #include <iostream>
  2. #include <stdio.h>
  3.  
  4. using namespace std;
  5.  
  6. #define cantidad_fila_imprimir 7
  7.  
  8. int main()
  9. {
  10.     FILE *arch_lectura;
  11.  
  12.     if ((arch_lectura = fopen("archivo.txt", "r+"))== NULL)
  13.         cout << "El Archivo no se puede leer." << endl;
  14.     else{
  15.         int cantidad = 0, numero, i = 0, j = 0;
  16.         while(fscanf(arch_lectura, "%d", &numero) != EOF) cantidad++; //cantidad elementos
  17.         rewind(arch_lectura); //Cursor al principio
  18.         int Arr[cantidad]; //Creamos el array
  19.         while(fscanf(arch_lectura, "%d", &Arr[i]) != EOF) i++; //asignamos al array cada elemento
  20.         fclose(arch_lectura); //cerramos archivo.
  21.         //Mostramos array:
  22.         for (i = 0; i<cantidad; i++){
  23.             cout << Arr[i] << "  ";
  24.             j++;
  25.             if (j == cantidad_fila_imprimir) {j = 0; cout << endl;}
  26.         }
  27.     }
  28.  
  29.     return 0;
  30. }
  31.  
  32.  

Bueno este código básicamente abre el archivo.txt para lectura, primero cuenta los elementos, posicionamos el cursor al inicio con rewind y luego los lee de nuevo ya que creamos un array con la cantidad de elementos y se los asignamos, y buno después los muestra. Ahora Mi pregunta:

¿Hay alguna forma de almacenar esos datos en algún array (para despues ordenarlos buscar menor mayor o algo así) solamente procesando el archivo una vez (No sé si con punteros o "dinámicamente" se pueda)? (Y no 2 como lo hice yo)

Ahora mi segunda pregunta:

2 - Suponiendo que tengo un archivo2.txt con esto:

Código: [Seleccionar]
2 5
3 3 4
5 5
6 10 8 6

Resulta que cada vez que uso "fscanf" automáticamente me hace un salto de linea, como podría yo leer los datos ?
Por ej:

leo el 2, y en vez de saltar de linea el cursor de mantiene al inicio del 5, y luego leo el 5. Y de alguna forma, que supongo de manera manual, salta de línea y sigue leyendo el número 3, luego el otro 3, luego el 4 y un salto de línea, y así...

Gracias ! Saludos!

6
C/C++ / Re:Resultado distinto según número decimal.
« en: Sábado 17 de Noviembre de 2012, 23:58 »
Gracias profesorX!

7
C/C++ / Resultado distinto según número decimal.
« en: Sábado 17 de Noviembre de 2012, 18:18 »
Hola a todos!  :jumpie:

Tengo una duda, resulta que este código (lo pongo después de mi pregunta), te pide un número decimal finito y positivo. Luego entra a un while hasta calcular que potencia de 10 hay que multiplicarlo, para que sea un número entero. Por ej:

(I) 12.456
(O) Hay que multiplicarlo por 1000

El problema es que si ingreso

0.07 o 1.07 (con otros números también incluidos) no devuelve 100, devuelve algo así como 2132312343 (número grande)
Pero con 2.07, 3.07, 4.07.... N.07 (N > 1) si funciona, alguien sabe por qué?

Código:

Código: [Seleccionar]
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    double numero;
    int potencia10 =1;

    do{
        cout << "Ingrese Numero: ";
        cin >> numero;
    }while(numero < 0);

    while(floor(numero) != numero){
        numero = numero*10;
        potencia10 = potencia10 * 10;
    }

    cout << "Hay que multiplicarlo por " << potencia10;
    cout << " Para que sea un numero entero" << endl;
    return 0;
}

8
C/C++ / Re:Problema con programa 1 y 0.
« en: Viernes 16 de Noviembre de 2012, 01:37 »
Si debes mostrar por pantalla " 3 * 2 * 4"
podrías contar cuantos grupos de 1 hay

En este caso hay 3, entonces crearías un Vector[3]. Y cada elemento sería por ej Vector[0] = 3 Vector[1] = 2 Vector[2] = 4. Y finalmente los multiplicarias

(Claro que si tomas lo que ingresaste como número, se guardaría sin los útimos ceros)

Lo que ingresas:  011100011000111100000
Lo que guarda: 0111000110001111

Lo otro es usar un booleano, y un indice. por ejemplo cuando indice = 0

Cuando encuentras el primer 1  (mediante el resto)  Vector[0] +=1;  y  booleano = true;
y luego entramos a un Mientras booleano = true
le suma al Vector[0] +=1; por cada uno, si encuentra un 0, entonces booleano = false;
termina el ciclo Mientras
y se le suma uno a indice, porque ahora tocara ver Vector[1]

9
C/C++ / Re:programa en c para quitar blancos al inicio y final de una cadena
« en: Sábado 10 de Noviembre de 2012, 03:53 »
Lo que puedes hacer es crear una nueva variable de tipo char que guarde los nuevos datos de la frase

Puedes hacer un while o for o el que te acomode para recorrer cada caracter de la frase "  ser o no ser  "

Y tienes que ir chequeando esto  (para el frase[0] no funcionaria tendrias que hacerlo por separado este)

por ej cuando es frase[1] chequeas
Si es una letra o algo asi  Ese caracter se añade a la nueva frase
Pero Si es un Espacio en blanco y:
Si a la derecha NO hay un espacio en blanco Y a la izquierda NO hay un espacio en blanco, significa que esta rodeado por letras
ej: "a s" . Ese caracter se añade a nueva frase (significa que seria un espacio en blanco que esta entremedio y no al inicio o final)
De caso contrario No se añade
Y así...

10
C/C++ / Re:Array a Función me cambia valor
« en: Viernes 9 de Noviembre de 2012, 22:39 »
Gracias!  :smartass:

11
C/C++ / Re:Array a Función me cambia valor
« en: Viernes 9 de Noviembre de 2012, 21:09 »
Muchas gracias profesorX

Bueno si quisiera copiar el array debería ser


memcpy(vec, rvec,sizeof(rvec));  ? 

memcpy(vec, rvec,sizeof(int) * cantidad);  ? 

O de alguna otra forma?

12
C/C++ / Array a Función me cambia valor
« en: Viernes 9 de Noviembre de 2012, 20:39 »
Hola a todos, soy Cotolon. Y tengo una duda. Bueno voy a explicar el código antes de la pregunta (después del código está la pregunta).  hace esto :

- (Input) Pide al usuario tamaño del array
- (Input) Pide al usuario introducir los valores tipo int del array
- (Output) Muestra el array
- (Output) Muestra el primer elemento sumado 2, por cada 0 que haya en el array
- (Output) Muestra el array

Código: [Seleccionar]

#include <iostream>
#include <conio.h>
using namespace std;

int suma2PrimeroPorCadaCero(int[], int);

int main()
{
    int cantidad;
    cout << "Tamanio array?: "; cin >> cantidad;
    cout << endl;
    int vec[cantidad], i;
    for(i = 0; i < cantidad; i++ )  cin >> vec[i];
    cout << endl << endl;
    //Tu vector:
    for(i = 0; i < cantidad; i++ )  cout << vec[i] << "   ";
    cout << endl << endl;
    //Primer elemento sumado 2 por cada cero
    cout << "Primer elemento: " << suma2PrimeroPorCadaCero(vec, cantidad);
    cout << endl << endl;
    //Tu vector:
    for(i = 0; i < cantidad; i++ )  cout << vec[i] << "   ";
    cout << endl << endl;

    getche();
    return 0;
}

int suma2PrimeroPorCadaCero(int arr[], int tamanio){
    for (int x = 0; x < tamanio; x++)
            if (arr[x] == 0)
                arr[0] +=2;
    return arr[0];
}


Bueno esta es mi duda:

Yo ingrese por ejemplo  6 -> 6 = tamaño array

Ingreso estos valores:  4  5   0  3   0   0

Me muestra el array: 4  5   0  3   0   0

Hay 3 ceros así que suma +6 al 4.

Muestra Primer elemento array:  10

Muestra el array  10  5   0  3   0   0

El problema aquí, es que creo que el parámetro "arr[]" está funcionando como un puntero ya que me cambia el valor del primer elemento de 4 a 10.
¿Hay alguna forma de pasar el array "vec" a la función, sin que me cambie el valor de algún elemento de "vec"

La única solución por ahora que hice fue en main crear un "rvec" que sería un array de respaldo que contiene los valores de "vec" y después de llamar a la función, le asignaría a los valores de "vec" los valores de "rvec"

Gracias a todos por pasar y comentar

Páginas: [1]