Autor Tema: ayuda para una tarea, numero de alumnos de este tipo de tareas

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

15 Mayo, 2009, 06:13 pm
Leído 2649 veces

raskolnikof

  • $$\Large \color{#5372a0}\pi\,\pi$$
  • Mensajes: 81
  • Karma: +0/-0
  • Sexo: Masculino
hola, tengo que hacer una tarea donde hay unos ejercicios de escribir en codigo fuente, diagrama de flujos y eso

este es uno de esos:
{
Al recibir como dato las calificaciones de un grupo de alumnos , calcule y escriba el número de calificaciones que hay en cada uno de los siguientes rangos:

0 .. 3,99
4 .. 5,99
6 .. 7.99
8 .. 8.99
         9 .. 10

El numero de alumnos será desconocido por lo que deberá implementar un mecanismo que controle esta situación, al igual, que valide que cada  nota esté dentro del rango permitido esto es mayor a cero y menor o igual a diez.
}

yo he intentado de escribirlo bien en dev c++, pude lograr algo pero no es lo que me piden en el ejercicio, espero que me digan que modificar, o por que camino ir, aqui dejo lo que llevo hasta ahora

Spoiler
#include <stdio.h>
#include <stdlib.h>

int num_alumnos,num_notas;
float calificacion;

main()
         {
                   
                   printf("ingrese el numero de alumnos:\n");
                   scanf("%d",&num_alumnos);
                 
       
                   
         for(int i=1;i<=num_alumnos;i++){
                 
                   printf("ingrese la calificacion de los alumnos:\n");
                   scanf("%f",&calificacion);
                   }
           
                 
         if(calificacion>0){
           if(calificacion < 3.99){
                           printf("pertenece al rango 0 .. 3,99 ");
                           
                           }
                           }
         if(calificacion > 3.99){
           if(calificacion < 5.99){
                           printf("pertenece al rango 4 .. 5,99");
                           
                           }
                           }
         if(calificacion > 5.99){
           if(calificacion < 7.99){
                           printf("pertenece al rango 6 .. 7.99");
                         
                           }
                           }
         if(calificacion > 8){
          if(calificacion < 8.99){
                          printf("pertenece al rango 8 .. 8.99");
                         
                          }
                          }
         if(calificacion > 8.99){
          if(calificacion < 10){
                          printf("pertenece al rango 9 .. 10");
                         
                          }
                          }
                         
                 system("pause");
                 }

[cerrar]

15 Mayo, 2009, 07:55 pm
Respuesta #1

aesede

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 492
  • Karma: +0/-0
  • Sexo: Masculino
Hola.

Mirá:

printf("Ingrese cantidad de alumnos: ");
scanf("%d",&cant);

for(i=0; i<cant; i++) {

        printf("Ingrese la nota: ");
        scanf("%f",&nota);

        if(nota >= 0 && nota <= 10) {

                //La nota está en el intervalo [0;4)
                if(nota >= 0 && nota < 4) cont1++;

                //La nota está en el intervalo [4;6)
                if(nota >= 4 && nota < 6) cont2++;

                //La nota está en el intervalo [6;8)
                if(nota >= 6 && nota < 8) cont3++;

                //La nota está en el intervalo [8;9)
                if(nota >= 8 && nota < 9) cont4++;

                //La nota está en el intervalo [9;10]
                if(nota >= 9 && nota <= 10) cont5++;

        } else {

                printf("Nota fuera de rango\n");

        }

}

//Mostramos resultados
printf("Hay un total de %d alumnos que obtuvieron notas en [0;4)\n", cont1);
printf("Hay un total de %d alumnos que obtuvieron notas en [4;6)\n", cont2);
printf("Hay un total de %d alumnos que obtuvieron notas en [6;8)\n", cont3);
printf("Hay un total de %d alumnos que obtuvieron notas en [8;9)\n", cont4);
printf("Hay un total de %d alumnos que obtuvieron notas en [9;10]\n", cont5);


Fijate que, en vez de:

Código: [Seleccionar]
if(calificacion>0) { if(calificacion < 3.99) { printf("pertenece al rango 0 .. 3,99 "); } }
se puede escribir:

Código: [Seleccionar]
if(calificacion>0 && calificacion<3.99) printf("pertenece al rango 0 .. 3,99 ");
para no tener tantos if anidados. Los dos códigos hacen lo mismo.

No te olvides de inicializar las variables contadoras en 0, porque si  no te va a dar cualquier cosa el contador (a veces hay basura almacenada en la variable, por eso la inicializamos en cero).

Saludos :)

16 Mayo, 2009, 02:36 am
Respuesta #2

raskolnikof

  • $$\Large \color{#5372a0}\pi\,\pi$$
  • Mensajes: 81
  • Karma: +0/-0
  • Sexo: Masculino
Hola.

Mirá:

Spoiler
printf("Ingrese cantidad de alumnos: ");
scanf("%d",&cant);

for(i=0; i<cant; i++) {

        printf("Ingrese la nota: ");
        scanf("%f",&nota);

        if(nota >= 0 && nota <= 10) {

                //La nota está en el intervalo [0;4)
                if(nota >= 0 && nota < 4) cont1++;

                //La nota está en el intervalo [4;6)
                if(nota >= 4 && nota < 6) cont2++;

                //La nota está en el intervalo [6;8)
                if(nota >= 6 && nota < 8) cont3++;

                //La nota está en el intervalo [8;9)
                if(nota >= 8 && nota < 9) cont4++;

                //La nota está en el intervalo [9;10]
                if(nota >= 9 && nota <= 10) cont5++;

        } else {

                printf("Nota fuera de rango\n");

        }

}

//Mostramos resultados
printf("Hay un total de %d alumnos que obtuvieron notas en [0;4)\n", cont1);
printf("Hay un total de %d alumnos que obtuvieron notas en [4;6)\n", cont2);
printf("Hay un total de %d alumnos que obtuvieron notas en [6;8)\n", cont3);
printf("Hay un total de %d alumnos que obtuvieron notas en [8;9)\n", cont4);
printf("Hay un total de %d alumnos que obtuvieron notas en [9;10]\n", cont5);


Fijate que, en vez de:

Código: [Seleccionar]
if(calificacion>0) { if(calificacion < 3.99) { printf("pertenece al rango 0 .. 3,99 "); } }
se puede escribir:

Código: [Seleccionar]
if(calificacion>0 && calificacion<3.99) printf("pertenece al rango 0 .. 3,99 ");
para no tener tantos if anidados. Los dos códigos hacen lo mismo.

No te olvides de inicializar las variables contadoras en 0, porque si  no te va a dar cualquier cosa el contador (a veces hay basura almacenada en la variable, por eso la inicializamos en cero).

Saludos :)
[cerrar]

mil gracias aesede, aun no entiendo mucho de lenguaje de programación en c++, me parece que en el pimer for tendria que salir un int verdad? for(int i =1;i<=cant;i++);

gracias por darte el tiempo de hasta dejar unos buenos comentarios para que pueda entenderlos ma facilmente.
saludos

16 Mayo, 2009, 03:08 am
Respuesta #3

aesede

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 492
  • Karma: +0/-0
  • Sexo: Masculino
Hola.

Escribí el programa pensando en que las variables ya estarían declaradas, o sea, lo dejé por tu cuenta eso.

Sería bueno que declares todas las variables al principio del programa, y que no las vayas declarando sobre la marcha. Sin embargo, mientras que las declares antes de usarlas, no tiene demasiada importancia dónde la declares (dejando de lado los casos en que tenemos que tener en cuenta el ámbito de las variables).

Saludos :)

16 Mayo, 2009, 03:53 am
Respuesta #4

raskolnikof

  • $$\Large \color{#5372a0}\pi\,\pi$$
  • Mensajes: 81
  • Karma: +0/-0
  • Sexo: Masculino
si, ya compile , funciones correctamente  :P.

ahora estoy intentando sacar este problema, espero me puedas ayudar nuevamente, por que no me sale bien  :banghead: jeej

Calcule el valor de PI   utilizando la siguiente serie:

PI =   \(   \frac{4}{1} -   \frac{4}{3} + \frac{4}{5} - \frac{4}{7} + \frac{4}{9} - ....... \)
       

Su programa deberá indicar el número de términos requerido para obtener una precisión menor o igual a 0,0001. ( precisión es la diferencia entre  PI y el valor de la serie).

yo he resuelto algo, aqui esta lo que llevo espero me puedas aconsejar que pasos seguir para que pueda compilar

Spoiler

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

/* bueno esto se resuelve con una sumatoria obviamente asi que declare las variables correspondientes*/

int n, a=0;
float numerador,denominador, sumatoria;

int main()
{
/* estos primeros pasos son tipicos de una sumatoria jeje */
     
      printf("ingrese un numero:\n");
      scanf("%d",&n);
     
      while(a<=n)
      {
                 if(a==1)
                 sumatoria=4;
                 else
                 {
                     /* aqui tengo un problema, como puedo hacer para que el numerador vaya cambiando de 4  a - 4 en la sucesion
                   
                      numerador= ._.
                     denominador=2*a-1;
                     sumatoria=sumatoria + (numerador/denominador);
                     }
                     a++;
                     }
                   /* hasta aqui llege plop*/
[cerrar]


21 Mayo, 2009, 04:58 pm
Respuesta #5

aesede

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 492
  • Karma: +0/-0
  • Sexo: Masculino
Hola. Fijate si te sirve esto.

//Establecemos el primer valor que toma el denominador
denominador=1;

//El bucle arranca en i=0
i=0;

//El signo del primer término es positivo
//1 representa (+) y 0 representa (-)
signo=1;

//Cuenta va a ir almacenando el resultado parcial de la serie (arranca en 0)
cuenta=0;

//Bucle que se repite N veces
//donde N es el número de iteraciones requeridas para lograr una precisión de
while(i<N) {
        if(signo==1) {
                cuenta = cuenta + 4 / denominador;
                signo=0;
        } else {
                cuenta = cuenta - 4 / denominador;
                signo=1;
        }

        //Incrementamos en dos el denominador
        denominador=denominador+2;

        //Incrementamos el contador
        i++;

}

printf("PI vale %f",cuenta);


Faltaría ver cómo determinamos N para que cuando llegamos al error que necesitamos se corte el bucle y nos tire el resultado.

Otra vez, dejé la declaración de variables y demás por tu cuenta.

Saludos :)

27 Mayo, 2009, 02:14 am
Respuesta #6

aesede

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 492
  • Karma: +0/-0
  • Sexo: Masculino
Citar
Faltaría ver cómo determinamos N para que cuando llegamos al error que necesitamos se corte el bucle y nos tire el resultado.

Lo único que se me ocurre para ésto es:

a) Tener una aproximación mejor de Pi que la que estamos calculando y compararlas para establecer con qué error estamos trabajando.

b) Generar, mediante otro procedimiento (no sé cuál), una aproximación de Pi mejor y compararla con la que obtuvimos, algo parecido a la idea anterior, excepto porque la aproximación "más aproximada" la generamos en el momento y no la tenemos almacenada en un archivo externo.

Me parece mejor la primera idea porque implica menos trabajo para el procesador, y un menor tiempo de respuesta en el resultado.

Si se te ocurre algo, o el profesor te explica cómo hacerlo contame :)

Saludos.

PD: para a) capáz que te interesen estos links

27 Mayo, 2009, 05:23 am
Respuesta #7

Don Equis

  • Aprendiendo de a poco...
  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,056
  • Karma: +0/-0
  • Sexo: Masculino
  • e^{i\pi}+1=0
Hola.

Para la aproximación de \( \pi \), fíjense que el error cometido es menor que el último valor sumado (la sucesión de términos positivos es decreciente). No me parece que necesiten una mejor cota.

Saludos.
I believe a leaf of grass is no less than the journey-work of the stars.

 \( e^{i\pi}+1=0 \)

30 Mayo, 2009, 12:55 am
Respuesta #8

aesede

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 492
  • Karma: +0/-0
  • Sexo: Masculino
Hola Don Equis.

La verdad no se casi nada de series.  Entiendo que esto:

Para la aproximación de \( \pi \), fíjense que el error cometido es menor que el último valor sumado (la sucesión de términos positivos es decreciente). No me parece que necesiten una mejor cota.

significa que por cada nuevo término que vamos sumando el error disminuye, no?

Pero lo que no entiendo mucho es cómo se puede exigir una precisión de 0,0001 para el valor de un número que es irracional. Es decir, no tengo un valor exacto con el que comparar a la aproximación que hice para saber el error con el que estoy trabajando.

Capáz que no estoy interpretando bien el problema.

Nos dás una mano?

Gracias, saludos :)

30 Mayo, 2009, 07:15 am
Respuesta #9

Don Equis

  • Aprendiendo de a poco...
  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,056
  • Karma: +0/-0
  • Sexo: Masculino
  • e^{i\pi}+1=0
Hola.

A priori vos no sabés si el error disminuye o no (está claro que el error es desconocido siempre ¿verdad? Pero ojo), lo que vos podés hacer es estimar una cota. Es decir, asegurarte que a partir de un momento el error será estrictamente menor que una cantidad positiva dada.

¿Cómo se puede hallar en este caso una cota para el error? Pues si asumimos que la serie converge a \( \pi \), entonces nos alcanza con observar que la serie de los términos impares es estrictamente decreciente, y la de los términos pares es estrictamente creciente. Digamos que nos vamos acercando a \( \pi \) de la siguiente forma. Primero tenemos un número mayor que \( \pi \), el siguiente número pasará a ser menor, el otro mayor y así sucesivamente. Donde, entre mayor y mayor; y menor y menor, el error sí fue efectivamente disminuyendo. Y como la sucesión de la cantidad que se suma o se resta, en módulo, es estrictamente decreciente, entonces esta cantidad es una cota superior para el error. Con un dibujo sería más fácil de entenderlo.

En el siguiente link tenés un gráfico de la situación: http://mathworld.wolfram.com/GregorySeries.html

Saludos.
I believe a leaf of grass is no less than the journey-work of the stars.

 \( e^{i\pi}+1=0 \)