Calculadora en Pascal

GeeK

Hola, vereis, estoy en ing.técnica industrial y nos están dando algunos fundamentos acerca de Pascal, más bien poco y poco a poco. Nos propusieron que íbamos a hacer en la siguiente práctica ( la de esta tarde) haceruna calculadora, pero yo me he adelantado y me he puesto por mi cuenta leyendo algún libro.
El caso es que lo que yo he pensado sería algo así, pero es un poco cutre porque solo lo he hecho para 2 números:

program Calculadora;
uses crt;

Var a,b,c:integer;
d : real ;

Begin
clrscr;
Writeln(' GeekŽs calculator program to University of Jaen :) ');
Writeln(' ');
Writeln('Codigo suma: 1 ; Codigo resta: 2 ; Codigo multiplicacion: 3 ; Codigo division: 4');
Writeln('Introduce el primer numero');
Readln(a);
Writeln(' ');
Writeln('Introduce el segundo numero');
Readln(b);
Writeln(' ');
Writeln('Introduce el codigo de la operacion que deseas hacer: ');
Readln(c);
Writeln(' ');
d := a / b ;
If c=1 then begin
Writeln('La suma es: ',a,' + ',b,' = ',a+b);
readln;
end
else begin
If c=2 then begin
Writeln('La resta es: ',a,' - ',b,' = ',a-b);
readln;
end
else begin
If c=3 then begin
Writeln('La multiplicacion es: ',a,' x ',b,' = ',a*b);
readln;
end
else begin
if c=4 then begin
Writeln('El resultado de la division es: ',a,' / ',b,' = ',d);

                 readln;
               end
         end

   end
 end

end.

El caso es que no se me ocurre con lo poco que sé (1 hora de prácticas) , hacerlo de otro modo para poder introducir más números y no hacer así las operaciones sino poniendo los símbolos de + - * y /, no así en , selecciona que quieres hacer, k queda un poco cutre, xDDDDD.

Weno si alguien no me ha entendio , porque he escrito un poco incoherente, sorry, pero es k llevo prisas, jajajaj, un saludo y gracias ;)

A

Para poder usar expresiones más complejas, lo que realmente necesitas es un parser, es decir, un analizador que separe los tokens (términos) de la cadena de entrada, los identifique y convierta en nuevos tokens resultado de unas reglas válidas en un contexto.

Por ejemplo, dada la expresión:
2 * ( 10 + 5,2 )

El parser debería reconocer:
2 - Número entero

  • - Símbolo matemático de multiplicación
    ( - Paréntesis, orden/preferencia
    10 - Número entero
  • - Símbolo matemático de suma
    5,2 - Número con decimales
    ) - Paréntesis, cierre del anterior

Una vez reconocidos debería ser capaz de emitir errores, expresiones, objetos, etc... resultado de las operaciones ordenadas.

Existe un libro sobre construcción de intérpretes/compiladores que explica muy claramente cómo funciona un parser. En él, se acaba construyendo un lenguaje de programación entero (a fin de cuentas cuando un compilador analiza tu código, está analizando términos: un léxico).

Sin embargo, solo necesitas leer los dos primeros capítulos, que explican como analizar expresiones matemáticas sencillas:
http://compilers.iecc.com/crenshaw/

Sé que es un poco complejo, pero el código el muy limpio, es Pascal y además el enfoque es muy práctico más que teórico.

n1x3r

Si quieres te monto la calculadora en C++ esq aun no eh tocado pascal ni creo que lo dare.

#include <stdio.h>
int menu ();
int suma (int,int);
int resta (int,int);
float division (int,int);
int multiplicacion (int,int);
void main ()
{
int opcion,num1,num2,resultado;
float cociente;
do
{
opcion=menu ();
switch (opcion)
{
case 1: printf ("La opcion elegida es la suma\n");
printf ("Introduce los dos numeros a sumar: ");
scanf ("%i",&num1);
scanf ("%i",&num2);
resultado=suma (num1,num2);

printf ("El resultado de la suma %i+%i es: %i",num1,num2,resultado);
break;
case 2: printf ("La opcion elegida es la resta\n");
printf ("Introduce los dos numeros a restar: ");
scanf ("%i",&num1);
scanf ("%i",&num2);
resultado=resta (num1,num2);
printf ("El resultado de la resta %i-%i es: %i",num1,num2,resultado);
break;
case 3: printf ("La opcion elegida es la multiplicacion\n");
printf ("Introduce los dos numeros a multiplicar: ");
scanf ("%i ",&num1);
scanf ("%i",&num2);
resultado=multiplicacion (num1,num2);
printf ("El resultado de la multiplicacion de %i por %i es: %i",num1,num2,resultado);
break;
case 4: printf ("La opcion elegida es la division\n");
printf ("Introduce el dividendo y el divisor: ");
scanf ("%i ",&num1);
scanf ("%i",&num2);
cociente=division (num1,num2);
printf ("La division %i/%i es igual a: %.2f",num1,num2,cociente);
break;
case 5: printf ("Has elegido salir de la calculadora\n");
break;
}
}while (opcion!=5);
}

//Funcion Menu
int menu ()
{
int opcion;
printf ("\n");
printf ("\nElige una opcion de la calculadora:\n");
printf ("1. Suma\n");
printf ("2. Resta\n");
printf ("3. Multiplicacion\n");
printf ("4. Division\n");
printf ("5. Salir\n");
printf ("\n");
printf ("Introduce el numero de la opcion elegida: ");
scanf ("%i",&opcion);
return opcion;
}

//Funcion Suma
int suma (int num1, int num2)
{
int resultado;
resultado=num1+num2;
return resultado;
}

//Funcion Resta
int resta (int num1, int num2)
{
int resultado;
resultado=num1-num2;
return resultado;
}

//Funcion multiplicacion
int multiplicacion (int num1, int num2)
{
int resultado;
resultado=num1*num2;
return resultado;
}

//Funcion Division
float division (int num1, int num2)
{
float resultado;
resultado=(float)num1/num2;
return resultado;
}

GeeK

toy ahora en informática, C ++ de momento no vamos a dar, ya sabía yo algo, pero no me interesa, de todos modos, muchas gracias.
Lo del parser luego trankilamente me lo miro ,porque parece complicao pero estaría wapo.

KiRoF

OS ESTAIS KEDANDO CON NOSOTROS NO?

OfUAHZ

smintcs

lo de #3 es C a secas no?

de todas maneras aunque ahora estes dando pascal supongo que tarde o temprano daras C C++ o Java, pascal esta bastante anticuado y se usa para aprender creo

T

pascal sucks

m0rG

Aquí en la UPNA en la asignatura Estructura de Datos dimos una práctica que era precisamente programar una calculadora que interpretara expresiones matemáticas con paréntesis etc...

Básicamente hay que tener en cuenta que dentro de las operaciones aritméticas hay unas que tienen más prioridad que otras además de los paréntesis(que estén correctamente escritos y demás).Realmente es bastante complejo por que hay que utilizar pilas y seguramente no lo habréis visto.

Mi consejo es que hagas la práctica tal y como os la han pedido y no te metas en estas historias,ya tendrás tiempo de pelearte con todo esto xD .

PD-Si sigues interesado mándame un msj privado y te envío el pdf con la explicación de cómo se hace.

dr_Rouman

#7 Pascal no sux, pascal se usa para aprender a programar (se diseñó para eso) y sobre todo para gente que no estudia informática y no va a necesitar lenguajes tan "bajos" como C.

Ese que ha puesto algo como "c++", sí, es C normal y corriente xD.

cracking

no se mucho de programacion, pero si lo q quieres es sumar mas numeros sin tener q crear 2390213 variables, pues algo asi:

Var num:real;
Suma:real;
pregunta:char;

Suma := 0
Writeln('Introduce el primer numero');
Readln(num);
Suma := Suma + num
Writeln(' ');
Writeln('Introduce el segundo numero');
Readln(num);
Suma := Suma + num
Writeln(' ');
Writeln('¿Quieres sumar más numeros? presiona "s" de sí o "n" de no');
Readln(pregunta);
While pregunta="s" begin
Writeln('Introduce el siguiente numero');
Readln(num);
Suma := Suma + num
Writeln('¿Quieres sumar más numeros? presiona "s" de sí o "n" de no');
Readln(pregunta);
end
Writeln('La suma de los números introducidos es: ' Suma);

PD: no tengo ni idea de pascal, me he guiado sobre tu codigo para mas o menos escribir esto, asi q hay cosas q no se si es escriben asi, he puesto en negrita lo q me he inventado porq nose como se define en pascal una variable de tipo caracter, y tb lo del while.. nose como sera la sintaxis de un mientras.. mayormente lo q hace por si no lo entiendes XD, es primero pregunta 2 numeros (como minimo sumara 2 numeros no xD?) y la variable Suma inicializada en 0 tomara el antiguo valor de suma (cero para la primera suma) + el numero introducido, luego en funcion de si quiere sumar mas o no (mientras variable pregunta sea igual a si, en realidad esto es un poco xapuza, porq anoser q meta exclusivamente "s" no saldra del bucle, da igual q meta "n" o "HOLAQTALSOYCOLOSAL" xd) seguira pidiendo numeros y almacenandolos en suma, asi hasta q diga q no, y te muestra suma XD no tara bien seguramente, pero espero q te ayude XD, para la multiplicacion resta y tal, pues igual..

PD2: otra opcion para no preguntar 'quieres sumar mas?' todo el rato, seria preguntar al principio la cantidad de numeros con los q quieres operar, y luego realizar un 'para' (for) o un 'repetir' (repeat) q se repitiesen las instrucciones N veces, donde N es la cantidad de numeros con los q operar . XD no se si me explico.

B

#6, si no ves templates ni clases ni coses raras, si, es c

Usuarios habituales