Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Строки в массиве двумерном

Автор: Zundell 5.02.2007 18:38

Ребят подскажите пожалуйста,вот мне нужно запонить массив (двумерный) строками(чтоб была первая строка,вторая строка,третья и т.д),после этого необходимо проверить встречается ли хотя бы в трех строках цифры и знаки сравнения.Задачу решить с использованием множеств.Беда в чем,в том что я не могу заполнить массив символами,т.е сделать строки.(я как понимаю необходимо ввести строку,затем с помощью length посчитать длинну строки и дальше посимвольно записать первый символ в a[1,j],и так далее).Проверку на вхождение символов я знаю как делать..но вот с вводом не моглибы помочь?заранее благодарен. yes2.gif

Автор: мисс_граффити 5.02.2007 20:34

1. Массив - статический? Тогда должно быть ограничение на длину строк. Ничего не оговаривается, то есть предел - 255 символов? А сколько строк - тоже не оговорено?
2. При чем здесь множества? Или их использовать только для проверки на вхождение? (То есть записать во множество цифры и знаки сравнения)?

Автор: Гость 5.02.2007 20:44

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

Const
z=10;
var
a:array[1..10,1..10] of char;
b:array[1..10] of char;
str:string[10];
i,j,n,m:integer;
P:set of char;
f1:boolean;
begin
p:=['0'..'9','<'..'>'];
writeln('vvod matricu');
writeln('vvedite kolvo strok matricu-');
readln(m);
for i:=1 to m do
for j:=1 to z do
begin
write('a[',i,',',j,']-');
readln(a[i,j]);
end;
for i:=1 to m do
begin
writeln('vvedite stroku');
readln(str);
n:=length(str);
for j:=1 to n do
b[j]:=str[j];
for j:=1 to z do
a[i,j]:=b[j];
end;
F1:=true;
if a[i,j] in p then
writeln('est') else writeln('Net');
readln;
end.





бред бредом канечна...но подругому я чет не понял как в массив строку запихнуть....И еще мне препод сказал,что лучше создать для каждой строки множество и проверять удовлетворяетли условию.И проверка должна идти вот так:
первая строка,вторая,третья
затем вторая,третья,четвертая
а потом третья,четвертая,пятая.
Спасибо заранее за помощь

Автор: Zundell 5.02.2007 21:56

Const
z=10;
var
a:array[1..10,1..100] of char;
str:string[100];
i,j,n,m:integer;
f1:boolean;
p:set of char;
begin
f1:=false;
p:=['1'..'9'];
writeln('vvedite kolvo strok');
readln(m);
for i:=1 to m do
begin
writeln('vvedite stroku ravnuju 10 simvolam');
readln(str);
n:=length(str);
for j:=1 to n do
a[i,j]:=str[j];
end;
writeln(' ');
for i:=1 to m do
begin
for j:=1 to n do
write(a[i,j],' ');
writeln;
end;
for i:=1 to 3 do
for j:=1 to n do
begin
if a[i,j] in p then
f1:=true else
f1:=false;
end;
if f1 then writeln('est') else writeln('net');
readln;
end.





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

Автор: volvo 5.02.2007 21:57

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

type
char_set = set of char;
var
arr_of_set = array[1 .. 10] of char_set;

begin
for i := 1 to 10 do begin
arr_of_set[i] := [];
write('строка №', i, ' -> '); readln(s);
for j := 1 to length(s) do include(arr_of_set[i], s[j]);
end;

{
Все, множества заполнены, теперь надо просто пройтись по ним, и подсчитать,
в скольких из множеств выполняется условие:
arr_of_set[i] * ['0' .. '9', '<', '=', '>'] <> []
}
end.


Справишься?

Автор: Zundell 5.02.2007 22:05

через if?если не трудно мог бы пожалуйста написать с коментами.И еще вопрос,как я начал делать так можно чисто теоритически сделать?

Автор: мисс_граффити 5.02.2007 23:09

Можно
Ты там с границами циклов понапутал.
Но определись, что тебе нужно - двумерный массив символов или одномерный массив множеств?

Цитата
И проверка должна идти вот так:
первая строка,вторая,третья
затем вторая,третья,четвертая
а потом третья,четвертая,пятая.

и что, все комбинации перебирать?!

Автор: Zundell 5.02.2007 23:13

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

Автор: volvo 5.02.2007 23:30

Цитата
пачму он вссе время пишет yes?если я даже и не ввожу цифры в строку и знаки сравнения
Не знаю... У меня при вводе
Цитата
vvedite kolvo strok
3
vvedite stroku ravnuju 10 simvolam
qwertyuiop
vvedite stroku ravnuju 10 simvolam
asdfghjkla
vvedite stroku ravnuju 10 simvolam
zxcvbnmzxc
выдает "net"

Автор: Zundell 5.02.2007 23:34

а вот если ввести какиенить цифры в строку,то всеравно выдает нет

Автор: volvo 5.02.2007 23:36

Потому, что ПОСЛЕДНИЙ символ, который ты проверяешь - НЕ число...

Добавлено через 56 сек.
А у тебя F1 устанавливается только по результатам последней проверки... Нехорошо...

Автор: мисс_граффити 5.02.2007 23:37

ну давай разбираться...

Const
z=10;
var
a:array[1..10,1..100] of char;
str:string[100];
i,j,n,m:integer;
f1:boolean;
p:set of char;
begin
f1:=false;
p:=['1'..'9'];
writeln('vvedite kolvo strok');
readln(m); {итак, m - это количество задействованных строк. хорошо бы проверять, что m<=10... ну ладно}
for i:=1 to m do
begin
writeln('vvedite stroku ravnuju 10 simvolam'); {в чем глубокий смысл этой просьбы? зачем выделяем 100 ячеек под строку, если ее длина равна 10?}
readln(str);
n:=length(str); {просили ввести строку длины 10, а теперь определяем ее длину. не верим пользователю?}
for j:=1 to n do
a[i,j]:=str[j];
end;
{вот в этом месте n равно длине последней строки, m равно количеству строк}
writeln(' ');
for i:=1 to m do {до m, логично}
begin
for j:=1 to n do {почему до n? а если какая-то строка короче или длиннее последней?}
write(a[i,j],' ');
writeln;
end;
for i:=1 to 3 do {откуда берется 3? это что-то новенькое...}
for j:=1 to n do {опять же - n}
begin
if a[i,j] in p then {типа f1:=a[i,j] in p? то есть только один символ тебя интересует?}
f1:=true else
f1:=false;
end;
if f1 then writeln('est') else writeln('net'); {если бы ты расставил отступы, то увидел бы, что это не в цикле... или ты и не хочешь писать для каждой строки?}
readln;
end.

Автор: Zundell 5.02.2007 23:55

Насчет 3-это типа я хочу проверять в первых трех строках).
<<{типа f1:=a[i,j] in p? то есть только один символ тебя интересует?}>>-а вот сдесь я чет не понял почему я тока один проверяю..ааа..так как я энд поставил перед <<if f1 then writeln('est') else writeln('net'); >>?а если я его не ставлю,то он выводит оч много непонятных yes и net

Добавлено через 6 мин.
аа..он проверяет поэлементно,а как сделать чтобы всю строку проверял?

Автор: мисс_граффити 6.02.2007 0:41

Ну, например, так:
изначально считаешь, что искомых символов в строке нет. (то есть f1:=false)
а потом, если попался символ из p, присваиваем true
варианты реализации:
//минимально переделанный твой

for i:=1 to m do
begin
f1:=false; {считаем, что строка без этих символов}
for j:=1 to [подумай, как определять этот индекс] do
begin
if a[i,j] in p then
f1:=true;
end;
end;


//несколько логичнее
for i:=1 to m do
begin
f1:=false; {считаем, что строка без этих символов}
for j:=1 to [подумай, как определять этот индекс] do
f1:=f1 or (a[i,j] in p) ;
end;


а по-хорошему, надо вылетать из цикла по строке, как только встретим символ - зачем нам лишние проверять?

сорри, проверить на работоспособность не могу, но вроде проблем не должно быть

Автор: Zundell 6.02.2007 1:10

Все..огромное спасибо..разобрался)все работает.Volvo,а ты бы не мог пояснить про массив множест плиз.Оч хочу разобраться

Автор: volvo 6.02.2007 1:25

Я же написал самое начало программы...

Ну, хорошо, вот программа полностью:

type
char_set = set of char;
var
arr_of_set: array[1 .. 10] of char_set;
s: string;
i, j, n, count: integer;

begin
write('Число строк -> '); readln(n);

for i := 1 to n do begin
arr_of_set[i] := [];
write('Строка №', i, ' -> '); readln(s);
for j := 1 to length(s) do include(arr_of_set[i], s[j]);
end;

{
Все, множества заполнены, теперь надо просто пройтись по ним, и подсчитать,
в скольких из множеств выполняется условие:
arr_of_set[i] * ['0' .. '9', '<', '=', '>'] <> []
}
count := 0;
for i := 1 to n do { <--- Проходим по всем множествам }
if arr_of_set[i] * ['0' .. '9', '<', '=', '>'] <> [] then inc(count);
{
и если приведенное выше условие выполняется, значит
в строке был хотя бы один символ из "цифр" и "операций
сравнения" (для доп. информации - читай тему "Множества",
в FAQ-е), то увеличиваем счетчик ...
}

{
Проверяем число строк, в которых встретились заданные символы.
Если больше 3 - то Да, иначе - Нет
}
if count >= 3 then writeln('Yes')
else writeln('No')

end.

Автор: Zundell 6.02.2007 1:54

Спасибо Volvo и Мисс!а для тупого что такое include?вплане че она делает и что мы указываем в скобках?

Автор: Алена 6.02.2007 1:59

Include(the_set, value); - то же самое, что the_set := the_set + [value];