|
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
« en: Jueves 6 de Diciembre de 2012, 19:37 »
Me ha servido gracias lo probé y si la lista me quedo como (Numero*) 0x0, ya que es nula. Gracias
2
« 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/1v25KeV2Es largo el código (200 líneas) por eso lo dejo por pastebin.
3
« 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: #include <iostream> #include <cstdlib> using namespace std; struct numero{ int dato; //valor del numero numero *sig; //nodo al q apunta }; typedef struct numero Numero; void ingresarNumero(Numero **); //puntero q recorrerá para insetar valor void mostrarNumeros(Numero *); //mostrar valores void eliminarNumero(Numero *); //eliminar valor segun posición int main() { int opcion = 4; Numero *lista = NULL; //primer elemento de la lista vacia do{ system("CLS"); cout << "1.- Ingresar Dato." << endl; cout << "2.- Mostrar Datos." << endl; cout << "3.- Eliminar Dato." << endl; cout << "4.- Salir." << endl; cout << "--> "; cin >> opcion; cout << endl; switch(opcion){ case 1: ingresarNumero(&lista); break; case 2: mostrarNumeros(lista); break; case 3: eliminarNumero(lista); break; } }while(opcion!=4); cout << "Nos vemos!" << endl; return 0; } void ingresarNumero(Numero **primerNumero){ Numero *nuevoNumero = new Numero; //reservamos memoria int nuevoDato; //el dato if (nuevoNumero == NULL){cout << "No se pudo reservar Memoria. " << endl;} else{ cout << "Si se pudo reservar memoria. Direccion: " << nuevoNumero << endl << endl; cout << "Ingrese nuevo numero: "; cin >> nuevoDato; nuevoNumero->dato = nuevoDato; //Le asignamos el nuevo dato. nuevoNumero->sig = NULL; //el siguiente es nulo //Si la lista esta vacia: if (*primerNumero == NULL) {*primerNumero = nuevoNumero;} else{ //si no esta vacia Numero *ptr = *primerNumero; while(ptr->sig != NULL) ptr = ptr->sig; // avanza al siguiente nodo // el nodo encontrado es no vacio pero el siguiente es nulo. ptr->sig = nuevoNumero; //el nodo sgte nulo toma la direccion de nuevo numero } } cout << endl; system("pause"); } void mostrarNumeros(Numero *ptr){ if (ptr == NULL) cout << "La Lista esta Vacia." << endl << endl; else { while(ptr!=NULL){ //mientras el nodo sgte no sea nulo muestra el dato del nodo actual. cout << ptr->dato << " "; ptr = ptr->sig; // avanza al sgte nodo } cout << endl << endl; } system("pause"); } void eliminarNumero(Numero *ptr){ }
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: void ingresarNumero(Numero *ptr){ Numero *nuevoNumero = new Numero; //reservamos memoria int nuevoDato; //el dato if (nuevoNumero == NULL){cout << "No se pudo reservar Memoria. " << endl;} else{ cout << "Si se pudo reservar memoria. Direccion: " << nuevoNumero << endl << endl; cout << "Ingrese nuevo numero: "; cin >> nuevoDato; nuevoNumero->dato = nuevoDato; //Le asignamos el nuevo dato. nuevoNumero->sig = NULL; //el siguiente es nulo //Si la lista esta vacia: if (ptr == NULL) {ptr = nuevoNumero;} else{ //si no esta vacia while(ptr->sig != NULL) ptr = ptr->sig; // avanza al siguiente nodo // el nodo encontrado es no vacio pero el siguiente es nulo. ptr->sig = nuevoNumero; //el nodo sgte nulo toma la direccion de nuevo numero } } cout << endl; system("pause"); }
Gracias a todos por pasar!
4
« en: Lunes 26 de Noviembre de 2012, 02:31 »
gracias! de a poco lo veré entonces xd
5
« 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: 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): #include <iostream> #include <stdio.h> using namespace std; #define cantidad_fila_imprimir 7 int main() { FILE *arch_lectura; if ((arch_lectura = fopen("archivo.txt", "r+"))== NULL) cout << "El Archivo no se puede leer." << endl; else{ int cantidad = 0, numero, i = 0, j = 0; while(fscanf(arch_lectura, "%d", &numero) != EOF) cantidad++; //cantidad elementos rewind(arch_lectura); //Cursor al principio int Arr[cantidad]; //Creamos el array while(fscanf(arch_lectura, "%d", &Arr[i]) != EOF) i++; //asignamos al array cada elemento fclose(arch_lectura); //cerramos archivo. //Mostramos array: for (i = 0; i<cantidad; i++){ cout << Arr[i] << " "; j++; if (j == cantidad_fila_imprimir) {j = 0; cout << endl;} } } return 0; }
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: 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
« en: Sábado 17 de Noviembre de 2012, 23:58 »
Gracias profesorX!
7
« en: Sábado 17 de Noviembre de 2012, 18:18 »
Hola a todos! 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: #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
« 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
« 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
« en: Viernes 9 de Noviembre de 2012, 22:39 »
Gracias!
11
« 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
« 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
#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]
|
|
|