Форум программистов, компьютерный форум, киберфорум
Наши страницы

PascalABC.NET

Войти
Регистрация
Восстановить пароль
 
sssommm
0 / 0 / 0
Регистрация: 21.04.2016
Сообщений: 5
#1

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

21.04.2016, 16:02. Просмотров 250. Ответов 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 находится в диапазоне чисел от 1 до 16 и является чётной? (PascalABC.NET):

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

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

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

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

Как указать, что i в цикле эта переменная, а не текст? - JavaScript
Красным выделена та область, где надо указать переменную. как это сделать? var i = 1; while( i < int ) { var qi =...

Определить количество первых чисел Пелля, что значение их суммы не превышает диапазона типа integer - Pascal ABC
Определить количество первых чисел Пелля, таких, что значение их суммы не превышает диапазона типа integer (longint). Вывести в виде...

10
capricornus CF
315 / 205 / 132
Регистрация: 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
Модератор
52370 / 40217 / 13559
Регистрация: 18.05.2008
Сообщений: 92,942
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
Модератор
52370 / 40217 / 13559
Регистрация: 18.05.2008
Сообщений: 92,942
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
Модератор
52370 / 40217 / 13559
Регистрация: 18.05.2008
Сообщений: 92,942
23.04.2016, 12:01 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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
ФедосеевПавел
Модератор
2477 / 1380 / 571
Регистрация: 01.02.2015
Сообщений: 4,694
23.04.2016, 23:41 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
ФедосеевПавел
Модератор
2477 / 1380 / 571
Регистрация: 01.02.2015
Сообщений: 4,694
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
Привет! Вот еще темы с ответами:

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

Дано натуральное число n. Верно ли, что сумма цифр этого числа является чётной - C (СИ)
У меня никак не получается написать код.Очень прошу

Дано натуральное число n. Верно ли, что сумма цифр этого числа является чётной - C++
У меня никак не получается сделать эту лабу. Очень прошу.срочно 1. Дано натуральное число n. Верно ли, что сумма цифр этого числа...

Как указать для тега SCRIPT что код VBScript находится во внешнем файле? - VBScript/JScript
Как указать для тега SCRIPT что код VBScript находится во внешнем файле? &lt;SCRIPT language=&quot;VBScript&quot;&gt; 'код во внешнем файле ...


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

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

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