program main !*****************************************************************************80 ! !! bank_test() tests bank(). ! ! Licensing: ! ! This code is distributed under the MIT license. ! ! Modified: ! ! 05 October 2015 ! ! Author: ! ! John Burkardt ! implicit none call timestamp ( ) write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'bank_test():' write ( *, '(a)' ) ' Fortran90 version' write ( *, '(a)' ) ' Test bank().' call ch_is_digit_test ( ) call ch_to_digit_test ( ) call s_to_digits_test ( ) call bank_check_digit_calculate_test ( ) call bank_is_valid_test ( ) ! ! Terminate. ! write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'BANK_TEST' write ( *, '(a)' ) ' Normal end of execution.' write ( *, '(a)' ) ' ' call timestamp ( ) stop 0 end subroutine ch_is_digit_test ( ) !*****************************************************************************80 ! !! CH_IS_DIGIT_TEST tests CH_IS_DIGIT. ! ! Licensing: ! ! This code is distributed under the MIT license. ! ! Modified: ! ! 08 September 2015 ! ! Author: ! ! John Burkardt ! implicit none character c character, dimension ( 13 ) :: c_test = (/ & '0', '1', '2', '3', '4', & '5', '6', '7', '8', '9', & 'X', '?', ' ' /) logical ch_is_digit integer i logical value write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'CH_IS_DIGIT_TEST' write ( *, '(a)' ) ' CH_IS_DIGIT is TRUE if a character represents a digit.' write ( *, '(a)' ) '' write ( *, '(a)' ) ' C CH_IS_DIGIT(C)' write ( *, '(a)' ) '' do i = 1, 13 c = c_test(i) value = ch_is_digit ( c ) write ( *, '(2x,a,2x,l1)' ) '"' // c // '"', value end do return end subroutine ch_to_digit_test ( ) !*****************************************************************************80 ! !! CH_TO_DIGIT_TEST tests CH_TO_DIGIT. ! ! Licensing: ! ! This code is distributed under the MIT license. ! ! Modified: ! ! 08 September 2015 ! ! Author: ! ! John Burkardt ! implicit none character c character, dimension ( 13 ) :: c_test = (/ & '0', '1', '2', '3', '4', & '5', '6', '7', '8', '9', & 'X', '?', ' ' /) integer d integer i write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'CH_TO_DIGIT_TEST' write ( *, '(a)' ) ' CH_TO_DIGIT: character -> decimal digit' write ( *, '(a)' ) '' write ( *, '(a)' ) ' C CH_TO_DIGIT(C)' write ( *, '(a)' ) '' do i = 1, 13 c = c_test(i) call ch_to_digit ( c, d ) write ( *, '(2x,a,2x,i8)' ) '"' // c // '"', d end do return end subroutine s_to_digits_test ( ) !*****************************************************************************80 ! !! S_TO_DIGITS_TEST tests S_TO_DIGITS. ! ! Licensing: ! ! This code is distributed under the MIT license. ! ! Modified: ! ! 08 September 2015 ! ! Author: ! ! John Burkardt ! implicit none integer dvec(20) integer n character ( len = 255 ) s write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'S_TO_DIGITS_TEST' write ( *, '(a)' ) ' S_TO_DIGITS: string -> digit vector' s = '34E94-70.6' write ( *, '(a)' ) '' write ( *, '(a)' ) ' Test string: "' // trim ( s ) // '"' n = 5 call s_to_digits ( s, n, dvec ) call i4vec_print ( n, dvec, ' Extracted 5 digits:' ) s = '34E94-70.6' write ( *, '(a)' ) '' write ( *, '(a)' ) ' Test string: "' // trim ( s ) // '"' n = 7 call s_to_digits ( s, n, dvec ) call i4vec_print ( n, dvec, ' Extracted 7 digits:' ) return end subroutine bank_check_digit_calculate_test ( ) !*****************************************************************************80 ! !! BANK_CHECK_DIGIT_CALCULATE_TEST tests BANK_CHECK_DIGIT_CALCULATE. ! ! Licensing: ! ! This code is distributed under the MIT license. ! ! Modified: ! ! 05 October 2015 ! ! Author: ! ! John Burkardt ! implicit none integer d1 integer d2 character ( len = 255 ) s1 integer bank_check_digit_calculate write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'BANK_CHECK_DIGIT_CALCULATE_TEST' write ( *, '(a)' ) ' BANK_CHECK_DIGIT_CALCULATE calculates the 12-th digit' write ( *, '(a)' ) ' (the check digit) of a bank checksum.' write ( *, '(a)' ) '' ! ! Supply the full code, with dashes. ! s1 = '123-456-780' d1 = 0 d2 = bank_check_digit_calculate ( s1 ) write ( *, '(a,i1,a,i1)' ) ' Check digit of "' // trim ( s1 ) // '" is ', d2, ', expecting ', d1 ! ! Supply a partial code, with spaces. ! s1 = '123 456 78' d1 = 0 d2 = bank_check_digit_calculate ( s1 ) write ( *, '(a,i1,a,i1)' ) ' Check digit of "' // trim ( s1 ) // '" is ', d2, ', expecting ', d1 ! ! Supply a partial code, no spaces. ! s1 = '323-371-076' d1 = 6 d2 = bank_check_digit_calculate ( s1 ) write ( *, '(a,i1,a,i1)' ) ' Check digit of "' // trim ( s1 ) // '" is ', d2, ', expecting ', d1 ! ! Supply a partial code, no spaces. ! s1 = '87654321' d1 = 2 d2 = bank_check_digit_calculate ( s1 ) write ( *, '(a,i1,a,i1)' ) ' Check digit of "' // trim ( s1 ) // '" is ', d2, ', expecting ', d1 ! ! Supply a partial code, no spaces. ! s1 = '13579864' d1 = 3 d2 = bank_check_digit_calculate ( s1 ) write ( *, '(a,i1,a,i1)' ) ' Check digit of "' // trim ( s1 ) // '" is ', d2, ', expecting ', d1 return end subroutine bank_is_valid_test ( ) !*****************************************************************************80 ! !! BANK_IS_VALID_TEST tests BANK_IS_VALID. ! ! Licensing: ! ! This code is distributed under the MIT license. ! ! Modified: ! ! 05 October 2015 ! ! Author: ! ! John Burkardt ! implicit none logical bank_is_valid character ( len = 255 ) s1 logical value1 logical value2 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'BANK_IS_VALID_TEST' write ( *, '(a)' ) ' BANK_IS_VALID reports whether a bank checksum is valid.' write ( *, '(a)' ) '' ! ! Supply a valid code, with dashes. ! s1 = '323-371-076' value1 = .true. value2 = bank_is_valid ( s1 ) write ( *, '(a,l1,a,l1)' ) ' Validity of "' // trim ( s1 ) // '" is ', value2, ', expecting ', value1 ! ! Modify one digit. ! s1 = '323-371-576' value1 = .false. value2 = bank_is_valid ( s1 ) write ( *, '(a,l1,a,l1)' ) ' Validity of "' // trim ( s1 ) // '" is ', value2, ', expecting ', value1 ! ! Supply a valid code, with spaces. ! s1 = '123 456 780' value1 = .true. value2 = bank_is_valid ( s1 ) write ( *, '(a,l1,a,l1)' ) ' Validity of "' // trim ( s1 ) // '" is ', value2, ', expecting ', value1 ! ! Modify the check digit. ! s1 = '123 456 789' value1 = .false. value2 = bank_is_valid ( s1 ) write ( *, '(a,l1,a,l1)' ) ' Validity of "' // trim ( s1 ) // & '" is ', value2, ', expecting ', value1 return end subroutine timestamp ( ) !*****************************************************************************80 ! !! timestamp() prints the current YMDHMS date as a time stamp. ! ! Example: ! ! 31 May 2001 9:45:54.872 AM ! ! Licensing: ! ! This code is distributed under the MIT license. ! ! Modified: ! ! 18 May 2013 ! ! Author: ! ! John Burkardt ! ! Parameters: ! ! None ! implicit none character ( len = 8 ) ampm integer d integer h integer m integer mm character ( len = 9 ), parameter, dimension(12) :: month = (/ & 'January ', 'February ', 'March ', 'April ', & 'May ', 'June ', 'July ', 'August ', & 'September', 'October ', 'November ', 'December ' /) integer n integer s integer values(8) integer y call date_and_time ( values = values ) y = values(1) m = values(2) d = values(3) h = values(5) n = values(6) s = values(7) mm = values(8) if ( h < 12 ) then ampm = 'AM' else if ( h == 12 ) then if ( n == 0 .and. s == 0 ) then ampm = 'Noon' else ampm = 'PM' end if else h = h - 12 if ( h < 12 ) then ampm = 'PM' else if ( h == 12 ) then if ( n == 0 .and. s == 0 ) then ampm = 'Midnight' else ampm = 'AM' end if end if end if write ( *, '(i2.2,1x,a,1x,i4,2x,i2,a1,i2.2,a1,i2.2,a1,i3.3,1x,a)' ) & d, trim ( month(m) ), y, h, ':', n, ':', s, '.', mm, trim ( ampm ) return end