• Lunes 29 de Abril de 2024, 22:45

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.


Temas - cotolon

Páginas: [1]
1
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!

2
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!

3
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;
}

4
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]