IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

3 страниц V < 1 2 3 >  
 Ответить  Открыть новую тему 
> Перестановка столбцов
volvo
сообщение 16.05.2005 20:14
Сообщение #21


Гость






Дож
Во-первых, речь не об этом, а о том, что если значение одной переменной известно (= 0), то можно обойтись без буферной переменной...
А во-вторых, я уже выкладывал результаты теста, где сравнивал 3 способа обмена... И результат - далеко не в пользу твоего метода :no:
 К началу страницы 
+ Ответить 
Serega18
сообщение 28.05.2005 16:34
Сообщение #22


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской

Репутация: -  0  +


Решил собрать все подзадачи в одну и используя текстовый файлы составить задачу.Но так как с текстовыми файлами я некогда не работал ни чего не вышло.
Поставить на первое место столбец с наименьшим количеством нулевых элементов,поставив все нули в конец этого столбца.
Исходный код
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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.05.2005 16:46
Сообщение #23


Гость






Опять велосипед изобретаем? Ну-ну... Что за смысл вкладывался в ПРОЦЕДУРУ:
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;

Я не вижу в ней смысла. Если можно, с комментариями !!!
 К началу страницы 
+ Ответить 
Serega18
сообщение 28.05.2005 16:58
Сообщение #24


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской

Репутация: -  0  +


Найти нул элементы в каждом столбце
Может так
Код
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;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.05.2005 17:15
Сообщение #25


Гость






Прочти теорию сначала, а потом уже начинай программировать, хорошо? Ты вообще представляешь, что ты от компилятора просишь? Обращаться к Integer как к массиву целых - это невозможно ... Кроме того, ты должен получать результат подсчета, что в случае с процедурой возможно только через Var-параметры, а Var-параметр у тебя только один - сама матрица.

Я кстати не зря попросил "с комментариями"... Когда комментируешь чего ты ХОЧЕШЬ добиться и пишешь код - ошибки видны как на ладони. Но ты, я вижу это просто проигнорировал... So Am I... :yes:
 К началу страницы 
+ Ответить 
Дож
сообщение 28.05.2005 17:19
Сообщение #26


Бывалый
***

Группа: Пользователи
Сообщений: 179
Пол: Мужской

Репутация: -  1  +


Цитата(volvo @ 16.05.05 20:14)
Во-первых, речь не об этом, а о том, что если значение одной переменной известно (= 0), то можно обойтись без буферной переменной...


Когда значение одной переменной известно, то все естественно проще...

Цитата(volvo @ 16.05.05 20:14)
А во-вторых, я уже выкладывал результаты теста, где сравнивал 3 способа обмена... И результат - далеко не в пользу твоего метода


Я и не говорю, что это лучший метод... :no: Я всегда пользуюсь буфферной переменной.


--------------------
Доброго времени суток.
:nnn:
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Serega18
сообщение 28.05.2005 17:27
Сообщение #27


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской

Репутация: -  0  +


Присваиваю 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;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
VDmV
сообщение 28.05.2005 17:31
Сообщение #28





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Извиняюсь что вклиниваюсь, но я не могу на енто смотреть меня переполняют эмоции. Ещё раз извиняюсь.
Цитата
Найти нул элементы в каждом столбце
Может так

Нет не так.
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 поста были посланы почти одновременно smile.gif

Сообщение отредактировано: VDmV - 28.05.2005 17:37
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.05.2005 17:46
Сообщение #29


Гость






VDmV, а ты правила читал?
Цитата
6. Проверяйте программы перед тем, как запостить их!!!

В Турбо-Паскале твой фрагмент кода не откомпилируется. Внимательнее с этим... Это первое.

А второе - нужно не координаты нулей, а количество их в каждом столбце... Чтобы потом найти максимум... чтобы потом перебросить столбец с максимальным количеством нулей на последнюю позицию... И т.д. и т.п. Вместо того, чтобы ВНИМАТЕЛЬНО прочесть пост №4, и ссылку которая там находится. С учетом той информации программа уложится в несколько строк...

Изобретаем дальше...
 К началу страницы 
+ Ответить 
VDmV
сообщение 28.05.2005 18:06
Сообщение #30





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Цитата
В Турбо-Паскале твой фрагмент кода не откомпилируется. Внимательнее с этим... Это первое.

Я понял. Возможно и не откомпилируется, но я хотел высказать хотябы идею.
А количество нулей найти ещё проще:
Код

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;

Это должно откомпилироваться unsure.gif Давно на чистом паскале не программировал, всё приходиться на делфи.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Serega18
сообщение 28.05.2005 22:22
Сообщение #31


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской

Репутация: -  0  +


Код
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 мне тоже матрицу А(но ведь она изменена) как мне поступить
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.05.2005 23:47
Сообщение #32


Гость






Цитата(Serega18 @ 28.05.05 22:22)
я ввел матрицу А в f1 read(f1,A[i,j]); ,а выводить в f2 мне тоже матрицу А(но ведь она изменена) как мне поступить

Ну так куда же деваться? Если нужно сохранять измененную матрицу - значит пиши измененные значения в F2, если тебе еще раз понадобится исходная матрица A, ты же ее всегда сможешь считать из F1, не так ли?
 К началу страницы 
+ Ответить 
Serega18
сообщение 30.05.2005 16:52
Сообщение #33


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской

Репутация: -  0  +


Сделал так:Сделал еще одну процедуру в которой из элементов измененной матрицы А формирую матрицу В и потом в 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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 30.05.2005 17:21
Сообщение #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
сообщение 30.05.2005 17:43
Сообщение #35


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской

Репутация: -  0  +


Исправил предыдущие ошибки но f2 всеравно остается пустой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 30.05.2005 18:46
Сообщение #36


Гость






А файлы за тебя кто закрывать будет? Может быть ты и записал матрицу B в файл, но файл не закрыл, и данные потерялись...
 К началу страницы 
+ Ответить 
Serega18
сообщение 30.05.2005 20:44
Сообщение #37


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской

Репутация: -  0  +


Теперь в 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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 30.05.2005 21:27
Сообщение #38


Гость






А вот что у меня получилось: Прикрепленный файл  rows.rar ( 765 байт ) Кол-во скачиваний: 308


(только учти, что в программе столбец с минимальным числом нулей НЕ просто меняется местами с первым, а столбцы СДВИГАЮТСЯ и тот, в котором меньше нулей ставится первым... При запуске программы поймешь о чем я smile.gif )
Я же говорил, прочти 4-ый пост, и сходи по ссылке... smile.gif
 К началу страницы 
+ Ответить 
Serega18
сообщение 30.05.2005 23:21
Сообщение #39


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской

Репутация: -  0  +


Это очень круто blink.gif ,я так понял там нетипизированные,константы и еще много чего.только это не мой уровень . хотелось бы хотя бы в простом виде сделать (хоть "немного" своими руками) и немного разобраться.
насчет столбцов понял,4 пост прочитал(по ссылке прошел).
И хотелось бы узнать почему у меня не работал последний вариант sad.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
VDmV
сообщение 30.05.2005 23:28
Сообщение #40





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Мдя, решение конечно найдено, но 2Serega18. Не разбирался я почему у тебя не работает (это может быть либо по не внимательности либо по не совсем хорошему знанию паскаля).
Я вот посмотрел бегло и вот что:
Цитата

Procedure chislo(var A:matrix;VAR ch:odn);
var i,j:integer;
Begin
  ch[j]:=0;

Посмотри переменная j - не определена, а ты её уже используешь, откуда ты знаешь что в ней хранилось до этого времени? Никогда не полагайся на то что там будет 0 или ещё что нибудь, если ты явно этого не указал.
Смотри сам по коду, я уверен ты найдёшь на все свои вопросы сам ответы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

3 страниц V < 1 2 3 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 19.07.2025 16:57
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"