![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
volvo |
![]()
Сообщение
#21
|
Гость ![]() |
Дож
Во-первых, речь не об этом, а о том, что если значение одной переменной известно (= 0), то можно обойтись без буферной переменной... А во-вторых, я уже выкладывал результаты теста, где сравнивал 3 способа обмена... И результат - далеко не в пользу твоего метода :no: |
Serega18 |
![]()
Сообщение
#22
|
Новичок ![]() Группа: Пользователи Сообщений: 26 Пол: Мужской Репутация: ![]() ![]() ![]() |
Решил собрать все подзадачи в одну и используя текстовый файлы составить задачу.Но так как с текстовыми файлами я некогда не работал ни чего не вышло.
Поставить на первое место столбец с наименьшим количеством нулевых элементов,поставив все нули в конец этого столбца. Исходный код Program St; Uses crt; Type Matrix=array[1..4,1..5] of real; var a:Matrix; i,j,indx:integer; f1,f2:text; Procedure chislo(var A:matrix); var i,j,ch:integer; Begin ch:=0; For i:=1 to 4 do Begin For j:=1 to 5 do Begin IF A[i,j]=0 Then ch:=ch+1; end; end; end; Function min_nulls(var a:matrix):integer; var i,j:integer; min,indx,count:integer; Begin min:=5; for j:=1 to 5 do Begin count:=0; for i:=1 to 4 do if A[i,j]=0 then inc(count); If min>count then Begin min:=count; indx:=j; end; end; min_nulls:=indx; end; Procedure resort(var A:matrix;indx:integer); Var i:integer; T:real; Begin If indx<>1 then for i:=1 to 4 do Begin T:=A[i,1]; A[i,1]:=A[i,indx]; A[i,indx]:=T; end; end; Procedure ST(var A:matrix;indx:integer); Var i,j,n:integer; Begin n:=0; for i:=1 to 4 do Begin IF A[i,indx]=0 then Begin A[i,indx]:=A[5-n,indx]; A[5-n,indx]:=0; n:=n+1; end; end; end; Begin assign(f1,'isdan.pas'); assign(f2,'vdan.pas'); reset(f1); rewrite(f2); Begin for i:=1 to 4 do Begin For j:=1 to 5 do read(f1,A[i,j]); end; writeln(f2); end; Begin clrscr; chislo(A); min_nulls(A); resort(A,indx); St(A,indx); readln; end; end. |
volvo |
![]()
Сообщение
#23
|
Гость ![]() |
Опять велосипед изобретаем? Ну-ну... Что за смысл вкладывался в ПРОЦЕДУРУ:
Procedure chislo(var A:matrix); Я не вижу в ней смысла. Если можно, с комментариями !!! |
Serega18 |
![]()
Сообщение
#24
|
Новичок ![]() Группа: Пользователи Сообщений: 26 Пол: Мужской Репутация: ![]() ![]() ![]() |
Найти нул элементы в каждом столбце
Может так Код Procedure chislo(var A:matrix); var i,ch:integer; Begin ch:=0; For i:=1 to 4 do Begin for j:=1 to 5 do Begin IF A[i,j]=0 Then ch[j]:=ch[j]+1; end; end; end; |
volvo |
![]()
Сообщение
#25
|
Гость ![]() |
Прочти теорию сначала, а потом уже начинай программировать, хорошо? Ты вообще представляешь, что ты от компилятора просишь? Обращаться к Integer как к массиву целых - это невозможно ... Кроме того, ты должен получать результат подсчета, что в случае с процедурой возможно только через Var-параметры, а Var-параметр у тебя только один - сама матрица.
Я кстати не зря попросил "с комментариями"... Когда комментируешь чего ты ХОЧЕШЬ добиться и пишешь код - ошибки видны как на ладони. Но ты, я вижу это просто проигнорировал... So Am I... :yes: |
Дож |
![]()
Сообщение
#26
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 179 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата(volvo @ 16.05.05 20:14) Во-первых, речь не об этом, а о том, что если значение одной переменной известно (= 0), то можно обойтись без буферной переменной... Когда значение одной переменной известно, то все естественно проще... Цитата(volvo @ 16.05.05 20:14) А во-вторых, я уже выкладывал результаты теста, где сравнивал 3 способа обмена... И результат - далеко не в пользу твоего метода Я и не говорю, что это лучший метод... :no: Я всегда пользуюсь буфферной переменной. -------------------- Доброго времени суток.
:nnn: |
Serega18 |
![]()
Сообщение
#27
|
Новичок ![]() Группа: Пользователи Сообщений: 26 Пол: Мужской Репутация: ![]() ![]() ![]() |
Присваиваю ch тип odn(одномерный массив),А-matrix
проц-задаю матрицу А и одномерный массив ch затем беру начальное число нул элементов,тоесть ноль(ch:=0),дальше условие(если элемент матрицы равен нулю,то число нул элементов увеличивается на один). Код Program St; Uses crt; Type Matrix=array[1..4,1..5] of real; Odn=array[1..5] of real; var a:Matrix; ch:odn; i,j,indx:integer; f1,f2:text; Procedure chislo(var A:matrix;ch:odn); var i,j,:integer; Begin ch:=0; For i:=1 to 4 do Begin For j:=1 to 5 do Begin IF A[i,j]=0 Then ch[j]:=ch[j]+1; end; end; |
VDmV |
![]()
Сообщение
#28
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
Извиняюсь что вклиниваюсь, но я не могу на енто смотреть меня переполняют эмоции. Ещё раз извиняюсь.
Цитата Найти нул элементы в каждом столбце Может так Нет не так. 1) ch:integer; //Ладно, а вот это что ch[j]:=ch[j]+1. Ты бы попробовал этот код в деле. У тебя ошибка совместимомсти типов. И как сказал volvo - в этой процедуре нет смысла всё равно. 2) Я так понял тебе нужно определить координаты всех нулей и затолкать их массив. Проще простого: Код procedure Chislo(var a:matrix; var b:array [1..5] of integer {этот массив будет хранить номера строк, которые на пресечении с i столбцом значение =0.}); var i,j:integer; begin for i:=1 to 5 do for j:=1 to 4 do if a[j,i]=0 then b[i]:=j; end; Вот и всё. Зачем тебе это надо - это другой вопрос. Добавлено позже: Похоже последние 4 поста были посланы почти одновременно ![]() Сообщение отредактировано: VDmV - 28.05.2005 17:37 |
volvo |
![]()
Сообщение
#29
|
Гость ![]() |
VDmV, а ты правила читал?
Цитата 6. Проверяйте программы перед тем, как запостить их!!! В Турбо-Паскале твой фрагмент кода не откомпилируется. Внимательнее с этим... Это первое. А второе - нужно не координаты нулей, а количество их в каждом столбце... Чтобы потом найти максимум... чтобы потом перебросить столбец с максимальным количеством нулей на последнюю позицию... И т.д. и т.п. Вместо того, чтобы ВНИМАТЕЛЬНО прочесть пост №4, и ссылку которая там находится. С учетом той информации программа уложится в несколько строк... Изобретаем дальше... |
VDmV |
![]()
Сообщение
#30
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата В Турбо-Паскале твой фрагмент кода не откомпилируется. Внимательнее с этим... Это первое. Я понял. Возможно и не откомпилируется, но я хотел высказать хотябы идею. А количество нулей найти ещё проще: Код type mass= b:array[1..5] of integer; procedure Chislo(var a:matrix; var b:mass); var i,j:integer; begin for i:=1 to 5 do begin b[i]:=0; for j:=1 to 4 do if a[j,i]=0 then b[i]:=b[i]+1; end; end; Это должно откомпилироваться ![]() |
Serega18 |
![]()
Сообщение
#31
|
Новичок ![]() Группа: Пользователи Сообщений: 26 Пол: Мужской Репутация: ![]() ![]() ![]() |
Код Begin assign(f1,'isdan.pas'); assign(f2,'vdan.pas'); reset(f1); rewrite(f2); Begin for i:=1 to 4 do Begin For j:=1 to 5 do read(f1,A[i,j]); end; writeln(f2); end; Такой вот вопрос я ввел матрицу А в f1 read(f1,A[i,j]); ,а выводить в f2 мне тоже матрицу А(но ведь она изменена) как мне поступить |
volvo |
![]()
Сообщение
#32
|
Гость ![]() |
Цитата(Serega18 @ 28.05.05 22:22) я ввел матрицу А в f1 read(f1,A[i,j]); ,а выводить в f2 мне тоже матрицу А(но ведь она изменена) как мне поступить Ну так куда же деваться? Если нужно сохранять измененную матрицу - значит пиши измененные значения в F2, если тебе еще раз понадобится исходная матрица A, ты же ее всегда сможешь считать из F1, не так ли? |
Serega18 |
![]()
Сообщение
#33
|
Новичок ![]() Группа: Пользователи Сообщений: 26 Пол: Мужской Репутация: ![]() ![]() ![]() |
Сделал так:Сделал еще одну процедуру в которой из элементов измененной матрицы А формирую матрицу В и потом в F2 вывожу уже матрицу В.Так я могу сделать?
Исходный код Program S4_3_3; Uses crt; Type Matrix=array[1..4,1..5] of real; Odn=array[1..5] of real;var A,B:matrix; ch:odn; i,j,indx:integer; f1,f2:text; Procedure chislo(var A:matrix;ch:odn); var i,j:integer; Begin ch[j]:=0; For i:=1 to 4 do Begin For j:=1 to 5 do Begin IF A[i,j]=0 Then ch[j]:=ch[j]+1; end; end; end; Function min_nulls(var a:matrix):integer; var i,j:integer; min,indx,count:integer; Begin min:=5; for j:=1 to 5 do Begin count:=0; for i:=1 to 4 do if A[i,j]=0 then inc(count); If min>count then Begin min:=count; indx:=j; end; end; min_nulls:=indx; end; Procedure resort(var A:matrix;indx:integer); Var i:integer; T:real; Begin If indx<>1 then for i:=1 to 4 do Begin T:=A[i,1]; A[i,1]:=A[i,indx]; A[i,indx]:=T; end; end; Procedure ST(var A:matrix;indx:integer); Var i,j,n:integer; Begin n:=0; for i:=1 to 4 do Begin IF A[i,indx]=0 then Begin A[i,indx]:=A[5-n,indx]; A[5-n,indx]:=0; n:=n+1; end; end; end; Procedure output(A,B:matrix); Var i,j:integer; Begin for i:=1 to 4 do Begin For j:=1 to 5 do A[i,j]:=B[i,j]; end; end; Begin assign(f1,'isdan.pas'); assign(f2,'vdan.pas'); reset(f1); rewrite(f2); Begin for i:=1 to 4 do Begin For j:=1 to 5 do read(f1,A[i,j]); end; writeln(f2,B[i,j]); end; Begin clrscr; chislo(A,ch); min_nulls(A); resort(A,indx); St(A,indx); Output(A,B); readln; end; end. Сообщение отредактировано: volvo - 30.05.2005 20:48 |
volvo |
![]()
Сообщение
#34
|
Гость ![]() |
Цитата(Serega18 @ 30.05.05 16:52) Так я могу сделать? Сделать-то можешь только... Вот программа-то твоя работать если и будет, то с ошибками. Смотри: Procedure chislo(var A:matrix;ch:odn);В ней ты меняешь содержимое массива Ch, но пойми, что этих изменений ты не увидишь: чтобы их увидеть, нужно передавать массив так: Procedure chislo(var A:matrix;var ch:odn); А так как сейчас у тебя - массив не изменится... Аналогично здесь: Procedure output(A,B:matrix);Какой матрица B была до вызова Output, такой и останется (по причине, указанной выше)... |
Serega18 |
![]()
Сообщение
#35
|
Новичок ![]() Группа: Пользователи Сообщений: 26 Пол: Мужской Репутация: ![]() ![]() ![]() |
Исправил предыдущие ошибки но f2 всеравно остается пустой
|
volvo |
![]()
Сообщение
#36
|
Гость ![]() |
А файлы за тебя кто закрывать будет? Может быть ты и записал матрицу B в файл, но файл не закрыл, и данные потерялись...
|
Serega18 |
![]()
Сообщение
#37
|
Новичок ![]() Группа: Пользователи Сообщений: 26 Пол: Мужской Репутация: ![]() ![]() ![]() |
Теперь в f2 выводит просто ноль
Исходный код Program S4_3_3; Uses crt; Type Matrix=array[1..4,1..5] of real; Odn=array[1..5] of real;var A,B:matrix; ch:odn; i,j,indx:integer; f1,f2:text; Procedure chislo(var A:matrix;VAR ch:odn); var i,j:integer; Begin ch[j]:=0; For i:=1 to 4 do Begin For j:=1 to 5 do Begin IF A[i,j]=0 Then ch[j]:=ch[j]+1; end; end; end; Function min_nulls(var a:matrix):integer; var i,j:integer; min,indx,count:integer; Begin min:=5; for j:=1 to 5 do Begin count:=0; for i:=1 to 4 do if A[i,j]=0 then inc(count); If min>count then Begin min:=count; indx:=j; end; end; min_nulls:=indx; end; Procedure resort(var A:matrix;indx:integer); Var i:integer; T:real; Begin If indx<>1 then for i:=1 to 4 do Begin T:=A[i,1]; A[i,1]:=A[i,indx]; A[i,indx]:=T; end; end; Procedure ST(var A:matrix;indx:integer); Var i,j,n:integer; Begin n:=0; for i:=1 to 4 do Begin IF A[i,indx]=0 then Begin A[i,indx]:=A[5-n,indx]; A[5-n,indx]:=0; n:=n+1; end; end; end; Procedure output(Var A:matrix; var B:matrix); Var i,j:integer; Begin for i:=1 to 4 do Begin For j:=1 to 5 do A[i,j]:=B[i,j]; end; end; Begin assign(f1,'isdan.pas'); assign(f2,'vdan.pas'); reset(f1); rewrite(f2); Begin for i:=1 to 4 do Begin For j:=1 to 5 do read(f1,A[i,j]); end; writeln(f2,B[i,j]); close(f1); close(f2); end; Begin clrscr; chislo(A,ch); min_nulls(A); resort(A,indx); St(A,indx); Output(A,B); readln; end; end. |
volvo |
![]()
Сообщение
#38
|
Гость ![]() |
А вот что у меня получилось:
![]() (только учти, что в программе столбец с минимальным числом нулей НЕ просто меняется местами с первым, а столбцы СДВИГАЮТСЯ и тот, в котором меньше нулей ставится первым... При запуске программы поймешь о чем я ![]() Я же говорил, прочти 4-ый пост, и сходи по ссылке... ![]() |
Serega18 |
![]()
Сообщение
#39
|
Новичок ![]() Группа: Пользователи Сообщений: 26 Пол: Мужской Репутация: ![]() ![]() ![]() |
Это очень круто
![]() насчет столбцов понял,4 пост прочитал(по ссылке прошел). И хотелось бы узнать почему у меня не работал последний вариант ![]() |
VDmV |
![]()
Сообщение
#40
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
Мдя, решение конечно найдено, но 2Serega18. Не разбирался я почему у тебя не работает (это может быть либо по не внимательности либо по не совсем хорошему знанию паскаля).
Я вот посмотрел бегло и вот что: Цитата Procedure chislo(var A:matrix;VAR ch:odn); var i,j:integer; Begin ch[j]:=0; Посмотри переменная j - не определена, а ты её уже используешь, откуда ты знаешь что в ней хранилось до этого времени? Никогда не полагайся на то что там будет 0 или ещё что нибудь, если ты явно этого не указал. Смотри сам по коду, я уверен ты найдёшь на все свои вопросы сам ответы. |
![]() ![]() |
![]() |
Текстовая версия | 19.07.2025 16:57 |