Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Помогите с программой (http://www.tehnari.ru/f43/t49677/)

diagen_62 30.03.2011 23:45

Помогите с программой
 
Вычислить количество ненулевых элементов матрицы, лежащих выше, ниже и на главной диагонали.

вот кое-что пытался составить

Выше главной:

for i:=1 to n-1 do
for j:=i+1 to n do
if x[i,j] = 0
then
k := k+1;
ниже главной:
for i:=2 to n do
for j:=1 to i-1 do
if x[i,j] = 0
then
inc(k);
На главной:
for i:=1 to n do
for j:=1 to n do
if (i=j) and
(x[i,j] = 0)
then
inc(k);



проверьте и дополните что не хватает.заранее спасибо!

Vladimir_S 31.03.2011 09:59

1. Вместо ненулевых, как требуется в условии, Вы считаете нулевые элементы. Поэтому условие должно быть if x[i,j]<>0 then...
2. Если результаты подсчета выводятся сразу после обработки каждого из условий (выше... ниже... на...), то нормально, не забываем только обнулить k перед циклом. А вот если в конце, то для каждого из условий нужен свой идентификатор счетчика, например k1, k2, k3.
3. Не ошибка, но излишняя громоздкость. При подсчете ненулевых элементов на главной диагонали, двойной цикл не нужен, достаточно однократного. Выглядит так:
for i:=1 to n do
if x[i,i]<>0 then inc(k);

diagen_62 12.04.2011 23:55

А можно всю программу с самого начала?с раздела описания переменных

Vladimir_S 13.04.2011 09:34

Цитата:

Сообщение от diagen_62 (Сообщение 502973)
А можно всю программу с самого начала?с раздела описания переменных

Можно. Но не считаю, что нужно. Учитесь жить свои умом: всю жизнь на форумах не проездите. Так что дерзайте! А мы всегда поможем, если что.

diagen_62 16.04.2011 15:57

да я хочу понять всё и научиться!я не ищу халявы, просто хочу во всем разобраться))
вот не знаю, что не так

выше главной:
program LabWork6;
const nmax=10; {максимальное число строк и столбцов}
type
Telem=real; {Тип элементов матрицы}
Tindex=1..nmax; {Тип индексов матрицы}
TArr=array[Tindex,Tindex] of Telem; {тип-матрица элементов типаTelem}
{размером nmax*nmax}

var
x:TArr {исходная матрица}
n,
k:Telem;
i,j:Tindex;
begin
for i:=1 to n do
if x[i,i]<>0 then inc(k)
then
k := k+1;
end.



не пойму в разделе описания(((что и как

Vladimir_S 16.04.2011 17:41

Цитата:

Сообщение от diagen_62 (Сообщение 505040)
да я хочу понять всё и научиться!я не ищу халявы, просто хочу во всем разобраться)) вот не знаю, что не так

Похвально, приветствую. Только... знаете, чтобы научиться, нужно действительно стараться писать программы (пусть даже самые простенькие!) самостоятельно, и при том ясно, четко и абсолютно понимать смысл каждого действия. Пусть даже программа реализует формулу c=a+b. А бездумное скатывание откуда ни попадя приведет к полностью обратному эффекту.
Вот Вы, якобы самостоятельно решая задачу о количестве ненулевых элементов матрицы, понаопределяли и понавводили кучу собственных пользовательских типов. Вопрос - зачем? Ответ я, кажется, знаю - затем, что так было сделано в некоей программе, откуда Вы это тупо скатали. Но там-то наверняка автор перешел к динамическим переменным, указателям, стекам и прочему такому разному, до чего Вам пока, как до звёзд, поэтому ему и понадобились переопределения типов. А Вам они ровно ни к чему.
В общем так. Вот Вам вариант решения задачки, попробуйте разобраться. А лучше - читайте книжки и пособия по Паскалю и пишите, пишите, пишите программки. Сами! Вот что главное. Только так чему-нибудь научитесь.
Код:

CONST
 N=10;
VAR
 A:Array[1..N,1..N] of Integer;
 N_higher,N_lower,N_on:Byte;
 i,j:Integer;

BEGIN
 Randomize;
 For i:=1 to N do
  For j:=1 to N do
  A[i,j]:=10-Random(20);

 For i:=1 to N do
  begin
  For j:=1 to N do
    Write(A[i,j]:4);
  WriteLn;
  end;

 WriteLn;

 N_higher:=0;
 N_lower:=0;
 N_on:=0;

 For i:=1 to N do
  For j:=1 to N do
  begin
    If (j>i) and (A[i,j]<>0) then Inc(N_higher);
    If (j=i) and (A[i,j]<>0) then Inc(N_on);
    If (j<i) and (A[i,j]<>0) then Inc(N_lower);
  end;

 WriteLn('N_higher= ',N_higher);
 WriteLn('N_on= ',N_on);
 WriteLn('N_lower= ',N_lower);

 ReadLn;
END.


diagen_62 18.04.2011 01:21

мне вот это непонятно:
N_higher,N_lower,N_on:Byte;
что значит это?

AlexZir 18.04.2011 07:14

Это строка определения 3-х числовых переменных типа Byte, они могут принимать значения от 0 до 255. В листинге используются для хранения количества ненулевых элементов соответственно выше, ниже и на главной диагонали. Данный тип, вероятно, выбран автором в целях оптимизации использования памяти, так как массив он определил в 100 элементов и в нем подсчитанные количества не превысят допустимые верхние значения этого типа.
Что вам ещё непонятно?

Vladimir_S 18.04.2011 09:40

Цитата:

Сообщение от AlexZir (Сообщение 505965)
Данный тип, вероятно, выбран автором в целях оптимизации использования памяти

Угу. Впрочем, можно безболезненно тип заменить на Word. Или Integer. Без разницы.

diagen_62 24.04.2011 15:51

хорошо))
вот пытался изменить эту программу.хотел, чтобы матрицу надо было вводить самому, а не через random.но не могу найти ошибку.помогите пожалуйста!



uses crt;
VAR
a:Array[1..4,1..4] of Integer;
N1,N2,N3,
N:integer;
i,j:byte;
BEGIN
clrscr;
writeln('Введите размер матрицы');
readln(N);
writeln('Введите элементы матрицы');
For i:=1 to N do
For j:=1 to N do
begin
readln(a[i,j]);
end;
WriteLn;
N1:=0;
N3:=0;
N2:=0;
For i:=1 to N do
For j:=1 to N do
begin
If (j>i) and (A[i,j]<>0) then Inc(N1);
If (j=i) and (A[i,j]<>0) then Inc(N2);
If (j<i) and (A[i,j]<>0) then Inc(N3);
end;
WriteLn('N1= ',N1);
WriteLn('N2= ',N2);
WriteLn('N3= ',N3);
ReadLn;
END.


Часовой пояс GMT +4, время: 16:46.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.