Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 7hongo7 en 17 Febrero 2013, 03:15 am



Título: problema l requerir números
Publicado por: 7hongo7 en 17 Febrero 2013, 03:15 am
Hola aqui ando de nuevo con mis dudas sobre programacion jejejeje :huh: :huh: :huh: :huh:
bueno espero me entiendan asi voy a plantear el problema:
Tengo un entero I que va de 1 hasta 1000 y enteros N1,N2,...,Nn el punto es que tengo que introducir un valor I por ejemplo 5 y despues introducir 5 valores de N, y después correr de nuevo el programa y si quiero pedir que I sea 7 e introducir 7 valores de N, osea que yo pueda meter cualquier numero e introducir esa cantidad de numeros.

osea
4
1 1 1 1     ó

5
6 3 4 5 2   ó

2
2 1

No se si me supe entender me dijeron que era con un ciclo while o for pero esa es mi duda como hacer que solamente meta los valores que me piden sin mas ni menos


Título: Re: problema l requerir números
Publicado por: engel lex en 17 Febrero 2013, 03:43 am
que llevas de código? en donde exactamente es tu duda?

por lo que entiendo con vectores y un while deberia bastar


Título: Re: problema l requerir números
Publicado por: BatchianoISpyxolo en 17 Febrero 2013, 06:13 am
A ver, en C y parecidos. Usar un for, while o do while es prácticamente lo mismo. Aunque, teóricamente, usaremos un for cuando haya unos límites fijos (punto de partida y punto de salida). Usaremos un ciclo do while, cuando desconozcamos alguno de los límites del recorrido y además sepamos que el ciclo se va a ejecutar como mínimo una vez. Usaremos el ciclo while en cualquier otro caso.

En este caso, teóricamente lo correcto sería usar un for porque conocemos los límites: 1..I, donde I es introducido por el usuario.

Código
  1. #include <stdio.h>
  2. #define SIZE 1000
  3.  
  4. int main (int argc, char **argv) {
  5.    int lista[SIZE];
  6.    char N[5]="";
  7.    int i,I;
  8.    while (1) {
  9.        fflush(stdin);
  10.        printf("Cantidad de elementos: ");
  11.        fgets(N,5*sizeof(char),stdin);
  12.        if (((I = atoi(N)) >= 1 ) && (I <= 1000)) break;
  13.    }
  14.    for(i=0; i<I; i++) {
  15.        printf("Elemento %d: ", i);
  16.        scanf("%d", &lista[i]); // para simplificar
  17.    }
  18.    return 0;
  19. }
  20.  

Espero que este código te sirva de ejemplo. Los usuarios de este foro (incluyéndome a mí) rara vez facilitan tanto las cosas. Trata de comprender el código y si tienes alguna duda, tan sólo pregunta.

Ten claro que si no programas tú mismo, jamás aprenderás.

"La práctica hace al maestro."


Título: Re: problema l requerir números
Publicado por: amchacon en 17 Febrero 2013, 11:45 am
Unas observaciones a ese código:

Código
  1. fflush(stdin);
Eso no es estándar, solo funcionará en Windows. Es una buena práctica usar las cosas lo más estándar posible, de esa forma funcionará en casi cualquier plataforma. Este es su equivalente:

Código
  1. while (getchar() != '\n' && getchar() != EOF);

Así mismo, en lugar de usar un break. Creo que es más correcto poner la condición directamente en el while. Así te ahorras una condición.

Por último, creo que las llaves quedan mejor abajo. Este sería mi código:

Código
  1. #include <stdio.h>
  2. #define SIZE 1000
  3.  
  4. int main (int argc, char **argv)
  5. {
  6.    int lista[SIZE];
  7.    char N[5]="";
  8.    int i,I;
  9.  
  10.    do
  11.    {
  12.        while (getchar() != '\n' && getchar() != EOF);
  13.        printf("Cantidad de elementos: ");
  14.        fgets(N,5*sizeof(char),stdin);
  15.  
  16.    } while (((I = atoi(N)) >= 1 ) && (I <= 1000));
  17.  
  18.    for(i=0; i<I; i++)
  19.    {
  20.        printf("Elemento %d: ", i);
  21.        scanf("%d", &lista[i]);
  22.    }
  23.    return 0;
  24. }

Por cierto, este sería su equivalente en C++ (por si acaso es este tu lenguaje):

Código
  1. #include <stdio.h>
  2.  
  3. using name space std;
  4.  
  5. const int = 1000;
  6.  
  7. int main (int argc, char **argv)
  8. {
  9.    int Lista[SIZE];
  10.    int N;
  11.    int i,I;
  12.  
  13.    do
  14.    {
  15.        cout<<"Cantidad de elementos: ";
  16.        cin>>N;
  17.    } while ((N >= 1 ) && (N <= 1000));
  18.  
  19.    for(i=0; i<I; i++)
  20.    {
  21.        cout<<"Elemento "<<i<<": ";
  22.        cin>>Lista[i];
  23.    }
  24.    return 0;
  25. }


Título: Re: problema l requerir números
Publicado por: BatchianoISpyxolo en 17 Febrero 2013, 14:16 pm
Gracias por tus aclaraciones y en este caso el ciclo do while era más apropiado.

De todas formas fíjate que al cambiar de ciclo su lógica también cambia:

Código
  1. #include <stdio.h>
  2. #define SIZE 1000
  3.  
  4. int main (int argc, char **argv)
  5. {
  6.    int lista[SIZE];
  7.    char N[5]="";
  8.    int i,I;
  9.  
  10.    do
  11.    {
  12.        while (getchar() != '\n' && getchar() != EOF);
  13.        printf("Cantidad de elementos: ");
  14.        fgets(N,5*sizeof(char),stdin);
  15.  
  16.    } while (((I = atoi(N)) < 1 ) || (I > 1000));
  17.  
  18.    for(i=0; i<I; i++)
  19.    {
  20.        printf("Elemento %d: ", i);
  21.        scanf("%d", &lista[i]);
  22.    }
  23.    return 0;
  24. }
  25.  

Pedir número mientras que I sea menor que 1 o que I sea mayor que 1000.

Por otra parte, con el getchar() para salto de línea y final de archivo no lee bien la entrada ._. Será que no lo sé usar :P


Título: Re: problema l requerir números
Publicado por: leosansan en 17 Febrero 2013, 17:34 pm
¿Me he perdido algo en el camino?.¿ Qué sentido tiene reservar un array de 1000 elementos cuando puede que sólo tenga 10?. ¿No creéis que es mejor crearlo sobre la marcha?   :silbar:

Código
  1. #include <stdio.h>
  2.  
  3. int main (void) {
  4.    int i,n;
  5.    do {
  6.      printf("Cantidad de elementos: ");
  7.      fflush (stdout);
  8.      scanf ("%d",&n);
  9.    }while (n<1 || n>1000);
  10.    int lista[n];
  11.    for(i=0; i<n; i++){
  12.        printf("Elemento %d: ", i+1);
  13.        scanf("%d", &lista[i]);
  14.    }
  15.    return 0;
  16. }
  17.  

Saluditos!.

P.D: Por cierto, el uso de "while (getchar() != '\n' && getchar() != EOF);" es usualmente usado para limpiar el buffer "después" de una entrada, pero donde está no tiene como mucho sentido.  :rolleyes:


Título: Re: problema l requerir números
Publicado por: BatchianoISpyxolo en 17 Febrero 2013, 17:38 pm
Porque C permite declarar cualquier elemento en cualquier lugar :P

Si no también se podría haber usado memoria dinámica (aunque ocupe más memoria por cada componente).


Título: Re: problema l requerir números
Publicado por: leosansan en 17 Febrero 2013, 18:10 pm
Porque C permite declarar cualquier elemento en cualquier lugar :P


Creo que no has entendido el sentido de mi observación. Precisamente como se puede declarar en cualquier lugar, por qué dimensionar la "a priori" a 1000 en lugar de "esperar" a recibir la entrada de la dimensión y dimensionara justito después con ese valor, que es justo lo que yo hago. El ya hacerlo estáticamente o dinámicamente sería otra historia a debatir.

Saluditos!.


Título: Re: problema l requerir números
Publicado por: BatchianoISpyxolo en 17 Febrero 2013, 20:42 pm
Te di la razón antes :P

Ahora lo que no tengo claro es que tú pides el tamaño del array al usuario... y, ¿reservamos la memoria estática en tiempo de ejecución? Supongo que será posible...


Título: Re: problema l requerir números
Publicado por: leosansan en 17 Febrero 2013, 21:00 pm

Ahora lo que no tengo claro es que tú pides el tamaño del array al usuario... y, ¿reservamos la memoria estática en tiempo de ejecución? Supongo que será posible...

, esa es la gracia de no tener que predefinir un tamaño para el array.

Saluditos!.


Título: Re: problema l requerir números
Publicado por: amchacon en 17 Febrero 2013, 21:20 pm
Por cierto, el uso de "while (getchar() != '\n' && getchar() != EOF);" es usualmente usado para limpiar el buffer "después" de una entrada, pero donde está no tiene como mucho sentido.[/size]  :rolleyes:
Cierto, habría que ponerlo despues del scanf. No antes.


Título: Re: problema l requerir números
Publicado por: rir3760 en 18 Febrero 2013, 17:34 pm
Ahora lo que no tengo claro es que tú pides el tamaño del array al usuario... y, ¿reservamos la memoria estática en tiempo de ejecución? Supongo que será posible...
Una declaracion similar a esta:
Código
  1. int num_elem;
  2.  
  3. /* Asignacion de algun valor a num_elem */
  4.  
  5. int valor[num_elem];
Es valida o no dependiendo del estandar de C utilizado al compilar el programa:

A) En C90 no es posible.
B) En C99 si es valida (Array de longitud variable o VLA).
C) En C11 es (Ouch!) opcional.

Ni modo, asi es la vida ...

Un saludo


Título: Re: problema l requerir números
Publicado por: 7hongo7 en 20 Febrero 2013, 16:01 pm
Vientos muchas gracias a todos es algo parecido lo que tengo que hacer ahora déjenme  probarlo, gracias BatchianoISpyxolo y leosansan sus codigos son geniales ahora a probarlos para que me salga el programa que me dejaron jejeje


Título: Re: problema l requerir números
Publicado por: 7hongo7 en 20 Febrero 2013, 18:49 pm
 ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ya me salio mi programa muchas gracias a todos y su ayuda vientos  :P :P :P :P :P :P :P