Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 30.03.2011, 23:45   #1 (permalink)
diagen_62
Member
 
Регистрация: 19.03.2011
Сообщений: 30
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Exclamation Помогите с программой

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

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

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

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);



проверьте и дополните что не хватает.заранее спасибо!
diagen_62 вне форума   Ответить с цитированием

Старый 30.03.2011, 23:45
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Пока в вашей теме нет ответов вы можете обратить внимание на эти ссылки

Помогите с программой
Помогите с программой в Паскале
Помогите с программой на Си

Старый 31.03.2011, 09:59   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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);
Vladimir_S вне форума   Ответить с цитированием
Старый 12.04.2011, 23:55   #3 (permalink)
diagen_62
Member
 
Регистрация: 19.03.2011
Сообщений: 30
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

А можно всю программу с самого начала?с раздела описания переменных
diagen_62 вне форума   Ответить с цитированием
Старый 13.04.2011, 09:34   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от diagen_62 Посмотреть сообщение
А можно всю программу с самого начала?с раздела описания переменных
Можно. Но не считаю, что нужно. Учитесь жить свои умом: всю жизнь на форумах не проездите. Так что дерзайте! А мы всегда поможем, если что.
Vladimir_S вне форума   Ответить с цитированием
Старый 16.04.2011, 15:57   #5 (permalink)
diagen_62
Member
 
Регистрация: 19.03.2011
Сообщений: 30
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

выше главной:
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.



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

Последний раз редактировалось diagen_62; 16.04.2011 в 16:03
diagen_62 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 16.04.2011, 17:41   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от diagen_62 Посмотреть сообщение
да я хочу понять всё и научиться!я не ищу халявы, просто хочу во всем разобраться)) вот не знаю, что не так
Похвально, приветствую. Только... знаете, чтобы научиться, нужно действительно стараться писать программы (пусть даже самые простенькие!) самостоятельно, и при том ясно, четко и абсолютно понимать смысл каждого действия. Пусть даже программа реализует формулу 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.
Vladimir_S вне форума   Ответить с цитированием
Старый 18.04.2011, 01:21   #7 (permalink)
diagen_62
Member
 
Регистрация: 19.03.2011
Сообщений: 30
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

мне вот это непонятно:
N_higher,N_lower,N_on:Byte;
что значит это?
diagen_62 вне форума   Ответить с цитированием
Старый 18.04.2011, 07:14   #8 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

Это строка определения 3-х числовых переменных типа Byte, они могут принимать значения от 0 до 255. В листинге используются для хранения количества ненулевых элементов соответственно выше, ниже и на главной диагонали. Данный тип, вероятно, выбран автором в целях оптимизации использования памяти, так как массив он определил в 100 элементов и в нем подсчитанные количества не превысят допустимые верхние значения этого типа.
Что вам ещё непонятно?
__________________
Убить всех человеков!
AlexZir вне форума   Ответить с цитированием
Старый 18.04.2011, 09:40   #9 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от AlexZir Посмотреть сообщение
Данный тип, вероятно, выбран автором в целях оптимизации использования памяти
Угу. Впрочем, можно безболезненно тип заменить на Word. Или Integer. Без разницы.
Vladimir_S вне форума   Ответить с цитированием
Старый 24.04.2011, 15:51   #10 (permalink)
diagen_62
Member
 
Регистрация: 19.03.2011
Сообщений: 30
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

хорошо))
вот пытался изменить эту программу.хотел, чтобы матрицу надо было вводить самому, а не через 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.
diagen_62 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.