• Viernes 1 de Noviembre de 2024, 18:33

Autor Tema:  Rellenar vector sin repetir  (Leído 14357 veces)

Gussr78

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Rellenar vector sin repetir
« en: Sábado 1 de Enero de 2011, 19:56 »
0
Hola, el caso es que estoy intentando enteder los vectores, y quiero rellenar manualmente un vector introduciendo números y comprobando que no se repitan.

Lo que tengo y que no me funciona es esto. A ver si alguien me puede ayudar y explicar se lo agradezco.

Código: C
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int main(){
  6.  
  7.   typedef int numeros[10];
  8.   int num,temp;
  9.   numeros misnumeros;
  10.  
  11.  
  12.   for (int i=0;i<11;i++){
  13.     misnumeros[i]=0;
  14.   }
  15.   num=0;
  16.  
  17.   while (num<10){ /*comienzo a introducir números*/
  18.   printf("introduzca un numero: ");
  19.   scanf("%d",&temp); /*Lo guardo en temp para comparar con los datos del vector*/
  20.      for (int i=0;i<=num;i++){ /*Comprobar si ya existe*/
  21.      while ((temp==misnumeros[i])!=0){
  22.     printf ("El numero existe, introduzca otro numero: ");
  23.     scanf ("%d",&temp);
  24.     printf ("El  numero temp vale %2d.n",temp);
  25.   }
  26. }
  27.   misnumeros[num]=temp; /*Si no existe pasamos el valor al vector*/
  28.   num++;
  29. }
  30. for (int i=0;i<10;i++){
  31.     printf ("los numero son: %2d.n",misnumeros[i]);
  32.   }
  33.   system("pause");
  34. }
  35.  
  36.  

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Rellenar vector sin repetir
« Respuesta #1 en: Sábado 1 de Enero de 2011, 20:12 »
0
Siempre es aconsejable que indiques concretamente qué problema te está dando.

Para comprobar, es así:
Código: C
  1. while (temp==misnumeros[i])
  2.  
Aparte, fíjate que cuando encuentras un número repetido, al pedir otra vez el número, no vuelves a comprobar que no esté ya en el vector. Sólo compruebas esa misma posición.

Código: C
  1. while (temp==misnumeros[i]){
  2.     printf ("El numero existe, introduzca otro numero: ");
  3.     scanf ("%d",&temp);
  4.     printf ("El  numero temp vale %2d.n",temp);
  5. }
  6.  
Además, deberías estructurar más tu código para que sea más legible. Tal y como lo tienes es un caos. ¿Has utilizado funciones alguna vez?

Saludos

Gussr78

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Rellenar vector sin repetir
« Respuesta #2 en: Sábado 1 de Enero de 2011, 20:24 »
0
Hola, gracias por responder. La verdad es que llevo muy poco tiempo aprendiendo y además de forma autodidacta. En cuanto a las funciones si las he usado, pero en este caso solo estoy intentando entender para luego desarrollarlo mas estructurado y seguro que con funciones como túdices.

Ya veo lo que me comentas de no comparar nuevamente cuando se introduce un nuevo valor, pero no se me ocurre como hacerlo sin repetir todo desde el for, a lo mejor ahí es donde dices de poner funciones??, si me puedes dar una idea te lo agradezco.

Saludos.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Rellenar vector sin repetir
« Respuesta #3 en: Domingo 2 de Enero de 2011, 09:19 »
0
Ahí va un ejemplo:

Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. // Devuelve la posición del número en el vector
  5. // -1 si no se encuentra
  6. // num: número a buscar
  7. // misnumeros: vector en el que buscar
  8. // tam_vector: tamaño del vector a buscar
  9. int posicion_numero_vector(const int num, const int vec[], const unsigned int tam_vector)
  10. {
  11.     int pos = -1;
  12.     int i = 0;
  13.     while(i < tam_vector)
  14.     {
  15.         if (vec[i] == num)
  16.         {
  17.             pos = i;
  18.             i = tam_vector;
  19.         }
  20.         else
  21.         {
  22.             i++;
  23.         }
  24.     }
  25.  
  26.     return pos;
  27. }
  28.  
  29. int main()
  30. {
  31.     int misnumeros[10];
  32.     int i, num, temp;
  33.  
  34.     for (i=0;i<10;i++){
  35.         misnumeros[i]=0;
  36.     }
  37.  
  38.     num=0;
  39.  
  40.     while (num<10){
  41.         printf("introduzca un numero: ");
  42.         scanf("%d",&temp); /*Lo guardo en temp para comparar con los datos del vector*/
  43.         for (i=0;i<=num;i++){ /*Comprobar si ya existe*/
  44.             while (posicion_numero_vector(temp, misnumeros, sizeof(misnumeros)/sizeof(int)) >= 0){
  45.             //while (temp==misnumeros[i]){
  46.                 printf ("El numero existe, introduzca otro numero: ");
  47.                 scanf ("%d",&temp);
  48.                 printf ("El  numero temp vale %2d.n",temp);
  49.             }
  50.         }
  51.         misnumeros[num]=temp; /*Si no existe pasamos el valor al vector*/
  52.         num++;
  53.     }
  54.  
  55.     for (i=0;i<10;i++){
  56.         printf ("los numero son: %2d.n",misnumeros[i]);
  57.     }
  58.  
  59.     system("pause");
  60. }
  61.  

LapizTolita

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Rellenar vector sin repetir
« Respuesta #4 en: Sábado 8 de Enero de 2011, 12:12 »
0
Una recomendación usar getchar(); en vez de system("pause"); por que? simplemente porque llamar al sistema es costoso tener que guardar en contexto hacer el pedido, si trabajas en otro sistema operativo puede que no funcione y aparte es inseguro.

Gussr78

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Rellenar vector sin repetir
« Respuesta #5 en: Domingo 9 de Enero de 2011, 12:10 »
0
Gracias por vuestras respuestas.

En cuanto a usar getchar(), no se por que puede ser que no me lo ejecuta, se cierra el programa y ya está. No se si es que me falta algo mas que poner.

En fin, gracias.

LapizTolita

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Rellenar vector sin repetir
« Respuesta #6 en: Jueves 13 de Enero de 2011, 10:02 »
0
Quiza te queda lleno el buffer te doy 2 opciones

Alternativa windows

Código: C++
  1. #include <windows.h>
  2. #define PAUSA printf("nPulse enter para continuar");
  3.     getch();
  4. int getch(void)
  5. {
  6.   int caracter;
  7.   DWORD leidos, modo;
  8.  
  9.   GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &modo);
  10.   SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), modo & !ENABLE_ECHO_INPUT & !ENABLE_PROCESSED_INPUT);
  11.   ReadConsole(GetStdHandle(STD_INPUT_HANDLE), &caracter, 1, &leidos, NULL);
  12.   SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), modo);
  13.   return caracter;
  14. }
  15.  
  16.  

O podes usar la misma macro pero llamando a esta función para limpiar el buffer que es mas portable, además te va a servir para otros momentos que necesites vaciar el buffer del teclado.

Código: C++
  1.  
  2. #include <unistd.h>
  3. #include <errno.h>
  4. #include <fcntl.h>
  5. #define PAUSA printf("nPulse enter para continuar");
  6.      stdin_flush();
  7.      getchar();
  8. int stdin_flush(){
  9.   char buf[64];
  10.   unsigned int bytes_read;
  11.   char flag;
  12.  flag = fcntl(0, F_SETFL, O_NONBLOCK);
  13.  if(flag == -1){
  14.    return flag;
  15.  }
  16.  while(1){
  17.     bytes_read = read(0, buf, sizeof(buf));
  18.     if(bytes_read == 0){
  19.      flag = fcntl(0, F_SETFL, O_SYNC);
  20.     return flag;
  21.     }
  22.     if(bytes_read == -1){
  23.       if(errno = EWOULDBLOCK){
  24.         fcntl(0, F_SETFL, O_SYNC);
  25.         return flag;
  26.       }
  27.       write(2, "Error #%d while reading stdinn", errno);
  28.       flag = fcntl(0, F_SETFL, O_SYNC);
  29.       return -1;
  30.     }
  31.   }
  32. }
  33.  
  34.  

Podrías usar fflush(stdin); pero también podrías freír huevos con aceite del auto  :rolleyes:

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Rellenar vector sin repetir
« Respuesta #7 en: Jueves 13 de Enero de 2011, 10:26 »
0
Le complicas la vida demasiado al chaval sólo por algo insignificante como que no se cierre la ventanita  :ph34r: Y encima le dices que no es portable, pero le plantas un getchar() con WinAPIs  :P

Eso de cerrarse la ventana es simplemente porque lo lanzas desde el IDE en una ventana externa. Si abres un terminal Windows y lanzas el programa verás que no se cierra (o si usas otro IDE que tenga consola integrada, por ejemplo Eclipse, tampoco lo necesitas).  Es algo que no tiene relevancia ni importancia, realmente, como para estar dándole tantas vueltas.

Saludos

LapizTolita

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Rellenar vector sin repetir
« Respuesta #8 en: Jueves 13 de Enero de 2011, 14:26 »
0
Bueno veo que te molesto que un random como yo te de sugerencias sobre como programar, te juro que cuando postie lo de la portabilidad era para darle al pibe ese una sugerencia que a mi me habían dado (si soy algo nuevo en esto de la programación)

Otra cosa no sé porque decís que  
Cita de: "m0skit0"
Y encima le dices que no es portable, pero le plantas un getchar() con WinAPIs  :P  
Siendo que ahí aclaro que esa es la alternativa Windows y por eso le doy 2 alternativas. Capaz que si hubieras leido por lo menos lo que escribí antes de responderme te hubieras dado cuenta de que la función que esta implementada con WinAPIs es getch() que por cierto en el único lugar que es "nativa" es en borland, y que puse:
Cita de: "lapiztolita"
O podes usar la misma macro pero llamando a esta función para limpiar el buffer que es mas portable, además te va a servir para otros momentos que necesites vaciar el buffer del teclado.
Ahí claramente expreso que podes usar la misma macro, oh wait!! si era "mas portable" como usar el getch() implementado con WinAPIs ? claro está que es un getchar(); pero bueno de esos detalles se dan cuenta los que leen por lo menos una vez el post.

Además yo pruebo todo lo que le digo no escribo porque si nada más, si dije que era más portable fue porque lo probé en ubuntu también.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Rellenar vector sin repetir
« Respuesta #9 en: Jueves 13 de Enero de 2011, 17:58 »
0
Cita de: "LapizTolita"
Bueno veo que te molesto que un random como yo te de sugerencias sobre como programar
:huh:  :lol:  :P