Помощь - Поиск - Пользователи - Календарь
Полная версия: Строки в массиве двумерном
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Zundell
Ребят подскажите пожалуйста,вот мне нужно запонить массив (двумерный) строками(чтоб была первая строка,вторая строка,третья и т.д),после этого необходимо проверить встречается ли хотя бы в трех строках цифры и знаки сравнения.Задачу решить с использованием множеств.Беда в чем,в том что я не могу заполнить массив символами,т.е сделать строки.(я как понимаю необходимо ввести строку,затем с помощью length посчитать длинну строки и дальше посимвольно записать первый символ в a[1,j],и так далее).Проверку на вхождение символов я знаю как делать..но вот с вводом не моглибы помочь?заранее благодарен. yes2.gif
мисс_граффити
1. Массив - статический? Тогда должно быть ограничение на длину строк. Ничего не оговаривается, то есть предел - 255 символов? А сколько строк - тоже не оговорено?
2. При чем здесь множества? Или их использовать только для проверки на вхождение? (То есть записать во множество цифры и знаки сравнения)?
Гость
статический массив....да..с помощью множества проверить имеются ли в массиве(а вернее в строках) цифры и знаки сравнения.Массив любой по размеру...вот я тут накидал немного:
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
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
Цитата
И еще мне препод сказал,что лучше создать для каждой строки множество и проверять удовлетворяетли условию.
Ну, тогда у тебя задача не про "двумерный массив строк", а про массив множеств...

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
через if?если не трудно мог бы пожалуйста написать с коментами.И еще вопрос,как я начал делать так можно чисто теоритически сделать?
мисс_граффити
Можно
Ты там с границами циклов понапутал.
Но определись, что тебе нужно - двумерный массив символов или одномерный массив множеств?

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

и что, все комбинации перебирать?!
Zundell
мнеб и так и так хотелось решить....подскажи плиз че там с границами...пачму он вссе время пишет yes?если я даже и не ввожу цифры в строку и знаки сравнения
volvo
Цитата
пачму он вссе время пишет 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
а вот если ввести какиенить цифры в строку,то всеравно выдает нет
volvo
Потому, что ПОСЛЕДНИЙ символ, который ты проверяешь - НЕ число...

Добавлено через 56 сек.
А у тебя F1 устанавливается только по результатам последней проверки... Нехорошо...
мисс_граффити
ну давай разбираться...
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
Насчет 3-это типа я хочу проверять в первых трех строках).
<<{типа f1:=a[i,j] in p? то есть только один символ тебя интересует?}>>-а вот сдесь я чет не понял почему я тока один проверяю..ааа..так как я энд поставил перед <<if f1 then writeln('est') else writeln('net'); >>?а если я его не ставлю,то он выводит оч много непонятных yes и net

Добавлено через 6 мин.
аа..он проверяет поэлементно,а как сделать чтобы всю строку проверял?
мисс_граффити
Ну, например, так:
изначально считаешь, что искомых символов в строке нет. (то есть 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
Все..огромное спасибо..разобрался)все работает.Volvo,а ты бы не мог пояснить про массив множест плиз.Оч хочу разобраться
volvo
Я же написал самое начало программы...

Ну, хорошо, вот программа полностью:
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
Спасибо Volvo и Мисс!а для тупого что такое include?вплане че она делает и что мы указываем в скобках?
Алена
Include(the_set, value); - то же самое, что the_set := the_set + [value];
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.