domingo, 7 de noviembre de 2010

LENGUAJES IMPERATIVOS - Programas Reporte 7

Lenguajes de Programación - Semana 12

FORTRAN
Fortran me inspiró bastante, asi que decidí aplicar algo de matemáticas para este lenguaje. Un programa que calcula las raices de una ecuación de segundo grado, incluyendo sus raices complejas. Para ello apliqué la fórmula general que todos conocemos y le agregue las condiciones para hallar las raices complejas, la cual es simple:

si el discriminante ( b^2 * 4*a*c ) es menor a 0, entonces la ecuación tendra raices complejas

Codigo:
C PROGRAMA QUE CALCULA LAS RAICES
C DE UNA ECUACION DE SEGUNDO GRADO
C --------------------------------------------
    PROGRAM raices
    REAL a, b, c, r, bc, rc, rc2, x, x1, x2
    PRINT*, 'Dame el valor de A: '
    READ(*,*) a
    PRINT*, 'Dame el valor de B: '
    READ(*,*) b
    PRINT*, 'Dame el valor de C: '
    READ(*,*) c

    r = ((b**2)-(4*a*c))
    PRINT*, r

    IF (r.GE.0) THEN
       x1 = (-b + (sqrt(r)))/(2*a)
       x2 = (-b - (sqrt(r)))/(2*a)
       PRINT*, 'x1 = ',x1
       PRINT*, 'x2 = ',x2
    ELSE
       rc = (sqrt(abs(r)))
       bc = -b / (2*a)
       rc2 = rc / (2*a)
       PRINT*, 'Solucion compleja x = ',bc,'+-',rc2,'i'
    ENDIF
    STOP
    END

DESCARGA: raices.f

Para compilar: gfortran -o raices raices.f

Para ejecutar: ./raices


BASIC

Para BASIC hice una calculadora sencilla, da la opción de seguir introduciendo operaciones hasta hartarte, no te permite dividir entre 0 y no acepta letras al momento de realizar una operacion, esto último ya es una funcionalidad del lenguaje. Para cada operación de 2 numeros, los valores se separan por una coma (ver imagen).

Codigo:
DECLARE SUB suma (a AS SINGLE, b AS SINGLE)
DECLARE SUB res (a AS SINGLE, b AS SINGLE)
DECLARE SUB mult (a AS SINGLE, b AS SINGLE)
DECLARE SUB div (a AS SINGLE, b AS SINGLE)
DECLARE SUB pot (a AS SINGLE, b AS SINGLE)
DECLARE SUB raiz (a AS SINGLE)

''' Calculadora Sencilla
   DIM x AS SINGLE, y AS SINGLE, opcion AS INTEGER
   PRINT
   PRINT "===== CALCULADORA 1.0 ====="
   DO
       PRINT
    PRINT "1. Suma"
PRINT "2. Resta"
    PRINT "3. Multiplicacion"
    PRINT "4. Division"
    PRINT "5. Potencia"
    PRINT "6. Raiz Cuadrada"
    PRINT "7+. SALIR"
    PRINT
    INPUT "Elige la operacion -> ", opcion
       PRINT

    SELECT CASE opcion
           CASE 1
     INPUT "Dame los dos valores a sumar -> ", x, y
     suma x, y
           CASE 2
     INPUT "Dame los dos valores a restar -> ", x, y
     res x, y
           CASE 3
        INPUT "Dame los dos valores a multiplicar ->", x, y
        mult x, y
           CASE 4
        INPUT "Dame los dos valores a dividir -> ", x, y
        div x, y
           CASE 5
        INPUT "Dame la base y el exponente (respect.) -> ", x, y
        pot x, y
           CASE 6
        INPUT "Dame un numero para obtener su raiz cuadrada -> ", x
        raiz x
           CASE ELSE
               PRINT "Saliendo . . . . . "
       END SELECT
   LOOP WHILE opcion < b =" 0"> ", b
   WEND
   r = a / b
   PRINT
   PRINT "Resultado: "; r
END SUB

SUB pot (a AS SINGLE, b AS SINGLE)
   DIM i AS INTEGER
   DIM c AS SINGLE
   c = 1
   FOR i = 1 TO b
    c = c * a
   NEXT i
   PRINT
   PRINT "Resultado: "; c
END SUB

SUB raiz (a AS SINGLE)
   PRINT
   PRINT "Resultado: "; SQR(a)
END SUB

DESCARGA: calculadora.bas

Para compilar: fbc calculadora.bas

Para ejecutar: ./calculadora


PASCAL

En este lenguaje batalle un poco, al final les muestro este otro que sirve para practicar la recursion en este lenguaje, un menú utilzando CASES, para seleccionar fibonacci, potencias o factorial

Codigo
PROGRAM recursion;

uses
   crt;

Function fibonacci (x : Integer):LongInt;
Begin
  If x <= 1 Then       fibonacci := x    Else       fibonacci := (fibonacci(x-1) + fibonacci(x-2)); End; { fibonacci }  Function potencia (a , b : Integer):LongInt; Begin    If b = 0 Then       potencia := 1    Else       potencia := a * potencia(a , b-1); End;  Function factorial(m : Integer):LongInt; Begin    If m < recursion ="="="="="="="="');"> ');
  opcion := ReadKey;

  Case opcion of
    'a' : begin
Writeln('');
Writeln('');
Write('BASE -> ');
Readln(num1);
Write('EXPONENTE -> ');
Readln(num2);
Writeln('');
Writeln('RESULTADO = ',potencia(num1,num2));
Writeln('');
    end;
    'b' : begin
Writeln('');
Writeln('');
Write('Cantidad de valores en la serie -> ');
Readln(num1);
For num2 := 1 To num1 Do
   Write(fibonacci(num2),' | ');
Writeln('');
    end;
    'c' : begin
Writeln('');
Writeln('');
Write('Factorial de? -> ');
Readln(num1);
Writeln('');
Writeln(num1,'! = ',factorial(num1));
Writeln('');
    end;
  end; { case }
End.

DESCARGA: recursion.pas

Para compilar: fpc recursion.pas

Para ejecutar: ./recursion


C

En C hice este programita que calcula el salario de los trabajadores de una empresa, el programa solicita las horas trabajadas totales a las que se les aplica el sueldo base seleccionado. Tambien se calculan horas extra (si son mas de 40 horas) y se les aplica una tarifa especial.
Los impuestos se aplican de la siguiente forma:
15% a los primeros $500
16% a los siguientes $300
17% a lo que resta
Despues se suman los descuentos y se le restan a la percepcion asi se obtiene un sueldo neto.
Al final el programa imprime todo el desglose de descuentos, horas y sueldo neto. Todo se maneja por medio de constantes por lo que es fácilmente editable a otros impuestos y sueldos base

Codigo
/*Programa para calcular salario en diferentes esquemas de pago*/

#include <stdio.h>
#define BASE1 57.46   
#define BASE2 55.84
#define BASE3 54.47
#define BASE4 53.00
#define EXTRA 15.00
#define TAX1 0.15
#define TAX2 0.16
#define TAX3 0.17

int menu(void) {    
    int opcion = 0, i;        
    for(i=0; i<79; i++) printf("=");    
    printf("\n\n");
    printf("\t    SELECCIONA EN NUMERO CORRESPONDIENTE A LA TAZA DE PAGO\n\n");
    printf("\t1) $ %.2f hr \t\t\t\t", BASE1);
    printf("\t2) $ %.2f hr\n\n", BASE2);
    printf("\t3) $ %.2f hr\t\t\t\t", BASE3);
    printf("\t4) $ %.2f hr\n\n", BASE4);
    printf("\t5) Salir\n\n");
    for(i=0;i<79;i++) printf("=");    
    scanf("%d", &opcion);
    while(opcion > 5 || opcion == 0) {
        printf("Elige una opcion valida -> ");
 scanf("%d", &opcion);
    }
    return opcion;
}


float calculos(float x, float y) {
 float horas, hrbase, hrext=0.0, hrtot;
 float salariobase, temp=0.0, percepcion, sueldoneto;
 float temp1=0.0, temp2=0.0, temp3=0.0;
 float imp1=0.0, imp2=0.0, imp3=0.0, descuento; 
 hrbase = y;   
 if (y > 40) {
   hrbase = 40;
   hrext = y - 40;
   temp = hrext * EXTRA;
 }
 hrtot = hrbase + hrext;
 salariobase = hrbase * x;
 percepcion = salariobase + temp;
 if (percepcion <= 300.0)     imp1 = percepcion*TAX1;   if (percepcion > 300.0) {
     temp1 = 300.0;
     temp2 = percepcion - 300;
     if (temp2 > 150.0){
temp3 = temp2 - 150;
temp2 = 150;
     }
     imp1 = temp1 * TAX1;
     imp2 = temp2 * TAX2;
     imp3 = temp3 * TAX3;
 }

 descuento = imp1 + imp2 + imp3;
 sueldoneto = percepcion - descuento;
 printf("\nHORAS BASE    %1.2f\nHORAS EXTRA   %1.2f\nHORAS TOTALES %1.2f\n\n", hrbase, hrext, hrtot);
 printf("SALARIO BASE  $%1.2f\nPAGO EXTRA    $%1.2f\nPERCEPCION    $%1.2f\n\n", salariobase, temp, percepcion);
 printf("IMPUESTO 15%% -$%1.2f\nIMPUESTO 20%% -$%1.2f\nIMPUESTO 25%% -$%1.2f\nDESCUENTOS   -$%1.2f\n\n", imp1, imp2, imp3, descuento);
 return(sueldoneto);
}

int main(int argc, char** args) {       
 int opcion;
 float horas, salario;        
 while(( opcion = menu()) != 5) {    
   switch(opcion) {                      
   case 1: {
     printf("\n\t\tSistema para calcular el sueldo con base a $ %.2f x hr\n\n", BASE1);
     printf("\t\tHORA EXTRA [ $ %.2f ]  \n\n", EXTRA);
     printf("INTRODUCE LAS HORAS LABORADAS -> ");
     scanf("%f", &horas);   
     salario = calculos(BASE1, horas);
     printf("SUELDO NETO A PAGAR [ $%1.2f ]\n\n", salario);
     break;
   }          
   case 2: {
     printf("\n\t\tSistema para calcular el sueldo con base a $ %.2f x hr\n\n", BASE2);
     printf("\t\tHORA EXTRA [ $ %.2f ]  \n\n", EXTRA);
     printf("INTRODUCE LAS HORAS LABORADAS -> ");
     scanf("%f", &horas);   
     salario = calculos(BASE2, horas);
     printf("SUELDO NETO A PAGAR [ $%1.2f ]\n\n", salario);
     break;
   }
   case 3: {
     printf("\n\t\tSistema para calcular el sueldo con base a $ %.2f x hr\n\n", BASE3);
     printf("\t\tHORA EXTRA [ $ %.2f ]  \n\n", EXTRA);
     printf("INTRODUCE LAS HORAS LABORADAS -> ");
     scanf("%f", &horas);   
     salario = calculos(BASE3, horas);
     printf("SUELDO NETO A PAGAR [ $%1.2f ]\n\n", salario);
     break;
   }           
   case 4: {
     printf("\n\t\tSistema para calcular el sueldo con base a $ %.2f x hr\n\n", BASE4);
     printf("\t\tHORA EXTRA [ $ %.2f ]  \n\n", EXTRA);
     printf("INTRODUCE LAS HORAS LABORADAS -> ");
     scanf("%f", &horas);   
     salario = calculos(BASE4, horas);
     printf("SUELDO NETO A PAGAR [ $%1.2f ]\n\n", salario);
     break;
   }
   }
 }
 return 0;   
}

DESCARGA: salario.c

Para compilar: gcc -o salario salario.o

Para ejecutar: ./salario

Ejecucion


SALUDOS

4 comentarios:

  1. hey en el de la raiz, no falta el caso cuando solo hay una raiz(discriminante es 0)??

    ResponderEliminar
  2. Lo considere, pero si te fijaste bien decidi hacer mas eficiente el codigo cuando incluyo en al condicion [ x.GE.0 - Greater Equal (mayor igual) ] a que?, pues a cero, entonces se especifica que el programa haga "algo" cuando el discriminante es cero. En la imagen se ve este caso especial y el programa imprime el mismo resultado en las 2 respuestas, entonces si x1=x2 se puede concluir que solo hay un resultado, pero muy buen observacion, para eso sirven las capturas de pantalla en los blogs :) solo hay que esperar que las vean :p.
    SALUDOS!!

    ResponderEliminar
  3. Profe espero lea mi comentario.
    Estas entradas me las tomo para laboratorio y son para ountos extra de clase ordinaria:

    http://juankenny.blogspot.com/2010/11/c-listas-enlazadas.html

    http://juankenny.blogspot.com/2010/11/c-pilas-y-colas.html

    ResponderEliminar