Risoluzione di equazioni con turbo pascal

RISOLUZIONE DI
EQUAZIONI
EQUAZIONI DI I E II GRADO
ALGORITMI RISOLUTIVI ED
IMPLEMENTAZIONE IN
LINGUAGGIO PASCAL
Inizio
DESCRIZIONE DEL
PROGRAMMA
Cancella lo
schermo
EQUAZIONI DI
I GRADO
Stampa
versione ed
istruzioni
Fare clic sulla
parte di algoritmo
per visualizzarne
il corrispondente
codice
Acquisisce
termini
equazione
NO
x = - b/a
SI
a=0
SI
b=0
NO
Stampa
risultati
visualizza
disequazioni
Stampa
equazione
impossibile
Fine
Stampa
equazione
indeterminata
Nella codifica in liguaggio "Pascal" (LISTATO N
1) utilizziamo stringhe costanti allo scopo di
condensare tutta la messagistica nella
"testata" del programma: questa metodologia,
norma di buona programmazione, consente
una più semplice modifca del codice
separando
la
parte
testuale
relativa
all'ingresso/uscita a video da quella più
propriamente algoritmica, ove viene "risolto" il
problema.
La prima operazione eseguita dal programma é
la cancellazione dello schermo : nel linguaggio
Pascal non essendo definita una istruzione
specifica, si é pensato di realizzare la
cancellazione da programma, al fine di non
introdurre in questa fase propedeutica
deviazioni dallo standard del linguaggio che
possano risultare fuorvianti per l'allievo; la
cancellazione dello schermo viene realizzata
tramite un ciclo che stampa una serie di righe
vuote per tutta la lunghezza dello schermo
codificata nella costante SCRLEN.
Successivamente viene stampato il numero di
versione e le istruzioni del programma che si
configura per ricevere i dati di ingresso dall'utente.
E' possibile introdurre qualsiasi valore reale per i
coefficienti dell'equazione, ivi inclusi quelli che
rendono impossibile o indeterminata l'equazione.
Il calcolo della soluzione si riassume
nell'assegnazione X := -B/A che viene eseguita
condizionalmente, se non sono stati introdotti
termini nulli nei coefficienti, diversamene viene
stampato un messaggio di equazione impossibile
o indeterminata.
L'ultima serie di istruzioni visualizza i risultati
dell'equazione e traccia i diagrammi delle
disequazioni associate utilizzando i caratteri
stampabili a video codificati nelle costanti
UNKNOWN e DASHLINE.
I risultati numerici vengono visualizzati nella
precisione specificata tramite la costante
DIGITS.
LISTATO N 1
PARTE I
PROGRAM EQNE1(INPUT, OUTPUT);
CONST
VERSION1='Risoluzione equazioni e disequazioni
di 1o grado';
DESCR1='Questo programma risolve equazioni di
primo grado';
DESCR2='nella forma:';
DESCR3='
ax + b = 0';
DESCR4='';
DESCR5='e le disequazioni:';
DESCR6='
ax + b > 0';
DESCR7='
ax + b <= 0';
QUESTION1='Inserire il coefficiente della x:';
QUESTION2='Inserire il valore del termine
noto:';
ANSWER1='La soluzione della equazione Ë:';
ANSWER2='Le soluzioni delle disequazioni
sono:';
ANSWER3=' intervallo aperto a sx';
ANSWER4=' intervallo semi-aperto a dx';
SCRLEN = 24; (* Lunghezza dell'area stampabile
in righe *)
DIGITS = 4; (* Numero di cifre significative
da stampare *)
(* Simboli vari stampabili a video *)
UNKNOWN= 'x';
STAR='*';
DASHLINE='-----';
BLANKLINE='
';
LISTATO N 1
PARTE II
VAR
I:
A:
B:
X:
INTEGER; (* Variabile indice usata nei loop *)
REAL;
(* Coefficiente incognita *)
REAL;
(* Termine noto *)
REAL;
(* Soluzione equazione *)
BEGIN
(* Prima pulisce lo schermo stampando una serie di
linee *)
(* vuote per la dimensione dell'area stampabile.
*)
FOR I:=1 TO SCRLEN DO
WRITELN;
(* Stampa numeri di versione ed istruzioni per
l'uso *)
WRITELN(VERSION1);
WRITELN(VERSION2);
WRITELN(DESCR1);
WRITELN(DESCR2);
WRITELN(DESCR3);
WRITELN(DESCR4);
WRITELN(DESCR5);
WRITELN(DESCR6);
WRITELN(DESCR7);
LISTATO N 1
PARTE II
VAR
I:
A:
B:
X:
INTEGER; (* Variabile indice usata nei loop *)
REAL;
(* Coefficiente incognita *)
REAL;
(* Termine noto *)
REAL;
(* Soluzione equazione *)
BEGIN
(* Prima pulisce lo schermo stampando una serie di
linee *)
(* vuote per la dimensione dell'area stampabile.
*)
FOR I:=1 TO SCRLEN DO
WRITELN;
(* Stampa numeri di versione ed istruzioni per
l'uso *)
WRITELN(VERSION1);
WRITELN(VERSION2);
WRITELN(DESCR1);
WRITELN(DESCR2);
WRITELN(DESCR3);
WRITELN(DESCR4);
WRITELN(DESCR5);
WRITELN(DESCR6);
WRITELN(DESCR7);
LISTATO N 1
PARTE II
VAR
I:
A:
B:
X:
INTEGER; (* Variabile indice usata nei loop *)
REAL;
(* Coefficiente incognita *)
REAL;
(* Termine noto *)
REAL;
(* Soluzione equazione *)
BEGIN
(* Prima pulisce lo schermo stampando una serie di
linee *)
(* vuote per la dimensione dell'area stampabile.
*)
FOR I:=1 TO SCRLEN DO
WRITELN;
(* Stampa numeri di versione ed istruzioni per
l'uso *)
WRITELN(VERSION1);
WRITELN(VERSION2);
WRITELN(DESCR1);
WRITELN(DESCR2);
WRITELN(DESCR3);
WRITELN(DESCR4);
WRITELN(DESCR5);
WRITELN(DESCR6);
WRITELN(DESCR7);
LISTATO N 1
PARTE III
(* Acquisisce i termini dell'eqne *)
WRITELN;
WRITE(QUESTION1); READ(A);
WRITE(QUESTION2); READ(B);
(* Calcola la soluzione dell'equazione *)
X := -B/A;
(* Stampa dei risultati *)
WRITELN(ANSWER1); (* Risultato equazione *)
WRITE(UNKNOWN,' = -b/a = ',X:DIGITS);
WRITELN;
WRITELN(ANSWER2); (* Prima disequazione *)
WRITE(UNKNOWN,' > -b/a = ',X:DIGITS,'
<',DASHLINE,UNKNOWN,')');
WRITELN(ANSWER3); (* Seconda disequazione *)
WRITE(UNKNOWN,' <= -b/a = ',X:DIGITS,'
[',UNKNOWN,DASHLINE,'>');
WRITELN(ANSWER4);
END.
LISTATO N 1
PARTE III
(* Acquisisce i termini dell'eqne *)
WRITELN;
WRITE(QUESTION1); READ(A);
WRITE(QUESTION2); READ(B);
(* Calcola la soluzione dell'equazione *)
X := -B/A;
(* Stampa dei risultati *)
WRITELN(ANSWER1); (* Risultato equazione *)
WRITE(UNKNOWN,' = -b/a = ',X:DIGITS);
WRITELN;
WRITELN(ANSWER2); (* Prima disequazione *)
WRITE(UNKNOWN,' > -b/a = ',X:DIGITS,'
<',DASHLINE,UNKNOWN,')');
WRITELN(ANSWER3); (* Seconda disequazione *)
WRITE(UNKNOWN,' <= -b/a = ',X:DIGITS,'
[',UNKNOWN,DASHLINE,'>');
WRITELN(ANSWER4);
END.
ESEMPI DI ESECUZIONE
ESEMPIO N.1
Risoluzione equazioni e disequazioni di 1o
grado
Questo programma risolve equazioni di primo
grado
nella forma:
ax + b = 0
e le disequazioni:
ax + b > 0
ax + b <= 0
Inserire il coefficiente della x:5
Inserire il valore del termine noto:15
La soluzione della equazione fi:
x = -b/a = -3.0E+000
Le soluzioni delle disequazioni sono:
x > -b/a = -3.0E+000 <-----x) intervallo
aperto a sx
x <= -b/a = -3.0E+000 [x-----> intervallo
semi-aperto a dx
ESEMPI DI ESECUZIONE
ESEMPIO N.2
Risoluzione equazioni e disequazioni di 1o grado
Questo programma risolve equazioni di primo grado
nella forma:
ax + b = 0
e le disequazioni:
ax + b > 0
ax + b <= 0
Inserire il coefficiente della x:5
Inserire il valore del termine noto:0
La soluzione della equazione fi:
x = -b/a = -0.0E+000
Le soluzioni delle disequazioni sono:
x > -b/a = -0.0E+000 <-----x) intervallo aperto a sx
x <= -b/a = -0.0E+000 [x-----> intervallo semi-aperto a dx
ESEMPI DI ESECUZIONE
ESEMPIO N.3
Risoluzione equazioni e disequazioni di 1o grado
Questo programma risolve equazioni di primo grado
nella forma:
ax + b = 0
e le disequazioni:
ax + b > 0
ax + b <= 0
Inserire il coefficiente della x:1.5
Inserire il valore del termine noto:-6
La soluzione della equazione fi:
x = -b/a = 4.0E+000
Le soluzioni delle disequazioni sono:
x > -b/a = 4.0E+000 <-----x) intervallo aperto a sx
x <= -b/a = 4.0E+000 [x-----> intervallo semi-aperto a dx
DESCRIZIONE DEL
PROGRAMMA
EQUAZIONI DI II
GRADO
L'algoritmo indicato
determina le incognite per
le equazioni di secondo
grado utilizzando la
formula risolutiva in forma
chiusa basata sull'analisi
del discriminante.
Fare clic sulla parte di
algoritmo per visualizzarne
il corrispondente codice
La strutturazione del programma (LISTATO N 2)
segue le linee guida già indicate nel caso delle
equazioni di primo grado, con una parte iniziale
costituita da stringhe costanti, e una stampa di
messaggio di chiusura; il calcolo delle soluzioni
invece è collocato nel corpo di una struttura selettiva
dove si analizza il discriminante dell'equazione in
esame, allo scopo di distinguere i vari casi:
- soluzioni reali e distinte;
- soluzioni reali e coincidenti;
- soluzioni complesse coniugate.
LISTATO N 2
PARTE I
PROGRAM EQNE1(INPUT, OUTPUT);
CONST
VERSION1='Risoluzione equazioni e disequazioni di
2o grado';
VERSION2='Version 1.0 by Lucia Sglavo as
19/03/2000';
DESCR1='Questo programma risolve equazioni di
secondo grado';
DESCR2='nella forma:';
DESCR3='
ax^2 + bx + c = 0';
DESCR4='';
QUESTION1='Inserire il coefficiente della x^2:';
QUESTION2='Inserire il coefficiente della x:';
QUESTION3='Inserire il valore del termine noto:';
ANSWER1='Il discriminante (b^2 - 4ac) vale:';
ANSWER2='Calcolo la soluzione della equazione.';
ANSWER3=' DELTA > 0 => due soluzioni reali
distinte:';
ANSWER4=' DELTA = 0 => due soluzioni reali
coincidenti:';
ANSWER5=' DELTA < 0 => due soluzioni complesse
coniugate:';
ANSWER6=' FINE PROGRAMMA.';
SCRLEN = 24; (* Lunghezza dell'area stampabile in
righe *)
DIGITS = 4; (* Numero di cifre significative da
stampare *)
(* Simboli vari stampabili a video *)
UNKNOWN= 'x';
STAR='*';
DASHLINE='-----';
LISTATO N 2
PARTE II
VAR
I: INTEGER; (*
*)
A: REAL;
incognita *)
B: REAL;
incognita *)
C: REAL;
X1,X2: REAL;(*
C1,C2: REAL;(*
*)
DELTA: REAL;(*
Variabile indice usata nei loop
(* Coefficiente quadratico
(* Coefficiente lineare
(* Termine noto *)
Soluzioni reali dell'equazione *)
Coefficienti immaginari soluzioni
Discriminante dell'equazione *)
BEGIN
(* Prima pulisce lo schermo stampando una serie
di linee
*)
(* vuote per la dimensione dell'area stampabile.
*)
FOR I:=1 TO SCRLEN DO
WRITELN;
(* Stampa numeri di versione ed istruzioni per
l'uso *)
WRITELN(VERSION1);
WRITELN(VERSION2);
WRITELN(DESCR1);
WRITELN(DESCR2);
WRITELN(DESCR3);
WRITELN(DESCR4);
LISTATO N 2
PARTE III
(* Acquisisce i termini dell'eqne *)
WRITELN;
WRITE(QUESTION1); READ(A);
WRITE(QUESTION2); READ(B);
WRITE(QUESTION3); READ(C);
(* Calcola il DISCRIMINANTE dell'equazione
*)
DELTA:= SQR(B) - 4 * A * C;
WRITELN(ANSWER1);
WRITELN;
WRITELN('
DELTA = ',DELTA:DIGITS);
WRITELN;
LISTATO N 2
PARTE IV
(* Calcola la soluzione dell'equazione *)
WRITELN(ANSWER2);
WRITELN;
IF (DELTA > 0) (* Due soluzioni reali *)
THEN BEGIN
WRITELN(ANSWER3);
X1 := (-B + SQRT(DELTA))/(2*A);
X2 := (-B - SQRT(DELTA))/(2*A);
WRITELN;
WRITE(UNKNOWN,'1 = ', X1:DIGITS,' ;
WRITE(UNKNOWN,'2 = ', X2:DIGITS);
');
END
ELSE IF (DELTA = 0) (* Soluzioni reali coincidenti *)
THEN BEGIN
WRITELN(ANSWER4);
X1 := -B/(2*A);
WRITELN;
WRITE(UNKNOWN,'1,2 = ', X1:DIGITS);
END
ELSE (* DELTA < 0 => Due soluzioni complesse coniugate *)
BEGIN
WRITELN(ANSWER5);
(* Calcolo parte REALE del risultato *)
X1 := -B/(2*A);
(* Calcolo coefficienti della parte immaginaria
*)
C1 := SQRT(ABS(DELTA))/(2*A);
C2 := -SQRT(ABS(DELTA))/(2*A);
(* Stampa del risultato complesso *)
i ;
WRITELN;
WRITE(UNKNOWN,'1 = ', X1:DIGITS,' + ',C1:DIGITS,'
');
WRITE(UNKNOWN,'2 = ', X1:DIGITS,' + ',C2:DIGITS,'
LISTATO N 2
PARTE V
(* Stampa dei messaggio di chiusura *)
WRITELN; WRITELN;
WRITELN(ANSWER6); (* Risultato
equazione *)
END.
ESEMPI DI ESECUZIONE
ESEMPIO N 1
CASO1
Sia dato (ax - b)2 = a2x2 - 2 abx + b2 con a = 2 e b = 3:
Risoluzione equazioni e disequazioni di 1o grado
Questo programma risolve equazioni di secondo grado
nella forma:
ax^2 + bx + c = 0
Inserire il coefficiente della x^2:Inserire il
coefficiente della x:Inserire il valore del termine
noto:Il discriminante (b^2 - 4ac) vale:
DELTA =
0.0E+000
Calcolo la soluzione della equazione.
DELTA = 0 => due soluzioni reali coincidenti:
x1,2 =
1.5E+000
FINE PROGRAMMA.
ESEMPI DI ESECUZIONE
ESEMPIO N 2
CASO2
Sia dato il prodotto di monomi (x - 6) (x + 5) = x2 - x - 30:
Risoluzione equazioni e disequazioni di 1o grado
Questo programma risolve equazioni di secondo grado
nella forma:
ax^2 + bx + c = 0
Inserire il coefficiente della x^2:Inserire il coefficiente della
x:Inserire il valore del termine noto:Il discriminante (b^2 - 4ac)
vale:
DELTA =
1.2E+002
Calcolo la soluzione della equazione.
DELTA > 0 => due soluzioni reali distinte:
x1 =
6.0E+000 ;
FINE PROGRAMMA.
x2 = -5.0E+000
ESEMPI DI ESECUZIONE
ESEMPIO N 3
CASO 3
Discriminante negativo.
Risoluzione equazioni e disequazioni di 1o grado
Questo programma risolve equazioni di secondo grado
nella forma:
ax^2 + bx + c = 0
Inserire il coefficiente della x^2:2
Inserire il coefficiente della x:5
Inserire il valore del termine noto:7
Il discriminante (b^2 - 4ac) vale:
DELTA = -3.1E+001
Calcolo la soluzione della equazione.
DELTA < 0 => due soluzioni complesse coniugate:
x1 = -1.3E+000 +
FINE PROGRAMMA.
1.4E+000 i ;
x2 = -1.3E+000 + -1.4E+000 i .
Proposte di sviluppo
- migliorare la diagnostica del programma risolutore delle equazioni
di primo grado prevedendo i casi di equazioni impossibile
(quando il coefficiente dell'incognita e' nullo) ed indeterminata
(quando sono nulli entrambi i coefficienti);
- migliorare l'input del programma dando la possibilità di correggere i
dati in ingresso durante la fase di introduzione, senza dover
rilanciare il programma;
- migliorare la formattazione dell'output, in particolare per il
programma relativo alle equazioni di secondo grado migliorare la
visualizzazione delle soluzioni complesse coniugate;
- visualizzare, per il programma risolutore delle equazioni di secondo
grado, anche le disequazioni associate con i relativi intervalli di
soluzione.