Может кто-нибудь скажет мне. Я пытаюсь понять код Pascal, в котором есть одна строка writeln(arr[i]:0:14);
Каково значение arr [i]: 0: 14 в Паскале?
Может ли кто-нибудь рассказать мне о значении этого в C?
Может кто-нибудь скажет мне. Я пытаюсь понять код Pascal, в котором есть одна строка writeln(arr[i]:0:14);
Каково значение arr [i]: 0: 14 в Паскале?
Может ли кто-нибудь рассказать мне о значении этого в C?
Это формат для действительных чисел:
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, с четырьмя цифрами точности после десятичного разделителя (точка в старом корпусе scool pascal).
Обратите внимание, что общая ширина 0 по существу отключает оправдание, но она должна быть там, чтобы иметь возможность указывать точность разделителя десятичных знаков.
Двойные аргументы форматирования означают, что arr [i] должен быть типом float. (или тип валюты с фиксированной точкой, в Delphi)
Будьте осторожны при переводе индексов массивов из массива Pascal в C. Паскаль может иметь ненулевую нижнюю границу, а затем вам придется перевести индекс массива соответственно.
var xx : array [m..n] of double
становится
double xx[n-m+1];
со всеми индексами массива скорректированных путем вычитания м. например
arr[x-m])
В Pascal n и m могут быть переменными. Поэтому, хотя в примере может быть одинаковым для простого примера, может потребоваться построить строку форматирования. –
Вам не нужно 'sprintf()' генерировать строку формата: 'printf ("% *. * F \ n ", N, M, foo);' намного проще, не так ли? –
@ ElchononEdelson да, это проще, и у меня было это в глубине моего разума. Это было так давно, что я был нужен или использовал его, я не был уверен в этом. Я добавил его к ответу для полноты. – lurker