Как из real сделать integer pascal
БлогNot. Паскаль: генерируем вещественные случайные числа из диапазона [-N,N]
Паскаль: генерируем вещественные случайные числа из диапазона [-N,N]
Небольшой вопрос по Паскалю на ранее описанную тему:
Я хочу сгенерировать массив из вещественных случайных чисел, распределённых в интервале от -10 до 10. Но вот такая программа
var a:array [1..10] of real; i:integer; begin randomize; for i:=1 to 10 do begin a[i]:=random(20)-10; write (a[i]:10:2); end; readln; end.
выдаёт странные числа, например
4.00 65528.00 4.00 65533.00 65526.00 7.00 3.00 65533.00 0.00 8.00
В чём причина?
Причина в том же, о чём писалось в этой заметке — строгой типизированности Паскаля. Функция random , вызванная с целочисленным параметром N , возвращает беззнаковые целые величины (тип данных Word ) из интервала [0,N-1] . Далее сложение или вычитание с целым числом даёт также Integer , а ошибка возникает при преобразовании типа к вещественному Real .
Чтобы сделать всё правильно, для генерации вещественных чисел используйте вызов random без параметра (тогда она вернёт вещественное число из интервала [0,1[ и дальнейшие вычисления будут производиться уже с Real , то есть, выражение будет приведено к нужному типу в процессе его вычисления, а не после вычисления или при присваивании):
var a:array [1..10] of real; i:integer; begin randomize; for i:=1 to 10 do begin a[i]:=random*20-10; write (a[i]:10:2); end; readln; end.
Эта программа выведет то, что мы вправе ожидать:
5.81 8.76 -1.17 -5.75 4.60 7.23 2.02 6.17 -7.35 -8.00
Понятно, что если нужен диапазон не [-10,10] , а другой, просто поменяем 20 и 10 на другие значения 2*N и N .
09.04.2011, 11:00 [33410 просмотров]
Pascal- How to convert Real to Integer variable
I’m writing a task in pascal. Everything is ok, just my result is not right. I’m summing some numbers Example: 2.3 + 3.4+ 3.3 = 9 But output shows: 9.000000 + EEE or something like that. So- how to convert, to be only 9, not this REAL variable.
asked Jun 5, 2013 at 16:29
user2456556 user2456556
41 1 1 gold badge 1 1 silver badge 2 2 bronze badges
4 Answers 4
To actually convert:
var i: integer; . i := round(floatVar);
To output only the integer part:
writeln(floatVar:9:0);
answered Jun 5, 2013 at 16:33
500 — Internal Server Error 500 — Internal Server Error
28.4k 8 8 gold badges 59 59 silver badges 66 66 bronze badges
Thank you, but in first part- duplicate identifier.
Jun 5, 2013 at 17:20
For purpose of showing pretty output on the screen you can use something like this:
Writeln(result:0:2);
Result on screen would be this:
What this means someone would ask? Well first number 0 means how wide filed is. if you say it’s 0 then Pascal writes it at the very left side of screen. If you said writeln(result:5:2) result would be:
In other words i would print form the right side and leave 5 chars to do so.
Second number 2, in this example means you want that result printed with 2 decimal places. You can place it only if you want to print on screen value that is real, single, double, extended and so on.You can round to any number of decimals, and if you do writeln(result:0:0) you would get ouput:
If you are printing integer and want to have some length of field, lets sat 5 you would do: writeln(int:5) . If you added :2 to the end you would get compile time error.
This all also works for something like this: writeln(5/3.5+sqrt(3):0:3) ,
You should know that this does not round variable itself but just formats output. This is also legal:
program test; var a:real; n,m:integer; begin readln(a,m,n); writeln(a:m:n); end.
What i did here is i asked user if on how many decimals and with what length of field he wants to write entered number a. This can be useful so i’m pointing it out. Thank you for reading. I hope i helped
Нельзя преобразовать тип real к integer
Задача такая, что если число чётное, то его нужно разделить на два, а если нет, то умножить на 3, прибавить 1 и разделить на два. И делать так, пока в итоге не получится 1. В 5 строчке пишет: нельзя преобразовать тип real к integer. Я не пойму где тут real. Помогите пожалуйста.
Отслеживать
user176262
задан 9 янв 2020 в 15:11
3 1 1 серебряный знак 2 2 бронзовых знака
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
В результате операции n / 2 получается значение типа real, т.к. / — обычное не целочисленное деление, результат которого может быть нецелым числом. Вы же записываете результат этой операции в переменную n , которая имеет тип integer. Из-за несоответствия типов возникает ошибка.
Вам нужно использовать целочисленное деление, которое отбрасывает остаток и даёт в результате целое число:
n := n div 2
Отслеживать
ответ дан 9 янв 2020 в 15:20
Кирилл Малышев Кирилл Малышев
10.8k 1 1 золотой знак 18 18 серебряных знаков 34 34 бронзовых знака
Я новичок и поэтому не знал в чём ошибка, но ваш совет помог! Спасибо большое)
9 янв 2020 в 16:54
Во-первых, форматируйте ваш код! Во-вторых, ваша проблема в использовании оператора / вместо DIV . Вот так:
PROGRAM main; VAR n, i: Integer; BEGIN Write('Введите число: '); Read(n); WHILE n <> 1 DO IF n MOD 2 = 0 THEN n := n DIV 2 ELSE n := (n * 3 + 1) DIV 2; END.
Отслеживать
ответ дан 9 янв 2020 в 15:24
16k 3 3 золотых знака 25 25 серебряных знаков 41 41 бронзовый знак
Спасибо большое)
9 янв 2020 в 16:54
@Вадим Пожалуйста. Не забывайте, что наиболее подходящий ответ надо выделять как верный, нажав галочку рядом с голосами.
Нельзя преобразовать тип real к integer с функцией синуса
Дальше идёт попытка вычислить and между булевым результатом и a .
В pascal оператор and имеет два разных действия:
- между двумя Boolean — логическое «И»
- между целочисленными типами — побитовое «И».
Так как a — не Boolean , то идет попытка применить побитовое «И». Boolean легко преобразуется в Integer , а вот при попытке преобразовать a к Integer получаем ошибку из заголовка.
Решение — явно задать порядок действий правильной расстановкой скобок: (a >= 0) and (a
