Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
5 / 5 / 3
Регистрация: 29.01.2015
Сообщений: 189
1

Упростить цикл while

08.12.2015, 23:14. Показов 545. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В последнем цикле while используется 2 вызова функции snake. Как сделать одиночный вызов с запоминанием результата итерации в переменную и дальнейшее использование её?

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
{
  Дано натуральное N (1<=N<=10), целочисленный квадратный массив-матрица (aij), 
  0<= i ,j <N. Отсортировать элементы матрицы так, чтобы при прохождении по 
  схеме, они были бы упорядочены по не убыванию. При сортировке элементов 
  не разрешается использовать дополнительные структуры данных (массивы).
  Сортировка вставками «с конца массива».
  
}
 
const m = 10;
var n, v, i, j, p, q, k, t, w, old: integer;
    a: array [0..m-1, 0..m-1] of integer;
 
{процедура вычисления индексов матрицы, исходя из условного номера элемента матрицы}
{согласно указанной схемы (считаем, что матрица пронумерована по змейке от 0 до n * n - 1)}
procedure snake(var x, y: integer; z: integer);
begin
  x := z mod n;  //строка
  y := z div n;  //столбец
  if odd(y) then //если у - нечётный
    x := n - x - 1;
end;
 
begin
  {ввод n}
  repeat
    write('Размер матрицы: n в [1..', m, '];  n = ');
    readln(n)
  until n in [1..m];
  {выводим матрицу }
  randomize;
  writeln('Исходная матрица:');
  for i := 0 to n - 1 do
    begin
      for j := 0 to n - 1 do
        begin
          a[i, j] := random(10);
          write(a[i, j]:5)
        end;
      writeln;
    end;
    
  {сортировка вставками, начиная с конца, змейкой, по неубыванию}
  v := n * n - 1; //последний элемент
  for k := v - 1 downto 0 do //идём к началу инд
    begin
      snake(i, j, k); //найдем коор. индекса К (предыдущ.)
      t := a[i, j];  
      w := k + 1;  //найдём индекс W (последний)
      snake(p, q, w);
      while (w <= v) and (a[p, q] < t) do //пока индекс не выходит за предел и знач. не меньше т
        begin
          snake(i, j, w - 1);  //коорд. в-1
          a[i, j] := a[p, q];  //запишем в в-1 значение в
          old:= w;
          inc(w);  //переход на 1 шаг вперед по змейке
          snake(p, q, w);  //ищем в+1
          //writeln('В цикле: w = ',w,', k = ',k);
        end;
      snake(i, j, w - 1); //ищем в-1 
      //writeln('w = ',w,', k = ',k);
      a[i, j] := t
      
    end;
//запомнить значение с первой итерации и использовать его в следующей    
    
    
  {вывод}
  writeln;
  writeln('Новая матрица:');
  for i := 0 to n - 1 do
    begin
      for j := 0 to n - 1 do write(a[i, j]:5);
      writeln
    end;
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2015, 23:14
Ответы с готовыми решениями:

Упростить эту часть программы, используя только один раз цикл «for»
Упростить эту часть программы, используя только один раз цикл «for» Var C, I, SM, SA, X:...

Создать программу по всем 3 видам циклов...цикл с параметром,цикл с условием,цикл,и цикл с предусловием...
Найти сумму чисел 1 в квадрате до 10 c квадрате...операцию возведению в степень не использовать...

Цикл с предусловием, цикл с постусловием и цикл с параметром
Объясните пожалуйста как делать эти циклы. У меня не получается. Можете сделать как на фото, или на...

Упростить цикл
Хеллоу еврибади!! Дело вот в чем есть такой вот цикл: for(int i=0;i&lt;n;i++){ for(int...

2
Модератор
9874 / 5242 / 3306
Регистрация: 17.08.2012
Сообщений: 16,011
11.12.2015, 02:47 2
Да... Действительно... Когда я эту программу писал (Сортировка элементов не по убыванию), не стал заниматься её оптимизацией. Ну да ладно. Вот так можно:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  {сортировка вставками, начиная с конца, змейкой, по неубыванию}
  v := n * n - 1;
  for k := v - 1 downto 0 do
    begin
      snake(i, j, k);
      t := a[i, j];
      w := k + 1;
      snake(p, q, w);
      while (w <= v) and (a[p, q] < t) do
        begin
          a[i, j] := a[p, q];
          i := p;
          j := q;
          inc(w);
          snake(p, q, w)
        end;
      a[i, j] := t
    end;
0
5 / 5 / 3
Регистрация: 29.01.2015
Сообщений: 189
11.12.2015, 19:59  [ТС] 3
Точняк! Спасибо большое!

Полный код:
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
{
  Дано натуральное N (1<=N<=10), целочисленный квадратный массив-матрица (aij), 
  0<= i ,j <N. Отсортировать элементы матрицы так, чтобы при прохождении по 
  схеме, они были бы упорядочены по не убыванию. При сортировке элементов 
  не разрешается использовать дополнительные структуры данных (массивы).
  Сортировка вставками «с конца массива».
  
   |0  7  8  15 |
   |1  6  9  14 | 
   |2  5  10 13 |
   |3  4  11 12 |
  
  Автор - Суворов А.А. 05.11.15
  Вариант 8
  
}
 
const m = 10;
var n, v, i, j, p, q, k, t, w, ptemp, qtemp: integer;
    a: array [0..m-1, 0..m-1] of integer;
 
{процедура вычисления индексов матрицы, исходя из условного номера элемента матрицы}
{согласно указанной схемы (считаем, что матрица пронумерована по змейке от 0 до n * n - 1)}
procedure snake(var x, y: integer; z: integer);
begin
  x := z mod n;  //строка
  y := z div n;  //столбец
  if odd(y) then //если у - нечётный
    x := n - x - 1;
end;
 
begin
  {ввод n}
  repeat
    write('Размер матрицы: n в [1..', m, '];  n = ');
    readln(n)
  until n in [1..m];
  {выводим матрицу }
  randomize;
  writeln('Исходная матрица:');
  for i := 0 to n - 1 do
    begin
      for j := 0 to n - 1 do
        begin
          a[i, j] := random(10);
          write(a[i, j]:5)
        end;
      writeln;
    end;
    
   {сортировка вставками, начиная с конца, змейкой, по неубыванию}
   v := n * n - 1;
   for k := v - 1 downto 0 do
    begin
      snake(i, j, k);
      t := a[i, j];
      w := k + 1;
      snake(p, q, w);
      while (w <= v) and (a[p, q] < t) do
        begin
          a[i, j] := a[p, q];
          i := p;
          j := q;
          inc(w);
          snake(p, q, w)
        end;
      a[i, j] := t
     end;  
    
  {вывод}
  writeln;
  writeln('Новая матрица:');
  for i := 0 to n - 1 do
    begin
      for j := 0 to n - 1 do write(a[i, j]:5);
      writeln
    end;
end.
0
11.12.2015, 19:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2015, 19:59
Помогаю со студенческими работами здесь

Как упростить цикл?
Добрый день! Есть вот такой код: Lx = 10; Ly = 10; hx = 0.10; hy = 0.10; Nx = Lx/hx; Ny =...

Как упростить цикл?
Знаю, что это самая дурацкая идея. #include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace...

Возможно ли упростить цикл?
Хотелось бы спросить можно ли избавиться от костыля в виде цикла тут: //{ ...

Упростить простой цикл, если x становится меньшее десяти, то прибавляй один, пока x не станет больше 40
Добрый день, если возможность упростить такой цикл? while (x &lt; 10) { ...


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

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