Actividad 2. Uso de funciones en programas modulares

Introducción
En el presente documento se muestra un ejercicio realizado con el método top-Down o el método descendente, con la finalidad de aplicar su filosofía de divide y veceras, con base a eso se pudo realizar el ejercicio dividiéndolo en varios módulos para hacer más sencillo su elaboración.
Dentro de la actividad se presenta los análisis, sus algoritmos, pseudocódigo, pruebas de escritorio de cada uno de los módulos así como también el diagrama de flujo de modulo donde se muestra la división que se le hiso al ejercicio.     

Instrucciones
Lee detalladamente y analiza el siguiente problema:
Un estudiante decide crear una calculadora para resolver diversos problemas que implican el cálculo de:
  1. Números pares e impares: El programa pedirá al usuario diez números enteros y evaluará si este es par o impar. Los números pares son aquellos números enteros múltiplos de 2.
  2. Números perfectos: El programa mostrará en pantalla los primeros 1000 Números perfectos de forma automática. Un número perfecto es un número natural que es igual a la suma de sus divisores propios (todos sus divisores excepto el propio número).
  3. Números invertidos: el programa pedirá al usuario un entero de cuatro dígitos y mostrará en pantalla el número con los dígitos en orden inverso
  4. Múltiplos de 3: el programa solicitará al usuario un entero y mostrará todos los múltiplos de 3 del número, de lo contrario mostrará un mensaje indicando no es múltiplo de 3.
  5. Suma de sucesores: dado un número N, se mostrará como resultado la suma de todos sus sucesores.
Para este caso utilizaremos el método top-down, dividiendo el programa en 5 operaciones distintas: números pares e impares, números perfectos, números invertido, múltiplos de 3 y suma de sucesores.  

Diagrama de modulo

Algoritmo

Modulo principal

  1. Inicio
  2. Leer opción
  3. Llamar [Números pares]
  4. Llamar [Números perfectos]
  5. Llamar [Números invertidos]
  6. Llamar [Múltiplos de 3]
  7. Llamar [Suma de sucesores]
  8. Fin 

Números pares

  1. Inicio
  2. Declarar variables de entrada “n” y de almacenamiento “i1”
  3. Utilizar la función for i1<n hasta 10
  4. Leer el valor del número ingresado
  5. Dividir el número en 2 y calcular su residuo
  6. Si el residuo es 0
  7. Imprimir el número es par
  8. Si no es 0
  9. Imprimir el número es impar
  10. Fin

Números perfectos

  1. Inicio
  2. Declarar 2 variables, una de almacenamiento “i” y salida “resultado”
  3. Utilizar la función for i<2 hasta 1000
  4. Calcular los números perfectos con la siguiente formula 2 i-1 (2 i – 1)
  5. Imprimir resultado
  6. Fin

Números invertidos

  1. Inicio
  2. Declarar variables, centenas, decenas, millar, unidades, residuoc,  residuom, nume
  3. Leer número (nume)
  4. “millar” = “nume”/1000
  5. “residuom” = residuo de “1000”
  6. “centenas” = “residuom”/100
  7. “residuoc” = residuo de “residuom”
  8. “decenas” = “residuoc”/10
  9. “unidades” = residuo de “residuoc”
  10. Si el número (nume) es menor a 4 dígitos
  11. Imprimir  “unidades”, “decenas”, “centenas”, “millar”
  12. Si no
  13. Imprimir por favor escriba un numero de 4 dígitos  
  14. Fin si 
  15. fin 

Múltiplos de 3

  1. Inicio
  2. Declarar variables, ent, i3, múltiplos
  3. Leer numero
  4. Si el numero dividido entre 3 es igual a 0 su residuo
  5. Dividir el numero entre 3
  6. Utilizar la función for i3 <1 hasta el valor obtenido de la división
  7. Realizar la operación 3 más lo acumulado de cada ciclo for 
  8. Imprimir los múltiplos
  9. Si no es 0 el residuo
  10. Imprimir no es múltiplo de 3
  11. Fin si
  12. Fin

Suma de sucesores

  1. Inicio
  2. Declarar variables e, num
  3. Leer numero
  4. Utilizar la función for e<1 hasta numero
  5. Realizar la operación 1 más lo acumulado de cada ciclo
  6. Imprimir los resultados
  7. Fin 

Pseudocódigo

Números pares
Inicio
        Definir n como real
        Escribir “Tecle los números que dese conocer si son pares o impares”
        Para i1 <-n hasta 10 hacer
                Leer n
                Si n %==0 entonces
                        Escribir “El número” n “es par”
                Si no
                        Escribir “El número” n “es impar”
                Fin si
        Fin para
Fin

Números perfectos
Inicio
        Definir resultados como real
        Escribir “Aquí están los primeros 1000 números perfectos”
        Para i <- 2 hasta 1000 hacer
                Resultado <- ((2^(i-1))*((2^i)-1)
                Escribir resultado
        Fin para
Fin

Números invertidos
Inicio
        Definir num, unidades, decenas, centenas, millar, residuom, residuoc, como entero
        Escribir “Tecle el numeor de 4 digitos que desea invertir”
        Leer num
        millar <- (num /1000)
        residuom <- (num %1000)
        centenas <- (residuom /100)
        residuoc <- (residuom%100)
        decenas <- (residuoc/10)
        unidades <- (residoc%10)
        Si num <- 10000 entonces
                Escribir “El número invertido es” unidades, decenas, centenas, millar
        Si no
                Escribir “Por favor escriba un numero de 4 digitos”
        Fin si
Fin 

Múltiplos de 3
Inicio
        Definir ent, val como entero
        Escribir “Tecle el número que desea conocer sus múltiplos de 3”
        Leer ent
        Si ent %==0 entonces
                Val<-(ent/3)
                Escribir “Todos los multiplos de 3 del número” ent “son”
                        Para i3<-1 hasta val hacer
                        multiplos <- (cont +3)
                        cont <-+ multiplos
                        Escribir multiplos
                Fin para
        Si no
                Escribir “El número” ent “no es múltiplo de 3”
        Fin si
Fin  

Suma de sucesores
Inicio
        Definir num, suma, como entero
        Escribir “Tecle un numero”
        Leer num
        cont <- 0
        Para e<-1 hasta num hacer
                Suma <- suma +e
        Fin para
        Escribir “La suma es” suma
Fin

Diagrama de flujo
Modulo principal


Números pares
Actividad 2 Uso de funciones en programas modulares


Números perfectos
Actividad 2 uso de funciones en programas modulares


Números invertidos
Actividad 2 uso de funciones en programas modulares


Múltiplos de 3
Actividad 2 uso de funciones en programas modulares


Suma de sucesores
Actividad 2 uso de funciones en programas modulares
Prueba de escritorio
Números pares   
  1. Inicio
  2. 6
  3. Si 6%2=0
  4. Es numero 6 es par
  5. 7
  6. Si no 7%2=0
  7. Es numero 7 es impar
  8. 8
  9. Si 8%2=0
  10. Es numero 8 es par
  11. 200
  12. Si 200%2=0
  13. Es numero 200 es par
  14. 303
  15. Si no 303%2=0
  16. Es numero 303 es impar
  17. 45
  18. Si no 45%2=0
  19. Es numero 45 es impar
  20. 24
  21. Si 24%2=0
  22. Es numero 24 es par
  23. 65
  24. Si no 65%2=0
  25. Es numero 65 es impar
  26. 98
  27. Si 98%2=0
  28. Es numero 98 es par
  29. 10
  30. Si 10%2=0
  31. Es numero 10 es par
  32. Fin
Números perfectos      
  1. Inicio
  2. Resultado = ((2^(i-1))*((2^i)-1))
  3. 6, 28, 120, 496, 2016, 8128, 32640,130816, 523776, 2096128…….
  4. Fin
Números invertidos   
Caso 1
  1. Inicio
  2. 1234
  3. millar = (1234/1000) =1
  4. residuom = (1234%1000)= 234
  5. centenas = (234/100)= 2
  6. residuoc = (234%100)= 34
  7. decenas = (34/10)= 3
  8. unidades = (34%10)= 4
  9. si 1234<10000
  10. unidades, decenas, centenas, millar
  11. 4321
  12. Fin
 Caso 2
  1. inicio
  2. 123456
  3. millar = (123456/1000) =123
  4. residuom = (123456%1000)= 456
  5. centenas = (456/100)= 4
  6. residuoc = (456%100)= 56
  7. decenas = (56/10)= 5
  8. unidades = (56%10)= 6
  9. si no 123456<10000
  10. Por favor escriba un numero de cuatro dígitos
  11. Fin
Múltiplos de 3
Caso 1
  1. Inicio
  2. 6
  3. Si (6%3==0)
  4. val = (6/3)= 2
  5. i3=1; i3<=2; i3+=1
  6. multiplos = (cont+3)
  7. cont = + multiplos
  8. 3
  9. 6
  10. Fin
Caso 2
  1. Inicio
  2. 7
  3. Si no (7%3==0)
  4. El número 7 no es múltiplo de 3
  5. Suma de sucesores   
  6. Inicio
  7. 4
  8. e=1; e<=4; e+=1
  9. suma=suma+e
  10. 10

Código en C

Función para el menú principal
#include <stdio.h> /*biblioteca a utilizar*/
#include <stdlib.h> /*biblioteca para el comando pausa*/
#include "operaciones.h" /*biblioteca para realizar operaciones matemáticas*/

int main (){
 
 int numero; /*variable para menú*/
 
 do{ /*función repetitiva*/
 
   system ("cls"); /*limpiar pantalla*/
   
     printf ("Teclee el numero de la opcion que desea"); /*indicaciones para el usuario*/
     printf ("\n"); /*salto de línea*/
     printf ("\n1: Numeros pares e impares "); /*menú*/
     printf ("\n2: Numeros perfectos "); /*menú*/
     printf ("\n3: Numeros invertidos"); /*menú*/
     printf ("\n4: Multiplos de 3 "); /*menú*/
     printf ("\n5: Suma de sucesores"); /*menú*/
     printf ("\n6: Salir\n\n");
     scanf("%i",&numero); /*entrada de la variable numero*/
   }while(numero < 1 || numero > 6);
   
   calcular(numero);
   
    system("pause");
    return 0;
}

Biblioteca (tipo de formato .H)
#ifndef _CALCULADORA_H_
#define _CALCULADORA_H_

#include <stdio.h> 


void calcular(int numero);

#endif

Funciones

Números pares 

#include <math.h>
#include "operaciones.h"

static void numeropar(){

int i1=10; /*variable*/
 int n; /*variable de los números */

  printf("\ntecle los numeros que dese conocer si son pares o impares\n"); /*indicaciones al usuario*/
 for (i1=n;i1<=10;i1+=1) { /*proceso*/
  scanf("%i",&n); /*entrada de la variable*/
  if (n%2==0) { /*valor del residuo*/
   printf("EL numero %i es par\n",n); /*si es igual a 0 es par*/
  } else {
   printf("EL numero %i es impar\n",n); /*si es diferente a 0 es impar*/
  }
 }
}

Números perfectos
static void numeroperfe(){
 
 float i;
 double resultado; /*variable*/
 
 printf("\nAqui estan los primeros 1000 numeros perfectos\n"); /*mensaje para el usuario*/
 for (i=2;i<=1000;i+=1) { /*proceso*/
  resultado = (pow(2,(i-1)))*((pow(2,i))-1); /*fórmula para calcular números perfectos*/
  printf ("%.f\n",resultado);
    }
}


Números invertidos
static void numeroinv(){
 
 int centenas; /*variable para las centenas*/
 int decenas; /*variable para decenas*/
 int millar; /*variable para millar*/
 int nume; /*variable de entrada*/
 int numinv; /*variable de salida*/
 int residuoc; /*variable residuos de centenas*/
 int residuom; /*variable residuos de millar*/
 int unidades; /*variable unidades*/
 printf("Tecle un numero de cuatro dígitos que desea invertir\n"); /*indicaciones al usuario*/
 scanf("%i",&nume); /*entrada de la variable*/

 /*Proceso*/
 millar = (nume/1000); 
 residuom = (nume%1000);
 centenas = (residuom/100);
 residuoc = (residuom%100);
 decenas = (residuoc/10);
 unidades = (residuoc%10);
 if (nume<10000 5="" a="" calcula="" cantidad="" centenas="" code="" cuatro="" d="" de="" decenas="" digitos="" el="" else="" erroneo="" es="" escriba="" favor="" gitos="" i="" invertido="" la="" mayor="" millar="" muestra="" n="" numero="" or="" printf="" resultado="" se="" si="" un="" unidades="">

Múltiplos de 3
static void multiplo3(){
 int cont; /*variable contador*/
 int ent; /*variable de entrada*/
 int i3; /*variable*/
 int multiplos; /*variable de salida*/
 int val; /*variable*/
 
 printf("tecle el numero que desea conocer sus multiplos de 3\n\n"); /*indicaciones para el usuario*/
 scanf("%i",&ent); /*entrada de la variable*/
 cont=0;
 if (ent%3==0) { /*identificar si es múltiplo de 3*/
  val = (ent/3); /*conocer cuántas veces cabe el 3 en dicho numero*/
  printf("\nTodos los multiplos de 3 del numero %i son: \n",ent); /*imprimir todos anteriores múltiplos hasta el numero*/
  for (i3=1;i3<=val;i3+=1) { /*proceso*/
   multiplos = (cont+3); 
   cont = +multiplos;
   printf("%i\n",multiplos); /*resultados*/
  }
   } else {
 printf("El numero %i no es multiplo de 3\n",ent); /*si no es un múltiplo de 3*/
    }
}

static void sumasuc (){
 int e; /*variable*/
 int num; /*variable de entrada*/
 int suma; /*resultado*/
 
 printf("tecle un numero\n"); /*indicaciones*/
 scanf("%i",&num); /*entrada de la variable*/
 suma=0;
    for (e=1;e<=num;e+=1) { /*proceso*/
  suma=suma+e;
 }
 printf("La suma es %i\n",suma); /*resultado*/
}

Función del menú principal
  void calcular(int numero){ 
 switch(numero){ /*función de múltiples alternativas*/
        case 1:
         numeropar();
         break;
  case 2:
      numeroperfe();
      break;
  case 3:
   numeroinv();
   break;
  case 4:
   multiplo3();
   break;
  case 5:
      sumasuc();
   break;
  case 6:
   salir();
   break;
   }
}


Referencias

Buijs, U. (11 de Septiembre de 2017). Archimedes Tube. Obtenido de https://www.youtube.com/watch?v=BU6dqmkTCjU
Morera, S. (23 de Septiembre de 2016). Math4all. Obtenido de https://www.youtube.com/watch?v=TWkkbwtHTFg
programar, E. a. (23 de Aosto de 2014). Empieza a programar. Obtenido de https://youtu.be/0yfHFstcN34
Rancel, M. R. (s.f.). aprenderaprogramar.com. Obtenido de https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=129:programacion-modular-y-definicion-de-recursividad-o-autollamada-diagramas-de-flujo-ejemplos-cu00204a&catid=36&Itemid=60
Rangel, J. (10 de Mayo de 2012). Jesse Rangel. Obtenido de https://www.youtube.com/watch?v=FsO39sqbWTU
Taboada, A. (25 de Febrero de 2016). Programación ATS. Obtenido de https://www.youtube.com/watch?v=UbkRifnA0FU