3 / 3 / 2
Регистрация: 10.09.2013
Сообщений: 210
1

Лишние пробелы при выводе данных в файл/на экран

18.05.2016, 00:21. Показов 3275. Ответов 9
Метки нет (Все метки)

Совсем недавно начал разбираться с Фортраном и встретил (в числе прочего) одну непонятную вещь.
Есть одна простенькая программка, продублированная на C++ и Фортране.
Такая:
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
void main()
{
    int x=5;
    cout<<"x="<<x<<"\n";
    system("pause");
    return;
}
...и такая:
Fortran
1
2
3
4
program example
integer::x=5
print *,'x=',x
end program example
В первом случае (C++) мы увидим на экране надпись «x=5» ну и предложение нажать любую клавишу.
А в случае Фортрана получим это: « x= 5» — именно так, с одним пробелом перед 'x' и пачкой пробелов после '=' (форумный движок удалил лишние пробелы после '=', оставив всего один, на самом деле их было три).

Собственно вопрос: почему так происходит?
Неужели Фортран настолько своевольный в плане вывода данных?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.05.2016, 00:21
Ответы с готовыми решениями:

Убрать лишние пробелы при выводе данных
Нужна небольшая помощь с выводом информации, при выводе, фортран ставит пробелы перед числами,...

Лишние пробелы при выводе текстового файла на экран
var f:text; Procedure Print; var s:string; begin reset(f); while not EOF(f) do begin...

При выводе на экран появляются лишние символы
#include &lt;iostream&gt; // ??? printf #include &lt;string.h&gt; // ??? strtok bool IsPalindrom (char...

Лишние пробелы при дозаписи в файл
Всем доброго времени суток. Задача следующая: Написать класса очередь(дин. структура данных), в...

9
60 / 69 / 16
Регистрация: 18.04.2016
Сообщений: 213
18.05.2016, 11:12 2
Цитата Сообщение от Монтгомери Посмотреть сообщение
настолько своевольный
Наоборот, все низкоуровневые ручки предоставляет сразу.
1
3 / 3 / 2
Регистрация: 10.09.2013
Сообщений: 210
18.05.2016, 23:09  [ТС] 3
smlprog, почитал, попробовал применить.
Возникла такая ситуация: при выводе двух действительных чисел, в частности 0.01 и 10 с F5.2 в случае 10 на экране появится "10.00", а в случае 0.01 - "_пробел_0.01".
Как от этого пробела избавиться в данном случае?
И да, как-то слишком неудобно получается: либо радуйся куче пробелов, понаставленных при таком невнятном автоматическом форматировании вывода, либо играйся с ручным форматированием каждой мелочи, которую хочешь вывести на экран.

Не по теме:

P.S. Пока что от Фортрана впечатления скорее отрицательные начиная с таких вот радостей вывода данных и продолжая передачей агрументов в функции/процедуры (а уж танцы с бубном ради передачи динамического массива ввели в культурный шок после С++).
Хотя плюсы имеются, но из них я заметил пока только возможность сохранять целые логические выражения в logical вместо простых T/F в bool.

0
Модератор
Эксперт функциональных языков программированияЭксперт Python
33101 / 18446 / 3880
Регистрация: 12.02.2012
Сообщений: 31,008
Записей в блоге: 12
19.05.2016, 00:11 4
Монтгомери, формат F5.2 означает, что число будет занимать 5 знакомест, из них 2 под дробную часть. Естественно, что число 0.01 по такому формату будет печататься с ведущим пробелом... И понятно, для чего это сделано: чтобы при выводе в колонку чисел разряд находился под разрядом. Что же Вам не нравится?

Форматирование в Фортране очень даже внятное.

А что может не нравиться при передаче параметров в функции/процедуры? Просто интересно.
0
3 / 3 / 2
Регистрация: 10.09.2013
Сообщений: 210
19.05.2016, 02:09  [ТС] 5
Цитата Сообщение от Catstail Посмотреть сообщение
Монтгомери, формат F5.2 означает, что число будет занимать 5 знакомест, из них 2 под дробную часть. Естественно, что число 0.01 по такому формату будет печататься с ведущим пробелом... И понятно, для чего это сделано: чтобы при выводе в колонку чисел разряд находился под разрядом. Что же Вам не нравится?
Не нравится навязывание именно такой системы в целом.
Потому что или Фортран сам понаставит кучу пробелов где ни попадя (что категорически не устраивает), либо надо использовать форматный вывод, который навязывает жёсткое указание количества знако-мест (что тоже выглядит не лучшим вариантом).
Да, в C++ тоже можно указать количество знако-мест, как и в Фортране - и пусть, элемент этот не обязательный.
Но вот подобная бесцеремонность стандартного вывода меня коробит - зачем его было таким делать - не ясно.

Цитата Сообщение от Catstail Посмотреть сообщение
А что может не нравиться при передаче параметров в функции/процедуры? Просто интересно.
В Фортране типы передаваемых параметров в функцию определяются внутри самой функции. В том числе и тип и размерность массивов.
В случае массива заранее известного размера этот размер можно просто указать внутри функции:
Fortran
1
2
3
4
function f(x)
real::x(10),f
!...
end function f
Но в случае массива неизвестной заранее размерности (например при вызове этой функции несколько раз для массивов разного размера) такое не работает.
А указывать размерность массива с помощью переменной Фортран, как я понял, не позволяет. Ни
Fortran
1
2
integer::n
real::x(n)
ни
Fortran
1
2
integer::n
real,dimension(n)::x
не работают.
В то время как в С++, во-первых:
* количеств и типы функции при определении и вызове жёстко согласованы: если объявить функцию с тремя аргументами, а попытаться вызвать с двумя - компилятор просто не позволит этого сделать
и во-вторых:
* в случае массивов передаётся просто указатель на первый элемент в выделенном под массив разделе памяти; и выглядит это в случае одномерных массивов (что фиксированной, что динамической величины) одинаково и весьма лаконично:
C++
1
2
3
4
real f(real *x)
{
//...
}
Поэтому сложностей с размерностью нет.
Всё, что остаётся - лишь передать в функцию размер массива в виде переменной и спокойно его использовать.
А в Фортране надо сначала показать, что это не просто переменная, что это массив, причём указать размерность, в качестве которой использование передаваемой в функцию переменной недопустимо.

И поэтому элементарные примеры, которые во времена обучения С++ писались легко, на Фортране вызывают серьёзные затруднения.
Например, эта передача массивов - я видел пример с использованием interface, но так и не понял его сути.
И на фоне всё того же С++ это выглядит излишне усложнённым и громоздким, да и сама идея определения типов переменных внутри функции вызывает уж слишком много неопределённости, за разрешением которой надо следить и от в С++, нсколько мне известно, стараются избавляться.

Понимаю, что это выглядит типичным нытьём человека, столкнувшегося с непривычными ему вещами, но я пытаюсь найти причины создания именно такой громоздкой и непонятной непосвящённому системы, но так их и не нахожу.
0
126 / 113 / 56
Регистрация: 05.12.2012
Сообщений: 463
19.05.2016, 04:00 6
Цитата Сообщение от Монтгомери Посмотреть сообщение
Но в случае массива неизвестной заранее размерности (например при вызове этой функции несколько раз для массивов разного размера) такое не работает.
Что-то Вы на фортран напали... Все очень хорошо работает.
Fortran
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
program test
 
integer :: ar(10)
integer, allocatable :: ar2(:)
 
ar = 0
CALL printArray(ar, size(ar))
 
CALL printArray2(ar)
 
allocate(ar2(11))
ar2 = -1
 
CALL printArray3(ar2)
 
contains
 
    SUBROUTINE printArray(ar, n)
        integer, intent(IN) :: n, ar(n)
        
        write(*,*) "size =", n
        write(*,*) ar
    END SUBROUTINE printArray
    
    SUBROUTINE printArray2(ar)
        integer, intent(IN) :: ar(:)
        
        write(*,*) "size =", size(ar)
        write(*,*) ar
    END SUBROUTINE printArray2
    
    SUBROUTINE printArray3(ar)
        integer, allocatable, intent(IN) :: ar(:)
        
        if (ALLOCATED(ar)) then
        
            write(*,*) "size =", size(ar)
            write(*,*) ar
        
        end if
    END SUBROUTINE printArray3
 
end program
2
3 / 3 / 2
Регистрация: 10.09.2013
Сообщений: 210
19.05.2016, 12:39  [ТС] 7
kushok, это интересно. Вечером обязательно попробую так передавать массивы.
Если это действительно так просто - про массивы вопрос отпадает.
Вот и сказывается отсутствие нормального учебника - неизвестно, что и где надо искать.
Ведь по поводу напали - такие вещи из-за недопонимания происходят. Сейчас стало чуть понятнее.
Но можете по поводу intent подробнее объяснить? Я искал, но как-то не понял его работу.
0
6426 / 4589 / 1890
Регистрация: 02.02.2014
Сообщений: 12,288
19.05.2016, 18:46 8
Цитата Сообщение от Монтгомери Посмотреть сообщение
по поводу intent
intent
1
126 / 113 / 56
Регистрация: 05.12.2012
Сообщений: 463
20.05.2016, 04:10 9
По поводу intent, и кстати, по поводу огромного подводного камня при переходе на фортран:
Дело в том, что в отличии от многих ЯП (в т.ч. java, C и т.д.) аргументы передаются в функции и подпрограммы не копированием, а по ссылке (т.е. просле CALL doSomethingWithVar(var) переменная var может быть изменена). Это и не хорошо, и не плохо. Собственно, это регулировать как раз позволяет intent:
IN - только на вход (запрещает присвоение переменной)
OUT - только на выход (Изначальное значение переменной в функцию не передается, но возвращаетя)
INOUT (по умолчанию выставляется, если явно не определять intent) - на вход и выход (функция/подпрограмма оперирует именно с передаваемой ей переменной, т.е. получает ее исходное значение и возвращает измененное значение в передаваемую переменную)

Добавлено через 14 минут
P.S.: Если объявлять функцию с указанием result(var), то переменная var получит intent(OUT). Правда я в этом не уверен, но мне всегда так казалось)

Добавлено через 21 минуту
По поводу вывода переменных (собственно, по данной теме): в Сях сделать форматированный "красивый" вывод сделать примерно так же геморно, как у фортрана сделать "неформатированный", но возможно. В этом разделе на форуме точно есть пара тем по этому поводу. Смысл в том, что в операторе write(*, тут) можно передать символьный массив/текстовую переменную, и, соответственно, формат можно рассчитать в самой программе в зависимости от чего-нибудь Вам нужного.
1
WH
1532 / 769 / 177
Регистрация: 10.09.2013
Сообщений: 3,040
Записей в блоге: 3
22.05.2016, 11:31 10
Монтгомери, может это будет вам интересно
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2016, 11:31
Помогаю со студенческими работами здесь

Добавляются лишние символы при выводе данных в поток
Есть char buff; куда пишутся данные с сети. вывожу на печать: cout &lt;&lt;&quot;IMEI- &quot; &lt;&lt; &quot;--&quot; &lt;&lt;...

Как сделать, чтобы при выводе на экран были пробелы
#include &lt;iostream&gt; using namespace std; int main() { int sum = 0, val = 1; while (val &lt;=...

Лишние символы при выводе значений из базы данных (postgresql)
Возникла такая проблема: при выводе значений таблицы из БД на html страницу значения &quot;обрамляются&quot;...

Отредактировать файл, удалив лишние пробелы
задано текстовый файл. Отредактировать его, удалив лишние пробелы


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru