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

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

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

 
 Ответить  Открыть новую тему 
> Использование процедур и функций, разбор задачи
сообщение
Сообщение #1


Новичок
*

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

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


Дана задача
Пусть дана матрица A(N x N), а симметричная строка – такая строка, у которой все ее элементы симметричны относительно ее центрального элемента. Воспользуйтесь логической функцией, определяющей симметричность i-й строки, а также функцией, подсчитывающей количество таких строк в заданной матрице.

Что я сделал
program One;
const
N = 100;
M = 10;
var
A : array[1..N, 1..M] of real;
i, Count, Row, MaxCount : integer;

{ Ввод исходной матрицы }
procedure InputMatrix;
var
i, j : integer;
begin
writeln( ‘+++ Введите исходную матрицу +++’ );
for i := 1 to N do
for j := 1 to M do
begin
write( ‘A[’, i, ‘;’, j, ‘] = ’ );
readln( A[i, j] );
end;
end;
{ Вывод матрицы на экран }
procedure PrintMatrix;
var
i, j : integer;
begin
writeln( ‘+++ Матрица A +++’ );
for i := 1 to N do
begin
for j := 1 to M do
write( A[i,j], ‘ ’ );
writeln;
end;
end;


Потом проверка на симметричность

{ Проверка, является ли число симметричным }
function TestSym( x : integer ) : boolean;
var
y, z : integer;
begin
y := 0;
z := x;

while z > 0 do
begin
y := y * 10 + z mod 10;
z := z div 10;
end;

TestSym := x = y;
end;


потом подсчет

{ Подсчёт в строке симметричных чисел }
function CalculateRow( x : integer ) : integer;
var
i, Count : integer;
begin
Count := 0;

for i := 1 to M do
if TestSym( A[x,i] ) then Count := Count + 1;

CalculateRow := Count;
end;
begin
InputMatrix;
writeln; writeln;
PrintMatrix;

MaxCount := 0;
Row := 0;

for i := 1 to N do
begin
Count := CalculateRow( i );

if Count > MaxCount then
begin
MaxCount := Count;
Row := i;
end;
end;

writeln; writeln;

if Row = 0 then
writeln( ‘Нет строк с симметричными числами’ );
else
writeln( ‘Строка с макс. кол-вом сим. чисел: ’, Row );
end.



Дальше ступор включился полный, чё делать ХЕЗ
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Объединить все это в одну программу, и запустить.

Ты не указываешь проблему, которая у тебя возникла. С чего ты взял, что достаточно вывалить сюда куски кода, и кто-то будет искать ошибки ЗА ТЕБЯ? Ты расскажи, ГДЕ у тебя ошибки/недочеты...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

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

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


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


Новичок
*

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

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


во первых вылезла ошибка в блоке подсчета
if TestSym( A[x,i] ) then Count := Count + 1;

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


Профи
****

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

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


Это потому что массив real, а функция с параметром integer. Но все равно - ты надергал кусков из разных программ, но делают они (в частности функция TestSym) не то.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

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

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


Хорошо, а как тогда сделать то? Я так понял что только первая часть правильна, остальное бред полный! Я проверил код, он вообще не работает, а его я переделывал с методички которую нам училка дала. Но потом и её пример проверил, балалайка - не работает nea.gif . Капец какой-то, дают примеры которые не работают lol.gif Ладно, будем пробывать дальше
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

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

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


Функция TestSym должна быть примерно такой:
function TestSym(j:integer):boolean;
var i:integer;
b:boolean;
begin
b:=true;
for i:=1 to n div 2 do
b:=b and (a[j,i]=a[j,n-i+1]);
test:=b;
end;

Параметр J- номер строки в массиве. Массив А используется через глобальные переменные-это может не понравится преподам, можно его тоже в параметрах передавать.
вызывать так:
 if TestSym(i) then Count := Count + 1;


ps и еще- в задании у тебя матрица NxN, а в программе NxM..

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


Новичок
*

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

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


Посмотрите пожалуйста так на что то уже похоже
program One;

Const

N=10; {число СТРОК!}

N=10; {число СТОЛБЦОВ!}

type

TElem = integer;

Matrix = array[1..N,1..N] of TElem;


(* Построчный ввод матрицы *)

Procedure ReadMatr(var A:Matrix; var n,n:word );

var

i,j:word;

begin

repeat

write('Vvedide kol-vo strok: '); readln(N)

until (N>0) and (N<=N);

repeat

write('Vvedide kol-vo stolbcov: '); readln(n)

until (n>0) and (N<=N);

For i:=1 to n do

begin

For j:=1 to n do

begin

write('A[',i,j,']= ');

readln(A[i,j])

end

end

end;


(* Построчный вывод матрицы *)

Procedure PrintMatr(A:Matrix; n,n:word);

Var

i,j:word;

begin

For i:=1 to n do

begin

For j:=1 to n do write(A[i,j],' ');

writeln

end

end

{ тестовая программа}

var

n,n:word;

a:matrix;

Begin

Readmatr(a,n,n);

PrintMatr(a,n,n)

end;

function TestSym(j:integer):boolean;

var i:integer;

b:boolean;

begin

b:=true;

for i:=1 to n div 2 do

b:=b and (a[j,i]=a[j,n-i+1]);

test:=b;

end;


это только часть кода, не полный. Дальше ещё интересней

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


Новичок
*

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

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


а где дальше?

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


Новичок
*

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

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


RaV да я вижу что не то получается, три не будет мало?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Профи
****

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

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


Цитата(valeral @ 2.06.2006 11:48) *

Посмотрите пожалуйста так на что то уже похоже

Теперь с другого места методички с заменой M на N smile.gif Ты ее даже не пробовал компилить. Осталось чуть-чуть: оставить одну константу N, убрать ее из var и все попытки ее задать пользователем через Readln(n), в основной программе сделать цикл c вызовом TestSym и подсчетом кол-ва строк.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Цитата(valeral @ 2.06.2006 7:48)
Дана задача
Пусть дана матрица A(N x N), а симметричная строка – такая строка, у которой все ее элементы симметричны относительно ее центрального элемента. Воспользуйтесь логической функцией, определяющей симметричность i-й строки, а также функцией, подсчитывающей количество таких строк в заданной матрице.

Так в чем, собственно, задача, у тебя как раз и не написано. Что ты решаешь??? Тебе надо что? Найти количество симметричных строк? Количество НЕсимметричных? Распечатать симметричные строки? Задание как следует напиши, а потом уже берись за выполнение...

На данный момент из твоего задания следует "сделать что-то, воспользовавшись теми или иными функциями." Так вот напиши, что это ЧТО_ТО...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Новичок
*

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

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


ребят, не злитесь. Я ж только учусь, и поэтому не успеваю так же быстро соображать в паскале как Вы. Пока тайм-аут.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

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

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


нифига не выходит wacko.gif чувствую себя полным идиотом, блин в задаче разобраться не могу. а мне до понедельника ещё 7 решить надо. почему так тяжко

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


Новичок
*

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

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


уже второй час долблюсь с этой задачей. Malice, Volvo прошу вас добейте её и я отстану от вас

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


Профи
****

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

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


Const
N=5;
type
Matrix = array[1..N,1..N] of integer;
var a:matrix;
Procedure ReadMatr(var A:Matrix);
var
i,j:word;
begin
For i:=1 to n do begin
For j:=1 to n do begin
write('A[',i,',',j,']= ');
readln(A[i,j])
end
end
end;

Procedure PrintMatr(A:Matrix);
Var
i,j:word;
begin
For i:=1 to n do begin
For j:=1 to n do write(A[i,j],' ');
writeln
end
end;

function TestSym(var a:matrix;j:integer):boolean;
var i:integer;
b:boolean;
begin
b:=true;
for i:=1 to n div 2 do
b:=b and (a[j,i]=a[j,n-i+1]);
testSym:=b;
end;

function TestSymStr(var a:matrix):integer;
var i,c:integer;
begin
c:=0;
for i:=1 to n do inc(c,byte(testsym(a,i)));
testsymstr:=c;
end;

Begin
Readmatr(a);
PrintMatr(a);
writeln (testSymStr(a));
readln;
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Новичок
*

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

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


Malice, Volvo громаднейшее спасибо
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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