Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/47: Рейтинг темы: голосов - 47, средняя оценка - 4.64
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
1

Вывод вещественных переменных

15.08.2010, 11:24. Показов 9372. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
1. Как вывести вещественные переменные в нормальном виде? Если написать :6:2 например, то если у меня получается 2.1225 - результат не будет точным, а хочется и точно и красиво.
Вот написал небольшую прогу, хочется сделать функцию, но не знаю как. А процедура - не очень удобно(мне так кажется)
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Var
   w, e   :Byte;
   x       :Real;
   z, x1  :LongInt;
Begin
   ReadLn (x);
   z:=1; w:=0;
   While (x/z) > 1 do begin
                        z:=z*10;
                        w:=w+1;
                      end;
   e:=10; z:=1;
   x1:=Round(1000000000*(frac(x)));
   If x1<>0 then While (x1 mod z) = 0 do begin
                                            z:=z*10;
                                            e:=e-1
                                         end;
   If z=1 then e:=0;
   w:=e+w;
   WriteLn (x:w:e);
   ReadLn
End.

2. Возможно ли из среды турбо паскаля вставлять сюда код проги или обязательно заново писать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2010, 11:24
Ответы с готовыми решениями:

div и mod в вещественных переменных
скажите как будет выглядеть выражение,, нужно найти остаток от деления числа типа float, если y---...

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

Поменяйте местами значения вещественных переменных
1.Поменяйте местами значения вещественных переменных x и y помогите пжл ) Правила форума: ...

Поменять местами значения вещественных переменных
Поменяйте местами значения вещественных переменных x и y

13
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
15.08.2010, 11:33 2
Цитата Сообщение от КОП Посмотреть сообщение
2. Возможно ли из среды турбо паскаля вставлять сюда код проги или обязательно заново писать?
Открываете файл .pas в любом блокноте, копируете и вставляете в сообщение.

Добавлено через 2 минуты
Цитата Сообщение от КОП Посмотреть сообщение
Если написать :6:2 например, то если у меня получается 2.1225 - результат не будет точным, а хочется и точно и красиво.
Во первых, если написать :6:2, то выведет типа х= 2.12
Во вторых нужно самому определять точность, если нужно 10 знаков после запятой, то напишите
Pascal
1
writeln('x=',x:14:10);
Добавлено через 2 минуты
Цитата Сообщение от КОП Посмотреть сообщение
Вот написал небольшую прогу, хочется сделать функцию,
Так напишите что должна делать программа в целом и функция в частности.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
15.08.2010, 11:44  [ТС] 3
Сама прога например вычисляет что-нибудь.
функция должна обеспечивать правильный вывод вещественных переменных, т.е. если это 1.123456 то и пишет 1. 123456, а если это 1.123, то 1.123000 пишет без нулей.
Желательно, что бы это выглядело так: WriteLn ('x=', <имя функции>(x))
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
15.08.2010, 11:53 4
КОП, Не бывает вещественных чисел таких как вы написали, количество знаков после запятой определяете вы при форматировании вывода, в памяти компьютера числа типа real имеют вид типа
2.123456251444444Е+0001
Например напишите такой код
Pascal
1
2
3
4
5
6
var a:real;
begin
a:=23.56;
write(a);
readln
end.
и посмотрите.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
15.08.2010, 12:03  [ТС] 5
дело в том, что я не знаю, сколько получится знаков после запятой. Я ,конечно, могу написать WriteLn (x:14:10), но при х=1.5 я получу на экране 1.5000000000, этого я и хочу избежать.
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
15.08.2010, 12:06 6
Цитата Сообщение от КОП Посмотреть сообщение
что я не знаю, сколько получится знаков после запятой.
А кто знает? Это же ваша программа, вам и определять точность вывода числа, а программа всегда считает 15-16 для типа real и до 19-20 для более точных типов
0
Автор FAQ
Автор FAQ
1802 / 614 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
15.08.2010, 12:09 7
Цитата Сообщение от КОП Посмотреть сообщение
дело в том, что я не знаю, сколько получится знаков после запятой. Я ,конечно, могу написать WriteLn (x:14:10), но при х=1.5 я получу на экране 1.5000000000, этого я и хочу избежать.
Тогда единственно что приходит в голову. это анализировать числа после запятой. А это тоже задача не простая.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
15.08.2010, 12:13  [ТС] 8
Допустим моя программа выполняет деление. Я ввожу 2 числа и она выдаёт частное. И количество знаков после запятой зависит от данных, которые я введу и будет различным, мне же нужно, что бы если после запятой мало знаков, то не было бы нулей, т.е. мне просто нужно красиво вывести результат.
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
15.08.2010, 12:35 9
КОП, А если в результате будет периодическая дробь, например 1/3?
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
15.08.2010, 12:47  [ТС] 10
Цитата Сообщение от Rockedit Посмотреть сообщение
Тогда единственно что приходит в голову. это анализировать числа после запятой. А это тоже задача не простая.
Вот моя прога это и делает (до 9 цифр после запятой)
Мне лишь нужно оформить её под функцию и использовать внутри оператора Write, если это возможно.
Если нет, то я сделаю процедуру c параметром, которую буду запускать перед Write и она определит количество цифр после запятой. Пример:

x:=1.123;
Proced(x); {w станет равным 4, е=3}
WriteLN ('x=', x:w:e);

Проблема в том, что если мне надо вывести 2 разные переменные (х1, х2), придётся сначала выполнить процедуру для ч1, написать одну половину Write с х1, потом запускать процедуру для х2 и дописывать строку.

Добавлено через 3 минуты
Цитата Сообщение от Puporev Посмотреть сообщение
КОП, А если в результате будет периодическая дробь, например 1/3?
то выведет 1.333333333 (округлённо)
мне достаточно точности в 9 цифр после запятой
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
15.08.2010, 13:30 11
Тогда можно преобразовывать число в строку, брать первые 9 символов и отбросить все ведомые ноли.

Добавлено через 18 минут
Вот пример для 9 цифр после запятой с отбрасыванием нолей.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
uses crt;
var a,b,c:real;
    s,s1:string;
begin
clrscr;
write('a=');readln(a);
write('b=');readln(b);
c:=a/b;
str(c:0:9,s);
s1:=copy(s,1,pos('.',s)-1);
s:=copy(s,pos('.',s)+1,9);
if s[length(s)]='0'then
while s[length(s)]='0'do
delete(s,length(s),1);
if length(s)>0 then s1:=s1+'.'+s;
writeln('c=',s1);
readln
end.
1
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
15.08.2010, 15:03  [ТС] 12
Pupurev спасибо

Я сам ещё посидел и вот написал процедуру для 2х чисел.

Pascal
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
44
45
46
VAR
   w, e, w2, e2  :Byte;
   p, p2         :Real;
 
PROCEDURE RealWrite (x, x2 :Real);
  Var
    z, x1     :LongInt;
  Begin
   z:=1; w:=0;
   While (x/z) > 1 do begin
                        z:=z*10;
                        w:=w+1;
                      end;
   e:=10; z:=1;
   x1:=Round(1000000000*(frac(x)));
   If x1<>0 then begin
                   While (x1 mod z) = 0 do begin
                                             z:=z*10;
                                             e:=e-1;
                                           end;
                 end;
   If z = 1 then e:=0;
   w:=e+w;
   z:=1; w2:=0;
   While (x2/z) > 1 do begin
                        z:=z*10;
                        w2:=w2+1;
                      end;
   e2:=10; z:=1;
   x1:=Round(1000000000*(frac(x2)));
   If x1<>0 then begin
                   While (x1 mod z) = 0 do begin
                                             z:=z*10;
                                             e2:=e2-1;
                                           end;
                 end;
   If z = 1 then e2:=0;
   w2:=e2+w2;
  end;
 
BEGIN
  ReadLn (p, p2);
  RealWrite (p, p2);
  WriteLn (p:w:e, ' ', p2:w2:e2);
  ReadLn
END.
Но ещё есть главный вопрос: возможно ли сделать из этого функцию, что бы писать например
Pascal
1
2
3
...
WriteLn ('x1=', RealWrite(x1), ' x2=', RealWrite(x2));
...
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
15.08.2010, 15:24 13
Цитата Сообщение от КОП Посмотреть сообщение
возможно ли сделать из этого функцию,
Конечно, только ее результатом будет не число, а строка, как у меня.
Pascal
1
function Rez(x,y:real):string;
Добавлено через 6 минут
Например так.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
uses crt;
function Rez(x,y:real):string;
var s,s1:string;
    z:real;
begin
z:=x/y;
str(z:0:9,s);
s1:=copy(s,1,pos('.',s)-1);
s:=copy(s,pos('.',s)+1,9);
if s[length(s)]='0'then
while s[length(s)]='0'do
delete(s,length(s),1);
if length(s)>0 then s1:=s1+'.'+s;
Rez:=s1;
end;
var a,b:real;
begin
clrscr;
write('a=');readln(a);
write('b=');readln(b);
writeln('rez=',Rez(a,b));
readln
end.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
15.08.2010, 15:30  [ТС] 14
Спасибо большое.
Как я сам не додумался
0
15.08.2010, 15:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.08.2010, 15:30
Помогаю со студенческими работами здесь

Считывание вещественных переменных до определенного символа
Заранее спасибо за помощь, немного подзабыл как осуществить считывание каких-либо целых или...

Программа которая меняет местами значение вещественных переменных а и в
Программа которая меняет местами значение вещественных переменных а и в. Помогите пожалуйста!!))

Даны значения вещественных переменных а b и с: найти среди них наибольшее и наименьше значение
2)даны значения вещественных переменных а b и с найти среди них наибольшее и наименьше значение...

Добавить вывод на экран адресов всех переменных, а в конец – значений всех переменных
Никак не могу найти ошибки.И еще, в начало программы добавить вывод на экран адресов всех...


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

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