Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 07.12.2021
Сообщений: 6

Не работает программа после создания процедуры ввода и вывода двумерного массива

07.12.2021, 12:14. Показов 609. Ответов 7

Студворк — интернет-сервис помощи студентам
Добрый день!
я впервые на форуме. Учусь программированию. Начал с изучения основ Делфи.
Решал задачу со следующим условием в среде Lasarus :

Пользователь вводит N (N<20) пар целых чисел, считаем что это пары координат
отрезков на прямой,сохраните их в двумерный массив.
Напишите подпрограмму, которая определит - есть ли у них общее пересечение,
и если есть - вычислит координаты отрезка-пересечения.

В таком виде код работает:

Delphi
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
const n = 2;
Type dublmass = array[1..n,1..2] of integer;
var
a: dublmass;
i,j, start, finish: integer;
f: boolean;
function Crest(var start, finish: integer; var a: dublmass; var f: boolean):boolean;
var i,j: integer;
 begin
begin
  writeln('chislo:');
  for i:= 1 to n do
    for j:= 1 to 2 do
    begin
      readln(a[i,j]);
    end;
  writeln('massiv:');
  for i:= 1 to n do
  begin
    writeln();
    for j:= 1 to 2 do
      write(a[i,j]:4);
    end;
  start:= a[i,1];
  finish:= a[i,2];
  writeln();
  writeln('segment:');
  for i:= 2 to n do
  begin
    if a[i,1] > start then
      start:= a[i,1];
    if a[i,2] < finish then
       finish:= a[i,2];
  end;
  f:= true;
 
  if (start > a[i,2]) or  (finish < a[i,1]) then
    f:= false;
  writeln();
end;
 
begin
   Crest(start, finish,a,f);
   if f then
     write(' Segment of the intersection is: ', start,', ',finish)
   else
     write('No all segments intersect');
    readln();
end.
Создал процедуры ввода и вывода массива и код перестал правильно работать.
Обнуляются данные перед передачей из функции в программу и условие не выполняется:

Delphi
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
Type dublmass = array[1..2,1..2] of integer;
var
a: dublmass;
i,j,n,m,start, finish: integer;
f: boolean;
procedure vvod(var n,m:integer; var a:dublmass); //процедура ввода
var i,j:integer;
begin
  writeln('n=');
  readln(n); //кол-во столбцов матрицы
  writeln('m=');
  readln(m); //кол-во строк матрицы
  for i:=1 to n do
    for j:=1 to m do
      begin
       write('el[',i,',',j,']=');
       readln(a[i,j]);
      end;
  writeln;
end;
procedure vivod(n,m:integer; a:dublmass); //процедура вывода
var i,j:integer;
begin
  for i:=1 to n do  begin
    for j:=1 to m do
      write(a[i,j]:4);
    writeln;
  end;
end;
function Crest(var start, finish: integer; var a: dublmass; var f: boolean):boolean;
var i,j,n: integer;
begin
  vvod(n,m,a);
  vivod (n,m,a);
 
  start:= a[i,1];
  finish:= a[i,2];
  writeln();
  writeln('segment:');
  for i:= 2 to n do
  begin
    if a[i,1] > start then
      start:= a[i,1];
    if a[i,2] < finish then
       finish:= a[i,2];
  end;
  f:= true;
     if (start > a[i,2]) or  (finish < a[i,1]) then
        f:= false;
  writeln();
end;
 
begin
   Crest(start, finish,a,f);
   if f then
     write(' Segment of the intersection is: ', start,', ',finish)
   else
     write('No all segments intersect');
    readln();
end.
Подскажите, пожалуйста, что делаю не так?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.12.2021, 12:14
Ответы с готовыми решениями:

Оформить программу с помощью процедуры ввода массива и процедуры вывода массива на экран.
Program Primer1; uses crt; var a: array of integer; i: integer; Begin clrscr; for i:=1 to 5 do begin write('a=');...

Функции ввода/вывода двумерного массива - Тип элементов массива неполный
Доброго времени суток! // Автоматический ввод двумерного массива void Gets2ArrayRand(int** A, int M, int N) { int i,j; ...

Составить программу ввода и вывода двумерного массива
Составить программу ввода и вывода двумерного массива 2 4 5 7 А= 3 1 0 9 2 5 7 8

7
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
07.12.2021, 12:34
Цитата Сообщение от NikolayG36 Посмотреть сообщение
Подскажите, пожалуйста, что делаю не так?
Для начала скажите, чему равен i в процедуре Crest в строках 36,37?
И достаточно странно использовать константы в качестве размерности массива, а границы задавать переменными.
Т.е., у вас количество строк и стоблюцов - 2, а вы дополнительно запрашиваете пользователя это количество и в дальнейшем его используете.
Если пользователь введет что-то большее 2 (строки 10, 12 во втором примере), что получится?
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
07.12.2021, 12:37
{del}
0
0 / 0 / 0
Регистрация: 07.12.2021
Сообщений: 6
07.12.2021, 20:27  [ТС]
I - счетчик строк, j - столбцов

константу я ввел для отладки, что бы было 2 столбца и две строки, для лучшего понимания,
чтобы много не вводить отрезков.

первый вариант программы дает правильные результаты.
у меня вопрос был: почему если я ввод массива вывожу в отдельную процедуру - у меня все ломается .
возможно я изначально что то не так сделал в функции?

Добавлено через 2 минуты
Возможно я в функции не ввел result?

Добавлено через 10 минут
Вот вариант который работает у меня:

Delphi
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
program project1;
const n = 2;
Type dublmass = array[1..n,1..2] of integer;
var
a: dublmass;
i,j, start, finish: integer;
f: boolean;
function Crest(var start, finish: integer; var a: dublmass; var f: boolean):boolean;
var i,j: integer;
begin
  writeln('chislo:');
  for i:= 1 to n do
    for j:= 1 to 2 do
    begin
      readln(a[i,j]);
    end;
  writeln('massiv:');
  for i:= 1 to n do
  begin
    writeln();
    for j:= 1 to 2 do
      write(a[i,j]:4);
    end;
  start:= a[i,1];
  finish:= a[i,2];
  writeln();
  writeln('segment:');
  for i:= 1 to n do
  begin
    if a[i,1] > start then
      start:= a[i,1];
    if a[i,2] < finish then
       finish:= a[i,2];
  end;
  f:= true;
 
  if (start > a[i,2]) or  (finish < a[i,1]) then
    f:= false;
  writeln();
end;
 
begin
   Crest(start, finish,a,f);
   if f then
     write(' Segment of the intersection is: ', start,', ',finish)
   else
     write('No intersection');
    readln();
end
.

Добавлено через 22 минуты
Мои мысли по поводу этого вопроса:
функция заканчивается определением boolean : или true - если найдено, или false если не найдено , а найденные значения start и finish тоже возвращаются в программу .

возможно здесь причина: Когда я вывожу из функции процедуру ввода, у меня значения старт и финиш правильно не заполняются - и получается все время функция выдает false

Иными словами: когда я ввод и поиск делаю в функции она как то нормально взаимодействуе с программой и по ссылке все изменения передает, если я ввод вывожу в процедуру - то эти ссылки теряются где то).
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
08.12.2021, 00:47
Цитата Сообщение от NikolayG36 Посмотреть сообщение
I - счетчик строк, j - столбцов
Привожу отрывок из вашего кода и повторяю вопрос - чему равен i в 7 и 8 строке?
Delphi
1
2
3
4
5
6
7
8
function Crest(var start, finish: integer; var a: dublmass; var f: boolean):boolean;
var i,j,n: integer;
begin
  vvod(n,m,a);
  vivod (n,m,a);
 
  start:= a[i,1];
  finish:= a[i,2];
1
0 / 0 / 0
Регистрация: 07.12.2021
Сообщений: 6
08.12.2021, 10:23  [ТС]
Добрый день! , i в этом блоке буде равна последнему значению которое получает в цикле ввода отрезков.
Спасибо, что обратили на это мое внимание.

Вот рабочий код с процедурой:

{Пользователь вводит N (N<20) пар целых чисел, считаем что это пары координат
отрезков на прямой,сохраните их в двумерный массив.
Напишите подпрограмму, которая определит - есть ли у них общее пересечение,
и если есть - вычислит координаты отрезка-пересечения.}
program project1;

Delphi
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
Type dublmass = array[1..10,1..2] of integer;
 
var
a: dublmass;
start, finish: integer;
f: boolean;
procedure vvod(var n,  start, finish:integer; var a:dublmass); //процедура ввода
var i,j:integer;
begin
  writeln('n=');
  readln(n); //кол-во отрезков ( строк матрицы)
  for i:=1 to n do
    for j:=1 to 2 do
      begin
       write('el[',i,',',j,']=');
       readln(a[i,j]);
      end;
  start:= a[i,1];  //начало отрезка пересечения
  finish:= a[i,2]; //конец отрезка пересечения
  writeln;
end;
procedure vivod(n:integer; a:dublmass); //процедура вывода
var i,j:integer;
begin
  for i:=1 to n do  begin
    for j:=1 to 2 do
      write(a[i,j]:4);
    writeln;
  end;
end;
function Crest(var start, finish: integer; var a: dublmass; var f: boolean):boolean;
var i,j,n: integer;             //  функция поиска пересечения отрезков
begin
  vvod(n,start, finish, a);
  writeln();
  writeln('segment:');
  for i:= 1 to n do
  begin
    if a[i,1] > start then
      start:= a[i,1];
    if a[i,2] < finish then
       finish:= a[i,2];
  end;
  f:= true;
     if (start > a[i,2]) or  (finish < a[i,1]) then
        f:= false;
  writeln();
  result:= f;
end;
 
begin
   Crest(start, finish,a,f);
   if f then
     write(' Segment of the intersection is: ', start,', ',finish)
   else
     write('No all segments intersect');
    readln();
end.
Еще раз спасибо!
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
08.12.2021, 11:41
Цитата Сообщение от NikolayG36 Посмотреть сообщение
i в этом блоке буде равна последнему значению которое получает в цикле ввода отрезков.
В этом блоке i равна произвольному мусору. Потому что i только объявлена, но ничему не присвоена. А это значит, что обращение к a[i,1],a[i,2] даст непредсказуемый результат.
0
0 / 0 / 0
Регистрация: 07.12.2021
Сообщений: 6
08.12.2021, 14:19  [ТС]
Вышележащий код, в моем представлении, дает ожидаемый результат.
При отладке все значения записываются корректно:
Например:
при вводе n=2,
и координат двух отрезков: 2, 4 ; 3, 5.

в i записывается значения полученные при работе этого цикла:

Delphi
1
2
3
4
5
6
7
readln(n); //кол-во строк матрицы
  for i:=1 to n do     <-------------- записывает индексы  первой строки в I ( сначала 1, потом 1, потом 2 , потом 2)
    for j:=1 to 2 do
      begin
       write('el[',i,',',j,']=');
       readln(a[i,j]);
      end;
ЕСЛИ МОЖНО поподробнее, что не так сделано и как это исправить.
(напомню: я только учусь)
Спасибо большое
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.12.2021, 14:19
Помогаю со студенческими работами здесь

Составить программу ввода и вывода двумерного массива
Составить программу ввода и вывода двумерного массива а, с размерностью 10х15

Как описать функции ввода и вывода двумерного массива?
Не могу разобраться с описанием функций ввода и вывода двумерного массива, прошу помочь пожалуйста.

Нужен пример процедуры ввода и вывода одномерного массива
Напишите обыкновенный пример процедуры ввода и вывода одномерного массива!

В программе предусмотреть процедуры ввода-вывода элементов массива
В одномерном массиве из n вещественных элементов вычислить: - сумму элементов массива с нечетными номерами; - сумму элементов массива,...

Блок схема для процедуры ввода вывода чисел двухменого массива
uses crt; const nmax=20; type Vmatr=array of real;//вещественные Cmatr=array of integer;//целые procedure VvodV(var...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru