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

Заполнение и графический вывод массива - исправить ошибки в коде

22.03.2013, 02:32. Просмотров 530. Ответов 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
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
program exm;
Uses GraphABC;
Type mas = array of integer;
Var mas1,mas2 : array of mas;
    n, nMax, k, f : integer;
    arrayWasFilled, kWasCalculated, fWasCalculated : boolean;
 
// процедура для создания массива
procedure CreateMas(n : integer);
Var i, j : integer;
begin
SetLength(mas1, n); // выделяем динамическую память под строки массива mas1
for i := 0 to n - 1 do // для каждой строки...
begin
SetLength(mas1[i], n); // выделяем память под столбцы (для данной строки; и так для каждой строки)
for j := 0 to n - 1 do
mas1[i, j] := trunc(1/(i+j)); // заполняем массив mas1
end;
end;
 
// процедура для вывода массива
procedure OutputMas;
Var i, j, posX, posY, x : integer;
begin
  posX := 0; posY := 0;
  Brush.Color := clWhite; // устанавливает цвет кисти в белый
  // следующий цикл чертит вертикальные линии "таблицы"
  for j := 0 to n do
  begin
    MoveTo(posX, 0);
    LineTo(posX, n*20 - 5);
    posX := posX + 15;
  end;
  x := posX - 15; // запоминаем в переменную x длину горизонтальных линий
  // следующий цикл чертит горизонтальные линии "таблицы" и выводит элементы
  for i := 0 to n - 1 do
  begin
    posX := 0;
    for j := 0 to n - 1 do
    begin
      if (i = j) then // если элемент находится на главной или побочной диагонали, то...
      begin
        Brush.Color := clRed; // устанавливаем цвет кисти в красный
        FillRectangle(posX + 1, posY - 4, posX + 15, posY + 15); // заполняем клетку красным цветом
      end
      else
        Brush.Color := clWhite; // иначе, меняем цвет кисти обратно на белый
      if mas1[i, j] < 0 then
        TextOut(posX+2, posY, mas1[i, j].ToString()) // если элемент отрицательный, то отступаем от левого края клетки 2 пикселя (считая, что знак минус занимает 3 пикселя)
      else
        TextOut(posX+5, posY, mas1[i, j].ToString()); // в противном случае, - отступаем 5 пикселей  
      posX := posX + 15;
    end;
    MoveTo(0, posY + 15); // определяем начало горизонтальной линии
    LineTo(x, posY + 15); // определяем конец горизонтальной линии
    posY := posY + 20;
  end;
  Brush.Color := clWhite; // возвращаем цвет кисти в белый
  TextOut(Window.Width div 2 - 200, posY + 10, 'Нажмите клавишу "Enter", чтобы вернуться в главное меню.'); // выводим сообщение после выведенной матрицы
end;
 
// функция PositiveElem считает кол-во положительных элементов на главной диагонали 
function PositiveElem(mas2 : array of mas; n : integer) : integer;
Var i, j, k1 : integer;
begin
  k1 := 0; // изначально счетчик = 0
  for i := 0 to n - 1 do
    for j := 0 to n - 1 do
      if (mas1[i]=mas1[j]) and (mas1[i, j] > 0) then k1 := k1 + 1; // проверяем, если элемент > 0, то увеличиваем счетчик
  PositiveElem := k1; // имени функции присваиваем полученное значение (для функций делается всегда, так так они должны возвращать какое-то определенное значение)
end;
 
 
 
// процедура main выводит "главное меню"
Procedure main;
begin
  // каждый раз при выводе "главного меню" графическое окно будет очищаться
  Window.Clear;
  TextOut (100,10,'F1 - Заполнить массив');
  TextOut (100,30,'F2 - Вывести массив');
  TextOut (100,50,'F3 - Количество положительных элементов массива');
  TextOut (100,70,'F4 - Очистить окно');
  TextOut (100,90,'F5 - Увеличить размерность массива');
  TextOut (100,110,'F6 - Уменьшить размерность массива');
end;
 
// процедура KeyPress - событие, обрабатываемое, как нажатие клавиши
procedure KeyPress(Key : integer);
var i, j : integer;
begin
  // в зависимости от того, какая клавиша была нажата, оператов ветвления case выберет нужный вариант
  case Key of
    // если нажали F1 => заполняем массив
    VK_F1:
      begin
        Window.Clear; // очищаем окно
        arrayWasFilled := true; // то есть массив заполнен (точнее сейчас будет заполнен =) )
        // устанавливаем следующие флаги в значение false (т.к. завели новый массив)
        kWasCalculated := false;
        fWasCalculated := false;
        CreateMas(n); // заполняем массив
        main; // снова выводим "главное меню" (т.к. очищали графическое окно)
        TextOut(100, Window.Height - 100, 'Массив размерности ' + n.ToString() + 'x' + n.ToString() + ' был заполнен.'); // снизу пишем, чему равна новая размерность массива
      end;
    VK_F2:
      // если нажали F2 => выводим сам массив
      if arrayWasFilled then // если массив был заполнен, то...
      begin
        Window.Clear; // очищаем окно
        OutputMas; // выводим массив
      end;
    VK_F3:
      // если нажали F3 => считаем кол-во положительных элементов
      if arrayWasFilled then // если массив был заполнен, то...
      begin
        Window.Clear; // очищаем окно
        k := PositiveElem(mas1, n); // вызываем нужную функцию
        kWasCalculated := true; // то есть посчитали k (кол-во положительных элементов)
        main; // снова выводим "главное меню" (т.к. очищали графическое окно)
        TextOut(100, Window.Height - 100, 'Общее число положительных элементов массива k = ' + k.ToString()); // снизу пишем, чему равно k
      end;
    
    VK_F4: Window.Clear; // если нажали F4 => очищаем окно
    VK_F5:
      // если нажали F5 => увеличим размерность массива
      if arrayWasFilled then // если массив был заполнен, то...
      begin
        Window.Clear; // очищаем окно
        n := n + 1; // увеличиваем число строк и столбцов на 1
        if (n > nMax) then
        begin
          SetLength(mas1, n); // выделяем память под строки массива mas1 (так как n изменилось)
          SetLength(mas1[n - 1], n); // выделяем память для столбца последней (добавленной) строки
          for i := 0 to n - 1 do
            mas1[n - 1, i] := trunc(1/(i+j)); // заполняем добавленную строку случайными значениями из промежутка [-9, 9]
          
          for i := 0 to n - 1 do // для каждой строки...
          begin
            SetLength(mas1[i], n); // выделяем память под столбцы
            mas1[i, n - 1] := trunc(1/(i+j)); // заполняем строки с добавленным столбцом случайными значениями из промежутка [-9, 9]
          end;
          nMax := n;
        end;
        kWasCalculated := false; // k теперь новое, т.к изменился массив => она теперь не посчитана 
        fWasCalculated := false; // f теперь новое, т.к изменился массив => она теперь не посчитана
        main; // снова выводим "главное меню" (т.к. очищали графическое окно)
        TextOut(100, Window.Height - 100, 'Размерность массива была увеличина (n = ' + n.ToString() + ').'); // снизу пишем, чему равна новая размерность массива
      end;
    VK_F6:
      // если нажали F6 => уменьшим размерность массива
      if arrayWasFilled then // если массив был заполнен, то...
      begin
        Window.Clear; // очищаем окно
        if (n > 1) then
        begin
          n := n - 1; // увеличиваем число строк и столбцов на 1
          kWasCalculated := false; // k теперь новое, т.к изменился массив => она теперь не посчитана 
          fWasCalculated := false; // f теперь новое, т.к изменился массив => она теперь не посчитана
          main; // снова выводим "главное меню" (т.к. очищали графическое окно)
          TextOut(100, Window.Height - 100, 'Размерность массива была уменьшена (n = ' + n.ToString() + ').'); // снизу пишем, чему равна новая размерность массива
        end
        else
          begin
            main;
            TextOut(100, Window.Height - 100, 'Невозможно уменьшит размерность массива (n = 1).'); 
          end;
      end;
    VK_Enter : main; // если нажали Enter => переходим к "главному меню"
  end;
end;
 
begin
  arrayWasFilled := false; // то есть массив ещё не был заполнен
  TextOut (100,10,'Введите размерность массива:');
  readln(n);  
  nMax := n;  
  main; // выводим "главное меню"
  // Привязка обработчиков к событиям
  OnKeyDown := KeyPress;
end.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2013, 02:32
Ответы с готовыми решениями:

Исправить ошибки в коде
Народ исправте ошыбку program tramvay; var n:integer; begin write('ДАНЫЕ: '); read(n); case...

Исправить ошибки в коде
Всем привет! Спасибо что открыли эту тему! Мой друг уже несколько дней бьётся над этой программой!...

Исправить ошибки в коде
Старая программа, помогите исправить ошибки или подскажите, какая программа поддерживает такой...

Исправить ошибки в коде.
Пожалуйста помогите исправить ошибки. 1 Параметр цикла for в PascalABC.NET должен описываться в...

Сортировка - исправить ошибки в коде
Const x:arrayof integer=(-1,2,4,-8,1,3,5,13,-4,7); Var i,s,k:integer; Begin for k:=5 to 8...

3
Ragnazar
37 / 37 / 13
Регистрация: 09.03.2013
Сообщений: 114
Записей в блоге: 2
22.03.2013, 07:27 2
Pascal
1
Writeln('Намного читабельнее было если бы вы занесли код в специально поле подобное этому')
0
Puporev
Модератор
57870 / 44077 / 30442
Регистрация: 18.05.2008
Сообщений: 105,463
22.03.2013, 11:55 3
Pascal
1
mas1[i, j] := trunc(1/(i+j)); // заполняем массив mas1
при i=0 и j=0 деление на 0
0
Usya100
1 / 1 / 0
Регистрация: 04.03.2012
Сообщений: 26
22.03.2013, 12:19  [ТС] 4
я уже разобралась. но спасибо, что ответили. и да, из-за этого и глючит программу
1
22.03.2013, 12:19
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2013, 12:19

Хеширование, исправить ошибки в коде
Ошибка 39 строка link не объявлен в типе node Program Hash; {объявляем новый тип данных} type...

Найти и исправить ошибки в коде
program ciklicheskie; var n1, n2, nom :integer; u1, u2, u3 : boolean; k1, k2, k3, k4, x,...

Рандомное заполнение массива: найти и исправить ошибки в коде
Доброго времени суток! Решил поэкспериментировать с рандомным заполнением массива. Всё, вроде,...


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

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

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