Ayuda con un programa

Iniciado por norris, 2 Noviembre 2012, 16:36 PM

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

norris

Escribir un programa que muestre al usuario el primer número medio y a continuación le  pregunte si quiere el siguiente. Si el usuario responde que sí ('s'), el programa ha de  calcular y mostrar el siguiente número medio y ha de volver a preguntar al usuario si quiere el siguiente. El proceso se repetirá hasta que el usuario responda que no ('n'). Cada vez que el usuario tenga que responder con una 's' o una 'n', no se admitirá ninguna otra respuesta, repitiendo la pregunta hasta obtener uno de esos dos caracteres.

Un número entero n que sea mayor o igual que 1 es medio si la suma de sus predecesores (1 + 2 + 3 + ... + n – 1) se puede obtener también sumando algunos números contiguos que le siguen:

Ejemplos de números medios y no medios:
 6 es medio porque 1 + 2 + 3 + 4 + 5 = 15 y 7 + 8 = 15. Es decir, la suma de los
predecesores de 6 es obtenible sumando algunos sucesores contiguos de 6.
 35 es medio porque 1 + 2 +...+ 34 = 595 y 36 + 37 +...+ 49 = 595 Es decir, la
suma de los predecesores de 35 es obtenible sumando algunos sucesores contiguos  de 35.
7 no es medio porque 1 + 2 + 3 + 4 + 5 + 6 = 21 y no se puede obtener el valor 21 sumando números contiguos a partir de 8: 8 ≠ 21, 8 + 9 ≠ 21, 8 + 9 + 10 ≠ 21,


Nose por donde cogerlo, podría hacer dos funciones pero nose como. Gracias de antemano

$Edu$

Papel y lapicera siempre ayuda para plantearte todo.

Create primero la estructura del programa, que seria la forma en que mostrara el mensaje y preguntara si quiere otro o no.

Hacer:
    Mostrar numero medio -Llamar funcion-;
   
        Mientras: Respuesta es distinto a 'n' o 's'.
             Preguntar si continua o no;
             Guardar respuesta en variable Respuesta;

Mientras: Respuesta sea igual a 's'.   

Salir del programa:

Ahora la funcion es lo mas dificil, que ideas tenes pensadas? porque dices dos funciones? si das alguna idea y haces la parte de la estructura que te deje y la mostras aca, me pongo a pensar luego el algoritmo para eso que no quiero pensar en vano xD Saludos!

norris

pues tenia pensado dos funciones.

la primera funcion, si  numero x >= 1, decide si es medio o no. Si x
es medio, la función devolverá un 1 y si no devolverá un 0

y la segunda, la funcion que pregunte al usuario si desea otro medio.

la primera funcion es la que no se por donde pillarla. Y gracias por responder


norris

Muchísimas gracias.

En cuanto lo acabe pongo el código por si alguien lo necesita. Un saludo

norris

Pff no consigo hacerlo. Con el codigo que me has puesto pense que iba a salir.Sin embargo el programa tiene que salir por partalla de la siguiente forma:

El primer numero medio es: 6
Quieres el siguiente numero medio?(s/n): q
El dato introducido no es adecuado.
Quieres el siguiente numero medio?(s/n): s
El siguiente numero medio es: 35
Quieres el siguiente numero medio?(s/n): n
Pulsa una tecla para terminar.

BatchianoISpyxolo

#6
La idea de los ciclos para el control del programa es cosa tuya ya que es muy sencillo. Con referencia al algoritmo pues también.

Lo puedes resolver con ciclos anidados. La idea es la siguiente

Sea N el número que se quiere averiguar si es medio.

Sea S1 = Sumatorio desde 1 hasta N-1
Sea S2 = Sumatorio desde N+1 hasta m, con m siendo el término que hace que S2 >= S1.

Si S2 = S1, N es medio. Si S2 > S1, N no es medio.

Un poco de código chapuza:

#include <stdio.h>

int main (void) {

   int N = 6, i;
   int sumaAntecesores = 0; // S1
   int sumaPredecesores = 0; // S2

   for (i=1; i<N; i++) sumaAntecesores += i;

   while (sumaPredecesores < sumaAntecesores) sumaPredecesores += ++N;

   printf("%d\n", (sumaAntecesores == sumaPredecesores ? 1 : 0));

   return 0;
}


Ahí hago el proceso iterativo para verificar si un número N es medio o no.

En tu caso N varía entre 1 y una MACRO de tamaño máximo, por ejemplo, el tamaño aceptado por la máquina. O usar un while (true) {}, teniendo una variable que recorra los Z+ y de la cual averiguaremos si es medio o no en cada iteración.

Para mejorar el proceso podrías llevar sumas parciales en el proceso...

Aunque el algoritmo de leosansan es mucho más eficiente.
Puede que desees aprender a programar desde 0: www.espascal.es

norris

LLevo poco tiempo en lo de la programación. La cuestion es que el programa no dice dame un numero y a partir de eso numero te da el primer centrico. sino que

imprime por pantalla:(lo que viene en negrita es lo que tienes que introducir, solo tienes que introducir s,n u otra letra( si imprime otra letra le dira que el dato no es adecuado)


El primer numero medio es: 6
Quieres el siguiente numero medio?(s/n): q
El dato introducido no es adecuado.
Quieres el siguiente numero medio?(s/n): s
El siguiente numero medio es: 35
Quieres el siguiente numero medio?(s/n): s
El siguiente numero medio es: 204
Quieres el siguiente numero medio?(s/n): n
Pulsa una tecla para terminar.

BatchianoISpyxolo

#8
Pues sencillo con un ciclo.

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

int main () {

    char * c = malloc(sizeof(char));

    do scanf("%c", c);
    while( (*c != 's') && (*c != 'n') );

    puts((*c == 's') ? "salir" : "continuar");

    free(c);
    c = NULL;

    return 0;
}

Cuando sea n, continuas buscando un siguiente medio...

Es simplemente pedir un carácter hasta que sea s o n, en cuyo caso saldrá del bucle y en c tendremos el carácter que introdujo y con él poder realizar una acción u otra.
Puede que desees aprender a programar desde 0: www.espascal.es