2013-07-02 2 views

ответ

3

Это формат для действительных чисел:

writeln(foo:N:M); 

печатает значение foo в ширине поля N и показывает M знаков после запятой. Таким образом, в C вы будете использовать:

printf("%N.Mf\n", foo); 

Если N является слишком мал, чтобы держать форматированный значение (с учетом размера M), он будет использовать пространство он должен напечатать номер.

В Паскале у вас могут быть N и/или M быть переменными. В этом случае, в C, можно создать строку формата следующим образом:

char my_fmt[50]; // could pick a "smarter" length for the string; this is just for example 

sprintf(my_fmt, "%%%d.%df\n", N, M); 
printf(my_fmt, foo); 

Или даже проще:

printf("%*.*f\n", N, M, foo); 
+0

В Pascal n и m могут быть переменными. Поэтому, хотя в примере может быть одинаковым для простого примера, может потребоваться построить строку форматирования. –

+0

Вам не нужно 'sprintf()' генерировать строку формата: 'printf ("% *. * F \ n ", N, M, foo);' намного проще, не так ли? –

+0

@ ElchononEdelson да, это проще, и у меня было это в глубине моего разума. Это было так давно, что я был нужен или использовал его, я не был уверен в этом. Я добавил его к ответу для полноты. – lurker

0

Он напечатает обр [я] с правом обоснования к минимальной общей ширине 0, с четырьмя цифрами точности после десятичного разделителя (точка в старом корпусе scool pascal).

Обратите внимание, что общая ширина 0 по существу отключает оправдание, но она должна быть там, чтобы иметь возможность указывать точность разделителя десятичных знаков.

Двойные аргументы форматирования означают, что arr [i] должен быть типом float. (или тип валюты с фиксированной точкой, в Delphi)

Будьте осторожны при переводе индексов массивов из массива Pascal в C. Паскаль может иметь ненулевую нижнюю границу, а затем вам придется перевести индекс массива соответственно.

var xx : array [m..n] of double 

становится

double xx[n-m+1]; 

со всеми индексами массива скорректированных путем вычитания м. например

arr[x-m]) 
Смежные вопросы