Ошибка в паскале нельзя преобразовать тип real к integer

Вот код

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

Вадим's user avatar

В результате операции n / 2 получается значение типа real, т.к. / — обычное не целочисленное деление, результат которого может быть нецелым числом. Вы же записываете результат этой операции в переменную n, которая имеет тип integer. Из-за несоответствия типов возникает ошибка.

Вам нужно использовать целочисленное деление, которое отбрасывает остаток и даёт в результате целое число:

n := n div 2

ответ дан 9 янв 2020 в 15:20

Кирилл Малышев's user avatar

Кирилл МалышевКирилл Малышев

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.

Дух сообщества's user avatar

ответ дан 9 янв 2020 в 15:24

Ainar-G's user avatar

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: Программы и алгоритмы для начинающих

mb871

5 / 3 / 2

Регистрация: 23.08.2017

Сообщений: 17

1

24.08.2017, 02:49. Показов 16018. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Снова я, вылезает ошибка:
Program3.pas(18) : Нельзя преобразовать тип real к integer
Проверял построчно, ошибку найти не получается, заранее спасибо за ответ.
Задача программы: Задан массив А, состоящий из n чисел. Найти среднее арифметическое его элементов. Элементы вводятся с клавиатуры.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
program ssp;
 
var
  mas: array[1..100] of integer;
  sum, a, n, h: integer;
 
begin
  write('введите число ');
  Readln(n);
  Sum := 0;
  for a := 1 to n do
  begin
    writeln('введите массив');
    Readln(mas[a]);
    sum := sum + mas[a];
    ;
  end;
  sum := sum / n;
  writeln(sum);
end.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

24.08.2017, 02:49

5

594 / 914 / 149

Регистрация: 10.08.2015

Сообщений: 4,796

24.08.2017, 03:56

2

Тебе ide показывает ошибку, номер строки дает и выделяет красным, как можно не найти ошибку? sum / n имеет тип real 9/4=2.25, а ты присваиваешь его целому sum. вот и ошибка



1



Cyborg Drone

Модератор

9609 / 4930 / 3251

Регистрация: 17.08.2012

Сообщений: 15,380

24.08.2017, 08:53

3

mb871, среднее арифметическое редко бывает целым. Либо объявите sum вещественным, либо используйте только результат деления, без присваивания. Для последнего варианта замените строки 18, 19, например, на

Pascal
18
  writeln(sum/n:0:2)



1



ko2101

2 / 2 / 2

Регистрация: 28.04.2017

Сообщений: 71

24.08.2017, 09:26

4

Лучший ответ Сообщение было отмечено mb871 как решение

Решение

Можно просто обозначить sum , как real и всё:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
program ssp;
 
var
  mas: array[1..100] of integer;
  sum: real;
  a, n, h: integer;
 
begin
  write('введите число ');
  Readln(n);
  Sum := 0;
  for a := 1 to n do
  begin
    writeln('введите массив');
    Readln(mas[a]);
    sum := sum + mas[a];
    ;
  end;
  sum := sum / n;
  writeln(sum);
end.

А лучше тогда и массив объявить как real



1



Модератор

9609 / 4930 / 3251

Регистрация: 17.08.2012

Сообщений: 15,380

24.08.2017, 09:29

5

Цитата
Сообщение от ko2101
Посмотреть сообщение

обозначить sum , как real

ko2101, так я же уже про это написал.



1



5 / 3 / 2

Регистрация: 23.08.2017

Сообщений: 17

24.08.2017, 13:41

 [ТС]

6

СПАСИБО!
p.s. Программу писал в 3 ночи, затупил, извиняюсь



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

24.08.2017, 13:41

Помогаю со студенческими работами здесь

Ошибка: нельзя преобразовать тип real к integer
Создайте массив А с помощью генератора случайных чисел с вещественными элементами от -10 до 10 и…

«Нельзя преобразовать тип real к integer»
Здравствуйте! У меня возникла проблема в Delphi, но для простоты, я написала ее в Паскале. Помогите…

Ошибка: Нельзя преобразовать тип function x real real к real
Здравствуйте, не могу понять как исправить ошибку (строка 32)

var
a,b,e,h,xi,fi,ln1,ln2:real;…

Нельзя преобразовать тип function(x: real): real к real
Здравствуйте! Не могу написать формулу. Ошибка:Нельзя преобразовать тип function(x: real): real к…

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

Или воспользуйтесь поиском по форуму:

6

Неописанная переменная

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

Вадим's user avatar

В результате операции n / 2 получается значение типа real, т.к. / — обычное не целочисленное деление, результат которого может быть нецелым числом. Вы же записываете результат этой операции в переменную n, которая имеет тип integer. Из-за несоответствия типов возникает ошибка.

Вам нужно использовать целочисленное деление, которое отбрасывает остаток и даёт в результате целое число:

n := n div 2

ответ дан 9 янв 2020 в 15:20

Кирилл Малышев's user avatar

Кирилл МалышевКирилл Малышев

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.

Дух сообщества's user avatar

ответ дан 9 янв 2020 в 15:24

Ainar-G's user avatar

Ainar-GAinar-G

15.8k3 золотых знака23 серебряных знака40 бронзовых знаков

2

mb871

5 / 3 / 2

Регистрация: 23.08.2017

Сообщений: 17

1

24.08.2017, 02:49. Показов 15392. Ответов 5

Метки нет (Все метки)


Снова я, вылезает ошибка:
Program3.pas(18) : Нельзя преобразовать тип real к integer
Проверял построчно, ошибку найти не получается, заранее спасибо за ответ.
Задача программы: Задан массив А, состоящий из n чисел. Найти среднее арифметическое его элементов. Элементы вводятся с клавиатуры.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
program ssp;
 
var
  mas: array[1..100] of integer;
  sum, a, n, h: integer;
 
begin
  write('введите число ');
  Readln(n);
  Sum := 0;
  for a := 1 to n do
  begin
    writeln('введите массив');
    Readln(mas[a]);
    sum := sum + mas[a];
    ;
  end;
  sum := sum / n;
  writeln(sum);
end.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

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, например, на

Pascal
18
  writeln(sum/n:0:2)

1

ko2101

2 / 2 / 2

Регистрация: 28.04.2017

Сообщений: 71

24.08.2017, 09:26

4

Лучший ответ Сообщение было отмечено mb871 как решение

Решение

Можно просто обозначить sum , как real и всё:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
program ssp;
 
var
  mas: array[1..100] of integer;
  sum: real;
  a, n, h: integer;
 
begin
  write('введите число ');
  Readln(n);
  Sum := 0;
  for a := 1 to n do
  begin
    writeln('введите массив');
    Readln(mas[a]);
    sum := sum + mas[a];
    ;
  end;
  sum := sum / n;
  writeln(sum);
end.

А лучше тогда и массив объявить как real

1

Модератор

9467 / 4793 / 3208

Регистрация: 17.08.2012

Сообщений: 15,027

24.08.2017, 09:29

5

Цитата
Сообщение от ko2101
Посмотреть сообщение

обозначить sum , как real

ko2101, так я же уже про это написал.

1

5 / 3 / 2

Регистрация: 23.08.2017

Сообщений: 17

24.08.2017, 13:41

 [ТС]

6

СПАСИБО!
p.s. Программу писал в 3 ночи, затупил, извиняюсь

0

IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

24.08.2017, 13:41

Помогаю со студенческими работами здесь

Ошибка: нельзя преобразовать тип real к integer
Создайте массив А с помощью генератора случайных чисел с вещественными элементами от -10 до 10 и…

«Нельзя преобразовать тип real к integer»
Здравствуйте! У меня возникла проблема в Delphi, но для простоты, я написала ее в Паскале. Помогите…

Ошибка: Нельзя преобразовать тип function x real real к real
Здравствуйте, не могу понять как исправить ошибку (строка 32)

var
a,b,e,h,xi,fi,ln1,ln2:real;…

Нельзя преобразовать тип function(x: real): real к real
Здравствуйте! Не могу написать формулу. Ошибка:Нельзя преобразовать тип function(x: 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)



  • 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 а ожидалось
  • Ошибка в параметре ip адрес
  • Ошибка в папке local temp