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

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

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

 
 Ответить  Открыть новую тему 
> Двухмерный символьный массив. Вывод различающихся столбцов.
сообщение
Сообщение #1


голодный(
*

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

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


Здравствуйте, помогите пожалуйста с программой.
----------------------------------------------------------------
Задача:
Напечатать последовательно все различающиеся между собой столбцы символьной матрицы.
Мое решение:

program simv_massive;
uses crt;
const str=30;
stp=40;
type MyArr=array[1..str,1..stp] of char;
MyArrSp=array[1..str] of char;
var mas:MyArr;
x:MyArrSp;
i,j,k,n,m:byte;
num:integer;

procedure Matr_In(var mas1:MyArr; n1,m1:byte);
var
i,j:byte;
begin
for i:=1 to n1 do
begin
for j:=1 to m1 do
read(mas1[i,j]);
readln;
end;
end;

procedure Matr_Out(var mas2:MyArr; n2,m2:byte);
var
i,j:byte;
begin
for i:=1 to n2 do
begin
for j:=1 to m2 do
write(mas2[i,j]:5);
writeln;
end;
end;

begin
clrscr;
Write('Введите количество строк:');
Readln(n);
Write('Введите количество столбцов:');
Readln(m);
Writeln('Заполните массив');
Matr_In(mas,n,m);
Writeln('Вы ввели массив');
Matr_Out(mas,n,m);

for j:=1 to m do
begin
num:=0;
for i:=1 to n do
if mas[i,j]=x[i] then
num:=num+1;

if num<>n then
for i:=1 to n do
writeln(mas[i,j]);

for i:=1 to n do
x[i]:=mas[i,j];
end;
writeln;
readkey
end.


Начну сначала, подскажите вывести столбцы последовательно это так
Цитата
2 5 5
2 5 6
2 5 8

или можно и так
Цитата
2
2
2

5
5
5
...

моя программа естественно выводит во втором варианте...
-------------------------------------
дальше, у меня она не выводит одинаковые столбцы если только одинаковые столбцы идут друг за другом, подскажите пожалуйста как сделать чтобы работала полноценно.
буду очень благодарен smile.gif
-------------------------------------
приветствуется критика по поводу процедур ввода вывода массива
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

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


надо проверить элементы столбца с элементами всех других столбцов.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

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


uses crt;
const str=10;
stp=10;

type
MyArrSp = array[ 1..str] of char;
MyArr = array [1..stp] of MyArrSp;

var mas : MyArr;
x : MyArrSp;
i, j, k, n, m : byte;
num:integer;

procedure Matr_In(var mas1:MyArr; n1,m1:byte);
var
i,j:byte;
begin
for i := 1 to n1 do
begin
for j := 1 to m1 do
read (mas1 [i, j] );
end;
end;

procedure Matr_Out(var mas2:MyArr; n2,m2:byte);
var
i,j:byte;
begin
for i:=1 to n2 do
begin
for j:=1 to m2 do
write(mas2[i,j]:5);
writeln;
end;
end;

procedure find(var MyMas : MyArr; n1, m1 : byte);
var
i, j, k : byte;
flag : boolean;
mn : set of byte;
begin
mn := [];
for i := 1 to m do begin

for j := i+1 to m do begin
flag := true;
for k := 1 to n do
if (MyMas[k, i] <> MyMas[k, j]) then flag := false;
if flag then mn := mn + [i];
end;
end;
for i := 1 to n do begin
for j := 1 to m do
if not (j in mn) then
write( MyMas[i,j]:5);
writeln;
end;
end;

begin
clrscr;
Write('Введите количество строк:');
Readln(n);
Write('Введите количество столбцов:');
Readln(m);
Writeln('Заполните массив');
Matr_In(mas,n,m);
Writeln('Вы ввели массив');
Matr_Out(mas,n,m);
writeln;
find(mas, n, m);

readkey
end.

Проверяй


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


голодный(
*

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

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


Client
Большое спасибо за помощь, сейчас постараюсь разобраться...
Вы множества да использовали? Я тип множества еще не знаю, сейчас буду "узнавать", или может можно как-то без них справиться?
------------------------------
По поводу ввода массива, мне нельзя его вводить в одну строчку или по одному символу в каждой строке, с числовым массивом никаких проблем, а вот в символьном проблема! Есть у кого идеи?
------------------------------
Ну и еще можно глупый вопрос, просто интересно уже не первый раз встречаю в других программах идентификатор (flag) почему именно flag ? Есть этому объяснения?
Если глупость спрашиваю не пинайте smile.gif
Буду благодарен за помощь) smile.gif

Сообщение отредактировано: Sum42 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Sum42 @ 19.10.2010 20:33) *
Я тип множества еще не знаю, сейчас буду "узнавать", или может можно как-то без них справиться?
------------------------------
По поводу ввода массива, мне нельзя его вводить в одну строчку или по одному символу в каждой строке, с числовым массивом никаких проблем, а вот в символьном проблема! Есть у кого идеи?
------------------------------
Ну и еще можно глупый вопрос, просто интересно уже не первый раз встречаю в других программах идентификатор (flag) почему именно flag ? Есть этому объяснения?
Если глупость спрашиваю не пинайте smile.gif

Конечно, можно. Я бы сказал, даже нужно. Вообще не понимаю, зачем усложнять (и ограничивать) простые вещи..
------------------------------
А зачем вообще его вводить? В условии это не оговорено. Сделай ввод случайным процессом.
------------------------------
Совсем не глупость, наоборот - проявление здорового интереса в к вопросу (что так нечасто бывает..) Поднять флажок, опустить флажок, выставить флаг, убрать флаг - это все действия, которые моделируют реальную отметку, например, на карте (в генеральном штабе)), на почтовом ящике (в России не принято, а в остальных странах - сплошь и рядом: Прикрепленное изображение - почтальон кладет конверт и поднимает флаг (картинка отсюда) ). Мой массив f - тоже сокращение от этого слова. В данном слуяае флаг означает, что столбец с этим номером выводить НАДО. Сначала я поднимаю все флаги (f[i]:=true), а потом сбрасываю их по мере обработки.

Вот так будет малька попроще, думаю:
const
m=10; // row length, or number of columns
n=3; // number of rows, or column length

var
a: array[1..n,1..m]of char;
f: array[1..m]of boolean;
i,j,k: integer;

begin
for i:=1 to n do for j:=1 to m do a[i,j]:=Chr(Random(3)+65);
for i:=1 to m do f[i]:=true;
WriteLn('initial array:');
for i:=1 to n do begin
for j:=1 to m do Write(a[i,j]:2);
WriteLn
end;
for i:=1 to m do if f[j] then
for j:=i+1 to m do if f[j] then begin
k:=1;
while (a[k,i]=a[k,j]) and (k<n) do Inc(k);
f[j]:=(k<n) or (a[k,i]<>a[k,j]);
f[i]:=f[i] and f[j] { < == убрать эту строку, чтобы выводить первую копию }
end;
WriteLn('developed array:');
for i:=1 to n do begin
for j:=1 to m do if f[j] then Write(a[i,j]:2);
WriteLn
end;
ReadLn
end.

P.S.
Прогнал прогу Client'а и подумал, что кто-то из нас неверно трактует условие. Клиент, похоже, выводит хотя бы один из повторяющихся столбцов. А я вообще не вывожу столбец, если у него есть дубль. sum42, пожалуйста, уточни условие.

Кстати, мое решение легко модифицировать, чтоб оно выдавало хотя бы одну копию (выбросить дубли, оригиналы оставить). Достаточно убрать одну строку (я пометил в коде).

P.P.S.
При всем моем уважении, просьба к тебе:
- старайся более аккуратно форматировать коды для новичков - пусть привыкают (да и ты заодно));
- не надо подавать новичкам дурной пример постоянного сования юнита CRT где ни попадя только для того, чтоб сделать задержку (а если он уже есть в проге, лучше выкинуть на фиг cwm8.gif )


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


Цитата(Lapp @ 20.10.2010 4:26) *

- не надо подавать новичкам дурной пример постоянного сования юнита CRT где ни попадя только для того, чтоб сделать задержку (а если он уже есть в проге, лучше выкинуть на фиг cwm8.gif )

имхо, он засунут ради очистки экрана.


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

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


Цитата
Прогнал прогу Client'а и подумал, что кто-то из нас неверно трактует условие. Клиент, похоже, выводит хотя бы один из повторяющихся столбцов. А я вообще не вывожу столбец, если у него есть дубль. sum42, пожалуйста, уточни условие.

Кстати, мое решение легко модифицировать, чтоб оно выдавало хотя бы одну копию (выбросить дубли, оригиналы оставить). Достаточно убрать одну строку (я пометил в коде).
а мне надо чуть меньше действий smile.gif
if flag then mn := mn + [i];
тут добавить еще и [j] в множество.
И еще. Я лишь добавил процедуру и убрал немного кода. Так что почти все тут от автора осталось smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(мисс_граффити @ 20.10.2010 9:22) *
имхо, он засунут ради очистки экрана.
... что само по себе есть неправильное и вредное действие..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


голодный(
*

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

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


Lapp
Большое спасибо за помощь, сейчас буду разбираться.
Цитата(Lapp)
А зачем вообще его вводить? В условии это не оговорено. Сделай ввод случайным процессом.

Мне с именно клавиатуры ввести нужно.
Цитата(Lapp)
Прогнал прогу Client'а и подумал, что кто-то из нас неверно трактует условие. Клиент, похоже, выводит хотя бы один из повторяющихся столбцов. А я вообще не вывожу столбец, если у него есть дубль. sum42, пожалуйста, уточни условие.

один раз выводит надо, последующие копии (если будут) нет... smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


голодный(
*

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

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


Lapp
Разбираю ваш код
Вроде где-то не совсем правильно(выводит одинаковые столбцы)
Прикрепленное изображение
думаю как поправить
------------------------------------------------
добавлено позже
кажется нашел ошибку

for i:=1 to m do if f[j] then
for j:=i+1 to m do if f[j] then begin
k:=1;
while (a[k,i]=a[k,j]) and (k<n) do Inc(k);
f[j]:=(k<n) or (a[k,i]<>a[k,j]);
f[i]:=f[i] and f[j] { < == убрать эту строку, чтобы выводить первую копию }
end;


в первой строчке f[i] а не f[j]??
поправьте если что...
------------------------------------------------------
продолжаю разбираться дальше... wacko.gif

Сообщение отредактировано: Sum42 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

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


for i:=1 to m do if f[ i ] then
попробуй так

Сообщение отредактировано: Client -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Sum42 @ 20.10.2010 21:22) *
в первой строчке f[i] а не f[j]?
Да, конечно )). Извиняюсь..


Добавлено через 4 мин.
sum42, а как насчет уточнения условия? Вопрос пропущен мимо ушей? Смотри, твои следующие могут пойти тем же путем, диалог есть диалог..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


голодный(
*

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

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


Цитата(Lapp)
sum42, а как насчет уточнения условия? Вопрос пропущен мимо ушей? Смотри, твои следующие могут пойти тем же путем, диалог есть диалог..

ну я вроде ответил выше
Цитата
один раз выводит надо, последующие копии (если будут) нет...


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Sum42 @ 21.10.2010 19:49) *
ну я вроде ответил выше
А, понятно, извини. Потерянный Ь сработал - фразу я у не понял с первого прочтения, вот и результат.. На русский все же тоже надо обращать внимание. Не надо заставлять собеседников гадать по контексту, что ты хотел сказать.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 18.04.2024 22:16
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name