Форум программистов, компьютерный форум, киберфорум
Fortran
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
WH
1578 / 808 / 189
Регистрация: 10.09.2013
Сообщений: 3,199
Записей в блоге: 3
1

Спецификации оператора FORMAT

11.05.2018, 14:32. Показов 3732. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Делаю повторитель вывода на экран:

Fortran
1
2 format (5(i3))
Но нужно не жестко указать 5 повторений, а через переменную. Может потребоваться другое количество повторений. Компилятор переменную не принимает.

Можно ли это как-то сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2018, 14:32
Ответы с готовыми решениями:

#define PRINT(format,x) printf("x = %format\n",x)
#include <stdio.h> #include <limits.h> #define PRINT(format,x) printf("x = %format\n",x) int...

Избыточное копирование объекта при реализации оператора умножения и оператора присваивания
Есть класс работы с матрицами. Есть операция умножения матриц, описанная как оператор класса. В...

Неправильная работа оператора присваивания после работы оператора суммирования
Доброго времени суток. У меня есть класс вектор class TVector {//ewde public: TVector();...

Найти матрицу оператора сопряжённого для данного линейного оператора
Здравствуйте! Подскажите мне, пожалуйста, как делать данную задачу: Матрица линейного оператора...

18
18 / 18 / 0
Регистрация: 27.02.2010
Сообщений: 58
12.05.2018, 09:05 2
Format (<n>I3)
0
WH
1578 / 808 / 189
Регистрация: 10.09.2013
Сообщений: 3,199
Записей в блоге: 3
12.05.2018, 10:30  [ТС] 3
Цитата Сообщение от engineer-002 Посмотреть сообщение
Format (<n>I3)
Не принимает, пишет (в переводе) : - "Ошибка: непредвиденный элемент " < " в строке формата at (1)".

Пробовал с пробелом и без, с запятой и без, со скобками для последующего спецификатора и без, никак не хочет.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
12.05.2018, 10:51 4
WH, Какой компилятор? Приведенное решение работает в Intel Fortran
0
WH
1578 / 808 / 189
Регистрация: 10.09.2013
Сообщений: 3,199
Записей в блоге: 3
12.05.2018, 11:05  [ТС] 5
Цитата Сообщение от volvo Посмотреть сообщение
WH, Какой компилятор?
gfortran

скорее всего синтаксис в чем то отличается
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
12.05.2018, 11:11 6
Тогда см. здесь: https://gcc.gnu.org/onlinedocs... sions.html
1
WH
1578 / 808 / 189
Регистрация: 10.09.2013
Сообщений: 3,199
Записей в блоге: 3
12.05.2018, 11:46  [ТС] 7
Спасибо. Но несмотря на то что в тексте написано, что это типа "курче", на самом деле там головоломка какая-то. Как просто задать <n> в "устаревшем" виде.

Я вот эти строки не понимаю

WRITE(FMT,'("(I", I0, ")")') N+1
или
WRITE(6,"(I" // ADJUSTL(FMT) // ")") INT1

число повторов как я понимаю это n, а где здесь скажем задать формат вещественного числа, например f8.3 ?

если у кого-либо есть желание разобрать посимвольно, буду благодарен.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
12.05.2018, 12:17 8
Fortran
1
2
3
4
5
6
7
   REAL :: c = 100.0
   INTEGER :: N = 8, M = 3
   CHARACTER(LEN=20) FMT
 
   WRITE(FMT,'("(F", I0, ".", I1, ")")') N, M  ! создаем строку (F8.3) в переменной FMT (I0 - первое целое в списке, I1 - второе целое)
   WRITE(*, '(A20)') FMT ! проверяем, та ли строка получилась
   WRITE(*, FMT) c ! и выводим переменную в полученном выше формате
0
WH
1578 / 808 / 189
Регистрация: 10.09.2013
Сообщений: 3,199
Записей в блоге: 3
12.05.2018, 16:35  [ТС] 9
А, возвращаясь к первому посту, повторитель?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
12.05.2018, 16:58 10
А для повторителя:
Fortran
1
2
   WRITE(FMT,'("(",I0,"I3)")') N ! N = 5, создаем строку "(5I3)"
   WRITE(*, FMT) A, B, C
0
WH
1578 / 808 / 189
Регистрация: 10.09.2013
Сообщений: 3,199
Записей в блоге: 3
13.05.2018, 07:48  [ТС] 11
Какой-то убийственный синтаксис, как произведения П. Джеймса. В принцип не могу врубиться, проще написать небольшую программу, чем один такой формат. Как я понял переменную, которую выносим за скобки, мы пишем между запятыми, без кавычек. Буквенные спецификации в кавычках (но почему-то с одной стороны скобка..), каша.

Я пытаюсь создать формат f12.3 с повтором S=5 раз и между выводимыми значениями вставить пробел. Вот что я делаю. Это компилируется, но при выполнении выпадает в осадок (runtime). Что здесь не так?

Fortran
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
program test
REAL :: c(5)
INTEGER :: S, N, M 
CHARACTER(LEN=20) FMT
 
data c/1,2,3,4,5/ 
 
S=5; N=12; M=3 
 
WRITE(FMT,'(", I0, (f", I1, ".", I2, ", " 1X ")")') S, N, M 
 
     !S - число повторов
     !N - общее количнство знаков под выводимое число
     !M - число знаков после запятой
     !1X - один пробел
 
WRITE(*, '(A20)') FMT 
WRITE(*, FMT) c
end
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
13.05.2018, 10:03 12
Какую строку формата ты хочешь в результате получить в FMT? Я не понимаю, что ты хотел написать там. Можешь записать Cи-шным синтаксисом, через sprintf? Я покажу, как это сделать фортрановским.

Добавлено через 19 минут
Может, вот это имелось в виду:
Fortran
1
WRITE(FMT,'("(",I0,"(f",I0,".",I0,"), 1X)")') S, N, M
Смотри. Строка в Сишном формате: "(%d(f%d.%d), 1X)", теперь каждый %d заменяем на ",I0,", потому что надо строку завершить, поставить запятую как разделитель параметров, сам параметр, запятую после параметра, и опять открыть форматную строку. В результате получаем: "(",I0,"(f",I0,".",I0,"), 1X)"

Ну, и добавляем еще охватывающие все это скобки по синтаксису WRITE: '(тут_полученная_выше_строка)' = '("(",I0,"(f",I0,".",I0,"), 1X)")'

Я там выше чуть ошибся:
Цитата Сообщение от volvo Посмотреть сообщение
(I0 - первое целое в списке, I1 - второе целое)
Это не так. Точно так же, как и в Си, задается только тип параметра, и ширина поля для записи, но не порядковый номер. Первый I0 соответствует S, второй I0 - для N, третий - для M.
1
WH
1578 / 808 / 189
Регистрация: 10.09.2013
Сообщений: 3,199
Записей в блоге: 3
13.05.2018, 10:40  [ТС] 13
Да, теперь заработало. Спасибо. Немного понятно стало.
Если не трудно, подскажи еще разницу между " и '. Например замена ' на " не принимается.
0
18 / 18 / 0
Регистрация: 27.02.2010
Сообщений: 58
13.05.2018, 12:03 14
У Вас в 10 и 18 строках ошибки.

10 - замените FMT на номер канала.
18 - FMT - уже на своем месте, но не содержит ничего.

Добавлено через 13 минут
В Интеле работает так
Fortran
1
2
3
4
5
6
7
8
9
10
11
12
13
program test
implicit none
REAL :: c(5)
INTEGER :: S 
data c/1,2,3,4,5/ 
 
do S  =1, 5
    WRITE(*,'(<i>(1X, F12.3))') c(1:i)
end do
 
read (*,*)
 
end
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
13.05.2018, 12:30 15
Цитата Сообщение от WH Посмотреть сообщение
Например замена ' на " не принимается.
Принимается. Если апострофы заменить на кавычки, а кавычки - на апострофы - то принимается, вот так прекрасно работает код:
Fortran
1
WRITE(FMT,"('(',I4,'(f',I0,'.',I0,'), 1X)')") S, N, M
, весь смысл - в том, что внешние ограничители строк и все внутренние - должны быть разными, а как это будет: внешние - апострофами, внутренние - кавычками, или наоборот - не важно.
1
WH
1578 / 808 / 189
Регистрация: 10.09.2013
Сообщений: 3,199
Записей в блоге: 3
13.05.2018, 12:42  [ТС] 16
Вроде нормально все стало.

Fortran
1
2
3
4
5
6
7
8
9
10
11
12
13
program test
REAL :: c(5)
INTEGER :: S, N, M 
CHARACTER(LEN=20) FMT
data c/1,2,3,4,5/ 
    
    S=5; N=12; M=3 
    WRITE(FMT,'("(",I0,"(f",I0,".",I0,"), 1X)")') S, N, M
 
write (*,*) c
WRITE(*, '(A20)') FMT 
WRITE(*, FMT) c
end
дает вывод
Код
   1.00000000       2.00000000       3.00000000       4.00000000       5.00000000    
(5(f12.3), 1X)      
       1.000       2.000       3.000       4.000       5.000
При S=3, N=8, M=2, получатся
Код
   1.00000000       2.00000000       3.00000000       4.00000000       5.00000000    
(3(f8.2), 1X)       
    1.00    2.00    3.00
    4.00    5.00
но между 1Х или 10X нет разницы.

Попробовал формат g, работает, но знаки после запятой съедает, вместо 3-х дает 2 или вообще не дает, если число большое
0
18 / 18 / 0
Регистрация: 27.02.2010
Сообщений: 58
13.05.2018, 13:29 17
Fortran
1
WRITE(FMT,'("(",I0,"(f",I0,".",I0,1X,")') S, N, M
(5(f12.3,1Х)) - надо 1Х или 10Х включить внутрь скобок для повторения.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
13.05.2018, 14:39 18
Fortran
1
 WRITE(FMT,'("(",I0,"(f",I0,".",I0,",10X))")') S, N, M
1
WH
1578 / 808 / 189
Регистрация: 10.09.2013
Сообщений: 3,199
Записей в блоге: 3
13.05.2018, 14:43  [ТС] 19
Цитата Сообщение от engineer-002 Посмотреть сообщение
(5(f12.3,1Х)) - надо 1Х или 10Х включить внутрь скобок для повторения.
Yes!

Fortran
1
WRITE(FMT,'("(",I0,"(g",I0,".",I0,", 10X))")') S, N, M
так работает
0
13.05.2018, 14:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2018, 14:43
Помогаю со студенческими работами здесь

Придумайте простую программу с использованием условного оператора IF и оператора switch
Пожалуйста, придумайте простую программу с использованием: условного оператора IF и оператора...

Вызов прегруженного оператора вывода в поток из аналогичного оператора
Программирую в c9.io с g++ получается тоже самое. Элементами стека(pointList) являются стеки(list)...

Ошибка в вводе данных из HTML и переносе их в JavaScript, при выполнении оператора IF или оператора swithc
доброго времени суток, при выполнении одной учебной задачи столкнулся с проблемой: при введении...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru