Нельзя преобразовать тип integer к integer как исправить паскаль

Александр005

0 / 0 / 0

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

Сообщений: 30

1

22.01.2015, 23:51. Показов 5626. Ответов 8

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


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

Есть такой кусок кода, не могу сделать вот эту операцию…

Pascal
1
work:=work+a[i,j];
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
function work (a:mas;k:byte) : integer;
const max=50;
var
n,i,j,tmp: byte;
begin
work:=0;
randomize;
writeln;
for i:=1 to k do
begin
for j:=1 to k do
begin
masyv[i,j]:=random (301);
end;
writeln();
end;
writeln();
j:=1;
while j<=(n div 2) do
begin
for i:=1 to n do
begin
tmp:=masyv[i,j];
masyv[i,j]:=masyv[i,n-j+1];
masyv[i,n-j+1]:=tmp
end;
inc(j);
end;
work:=work+a[i,j];
end;



0



JokeR.BY

CAPITAL OF ROCK!

1281 / 708 / 982

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

Сообщений: 2,286

23.01.2015, 00:02

2

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

Решение

потому что использование имени функции в теле функции в операциях присвоения есть либо точка возврата оной функции (если с левой стороны), либо вызов оной функции внутри самой себя, то бишь рекурсия (с правой; но тогда и параметры должны задаваться в скобках, чего как бы нет).

C++
1
2
3
4
int func()
{
    return 1 + 2; //work:=1+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
function work (a:mas;k:byte) : integer;
const max=50;
var
n,i,j,tmp: byte;
Result: integer;
begin
Result:=0;
randomize;
writeln;
for i:=1 to k do
begin
for j:=1 to k do
begin
masyv[i,j]:=random (301);
end;
writeln();
end;
writeln();
j:=1;
while j<=(n div 2) do
begin
for i:=1 to n do
begin
tmp:=masyv[i,j];
masyv[i,j]:=masyv[i,n-j+1];
masyv[i,n-j+1]:=tmp
end;
inc(j);
end;
work:=Result+a[i,j];
end;



1



Александр005

0 / 0 / 0

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

Сообщений: 30

23.01.2015, 00:19

 [ТС]

3

JokeR.BY,
Спасибо большое,разобрался)
только столкнулся с ещё одним праблом…
Мне нужно потом этот массив показать на екране,это происходит в другой процедуре

Pascal
1
write(work);

матерится:
Нет перегруженной подпрограммы с такими типами параметров
что-то все переропробовал-ничего(



0



Александр005

0 / 0 / 0

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

Сообщений: 30

23.01.2015, 00:29

 [ТС]

4

Есть код,помогите.
в этом куске нужно вывести на экран массив из функции,а пишет ошибку Неверное число параметров функции или Нет перегруженной подпрограммы с такими типами параметров

Pascal
1
writeln(work(a));
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
function work (a:mas;k:byte) : integer;
const max=50;
var
n,i,j,tmp: byte;
b: integer;
begin
b:=0;
\\\\\\\\
end;
work:=b+a[i,j];
end;
 
procedure screen(a:mas;k:byte);
var i,j:byte;
begin
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:5);
writeln;
end;
writeln(work(a));
writeln;
end;



0



JokeR.BY

CAPITAL OF ROCK!

1281 / 708 / 982

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

Сообщений: 2,286

23.01.2015, 01:05

5

Александр005, вы вызываете функцию work только с одним параметром. а она у вас описана только в одном варианте, то бишь с двумя.

Pascal
1
2
function work (a:mas;k:byte) : integer;
writeln(work(a));



0



0 / 0 / 0

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

Сообщений: 30

23.01.2015, 01:10

 [ТС]

6

JokeR.BY,
Именно в этом варианте выдает ошибку: Неверное число параметров функции.



0



CAPITAL OF ROCK!

1281 / 708 / 982

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

Сообщений: 2,286

23.01.2015, 01:52

7

Александр005, а сколько у вашей функции параметров?



0



0 / 0 / 0

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

Сообщений: 30

23.01.2015, 02:24

 [ТС]

8

JokeR.BY, параметра 2,но выводит только К и то 0. Тоесть массив не выводит.
я думаю ошибка раньше. Дело в том что К(размерность матрици) вводиться в отдельной процедуре,и сохраняется в файл. Потом в следущей процедуре она оттуда считывается, а уже дальше идет функция. Следовательно у меня вопрос: как правильно перенести К из процедуры в функцию?



0



CAPITAL OF ROCK!

1281 / 708 / 982

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

Сообщений: 2,286

23.01.2015, 02:57

9

Александр005, вы нигде оный параметр не используете. просто удалите.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

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

23.01.2015, 02:57

9

Вот код

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

Формулировка задачи:

Дана целочисленная матрица В размером 5х8. Получить массив С из 0 и 1, в котором Ci=1, если в i –ой строке матрицы есть хотя бы один отрицательный элемент, и Ci=0 в противном случае.

Program1.pas(22) : Нельзя преобразовать тип array [1..8] of integer к integer.
Какая ошибка допущена в 22 строке?

Код к задаче: «Ошибка : Нельзя преобразовать тип array [1..8] of integer к integer»

Полезно ли:

13   голосов , оценка 4.077 из 5

Сообщество Программистов

Загрузка…

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

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

Понравилась статья? Поделить с друзьями:
  • Как найти образ точки при параллельном переносе
  • Как найти солнечные очки
  • Как найти малую медведица фото
  • Как найти мои контакты в скайпе
  • Как можно найти фотки подруги