segundo resueltos por julioprofe grado general factorizar factorizacion ejercicios ecuaciones cuadraticas cuadrados completacion como algebraicas fortran gfortran

fortran - resueltos - Resolviendo la ecuación cuadrática pero obteniendo errores extraños



ecuaciones cuadraticas por factorizacion julioprofe (4)

Algunos cambios: correcta sintaxis IF; las constantes son números reales en lugar de números enteros, cuando corresponda:

IF (CORRECT == "N" ) stop if ( discrim > 0.0 ) then

Aplicar en ubicaciones adicionales, y debe estar muy cerca. Buena suerte.

Puede ser un algoritmo pobre para probar un número de punto flotante para tener un valor exacto. ¿Qué ocurre si el error de redondeo hace que disrim tenga el valor 1.0E-30, cuando la aritmética perfecta daría el valor cero e indicaría una raíz doble?

Estoy intentando mi primer programa en Fortran, tratando de resolver una ecuación cuadrática. Hice doble y triple comprobación de mi código y no veo nada mal. Sigo recibiendo "Carácter inválido en el nombre en (1)" y "Declaración inclasificable en (1)" en varios lugares. ¿Qué está mal con el código?

! This program solves quadratic equations ! of the form ax^2 + bx + c = 0. ! Record: ! Name: Date: Notes: ! Damon Robles 4/3/10 Original Code PROGRAM quad_solv IMPLICIT NONE ! Variables REAL :: a, b, c REAL :: discrim, root1, root2, COMPLEX :: comp1, comp2 CHARACTER(len=1) :: correct ! Prompt user for coefficients. WRITE(*,*) "This program solves quadratic equations " WRITE(*,*) "of the form ax^2 + bx + c = 0. " WRITE(*,*) "Please enter the coefficients a, b, and " WRITE(*,*) "c, separated by commas:" READ(*,*) a, b, c WRITE(*,*) "Is this correct: a = ", a, " b = ", b WRITE(*,*) " c = ", c, " [Y/N]? " READ(*,*) correct IF correct = N STOP IF correct = Y THEN ! Definition discrim = b**2 - 4*a*c ! Calculations IF discrim > 0 THEN root1 = (-b + sqrt(discrim))/(2*a) root2 = (-b - sqrt(discrim))/(2*a) WRITE(*,*) "This equation has two real roots. " WRITE(*,*) "x1 = ", root1 WRITE(*,*) "x2 = ", root2 IF discrim = 0 THEN root1 = -b/(2*a) WRITE(*,*) "This equation has a double root. " WRITE(*,*) "x1 = ", root1 IF discrim < 0 THEN comp1 = (-b + sqrt(discrim))/(2*a) comp2 = (-b - sqrt(discrim))/(2*a) WRITE(*,*) "x1 = ", comp1 WRITE(*,*) "x2 = ", comp2 PROGRAM END quad_solv


Tantos errores ... Parece que no sabes los conceptos básicos de Fortran ...

Con correcciones mínimas

! This program solves quadratic equations ! of the form ax^2 + bx + c = 0. ! Record: ! Name: Date: Notes: ! Damon Robles 4/3/10 Original Code PROGRAM quad_solv IMPLICIT NONE ! Variables REAL :: a, b, c REAL :: discrim, root1, root2 COMPLEX :: comp1, comp2 CHARACTER(len=1) :: correct ! Prompt user for coefficients. WRITE(*,*) "This program solves quadratic equations " WRITE(*,*) "of the form ax^2 + bx + c = 0. " WRITE(*,*) "Please enter the coefficients a, b, and " WRITE(*,*) "c, separated by commas:" READ(*,*) a, b, c WRITE(*,*) "Is this correct: a = ", a, " b = ", b WRITE(*,*) " c = ", c, " [Y/N]? " READ(*,*) correct IF (correct == ''N'') STOP IF (correct == ''Y'') THEN ! Definition discrim = b**2 - 4*a*c ! Calculations IF (discrim > 0) THEN root1 = (-b + sqrt(discrim))/(2*a) root2 = (-b - sqrt(discrim))/(2*a) WRITE(*,*) "This equation has two real roots. " WRITE(*,*) "x1 = ", root1 WRITE(*,*) "x2 = ", root2 ELSEIF (discrim == 0) THEN root1 = -b/(2*a) WRITE(*,*) "This equation has a double root. " WRITE(*,*) "x1 = ", root1 ELSE comp1 = (-b + sqrt(discrim))/(2*a) comp2 = (-b - sqrt(discrim))/(2*a) WRITE(*,*) "x1 = ", comp1 WRITE(*,*) "x2 = ", comp2 END IF END IF END PROGRAM quad_solv

PD: No revisé la corrección. PPS Siempre sangría su código para que sea legible y no use la instrucción STOP. Cada programa (o subrutina) debe tener una entrada y una salida. El único lugar correcto para DETENER es exactamente antes de la declaración del PROGRAMA END donde es redundante. Entonces no use STOP en absoluto.


Refiérase a la pregunta adicional de cómo hacer un loop back para rehacer la entrada - un programa de ejemplo que demuestra las características de bucle de Fortran> = 90. El bucle es aparentemente infinito - la salida controlada por la instrucción IF sale del bucle y hace que el bucle sea finito. También se muestra el control de ciclo , que se utiliza si se encuentra una entrada no válida, que de lo contrario bloquearía el programa. (Por ejemplo, escriba "A" como entrada en la primera lectura, en lugar de un número.) En este caso, la variable iostat adquiere un valor distinto de cero, la instrucción IF activa el ciclo y el resto del ciclo DO es omitido, para que el ciclo vuelva a comenzar.

program test_readdata real :: a, b, c integer :: ReturnCode character (len=1) :: correct ReadData: do write (*, ''( "This program solves quadratic equations of the form ax^2 + bx + c = 0. " )'' ) write (*, ''( "Please enter the coefficients a, b, and c, separated by commas: " )'', advance=''no'' ) read (*,*, iostat=ReturnCode) a, b, c if ( ReturnCode /= 0 ) cycle ReadData write (*,*) "Is this correct: a = ", a, " b = ", b, " c = ", c write (*, ''( "Enter Y or N: " )'', advance=''no'' ) read (*,*, iostat=ReturnCode) correct if ( ReturnCode /= 0 ) cycle ReadData if ( correct == ''Y'' .or. correct == ''y'' ) exit ReadData end do ReadData stop end program test_readdata

La recomendación de mi libro: Fortran 95/2003 explicado por Metcalf, Reid y Cohen.


Lo primero que noté con su código es el error de sintaxis al final de su programa.

END

debería haber precedido a la palabra programa

¿Su editor no resalta sus errores de sintaxis?

Puede obtener la versión para estudiantes de ELF 90 de forma bastante económica y es un buen lugar para comenzar. Me gustaría actualizar a Lahey ELF 95 con Visual Studio y generador de diagrama de flujo algorítmico que codifica el color de las vías de paso de los valores.