taghack
Programmer
- May 2, 2013
- 3
I have a weird assignment that I am struggling with. I have written a very simple method to insert spaces into a text and produce an evenly formatted (justified) text as a result. The coding in Java was fairly straightforward, but I now have to rewrite it in Fortran ... After a lot of efforts i finally rolled out this ugly code. However it seems that I am missing some key point when it comes to concatenating spaces to a string or atleast thats what i think. Anyway it is not outputting what it should. Could somebody please take a look at it. I would be very grateful. Here is the code:
Code:
program xfunc
implicit none
CHARACTER(LEN=682) :: text
CHARACTER(100) :: words(100)
CHARACTER(2000) :: result
integer :: lineLenght
integer :: beginningIndent
integer :: pos1
integer :: pos2
integer :: n
integer :: i
integer :: characterCount
CHARACTER(100) :: wordsForLine(100)
integer :: wordsForLinePointer
integer :: substractForInterval
CHARACTER(20) :: beginningIndentWord
integer :: k
integer :: numberOfSpacesToAddAfterEachWord
integer :: numberOfLeftOverSpaces
integer :: numberOfLeftOverSpacesAdded
integer :: j
integer :: p
text = 'Lorem ipsum dolor sit amet, &
consectetur adipiscing elit. Duis et &
ante at eros euismod molestie eu &
varius ipsum. Aenean gravida pharetra &
magna quis auctor. Nullam est leo, &
dictum ac luctus quis, aliquet eu &
neque. Donec in nisl enim, et &
malesuada odio. Nulla scelerisque &
tortor id justo porttitor et &
vulputate urna pharetra. Pellentesque &
mollis condimentum elementum. Cras &
tempor, turpis hendrerit adipiscing &
lacinia, dolor metus egestas velit, &
venenatis vulputate leo eros elementum &
tellus. Vivamus id dui erat. Sed &
dictum consequat nulla, sed gravida &
eros mattis in. Suspendisse ac lorem &
lorem, ut molestie justo. Quisque &
suscipit velit ut odio euismod &
elementum. Vestibulum tempus.'
lineLenght = 50
beginningIndent = 10
pos1 = 1
n = 0
DO
pos2 = INDEX(text(pos1:), " ")
IF (pos2 == 0) THEN
n = n + 1
words(n) = text(pos1:)
EXIT
END IF
n = n + 1
words(n) = text(pos1:pos1+pos2-2)
pos1 = pos2+pos1
END DO
print*, LEN(words)
i = 0
DO
IF( i >= LEN(words) ) THEN
EXIT
END IF
characterCount = 0
wordsForLinePointer = 0
DO
IF( wordsForLinePointer >= LEN(wordsForLine) ) THEN
EXIT
END IF
wordsForLine(wordsForLinePointer) = ''
wordsForLinePointer = wordsForLinePointer + 1
END DO
wordsForLinePointer = 0
substractForInterval = 1
IF( i == (LEN(wordsForLine) -1) ) THEN
substractForInterval = 0
END IF
DO
IF( (i >= LEN(words)) .AND. (characterCount > lineLenght - LEN(words(i)) - substractForInterval) ) THEN
EXIT
END IF
IF( i == 0 ) THEN
beginningIndentWord = ''
k=0
DO
IF( k >= beginningIndent ) THEN
EXIT
END IF
beginningIndentWord = beginningIndentWord//' '
k = k + 1
END DO
wordsForLine(wordsForLinePointer) = beginningIndentWord
wordsForLinePointer = wordsForLinePointer + 1
characterCount = characterCount + beginningIndent + 1
END IF
wordsForLine(wordsForLinePointer) = words(i)
wordsForLinePointer = wordsForLinePointer + 1
characterCount = characterCount + LEN(words(i)) + 1
i = i + 1
END DO
characterCount = characterCount - 1
numberOfSpacesToAddAfterEachWord = (lineLenght - characterCount) / (LEN(wordsForLine) - 1)
numberOfLeftOverSpaces = MOD((lineLenght - characterCount),(LEN(wordsForLine) - 1))
numberOfLeftOverSpacesAdded = 0
j = 0
DO
IF( j >= (wordsForLinePointer + 1) ) THEN
EXIT
END IF
result = result//wordsForLine(j)
IF( j < wordsForLinePointer ) THEN
result = result//' '
END IF
IF( i /= LEN(words) .AND. j < wordsForLinePointer ) THEN
p = 0
DO
IF( p >= numberOfSpacesToAddAfterEachWord ) THEN
EXIT
END IF
result = result//' '
p = p + 1
END DO
IF( numberOfLeftOverSpacesAdded < numberOfLeftOverSpaces ) THEN
result = result//' '
numberOfLeftOverSpacesAdded = numberOfLeftOverSpacesAdded + 1
END IF
END IF
j = j + 1
END DO
result = result//'\n'
END DO
print*, result
end program xfunc