Вот код
var
n, i: integer;
begin
write('Введите число: ');
read(n);
while n <> 1 do
if n mod 2 = 0 then
n := n / 2
else
n:=(n* 3 + 1) / 2;
end.
Задача такая, что если число чётное, то его нужно разделить на два, а если нет, то умножить на 3, прибавить 1 и разделить на два. И делать так, пока в итоге не получится 1. В 5 строчке пишет: нельзя преобразовать тип real к integer. Я не пойму где тут real. Помогите пожалуйста.
задан 9 янв 2020 в 15:11
В результате операции n / 2
получается значение типа real, т.к. /
— обычное не целочисленное деление, результат которого может быть нецелым числом. Вы же записываете результат этой операции в переменную n
, которая имеет тип integer. Из-за несоответствия типов возникает ошибка.
Вам нужно использовать целочисленное деление, которое отбрасывает остаток и даёт в результате целое число:
n := n div 2
ответ дан 9 янв 2020 в 15:20
Кирилл МалышевКирилл Малышев
10.8k1 золотой знак18 серебряных знаков34 бронзовых знака
1
Во-первых, форматируйте ваш код! Во-вторых, ваша проблема
в использовании оператора /
вместо 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
Ainar-GAinar-G
15.9k3 золотых знака24 серебряных знака41 бронзовый знак
2
Неописанная переменная
begin S := 1; // Неизвестное имя S end.
Все используемые переменные должны быть предварительно описаны с помощью ключевого слова var (внутри блока begin/end или, что обычно хуже, в разделе описаний вначале программы).
Отсутствующая ;
begin var S: integer S := 1; // Компилятор здесь скажет: Ожидалась ; — имеется ввиду предыдущая строка! end.
begin var S := 1 S := S + 1 // Аналогично: проблема на предыдущей строке, а на текущей нет, потому что после неё идёт end. end.
Очень частая ошибка у начинающих. Курсор, как правило, позиционируется в начале следующей строки.
Несовместимость типов при присваивании
begin var S: integer := 1.3; // Нельзя преобразовать тип real к integer end.
Безболезненно можно присваивать только данные одного типа. Если данные — разных типов, то в редких случаях можно преобразовать данные одного типа в данные другого. Например, целое можно преобразовать в вещественное, а символ — в строку. Обратные преобразования не допускаются.
Чтобы не ошибаться в подобных простых случаях в Паскале есть следующая краткая форма объявления и инициализации переменной:
begin var S := 1.3; // Тип real будет выведен компилятором автоматически end.
Отсутствие закрывающего апострофа литеральной строки
begin var x := 2; // x получает тип integer var y := 3; // y получает тип integer writeln('Результат сложения равен =, x + y); // Не хватает закрывающего апострофа end.
Закрыть апостроф надо на той же строке, где расположен открывающий апостроф
Ошибки расстановки запятых и апострофов при выводе строк и выражений
begin var x := 2; // x получает тип integer var y := 3; // y получает тип integer writeln(x, '+,' y, '=', x+y); // Неверная расстановка запятых и апострофов end.
Слишком много запятых и апострофов рядом, потому начинающие часто путаются
Надо уяснить правила:
- запятые разделяют разные элементы вывода
- все, что находится в апострофах, будет выведено на экран без изменений
Ошибка ввода
begin var x: integer; read(x); // введите блаблабла и посмотрите, что получится end.
Это — ошибка во время выполнения. Программа пытается преобразовать введенную строку в число, не может это сделать и завершается с ошибкой.
Аналогичный фрагмент в более современном и предпочтительном синтаксисе:
begin var x := ReadInteger; end.
Ошибка неинициализированной переменной
begin var x: integer; // Забыли инициализировать или ввести x var r := x * x; // r получает тип integer writeln('Квадрат числа ', x, ' = ', r); end.
Перед использованием любую переменную надо ввести или присвоить ей начальное значение. Это действие называется инициализацией переменной.
Деление на 0
begin var x := 0; var c := 666 div x; // Здесь происходит деление на 0 end.
Если во время выполнения программа выполнит деление на 0, то она завершится с ошибкой.
Корень из отрицательного числа
begin writeln(sqrt(-1)); // Корень из отрицательного числа end.
В обычном Паскале возникает ошибка времени выполнения.
В PascalABC.NET выводится NaN — Not a Number
Ссылки
- Программы для начинающих
- Сайт PascalABC.NET: Программы и алгоритмы для начинающих
Вот код
var
n, i: integer;
begin
write('Введите число: ');
read(n);
while n <> 1 do
if n mod 2 = 0 then
n := n / 2
else
n:=(n* 3 + 1) / 2;
end.
Задача такая, что если число чётное, то его нужно разделить на два, а если нет, то умножить на 3, прибавить 1 и разделить на два. И делать так, пока в итоге не получится 1. В 5 строчке пишет: нельзя преобразовать тип real к integer. Я не пойму где тут real. Помогите пожалуйста.
задан 9 янв 2020 в 15:11
В результате операции n / 2
получается значение типа real, т.к. /
— обычное не целочисленное деление, результат которого может быть нецелым числом. Вы же записываете результат этой операции в переменную n
, которая имеет тип integer. Из-за несоответствия типов возникает ошибка.
Вам нужно использовать целочисленное деление, которое отбрасывает остаток и даёт в результате целое число:
n := n div 2
ответ дан 9 янв 2020 в 15:20
Кирилл МалышевКирилл Малышев
10.7k1 золотой знак18 серебряных знаков34 бронзовых знака
1
Во-первых, форматируйте ваш код! Во-вторых, ваша проблема
в использовании оператора /
вместо 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
Ainar-GAinar-G
15.8k3 золотых знака23 серебряных знака40 бронзовых знаков
2
mb871 5 / 3 / 2 Регистрация: 23.08.2017 Сообщений: 17 |
||||
1 |
||||
24.08.2017, 02:49. Показов 15392. Ответов 5 Метки нет (Все метки)
Снова я, вылезает ошибка:
__________________ 0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
24.08.2017, 02:49 |
5 |
544 / 868 / 144 Регистрация: 10.08.2015 Сообщений: 4,456 |
|
24.08.2017, 03:56 |
2 |
Тебе ide показывает ошибку, номер строки дает и выделяет красным, как можно не найти ошибку? sum / n имеет тип real 9/4=2.25, а ты присваиваешь его целому sum. вот и ошибка 1 |
Cyborg Drone Модератор 9467 / 4793 / 3208 Регистрация: 17.08.2012 Сообщений: 15,027 |
||||
24.08.2017, 08:53 |
3 |
|||
mb871, среднее арифметическое редко бывает целым. Либо объявите sum вещественным, либо используйте только результат деления, без присваивания. Для последнего варианта замените строки 18, 19, например, на
1 |
ko2101 2 / 2 / 2 Регистрация: 28.04.2017 Сообщений: 71 |
||||
24.08.2017, 09:26 |
4 |
|||
Сообщение было отмечено mb871 как решение РешениеМожно просто обозначить sum , как real и всё:
А лучше тогда и массив объявить как real 1 |
Модератор 9467 / 4793 / 3208 Регистрация: 17.08.2012 Сообщений: 15,027 |
|
24.08.2017, 09:29 |
5 |
обозначить sum , как real ko2101, так я же уже про это написал. 1 |
5 / 3 / 2 Регистрация: 23.08.2017 Сообщений: 17 |
|
24.08.2017, 13:41 [ТС] |
6 |
СПАСИБО! 0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
24.08.2017, 13:41 |
Помогаю со студенческими работами здесь Ошибка: нельзя преобразовать тип real к integer «Нельзя преобразовать тип real к integer» Ошибка: Нельзя преобразовать тип function x real real к real var Нельзя преобразовать тип function(x: real): real к real Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 6 |
-
- 0
-
Ошибка Program1.pas(5) : Нельзя преобразовать тип real к integer. Можете объяснить почему?
program chasiki;
var N,z,x,y,v,b :real;
begin
read (N);
z:=N div 3600;
x:=N mod 3600;
y:=x div 60;
v:=y mod 60;
b:=v mod 60;
writeln (z,x,b);
end.
-
Комментариев (0)
-
- 0
-
z:=N div 3600; — операция div применима только к целочисленным типам, а у Вас объявлено var N … :real;
-
Комментариев (0)
-
- 0
-
Дело в том, что div и mod — относятся к операциям на ЦЕЛЫМИ числами, Вы же пытаетесь их использовать с вещественными.
Div — Целая часть от деления, а Mod — остаток
Для типа Real следует использовать «/«
-
Комментариев (0)
Неописанная переменная
begin S := 1; // Неизвестное имя S end.
Все используемые переменные должны быть предварительно описаны с помощью ключевого слова var (внутри блока begin/end или, что обычно хуже, в разделе описаний вначале программы).
Отсутствующая ;
begin var S: integer S := 1; // Компилятор здесь скажет: Ожидалась ; — имеется ввиду предыдущая строка! end.
begin var S := 1 S := S + 1 // Аналогично: проблема на предыдущей строке, а на текущей нет, потому что после неё идёт end. end.
Очень частая ошибка у начинающих. Курсор, как правило, позиционируется в начале следующей строки.
Несовместимость типов при присваивании
begin var S: integer := 1.3; // Нельзя преобразовать тип real к integer end.
Безболезненно можно присваивать только данные одного типа. Если данные — разных типов, то в редких случаях можно преобразовать данные одного типа в данные другого. Например, целое можно преобразовать в вещественное, а символ — в строку. Обратные преобразования не допускаются.
Чтобы не ошибаться в подобных простых случаях в Паскале есть следующая краткая форма объявления и инициализации переменной:
begin var S := 1.3; // Тип real будет выведен компилятором автоматически end.
Отсутствие закрывающего апострофа литеральной строки
begin var x := 2; // x получает тип integer var y := 3; // y получает тип integer writeln('Результат сложения равен =, x + y); // Не хватает закрывающего апострофа end.
Закрыть апостроф надо на той же строке, где расположен открывающий апостроф
Ошибки расстановки запятых и апострофов при выводе строк и выражений
begin var x := 2; // x получает тип integer var y := 3; // y получает тип integer writeln(x, '+,' y, '=', x+y); // Неверная расстановка запятых и апострофов end.
Слишком много запятых и апострофов рядом, потому начинающие часто путаются
Надо уяснить правила:
- запятые разделяют разные элементы вывода
- все, что находится в апострофах, будет выведено на экран без изменений
Ошибка ввода
begin var x: integer; read(x); // введите блаблабла и посмотрите, что получится end.
Это — ошибка во время выполнения. Программа пытается преобразовать введенную строку в число, не может это сделать и завершается с ошибкой.
Аналогичный фрагмент в более современном и предпочтительном синтаксисе:
begin var x := ReadInteger; end.
Ошибка неинициализированной переменной
begin var x: integer; // Забыли инициализировать или ввести x var r := x * x; // r получает тип integer writeln('Квадрат числа ', x, ' = ', r); end.
Перед использованием любую переменную надо ввести или присвоить ей начальное значение. Это действие называется инициализацией переменной.
Деление на 0
begin var x := 0; var c := 666 div x; // Здесь происходит деление на 0 end.
Если во время выполнения программа выполнит деление на 0, то она завершится с ошибкой.
Корень из отрицательного числа
begin writeln(sqrt(-1)); // Корень из отрицательного числа end.
В обычном Паскале возникает ошибка времени выполнения.
В PascalABC.NET выводится NaN — Not a Number
Ссылки
- Программы для начинающих
- Сайт PascalABC.NET: Программы и алгоритмы для начинающих
-
- 0
-
Ошибка Program1.pas(5) : Нельзя преобразовать тип real к integer. Можете объяснить почему?
program chasiki;
var N,z,x,y,v,b :real;
begin
read (N);
z:=N div 3600;
x:=N mod 3600;
y:=x div 60;
v:=y mod 60;
b:=v mod 60;
writeln (z,x,b);
end.
-
Комментариев (0)
-
- 0
-
z:=N div 3600; — операция div применима только к целочисленным типам, а у Вас объявлено var N … :real;
-
Комментариев (0)
-
- 0
-
Дело в том, что div и mod — относятся к операциям на ЦЕЛЫМИ числами, Вы же пытаетесь их использовать с вещественными.
Div — Целая часть от деления, а Mod — остаток
Для типа Real следует использовать «/«
-
Комментариев (0)
Нельзя преобразовать тип real к integer program chees ; var m, n, s, k : real ; begin readln(m) ; readln(n) ; s : = m * n ; If s mod 2< ; > ; 0 then k : = s / 2 + 1 else k : = s / 2 ; writeln(k) end.
Вы зашли на страницу вопроса Нельзя преобразовать тип real к integer program chees ; var m, n, s, k : real ; begin readln(m) ; readln(n) ; s : = m * n ; If s mod 2< ; > ; 0 then k : = s / 2 + 1 else k : = s / 2 ; writeln(k) e?, который относится к
категории Информатика. По уровню сложности вопрос соответствует учебной
программе для учащихся 5 — 9 классов. В этой же категории вы найдете ответ
и на другие, похожие вопросы по теме, найти который можно с помощью
автоматической системы «умный поиск». Интересную информацию можно найти в
комментариях-ответах пользователей, с которыми есть обратная связь для
обсуждения темы. Если предложенные варианты ответов не удовлетворяют,
создайте свой вариант запроса в верхней строке.