Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Asignar numeros a un vector

Estas en el tema de Asignar numeros a un vector en el foro de C/C++ en Foros del Web. Hola! necesito meter en un vector, una cantiad X de numeros (los que el usuario inmgrese) por ejem: el usuario ingresa 12345 quiero asignar cada ...
  #1 (permalink)  
Antiguo 11/07/2013, 18:02
 
Fecha de Ingreso: julio-2010
Mensajes: 191
Antigüedad: 13 años, 9 meses
Puntos: 2
Asignar numeros a un vector

Hola!

necesito meter en un vector, una cantiad X de numeros (los que el usuario inmgrese)

por ejem: el usuario ingresa 12345

quiero asignar cada numero en un vector, de modo que quede asi en el vector:

| 1 | 2 | 3 | 4 | 5 |

llevo 1 hora y no le encuentro la logica, sera que hay una funcion para eso?
  #2 (permalink)  
Antiguo 12/07/2013, 08:13
Avatar de LydiaH  
Fecha de Ingreso: julio-2013
Ubicación: Ávila, España
Mensajes: 15
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Asignar numeros a un vector

Hola, buenas tardes!!
Bueno voy a intentar ayudarte aunque en realidad no tengo claro un par de cosas que pones.
No entiendo si te refieres a que el usuario va introduciendo uno por uno cada número que se inserta a continuación en el vector o que el usuario inserta un número por ejemplo el 13453 (todo seguido) y tienes que separar los números para introducirlos en el vector. Aún así te explicaré como haría yo ambos casos.

A) El usuario ingresa uno por uno cada número:
Bien, esté caso es muy sencillo unicamente tienes que declarar un vector, e ir asignando a cada posición del vector los números introducidos por teclado.

Código C:
Ver original
  1. #include <stdio.h>
  2. #define DIM 4
  3.  
  4. int main (void)
  5. {
  6.     //Declaración de variables
  7.     int vector[DIM];
  8.     int i=0;
  9.    
  10.     //Petición de datos al usuario
  11.     for(i=0; i<DIM; i++)
  12.      {
  13.       printf("Introduce el numero %d:", i+1);
  14.       scanf("%d", &vector[i]);
  15.       }
  16.      
  17.      //Mostramos el vector
  18.      printf("Vector:");
  19.      for(i=0; i<DIM; i++)
  20.       printf(" %d", vector[i]);
  21.  
  22. getch();
  23. return 0;
  24. }

B)El usuario introduce un número (de varias cifras) y a cada posición del vector hay que asignarle una cifra del número.
Este planteamiento es un poco más complejo. Lo primero que hay que realizar es separar el numero por cifras (unidades, decenas, centenas, unidades de millar....) ese procedimiento se puede realizar utilizando el operador modulo (%) el módulo lo que hace es realizar una división y quedarse con el resto de la división. Para ello también tenemos que utilizar una variable temporal. Para finalizar lo único que hay que hacer es asignar cada cifra del número a un elemento del vector.
Código C:
Ver original
  1. #include <stdio.h>
  2. #define DIM 4
  3.    
  4.     int main()
  5.     {  
  6.         //Declaración de variables
  7.         int numero;
  8.         int vector[DIM];
  9.         int unidades=0, decenas=0, centenas=0, millar=0;
  10.         int temporal=0;
  11.         int i=0;
  12.      
  13.         //Petición del numero
  14.         do
  15.         {
  16.           printf("Introduce un numero:");
  17.           scanf("%d", &numero);
  18.           if(numero > 9999)
  19.            printf("El numero no es valido\n");
  20.         }while(numero>9999);
  21.      
  22.         /*Dividimos el número en unidades, decenas centenas y unidades de millar
  23.         en el caso de este programa como mucho trabajamos con números de 4 cifras*/
  24.         unidades = numero %10;
  25.         temporal = numero /10;
  26.      
  27.         decenas= temporal %10;
  28.         temporal = temporal /10;
  29.      
  30.         centenas= temporal%10;
  31.         millar = temporal /10;
  32.      
  33.         //Asignamos a cada posición del vector una cifra del numero
  34.         vector[0]= millar;
  35.         vector[1]= centenas;
  36.         vector[2]= decenas;
  37.         vector[3]= unidades;
  38.      
  39.         //Imprimimos el vector
  40.         printf("Vector");
  41.         for(i=0; i<4; i++)
  42.           printf(" %d", vector[i]);
  43. getch();
  44. return 0;
  45. }

Otra forma de realizar la segunda opción, se basa también en el algoritmo que use anteriormente de descomponer el número, pero ahora utilizamos un bucle for para realizar la descomposición puesto que así no tendremos que utilizar más variables si los números son de más dígitos (directamente lo guardamos en el vector, sin utilizar variables como "unidades", "decenas"....). Lo único "malo" del siguiente código es que hay que pedir la longitud (número de cifras) que tendrá el número. Se podrían implementar códigos que lo calculasen pero eso ya te lo dejo a tí.
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3.    
  4.     int main()
  5.     {  
  6.         //Declaración de variables
  7.         int numero=0;
  8.         int dimension=0;
  9.         int temporal=0;
  10.         int i=0;
  11.         int contador=0;
  12.      
  13.         //Petición de la dimensión del vector y el número que utilizaremos
  14.           printf("Introduce la dimension:");
  15.           scanf("%d", &dimension);
  16.          
  17.           printf("Introduce un numero:");
  18.           scanf("%d", &numero);
  19.          
  20.           //Declaración del vector
  21.           int vector[dimension];
  22.          
  23.           //En la primera posición del vector almacenamos el primer dígito las uidades
  24.           vector[0] = numero %10;
  25.           temporal = numero /10;
  26.        
  27.           //Con un bucle continuamos almacenando las siguientes cifras
  28.           for(i=1; i<=dimension; i++)
  29.           {
  30.            contador++; //Utilizamos un contador que se incremente para poder imprimir el vector
  31.            vector[i]= temporal %10;
  32.            temporal = temporal /10;
  33.           }
  34.        
  35.          //Imprimimos el vector
  36.          printf("Vector");
  37.          
  38.          /*Imprimimos el vector hacia atrás puesto que las unidades ocupan la primera posición*/
  39.          for(i=contador-1 ;i>=0 ; i--)
  40.            printf(" %d", vector[i]);
  41. getch();
  42. return 0;
  43. }

Última edición por LydiaH; 12/07/2013 a las 08:38
  #3 (permalink)  
Antiguo 12/07/2013, 12:53
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Asignar numeros a un vector

Una cosa sobre la propuesta B:

Código C++:
Ver original
  1. printf("Introduce la dimension:");
  2. scanf("%d", &dimension);
  3. printf("Introduce un numero:");
  4. scanf("%d", &numero);
  5.  
  6. //Declaración del vector
  7. int vector[dimension];//<< quiero comentar esto
  8.  
  9. //En la primera posición del vector almacenamos el primer dígito las uidades
  10. vector[0] = numero %10;
  11. temporal = numero /10;

Y como sabes si la aplicacion pudo bloquear memoria suficiente para el vector de 'dimension' enteros? Creo haber leido por ahi algo acerca de los arrays de dimension variable que fueron aceptados en C, propuestos en C++ pero finalmente se desestimo la idea aun cuando algunos compiladores permitieron su uso, lo pongo de memoria sería cuestion de buscar.

Alternativamente puedes usar 'new' y 'delete', o un objeto 'vector' (o lista o lo que quieras).

Otra cosa, usa 'getchar()' en vez de 'getch()' :)

Saludos
vosk
  #4 (permalink)  
Antiguo 12/07/2013, 13:06
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 3 meses
Puntos: 46
Respuesta: Asignar numeros a un vector

Puedes usar lo de las variables de dimension variable, aunque si mal no recuerdo es solo de C99 así que tendras que decirle eso al compilador.

Otra cosa que puedes hacer es usar memoria dinamica y añadir un espacio de memoria para cada numero segun los que haya, pero me parece que sería complicarse la vida para no acabar logrando nada xDD
  #5 (permalink)  
Antiguo 12/07/2013, 13:18
Avatar de LydiaH  
Fecha de Ingreso: julio-2013
Ubicación: Ávila, España
Mensajes: 15
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Asignar numeros a un vector

Hola Vosk! gracias por la información la verdad no sé si se podrá hacer así yo siempre he pensado que sí. De todas maneras aún me queda mucho que aprender no tengo ni un año de experiencia estoy empezando. Aquí es verdad que estoy aprendiendo bastante, por ejemplo, este año he tenido una profesora que sí me decía que tenia que poner fflush (stdin) ahora me encuentro aquí que es mejor no usarlo (?) Lo de getch(); igual, siempre he usado getch(); nunca me ha dado ningun problema, supongo que me propones getchar(); por algún motivo en especial, pero la verdad siempre me han dicho que ponga getch(); y no entiendo que diferencia puede haber entre usar getch(); y getchar(), con el fin de que se realice una pausa. De todas maneras gracias! ;) lo tendré en cuenta.

La verdad es que ahora que me fijo eso no lo he hecho nunca =S, funcionar funciona lo he comprobado pero que sea correcto no lo sé me resulta extraño.
Lo he modificado usando memoria dinámica que se supone que es lo normal si la dimensión del vector se obtiene por teclado:

Código C:
Ver original
  1. #include <stdio.h>
  2.    
  3.     int main()
  4.     {  
  5.         //Declaración de variables
  6.         int numero=0;
  7.         int *vector;
  8.         int temporal=0;
  9.         int i=0;
  10.         int contador=0;
  11.         int dimension=0;
  12.      
  13.         //Petición de la dimensión del vector y el número que utilizaremos
  14.           printf("Introduce la dimension:");
  15.           scanf("%d", &dimension);
  16.          
  17.           printf("Introduce un numero:");
  18.           scanf("%d", &numero);
  19.          
  20.           //Asignación de memoria dinamica
  21.           vector=(int*) malloc(dimension*sizeof(int));
  22.          
  23.          
  24.           //En la primera posición del vector almacenamos el primer dígito las unidades
  25.           vector[0] = numero %10;
  26.           temporal = numero /10;
  27.        
  28.           //Con un bucle continuamos almacenando las siguientes cifras
  29.           for(i=1; i<=dimension; i++)
  30.           {
  31.            contador++; //Utilizamos un contador que se incremente para poder imprimir el vector
  32.            vector[i]= temporal %10;
  33.            temporal = temporal /10;
  34.           }
  35.        
  36.          //Imprimimos el vector
  37.          printf("Vector");
  38.          
  39.          /*Imprimimos el vector hacia atrás puesto que las unidades ocupan la primera posición*/
  40.          for(i=contador-1 ;i>=0 ; i--)
  41.            printf(" %d", vector[i]);
  42. getch();
  43. return 0;
  44. }

¿Así esta bien?

PD: he ejecutado el programa utilizando getchar(); en vez de getch(); y la pantalla de ejecución se cierra inmediatamente una vez muestra el último printf... ¿Qué puede ser?¿Entonces?.... Uso getch(); o getchar(); ?

Última edición por LydiaH; 12/07/2013 a las 13:41
  #6 (permalink)  
Antiguo 12/07/2013, 14:35
 
Fecha de Ingreso: julio-2010
Mensajes: 191
Antigüedad: 13 años, 9 meses
Puntos: 2
Respuesta: Asignar numeros a un vector

hey gracias por su ayuda, ya me dio la logica :)
  #7 (permalink)  
Antiguo 12/07/2013, 15:16
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Asignar numeros a un vector

Cita:
Iniciado por LydiaH Ver Mensaje
Lo de getch(); igual, siempre he usado getch(); nunca me ha dado ningun problema, supongo que me propones getchar(); por algún motivo en especial, pero la verdad siempre me han dicho que ponga getch(); y no entiendo que diferencia puede haber entre usar getch(); y getchar(), con el fin de que se realice una pausa. De todas maneras gracias! ;) lo tendré en cuenta.


PD: he ejecutado el programa utilizando getchar(); en vez de getch(); y la pantalla de ejecución se cierra inmediatamente una vez muestra el último printf... ¿Qué puede ser?¿Entonces?.... Uso getch(); o getchar(); ?
En mi compilador getch no existe. Eso es porque es una función nativa de borland. y no te va a servir si cambias de compilador. En cambio getchar si esta en el standar de C y debería estar en todos los compiladores.
  #8 (permalink)  
Antiguo 12/07/2013, 15:57
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Asignar numeros a un vector

@L3m0n: "Puedes usar lo de las variables de dimension variable, aunque si mal no recuerdo es solo de C99 así que tendras que decirle eso al compilador."

Y tambien tendras que decirle al tio que te compra la aplicacion que es posible que finalice de forma inesperada debido a una sobrecarga del stack :)) Bueno, hasta donde yo se no es posible en C saber la disponibilidad de memoria para las variables bloqueadas por la propia aplicacion, tal vez haya alguna solucion que desconozco tal como el malloc y el new(nothrow) retornan nulo y puedo checar ese error.


@LydiaH: "¿Así esta bien?"

No es eso a lo que me refiero, sino a comprobar que realmente se pudo bloquear la memoria requerida; si declaras variables de longitud estatica (variables normales para entendernos) la condicion de memoria disponible se comprueba al cargar la aplicacion (no se si lo hara el s.o. o quien sea), saltando una alerta (o algo) indicando que no hubo suficiente memoria para lanzar la aplicacion. En caso que uses VLA (esto de los arrays de longitud variable), la aplicacion inicia correctamente, se pide bloquear x tamaño pero no se sonsigue y se intenta escribir en algun elemento de la memoria no disponible para la aplicacion. En la correccion que hiciste:

Código C:
Ver original
  1. if(!(vector = malloc(dimension*sizeof(int)))) {
  2.     //error, memoria no disponible
  3. }
  4. else {
  5.     //trabajas con el array
  6.     //y lo liberas cuando ya no lo necesitas
  7.     free(vector);
  8.  
  9.     //y si quieres reusarlo asignas nulo
  10.     vector = 0;
  11. }


@LydiaH: "he ejecutado el programa utilizando getchar(); en vez de getch(); y la pantalla de ejecución se cierra inmediatamente una vez muestra el último printf... ¿Qué puede ser?¿Entonces?.... Uso getch(); o getchar(); ?"

'getch' no es estandar y está prototipada en la cabecera conio.h que tampoco es estandar; 'getchar' es estandar y esta prototipada en stdio.h De todas formas el funcionamiento interno es diferente: getch no requiere enter (salto de linea) para leer los datos entrados por teclado, mientras que getchar si. De todas formas ese no es el problema que se te plantea: la funcion 'scanf' lee datos del stdin hasta dar con un salto de linea (la tecla enter con la que dices 'aceptar'), dejando el la cola del stdin un salto de linea en primera posicion, luego cuando llamas al 'getchar()' encuentra enseguida un salto de linea y finaliza la aplicacion. Una solucion es vaciar el buffer de entrada (ojo como muy bien dices sin fflush ya que el comportamiento de esa funcion con el stream de entrada no está definido, es decir en algunos s.o. funciona y en otros no).


@l222p: "ya me dio la logica :)"

Pero estas en C o en C++? Lo de las VLA solo compila en C (C99, y creo haber visto que para compiladores gcc tambien en C++). Lo de malloc/free es de C (tambien funciona en c++ siempre que no haya objetos de por medio); en c++ seria mejor usar new/delete, al igual que cin/cout para leer/escribir; que sentido tendria usar toda la sintaxi de C compilandola como C++?


Saludos
vosk
  #9 (permalink)  
Antiguo 12/07/2013, 16:20
Avatar de LydiaH  
Fecha de Ingreso: julio-2013
Ubicación: Ávila, España
Mensajes: 15
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Asignar numeros a un vector

Okey! vale, entendido.
Sí Sam90 yo entiendo que en algunos compiladores no getch no exista y que por tanto sea más conveniente utilizar getchar(), el problema es que a mi nunca me han explicado estas historias, la programación en C es bastante amplia.. y claro... pues a mi me han dicho desde un principio pon getch() al final de un programa, a mi me funciona en mi compilador y yo no me planteo poner otra cosa si a mi me funciona. ¿Cómo iba a saber yo que getch() no es estandar....? Pero bueno muchas gracias, poco a poco voy sabiendo más. Muchas gracias también a tí vosk por toda la dedicación que has tenido para explicarmelo todo! oyeee podrias ser profesor! (aunque quizas ya lo eres jaja) Bueno lo dicho muchas gracias por las explicaciones, gracias por ayudarme e intentaré cambiarlo pero tened un poco de paciencia conmigo... Cuesta quitarse las costumbres.

Vosk me podrías poner un ejemplo.. de como cerrar un programa usando getchar(); y vaciando el buffer sin usar fflush? porfi..? Te lo agradecería mucho, solo esas lineas no necesito todo el código de un programa. Es que no lo veo muy claro.

Ah si Vosk!! y lo de liberar la memoria, es verdad... Siempre me lo olvido, bueno en realidad esta vez no lo olvidé, no lo puse por pereza... pero lo pondré, lo pondré

Hay una cosa que no entiendo del codigo que me has puesto:
Código C:
Ver original
  1. if(!(vector = malloc(dimension*sizeof(int))))

si (vector=malloc(dimension*sizeof(int)) es distinto? Distinto? a que?? Se puede poner simplemente "!"?
yo siempre pongo :
Código C:
Ver original
  1. if((vector=malloc(dimension*sizeof(int))!=NULL);

Última edición por LydiaH; 12/07/2013 a las 16:25
  #10 (permalink)  
Antiguo 13/07/2013, 06:35
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Asignar numeros a un vector

Creo que todo esto requiere otro hilo, ademas no soy el unico que te pueda ayudar con eso, de echo los demas foreros 'habituales' saben tanto y mas que yo que solo estoy de hobby :)

Saludos
vosk
  #11 (permalink)  
Antiguo 13/07/2013, 06:47
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 3 meses
Puntos: 46
Respuesta: Asignar numeros a un vector

A grandes rasgos, el parametro NULL se define como 0 en la mayoría de compiladores modernos.
Por otro lado debemos saber que como en C no hay valores booleanos, se usa el 0 y el 1 (o cualquier otro numero) por tanto para C, 0 es false y por tanto si yo pongo !0 eso sera true. Por tanto si yo pongo ! a una expresion que espero que sea falsa, pasara a ser cierta y así puedo comprovar si hay un error, como en este caso.
  #12 (permalink)  
Antiguo 13/07/2013, 07:19
Avatar de LydiaH  
Fecha de Ingreso: julio-2013
Ubicación: Ávila, España
Mensajes: 15
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Asignar numeros a un vector

Vale, gracias de todas maneras vosk.
L3m0n, muchas gracias ya lo pille. No es tan complicado! Son tantas cosas que se me olvidan detalles así!
Bueno ya no os molesto mas , muchas gracias a los dos.
Un saludo.
  #13 (permalink)  
Antiguo 18/07/2013, 06:36
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: Asignar numeros a un vector

Cita:
Iniciado por LydiaH Ver Mensaje
Okey! vale, entendido.
Sí Sam90 yo entiendo que en algunos compiladores no getch no exista y que por tanto sea más conveniente utilizar getchar(), el problema es que a mi nunca me han explicado estas historias, la programación en C es bastante amplia.. y claro... pues a mi me han dicho desde un principio pon getch() al final de un programa, a mi me funciona en mi compilador y yo no me planteo poner otra cosa si a mi me funciona. ¿Cómo iba a saber yo que getch() no es estandar....? Pero bueno muchas gracias, poco a poco voy sabiendo más. Muchas gracias también a tí vosk por toda la dedicación que has tenido para explicarmelo todo! oyeee podrias ser profesor! (aunque quizas ya lo eres jaja) Bueno lo dicho muchas gracias por las explicaciones, gracias por ayudarme e intentaré cambiarlo pero tened un poco de paciencia conmigo... Cuesta quitarse las costumbres.
El mayor problema de no seguir el estándar esque el código de aplicación solo te servirá para Windows y bajo tu compilador. Si sigues el estándar te servirá para cualquier SO (Windows,Linux,Mac) y para cualquier compilador.

Además de eso, no deberías usar devcpp (tengo la intuición de que lo usas ;)):
http://foro.elhacker.net/programacio...t385150.0.html
  #14 (permalink)  
Antiguo 18/07/2013, 07:39
Avatar de LydiaH  
Fecha de Ingreso: julio-2013
Ubicación: Ávila, España
Mensajes: 15
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Asignar numeros a un vector

Cita:
Iniciado por amchacon Ver Mensaje
El mayor problema de no seguir el estándar esque el código de aplicación solo te servirá para Windows y bajo tu compilador. Si sigues el estándar te servirá para cualquier SO (Windows,Linux,Mac) y para cualquier compilador.

Además de eso, no deberías usar devcpp (tengo la intuición de que lo usas ;)):
[url]http://foro.elhacker.net/programacion_cc/iquestpor_que_no_deberias_usar_el_devcpp-t385150.0.html[/url]
Gracias por la aclaración ya lo tengo más claro. La verdad es que si uso el dev-c++ pero lo uso porque es el que conozco y el que me exigían aprender a usar para programación I y II supongo que habrá mas y mejores pero ya tendré tiempo de dwscubrirlos mi objetivo principal es aprender a programar en C ( el curso pasado) que este mejor o peor que otro pues me parece importante pero para mi su importancia es secundaria
Aun así gracias por el consejo

Etiquetas: funcion, numeros, vector
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:28.