С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
PascalABC.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
sssommm
0 / 0 / 0
Регистрация: 21.04.2016
Сообщений: 5
1

Как правильно указать что переменная типа integer находится в диапазоне чисел от 1 до 16 и является чётной?

21.04.2016, 16:02. Просмотров 882. Ответов 10
Метки нет (Все метки)

Здравствуйте. Как правильно указать что переменная типа integer находиться в диапазоне чисел от 1 до 16 и является чётной?
Pascal
1
2
3
begin
for A:=1 to 16 do;
A:=A mod 2=0;
выдаёт ошибку
Нельзя преобразовать тип boolean к integer
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2016, 16:02
Ответы с готовыми решениями:

правильно ли используется переменная типа integer.
Допустим у нас есть текстовой файл с кодом программы на Паскале. Нам на...

Предположим, что переменная типа CHAR занимает 1 байт, переменная типа INTEGER занимает два байта
Предположим, что переменная типа CHAR занимает 1 байт, переменная типа INTEGER...

Как правильно указать путь к файлу, который находится в одной папке с программой
Здравствуйте. Прошу помощи в таком вопросе. Пишу программу (с# Windows...

Как правильно записать в поле типа Число переменную с тип данных integer?
Доброго времени суток! Помогите, пожалуйста. Есть 2 поля в таблице: первое...

Правильное отображение времени, переменная типа integer
Здравствуйте форумчане ;) Пишу одну забавную...эээ, мини игру, и столкнулся с...

10
capricornus CF
315 / 205 / 162
Регистрация: 08.12.2015
Сообщений: 853
21.04.2016, 16:13 2
Pascal
1
2
3
4
5
var A :integer;
begin
  for A := 1 to 16 do
  if (A>=1) and (A<=16) and (A mod 2 = 0) then writeln ('A = ',A,', чётноe');
end.
0
Puporev
Модератор
55496 / 42589 / 29437
Регистрация: 18.05.2008
Сообщений: 100,748
21.04.2016, 16:22 3
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
var a:array[1..n] of integer;
    i:byte;
begin
randomize;
for i:=1 to n do
 begin
  a[i]:=-2+random(25);
  write(a[i]:3);
 end;
writeln;
for i:=1 to n do
writeln((a[i] in [1..16])and(a[i] mod 2=0));
end.
0
sssommm
0 / 0 / 0
Регистрация: 21.04.2016
Сообщений: 5
22.04.2016, 13:48  [ТС] 4
Условие если A>1 и A<16... не подходит, т.к. мы точно знаем что оно чётное и находится в заданном диапазоне.Что и требуется указать.

Добавлено через 18 минут
Puporev, могу ли я вас попросить добавить комментарий к каждой строке зачем это сделано? До изучения массивов я еще не дошёл... Я конечно погуглю и постараюсь сам понять что к чему, но ваше пояснение ускорит процесс понимания.
А если мне нужно задать 8 переменных в данном диапазоне и указать что они четные? Этот процесс повторяется для каждой переменной в отдельности или его можно применить для всей группы?
0
Puporev
Модератор
55496 / 42589 / 29437
Регистрация: 18.05.2008
Сообщений: 100,748
22.04.2016, 14:29 5
Если бы я знал точное условие задачи....
А это просто пример на тему
Цитата Сообщение от sssommm Посмотреть сообщение
Как правильно указать что переменная типа integer находиться в диапазоне чисел от 1 до 16 и является чётной?
0
sssommm
0 / 0 / 0
Регистрация: 21.04.2016
Сообщений: 5
23.04.2016, 11:50  [ТС] 6
Пару недель назад занялся изучением программирования на языке Паскаль. В нете увидел задачку http://42.tut.by/492759?utm_source=4...=recirculation и хотел решить её но сразу возникла проблема с присвоением переменной чёт-нечет...
0
Puporev
Модератор
55496 / 42589 / 29437
Регистрация: 18.05.2008
Сообщений: 100,748
23.04.2016, 12:01 7
Лучший ответ Сообщение было отмечено sssommm как решение

Решение

Цитата Сообщение от sssommm Посмотреть сообщение
возникла проблема с присвоением переменной чёт-нечет...
Pascal
1
2
3
4
5
6
var f:boolean;
     a:integer;
begin
........................
f:=a mod 2=0; //f- четное not f-нечетное
.......................
1
capricornus CF
23.04.2016, 17:32
  #8

Не по теме:

Эту задачу можно решить используя массивы, множества и тд.

Цитата Сообщение от sssommm Посмотреть сообщение
Пару недель назад занялся изучением программирования на языке Паскаль
Боюсь, не для новичка вы взяли задание. Возьмите задачник Абрамяна (PT4) , идет в комплекте с PABC.NET.

0
ФедосеевПавел
Модератор
3860 / 2180 / 895
Регистрация: 01.02.2015
Сообщений: 7,263
23.04.2016, 23:41 9
Лучший ответ Сообщение было отмечено sssommm как решение

Решение

sssommm, из чистого любопытства попробовал решить задачку. Решал, правда на FPC, но компиляцию проверил и на PABC.NET (WDE). На FPC результат получил (~3с), а на WDE, видимо, сервер остановил выполнение по времени.

На сайте врут, комбинаций перебора не 16!=20'922'789'888'000, а всего лишь 7!8!=203'212'800.

Задача решается перебором, вернее рекурсивным перебором с возвратом.
Матрицу для удобства представил в виде массива. Прошу прощения, но т.к. backtracking делал по имеющимся наработкам, то индексация массивов от 0, а не от 1.
Выражение
Pascal
(odd(k) xor (Cell in EvenPos))
в результате даёт true, если k чётное и в этой ячейке должно быть чётное число, или если число k нечётное и в этой ячейке должно быть нечётное число.

Формально, можно было бы решить 16-ю (вернее, 15-ю - из-за известной позиции для 13) вложенными циклами для каждой ячейки, но рекурсия делает именно то же, но выглядит красивее.
Кликните здесь для просмотра всего текста
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
program SquareBacktracking;
 
const
  N = 4;
type
  TMatrix = array [0..N * N - 1] of integer;
const
  {позиции с нечётными числами}
  OddPos  = [0, 3, 4, 5, 7, 8, 9, 11];
  {позиции с чётными числами}
  EvenPos = [0..15] - OddPos;
 
  procedure ShowMatrix(const M: TMatrix; ARows, ACols: integer);
  var
    i: integer;
  begin
    for i := 0 to ARows * ACols - 1 do
    begin
      Write(M[i]: 3);
      if (i + 1) mod ACols = 0 then
        writeln;
    end;
  end;
 
  function TestSquare(const M: TMatrix): boolean;
  var
    Res: boolean;
  begin
    Res := (M[3] = 13);
    Res := Res and (M[0] * M[1] = M[2]);
    Res := Res and (M[5] + M[6] = M[7]);
    Res := Res and (M[8] - M[9] = M[10]);
    Res := Res and (M[13] - M[14] = M[15]);
    Res := Res and (M[1] + M[5] = M[9]);
    Res := Res and (M[4] + M[8] = M[12]);
    Res := Res and (M[6] - M[10] = M[14]);
    Res := Res and (M[7] - M[11] = M[15]);
    Res := Res and odd(M[0]);
    TestSquare := Res;
  end;
 
  function CreateSquare(var M: TMatrix): boolean;
 
  var
    UsedNumber: array of boolean;
 
    function Backtracking(Cell: integer): boolean;
    var
      k: integer;
      Res: boolean;
    begin
      {если квадрат заполнен, проверяем его свойства}
      if Cell = sqr(N) then
      begin
        Backtracking := TestSquare(M);
        Exit;
      end;
      {перебор возможных кандидатов, на место в данной ячейке}
      if Cell = 3 then
      begin
        Backtracking := Backtracking(Cell + 1);
      end
      else
      begin
        for k := 1 to sqr(N) do
        begin
          if (not UsedNumber[k - 1]) and (odd(k) xor (Cell in EvenPos)) then
          begin
            UsedNumber[k - 1] := True;
            M[Cell] := k;
            Res := Backtracking(Cell + 1);
            Backtracking := Res;
            if Res then
              break;
            UsedNumber[k - 1] := False;
          end;
        end;
      end;
    end;
 
  var
    i: integer;
  begin
    SetLength(UsedNumber, sqr(N));
    for i := 0 to sqr(N) - 1 do
      UsedNumber[i] := False;
    UsedNumber[13 - 1] := True;
    M[3] := 13;
    CreateSquare := BackTracking(0);
  end;
 
var
  Square: TMatrix;
begin
  if CreateSquare(Square) then
    ShowMatrix(Square, N, N)
  else
    writeln('No');
end.

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

Добавлено через 2 часа 22 минуты
Ускорение перебора, за счет отбрасывания неподходящих вариантов по мере заполнения матрицы, а не по окончании заполнения.
Кликните здесь для просмотра всего текста
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
program SquareBacktracking;
 
const
  N = 4;
type
  TMatrix = array [0..N*N - 1] of integer;
const
  OddPos  = [0, 3, 4, 5, 7, 8, 9, 11];
  EvenPos = [0..15] - OddPos;
 
  procedure ShowMatrix(const M: TMatrix; ARows, ACols: integer);
  var
    i: integer;
  begin
    for i := 0 to ARows * ACols - 1 do
    begin
      Write(M[i]: 3);
      if (i + 1) mod ACols = 0 then
        writeln;
    end;
  end;
 
  function TestSquare(const M: TMatrix; Cell: integer): boolean;
  var
    Res: boolean;
  begin
    Res := True;
    if Cell >= 3 then
      Res := (M[3] = 13);
    if Cell >= 2 then
      Res := Res and (M[0] * M[1] = M[2]);
    if Cell >= 7 then
      Res := Res and (M[5] + M[6] = M[7]);
    if Cell >= 10 then
      Res := Res and (M[8] - M[9] = M[10]);
    if Cell >= 15 then
      Res := Res and (M[13] - M[14] = M[15]);
    if Cell >= 9 then
      Res := Res and (M[1] + M[5] = M[9]);
    if Cell >= 12 then
      Res := Res and (M[4] + M[8] = M[12]);
    if Cell >= 14 then
      Res := Res and (M[6] - M[10] = M[14]);
    if Cell >= 15 then
      Res := Res and (M[7] - M[11] = M[15]);
    //Res := Res and odd(M[0]);
    TestSquare := Res;
  end;
 
  function CreateSquare(var M: TMatrix): boolean;
 
  var
    UsedNumber: array of boolean;
 
    function Backtracking(Cell: integer): boolean;
    var
      k: integer;
      Res: boolean;
    begin
      {если квадрат заполнен, проверяем его свойства}
      if Cell = sqr(N) then
      begin
        Backtracking := TestSquare(M, Cell);
        Exit;
      end;
      {перебор возможных кандидатов, на место в данной ячейке}
      if Cell = 3 then
      begin
        Backtracking := Backtracking(Cell + 1);
      end
      else
      begin
        for k := 1 to sqr(N) do
        begin
          if (not UsedNumber[k - 1]) and (odd(k) xor (Cell in EvenPos)) then
          begin
            UsedNumber[k - 1] := True;
            M[Cell] := k;
            Res := TestSquare(M, Cell);
            Backtracking := Res;
            if Res then
            begin
              Res := Backtracking(Cell + 1);
              Backtracking := Res;
              if Res then
                break;
            end;
            UsedNumber[k - 1] := False;
          end;
        end;
      end;
    end;
 
  var
    i: integer;
  begin
    SetLength(UsedNumber, sqr(N));
    for i := 0 to sqr(N) - 1 do
      UsedNumber[i] := False;
    UsedNumber[13 - 1] := True;
    M[3] := 13;
    CreateSquare := BackTracking(0);
  end;
 
var
  Square: TMatrix;
begin
  if CreateSquare(Square) then
    ShowMatrix(Square, N, N)
  else
    writeln('No');
end.
1
sssommm
0 / 0 / 0
Регистрация: 21.04.2016
Сообщений: 5
24.04.2016, 12:00  [ТС] 10
Спасибо. Что то, действительно сложная задача для начинающего. Оставлю её пока в покое.

Добавлено через 1 минуту
На первый взгляд всё выглядело так просто и безобидно)
0
ФедосеевПавел
Модератор
3860 / 2180 / 895
Регистрация: 01.02.2015
Сообщений: 7,263
24.04.2016, 12:32 11
Оно действительно просто. Если отвлечься от рекурсии, то там 15 вложенных циклов for для каждой позиции.
Примерно
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  for i11:=1 to 16 do
  begin
    if not odd(i11) then {если i11 четное, то пропустить, взять следующее значение}
      continue;
    if i11 in UsedNumber then
      continue;
    include(UsedNumber, i11);
    M[1,1]:=i11;
    for i12:=1 to 16 do
    begin
................................
  {внутри самого вложенного цикла}
                               if TestSquqre(M) then
                                  goto Show;
................................
    end;
    exclude(UsedNumber, i11);
  end;
Show:
   вывод матрицы
Полный перебор. Границы значений от 1 до 16 определяются в заголовке каждого цикла, чёт-нечет условием if.
0
24.04.2016, 12:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2016, 12:32

Как указать, что i в цикле эта переменная, а не текст?
Красным выделена та область, где надо указать переменную. как это сделать? ...

Определить количество первых чисел Пелля, что значение их суммы не превышает диапазона типа integer
Определить количество первых чисел Пелля, таких, что значение их суммы не...

Как проверить, что переменная является числом?
Добрый день, уважаемые. Скучая на работе и просто решив побаловаться BAT, я...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru