Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Помогите решить задачи по фортрану (http://forum.oszone.net/showthread.php?t=147208)

IkinG 05-08-2009 20:36 1186504

Помогите решить задачи по фортрану
 
Доброго времени суток. Не могли бы вы мне помочь решить две задачи. Вот условия:
1) даны натуральное число n, символы s[1],...,s[n]. исключить из последовательности s[1],...,s[n] группы символов, расположенные между скобками (,). сами скобки тоже должны быть исключены. предполагается что внутри каждой пары скобок нет других скобок. (нужно сделать на fortran).
2) в данной действительной квадратной матрице порядка n найти сумму элементов строки, в которой расположен элемент с наименьшим значением (минимальный элемент). предполагается, что такой элемент единственный. (нужно сделать на fortran).
Желательно алгоритм решения должен быть максимально прост. Очень надеюсь на вашу помощь и буду премного благодарен.

Tau_0 21-08-2009 21:05 1199704

IkinG :), Время прошло и если это ещё актуально…

Как старый фортранщик, мог бы и помочь, но смущают этические проблемы:
--- Вам это для отписки (лениво самому разбираться), а зачёт нужен --- одно дело.
Думаю, что не стоит поощрять халявщиков…

--- Хвосты поджали (припёрло и некогда), другое дело --- без вопросов сделаю.

Сами задачи выеденного яйца не стоят, но поставлены из рук вон плохо. Толи Вы такой молодец, толи те, кто Вас научить собрался ещё большие умники.

Фортран, для меня святое, хотя не для обучения не предназначен…

Ну да ладно, итак???

1. ANSI.стандарт ФОРТРАНа? Языку более 50 лет!!!
На чем реализовывать. В задаче 1 символьные (строковые), данные. В изначальном Базовом Фортране (до 77-го) таких данных нет, но выкрутится можно -- есть код Холлерита. Кодировка символов???

2. Задача 2. Тип данных: целые, плавающая точка? Да и точность не помешает.

Как я понимаю, нужно написать подпрограммы. Хотя для задачи 2 это может быть и функция.

3. Среда. Думаю, что FORTRAN 77 в MS DOS Вам хватит. Но кто знает.

IkinG 22-08-2009 00:14 1199875

Доброго времени суток. Да, помощь мне действительно необходима. Но задачу с матрицами я уже сделал, а вот задача со строками не получается. Ума не приложу как сделать. Я думаю что лучше воспользоваться встроенными функциями обработки текстовых элементов. Но в данном случае придется ограничить длину строки определённым числом, так как константа n не поддерживается при использовании функций. Я пробовал циклично выводить подстроку, но так получается коряво. При решении я пользуюсь книгой Бартеньева. Все задачи решаю на Фортран 90. Буду премного благодарен за помощь. С уважением IkinG

Tau_0 28-05-2010 16:01 1423035

IkinG:), Увы, я тоже хвостист…
Задержка на N… месяцев по вредным обстоятельствам --- не было Инета…

Решение ниже
/////////////////////////////////////////////////////////////

PROGRAM Cutting

PARAMETER Bunny ='PROGRAM Cutting (((()))))----()((())())(**** +++(123),+++ &
(12) +++(123)////(1234),,,,,(12345) 12345 -- Compaq Visual &
Fortran Version 6.1 Home Page !!!(Debugging+++Fortran+++Programs)!!!'

CHARACTER ( Len = 200 ) InString
!
!------------------------------------------------------------------------------
!

InString = Bunny

WRITE (*, *) InString

CALL COMPRESS (InString)

WRITE (*, *) InString

END PROGRAM Cutting

! =============================================================================
!
!
! COMPRESS.F90 Подпрограмма COMPRESS
! Верезает печатные символы между сбалансированными скобками и сжимает строку...
! Освободившийся хвост строки зачищается пробелами
!
! Аргумент (Фиктивный параметр)
! ----------------------------------------------------------------------------
! Str --- Строка символов-
! ВНИМАНИЕ ПОДПРОГРАММА "КАЛЕЧИТ ПАРАМЕТР" !!! *** *** *** +++ +++ ---
!
!-----------------------------------------------------------------------------
!

SUBROUTINE COMPRESS (Str)


CHARACTER Str * (*)

CHARACTER Char ! Промежуточная Рабочая переменная для хранения символа

PARAMETER Left = '(', Rigth = ')', Blank = ' '! Обозвали так скобки и пробел для удобства
! и прозрачности текста программы
! Символ пробела (Нужен для зачистки)
! Blank) = '\0'C Если нужна C - совместимость --- ESC нулями
! (Символические имена лучше литералов...)

INTEGER Head, Tail ! Индексы-Указатели на символ в строке...
! Одиночный Символ интерпретируется как подстрока в строке
! P.S. При выходе из подпрограммы длина сжатой подстроки Head - 1

INTEGER LenStr ! Полная длина строки символов

INTEGER IBlank ! Индексирует "вычищаемые" символы хвоста (после сжатия0

LOGICAL Closed ! Флаг/Переключатель ---.TRUE. --- В Текущем состоянии Скобки закрыты
! ---.FALSE.. --- В Текущем состоянии Левая скобка открыта

!
! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
!
!
! ====================>>> Движение по строке слева направо ==========================>>>
! Обрабатываем строку посимвольно в DO-цикле от 1 до LEN(Str)
!
! Смысл Всего ЭТОГО в некотором Текущем состоянии
! -----------------------------------------------
!
!
! Head --- Текущий указатель на Голову
! ------------------------------------
! |
! | Tail --- Текущий указатель на Хвост
! | -----------------------------------
! | |
! | |
! ----------------------------------------- Строка символов
! | с1 | с2 | с3 | .. | .. | .. | .. | N | <===============
! -----------------------------------------
! 1 2 3 ... ... ... ... | Указатель на Последний символ строки N == LEN(Str)
! ------------------------------------------------------
! N == LenStr
!
!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
!

Head = 1
Closed =.TRUE.

LenStr = LEN(Str)
DO Tail = 1, LenStr
!-------------------------------------------------------
!Основной программный цикл по массиву одиночных символов
!передвигаемся слева направо.
! Нужные символы перебрасываются и хвоста в гллву...
!
! В некотором смысле Хвост из Головы растёт
! --- вначале совпадает с Головой, f затем
! (за счёт"рыхлости"строки символов) иуходит дальше...
!-------------------------------------------------------
!

Char = Str(Tail : Tail)


IF ( Char == Left ) THEN
Closed = .FALSE.
ELSEIF ( Char == Rigth ) THEN
Closed = .TRUE.
END IF


IF ( Closed .AND. (Char /= Rigth) ) THEN
! ---------------------------------------------------------------
! Если прапвая скобка закрыта и символ не правая скобка
! Только в этом случае сохраняем текущий символ ---
!
! Перебрасываем его из хвоста в голову и сдвигаем голову "вправо"
! ---------------------------------------------------------------
Str(Head : Head) = Char
Head = Head + 1
END IF

END DO


DO IBlank = Head, LenStr
! -------------------------------------------------
! Чистим хвост пробелами..---.
!
! Затираем мусор сразу за головой и до конца строки...
!(В Общем случае должен остаться "дубликат")
! перекидываемых символов
!
! Если не было лакун (Скобок),
! то Head > LenStr (Head == LenStr,+ 1)
! и данныый DO - цикл пропускается
! -------------------------------------------------
!


Str(IBlank : IBlank) = Blank ! Стандарт FORTRAN --- забиваем ненужный мусор пробелами

END DO


END SUBROUTINE COMPRESS

wolf000 31-05-2010 02:05 1424388

прошу помочь. Сложение двух матриц МхN, FORTRAN 77
PROGRAM PR
CCCC SLOZHENIE DVUH MATRIC RAZMERA MxN
DIMENSION A(100,100),B(100,100),C(100,100)
INTEGER A,B,C
READ*,M,N
DO 1 I=1,M
DO 2 J=1,N
READ*,A(I,J),B(I,J)
2 CONTINUE
1 CONTINUE
PRINT*,'A(M,N)=',((A(I,J),I=1,M),J=1,N)
PRINT*,'B(M,N)=',((B(I,J),I=1,M),J=1,N)
CALL MATADD(A,B,C,M,N,4)
PRINT*,'C=',((C(I,J),I=1,M),J=1,N)
END

SUBROUTINE MATADD(A,B,C,M,N,LU)
DIMENSION A(LU,*),B(LU,*),C(LU,*)
INTEGER A,B,C
DO 5 I=1,M
DO 6 J=1,N
C(I,J)=A(I,J)+B(I,J)
6 CONTINUE
5 CONTINUE
RETURN
END

ВВОД ДАННЫХ, ВЫВОД ДАННЫХ/ОТВЕТ ЗАДАЧИ
СКОПИРОВАНО ИЗ BUSH:


2
2
1
2
3
4
5
6
7
8




A(M,N)= 1 5 3 7
B(M,N)= 2 6 4 8

C= 3 11 0 0


ОБРАЗЦЫ ВВОДИМЫХ МАТРИЦ

A B
1 5 2 6
3 7 4 8

ДОЛЖНО ПОЛУЧИТьСЯ

C
3 11
7 15

ПОЛУЧИЛОСь

C
3 11
0 0

БОЛЬШОЕ СПАСИБО ЗА ПОМОЩЬ

Tau_0 31-05-2010 14:24 1424658

wolf000:),

Угу, на то он и Баш…
Там ВСЕГДА мозгов не хватает, чтобы что-нибудь поумнее придумать…

Замените утверждение
CALL MATADD(A,B,C,M,N,4) <==== CALL MATADD(A,B,C,M,N,100)

И будет Вам шасце…

wolf000 31-05-2010 21:49 1424950

Спасибо Tau 0, а ларчик просто открывался.

Валерий_Калмыков@vk 28-11-2012 19:47 2034863

тут есть кто нибудь? ._.

XPEHOMETP 28-11-2012 20:10 2034878

Иногда есть. А в чем проблемы?


Время: 00:51.

Время: 00:51.
© OSzone.net 2001-