Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

firstf90

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
[more] попытался воспроизвести алгоритм Шеннона-Фано.
прошлый вопрос, снят понял ошибку. но всё равно не работает. буду рад с подсказку.
[more]

Код:
MODULE modsh_f
 
 Character :: a(6) ! символы
 Integer :: af(6)  ! частота символов
 
END MODULE
 
 
! подпрограмма для поиска кода каждой буквы  
RECURSIVE Subroutine SearchTree(branch, full_branch, start_pos, end_pos)
 USE modsh_f
 
 Real :: dS ! Среднее значение массива  
 Integer :: i, m, S, start_pos, end_pos ! m - номер средней буквы в последовательности, S - сумма чисел, левой ветки  
 !Integer :: c_branch !string  текущая история поворотов по веткам  
 Character :: branch
 Character(len=77) :: c_branch,full_branch
   
 
 a(1)='a'
 a(2)='b'
 a(3)='c'
 a(4)='d'
 a(5)='e'
 a(6)='f'
 af(1)=10
 af(2)=8
 af(3)=6
 af(4)=5
 af(5)=4
 af(6)=3
 
 
do i=1,6
! проверка если это вход нулевой то очистить историю  
 if (a(i) .NE. ' ') then  
        call charSUM(c_branch,full_branch,branch)
        c_branch= c_branch
 else  
        c_branch = ''
 
 EndIf
enddo
 
 
!   Критерий выхода: если позиции символов совпали, то это конец  
 if (start_pos == end_pos) then
        Write(*,*)a(start_pos), ' = ', c_branch
        stop
 EndIf
 
 
! Подсчет среднего значения частоты в последовательности  
 dS= 0
 do i=start_pos, end_pos  
        dS= dS + af(i)
        dS= dS/2
 EndDo
 
 
        S= 0
        i= start_pos
        m= i
        do while (S+af(i)<dS .and. i<=end_pos)  
            S= S + af(i)
            call INC(i); call INC(m)
        enddo
 
 
! Рекурсия левая ветка дерева  
 call SearchTree('1', c_branch, start_pos, m)
! Правая ветка дерева  
 call SearchTree('0', c_branch, m+1, end_pos)
 
end
 
Subroutine INC(X)
Integer :: X
        X=X+1.
END
 
Program ShennonFano
 
 call SearchTree(' ',' ', 1, 6)
End Program ShennonFano
 
Subroutine charSUM(Summa,a,b)
 
 Character(len=77) ::  a, b
 Character(len=77) :: Summa
 Integer :: i
 
 a=trim(a)
 i = Len_Trim(a)
 Summa = a(1:i)//b
end
 

Всего записей: 3 | Зарегистр. 09-02-2012 | Отправлено: 10:12 09-02-2012 | Исправлено: firstf90, 11:16 09-02-2012
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru