• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Помогите с программой

diagen_62

Новые
Регистрация
19 Мар 2011
Сообщения
30
Реакции
0
Баллы
0
Помогите с программой

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

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

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

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



проверьте и дополните что не хватает.заранее спасибо!
 
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);
 
А можно всю программу с самого начала?с раздела описания переменных
 
А можно всю программу с самого начала?с раздела описания переменных
Можно. Но не считаю, что нужно. Учитесь жить свои умом: всю жизнь на форумах не проездите. Так что дерзайте! А мы всегда поможем, если что.
 
да я хочу понять всё и научиться!я не ищу халявы, просто хочу во всем разобраться))
вот не знаю, что не так

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



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

Похвально, приветствую. Только... знаете, чтобы научиться, нужно действительно стараться писать программы (пусть даже самые простенькие!) самостоятельно, и при том ясно, четко и абсолютно понимать смысл каждого действия. Пусть даже программа реализует формулу 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.
 
мне вот это непонятно:
N_higher,N_lower,N_on:Byte;
что значит это?
 
Это строка определения 3-х числовых переменных типа Byte, они могут принимать значения от 0 до 255. В листинге используются для хранения количества ненулевых элементов соответственно выше, ниже и на главной диагонали. Данный тип, вероятно, выбран автором в целях оптимизации использования памяти, так как массив он определил в 100 элементов и в нем подсчитанные количества не превысят допустимые верхние значения этого типа.
Что вам ещё непонятно?
 
хорошо))
вот пытался изменить эту программу.хотел, чтобы матрицу надо было вводить самому, а не через 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.
 
хорошо)) вот пытался изменить эту программу.хотел, чтобы матрицу надо было вводить самому, а не через random.но не могу найти ошибку.помогите пожалуйста!
Собственно, ошибок почти нет. Единственное - если Вы используете команду очистки экрана clrscr, то необходимо присоединить модуль CRT - это его команда, в основной список команд она не входит.
Но есть несколько стилистических замечаний:
1. Ввод, организованный Вами - полностью "слепой". Никаких подсказок на экране. А это очень неудобно.
2. По окончании ввода желательно вывести матрицу на экран, по крайней мере для контроля и лёгкой наглядной сверки с результатом подсчета ненулевых элементов.
С учетом всего вышеизложенного:
Код:
Uses CRT;
VAR
 a:Array[1..4,1..4] of Integer;
 N1,N2,N3,N:integer;
 i,j:byte;
BEGIN
 clrscr;
 write('Введите размер матрицы ');
 readln(N);
 writeln('Введите элементы матрицы');
 For i:=1 to N do
  For j:=1 to N do
   begin
    Write('A[',i,',',j,']= ');
    readln(a[i,j]);
   end;
 WriteLn;
 For i:=1 to N do
  begin
   For j:=1 to N do
    Write(A[i,j]:4);
   writeln;
  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.
 
Назад
Сверху