0 / 0 / 0
Регистрация: 21.04.2016
Сообщений: 5
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте. Как правильно указать что переменная типа integer находиться в диапазоне чисел от 1 до 16 и является чётной?
Pascal
1
2
3
begin
for A:=1 to 16 do;
A:=A mod 2=0;
выдаёт ошибку
Нельзя преобразовать тип boolean к integer
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2016, 16:02
Ответы с готовыми решениями:

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

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

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

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

10
318 / 208 / 162
Регистрация: 08.12.2015
Сообщений: 863
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
Почетный модератор
64299 / 47594 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
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
0 / 0 / 0
Регистрация: 21.04.2016
Сообщений: 5
22.04.2016, 13:48  [ТС] 4
Условие если A>1 и A<16... не подходит, т.к. мы точно знаем что оно чётное и находится в заданном диапазоне.Что и требуется указать.

Добавлено через 18 минут
Puporev, могу ли я вас попросить добавить комментарий к каждой строке зачем это сделано? До изучения массивов я еще не дошёл... Я конечно погуглю и постараюсь сам понять что к чему, но ваше пояснение ускорит процесс понимания.
А если мне нужно задать 8 переменных в данном диапазоне и указать что они четные? Этот процесс повторяется для каждой переменной в отдельности или его можно применить для всей группы?
0
Почетный модератор
64299 / 47594 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
22.04.2016, 14:29 5
Если бы я знал точное условие задачи....
А это просто пример на тему
Цитата Сообщение от sssommm Посмотреть сообщение
Как правильно указать что переменная типа integer находиться в диапазоне чисел от 1 до 16 и является чётной?
0
0 / 0 / 0
Регистрация: 21.04.2016
Сообщений: 5
23.04.2016, 11:50  [ТС] 6
Пару недель назад занялся изучением программирования на языке Паскаль. В нете увидел задачку http://42.tut.by/492759?utm_so... irculation и хотел решить её но сразу возникла проблема с присвоением переменной чёт-нечет...
0
Почетный модератор
64299 / 47594 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
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
Модератор
Эксперт по электронике
8458 / 4321 / 1638
Регистрация: 01.02.2015
Сообщений: 13,393
Записей в блоге: 7
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
0 / 0 / 0
Регистрация: 21.04.2016
Сообщений: 5
24.04.2016, 12:00  [ТС] 10
Спасибо. Что то, действительно сложная задача для начинающего. Оставлю её пока в покое.

Добавлено через 1 минуту
На первый взгляд всё выглядело так просто и безобидно)
0
Модератор
Эксперт по электронике
8458 / 4321 / 1638
Регистрация: 01.02.2015
Сообщений: 13,393
Записей в блоге: 7
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2016, 12:32
Помогаю со студенческими работами здесь

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

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

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

Если у меня переменная int, как указать на то что она пустая?
Суть вопроса вот в чём. У меня есть несколько текстбоксов, и при вводе в них определённых чисел и...

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

Как указать для тега SCRIPT что код VBScript находится во внешнем файле?
Как указать для тега SCRIPT что код VBScript находится во внешнем файле? &lt;SCRIPT...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru