problema l requerir números

Iniciado por 7hongo7, 17 Febrero 2013, 03:15 AM

0 Miembros y 1 Visitante están viendo este tema.

7hongo7

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

engel lex

que llevas de código? en donde exactamente es tu duda?

por lo que entiendo con vectores y un while deberia bastar
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

BatchianoISpyxolo

#2
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.

#include <stdio.h>
#define SIZE 1000

int main (int argc, char **argv) {
   int lista[SIZE];
   char N[5]="";
   int i,I;
   while (1) {
       fflush(stdin);
       printf("Cantidad de elementos: ");
       fgets(N,5*sizeof(char),stdin);
       if (((I = atoi(N)) >= 1 ) && (I <= 1000)) break;
   }
   for(i=0; i<I; i++) {
       printf("Elemento %d: ", i);
       scanf("%d", &lista[i]); // para simplificar
   }
   return 0;
}


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."
Puede que desees aprender a programar desde 0: www.espascal.es

amchacon

Unas observaciones a ese código:

Código (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
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:

#include <stdio.h>
#define SIZE 1000

int main (int argc, char **argv)
{
    int lista[SIZE];
    char N[5]="";
    int i,I;

    do
    {
        while (getchar() != '\n' && getchar() != EOF);
        printf("Cantidad de elementos: ");
        fgets(N,5*sizeof(char),stdin);

    } while (((I = atoi(N)) >= 1 ) && (I <= 1000));

    for(i=0; i<I; i++)
    {
        printf("Elemento %d: ", i);
        scanf("%d", &lista[i]);
    }
    return 0;
}


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

Código (cpp) [Seleccionar]

#include <stdio.h>

using name space std;

const int = 1000;

int main (int argc, char **argv)
{
    int Lista[SIZE];
    int N;
    int i,I;

    do
    {
        cout<<"Cantidad de elementos: ";
        cin>>N;
    } while ((N >= 1 ) && (N <= 1000));

    for(i=0; i<I; i++)
    {
        cout<<"Elemento "<<i<<": ";
        cin>>Lista[i];
    }
    return 0;
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

BatchianoISpyxolo

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:

#include <stdio.h>
#define SIZE 1000

int main (int argc, char **argv)
{
    int lista[SIZE];
    char N[5]="";
    int i,I;

    do
    {
        while (getchar() != '\n' && getchar() != EOF);
        printf("Cantidad de elementos: ");
        fgets(N,5*sizeof(char),stdin);

    } while (((I = atoi(N)) < 1 ) || (I > 1000));

    for(i=0; i<I; i++)
    {
        printf("Elemento %d: ", i);
        scanf("%d", &lista[i]);
    }
    return 0;
}


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
Puede que desees aprender a programar desde 0: www.espascal.es

leosansan

¿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 (cpp) [Seleccionar]
#include <stdio.h>

int main (void) {
    int i,n;
    do {
      printf("Cantidad de elementos: ");
      fflush (stdout);
      scanf ("%d",&n);
    }while (n<1 || n>1000);
    int lista[n];
    for(i=0; i<n; i++){
        printf("Elemento %d: ", i+1);
        scanf("%d", &lista[i]);
    }
    return 0;
}


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:

BatchianoISpyxolo

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).
Puede que desees aprender a programar desde 0: www.espascal.es

leosansan

Cita de: BatchianoISpyxolo en 17 Febrero 2013, 17:38 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!.

BatchianoISpyxolo

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...
Puede que desees aprender a programar desde 0: www.espascal.es

leosansan

Cita de: BatchianoISpyxolo en 17 Febrero 2013, 20:42 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!.