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
hey en el de la raiz, no falta el caso cuando solo hay una raiz(discriminante es 0)??
ResponderEliminarLo 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.
ResponderEliminarSALUDOS!!
Muy bien. Cinco puntos.
ResponderEliminarProfe espero lea mi comentario.
ResponderEliminarEstas 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