2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2  След.
 
 Помогите найти ошибку в простой паскалевской программе.
Сообщение21.11.2011, 13:25 
Аватара пользователя
Мне нужно вычислить среднее арифметическое квадратов элементов заданной матрицы, расположенных выше побочной диагонали и присвоить это значение всем элементам главной диагонали.
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
 
uses crt;

var
    a:array[1..100,1..100] of real;{Якобы здесь несоответствие типов. Помогите, пожалуйста,понять}
    i,j,n,k,s:integer;
BEGIN
    clrscr;
    readln(n);
    for i:=1 to n do
          for j:=1 to n do
               begin
                     write('a[',i,',',j,']=');
                     readln(a[i,j]);
               end;
     s:=0;
     k:=0;
     for i:=1 to n-1 do
          for j:=1 to n-i do
                begin
                     k:=k+1;
                     s:=s+sqr(a[i,j]);
                end;
      for i:=1 to n do
           for j:=1 to n do
                 if (i=j) then a[i,j]:=s/k
      for i:=1 to n do
           for j:=1 to n do
                 writeln('a[',i,',',j,']=',a[i,j]);
       write(s/k);
       readkey;
END.  
 

Паскаль выдает сообщение об ошибке в присвоение компонентам массива вещественного типа данных. Час сижу, не понимаю в чем ошибка.

 
 
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение21.11.2011, 13:36 
Аватара пользователя
Переехали в "Программирование".

 
 
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение21.11.2011, 15:57 
2shady
Цитата:
Якобы здесь несоответствие типов

Процитируйте само сообщение об ошибке, пожалуйста.

Мелкие замечания. Кусок:
Код:
      for i:=1 to n do
            for j:=1 to n do
                  if (i=j) then a[i,j]:=s/k

Наверное лучше заменить на более короткое (не забыв исправить финальный write):
Код:
    s:=s/k;
    for i:=1 to n do a[i, i]:=s;

 
 
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение21.11.2011, 15:59 
Скорее не соответствие типов у переменной s. Она у вас типа integer, а присваиваете ей значение типа real
Код:
                     s:=s+sqr(a[i,j]);

 
 
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение21.11.2011, 17:15 
Да, именно тут. Кроме того, небольшой совет: вместо
Код:
readkey;
лучше писать
Код:
if readkey=#0 then  if readkey=#0 then;

Правда, это не особо актуально, поскольку программа всё равно неработоспособна (умучаешься десять тысяч чисел вручную вводить).

 
 
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение21.11.2011, 18:26 
1. k=n*(n-1)/2 Количество елементов над диагональю.
2. s=s/k Это делать вне цикла
2. for i:=1 to n do
a[i,i]:=s; Это делать одним прогоном.
Матрица у тебя ограничена - n. Проблем ввода нет.
При разумном n.

 
 
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение21.11.2011, 18:45 
oveka в сообщении #506217 писал(а):
1. k=n*(n-1)/2 Количество елементов над диагональю.

У ТС, между прочим, вот как раз именно этот элемент вполне разумен ( в отличие от всего прочего алгоритмического безобразия): он дёшев с точки зрения затрат и при этом не требует переналадки, если вдруг понадобится немножко изменить условия задачки. Что существенно повышает надёжность программирования. Ну разве что вместо "k:=k+1;" лучше, конечно, "inc(k);".

 
 
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение21.11.2011, 20:16 
Аватара пользователя
ewert в сообщении #506190 писал(а):
Правда, это не особо актуально, поскольку программа всё равно неработоспособна (умучаешься десять тысяч чисел вручную вводить).

Почему она не работоспособна, я же ввожу параметр n.

 
 
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение21.11.2011, 20:25 
shady в сообщении #506327 писал(а):
Почему она не работоспособна, я же ввожу параметр n.

А, на это я не обратил внимания, прошу пардону. Но всё остальное -- и организация циклов, и вывод матрицы -- это всё-таки фирменное безобразие. При всей формальной корректности.

 
 
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение21.11.2011, 21:41 
Аватара пользователя
ewert в сообщении #506338 писал(а):
shady в сообщении #506327 писал(а):
Почему она не работоспособна, я же ввожу параметр n.

А, на это я не обратил внимания, прошу пардону. Но всё остальное -- и организация циклов, и вывод матрицы -- это всё-таки фирменное безобразие. При всей формальной корректности.

Как правильно? Пожалуйста, поправьте меня.

 
 
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение21.11.2011, 23:51 
Это философский вопрос...

 
 
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение22.11.2011, 01:51 
shady в сообщении #506392 писал(а):
Как правильно? Пожалуйста, поправьте меня.
Вот ведь набросились. Ну есть пара недочетов, подумаешь, с кем не бывает.

Вот смотрите, у Вас цикл:
Используется синтаксис Pascal
     s:=0;
     k:=0;
     for i:=1 to n-1 do
          for j:=1 to n-i do
                begin
                     k:=k+1;
                     s:=s+sqr(a[i,j]);
                end;
 

Вам тут кагбе намекают, что $k$ зависит только от $n$, поэтому рассчитывать его в цикле никакой необходимости нет; можно просто сразу присвоить нужное значение $n(n-1)/2$. И, с одной стороны, это правильно. Но с другой -- в том, как это сделано у Вас, на мой взгляд, тоже ничего страшного нет: меньше шансов просчитаться с количеством элементов над побочной диагональю :)

Ну и второе:
Используется синтаксис Pascal
      for i:=1 to n do
           for j:=1 to n do
                 if (i=j) then a[i,j]:=s/k
 
Тут просто не надо двойного цикла, достаточно одинарного:
Используется синтаксис Pascal
    for i:=1 to n do
        a[i,i] := s/k
 
Не, ну конечно, можно еще $s/k$ посчитать где-то один раз до цикла, но любой компилятор прекрасно справится с этим самостоятельно. Ну а даже если и не справится, то потеря времени на этой "неэффективности" составит наносекунды, что в сравнении с временем ручного ввода матрицы как-то не впечатляет. К тому же, так короче и понятней.

ewert в сообщении #506236 писал(а):
Ну разве что вместо "k:=k+1;" лучше, конечно, "inc(k);".
Стесняюсь спросить, это почему? По-моему, так исключительно дело вкуса.

 
 
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение22.11.2011, 04:24 
2Maslov
Цитата:
Стесняюсь спросить, это почему?

Слышал, что компилятор turbo pascal довольно примитивен, и код для k:=k+1 и inc(k) будет различным (в последнем случае одна инструкция, в первом -- да мало ли, даже временная переменная/регистр может использоваться). Но я не проверял, если честно. Ok, я согласен, что это все настолько мелкие особенности, что к алгоритмизации они никакого отношения не имеют, но преподаватели разные ж бываю -- у Феди пятерка, он inc'ом воспользовался, у Васи двойка -- "сумничал" паразит такой, мол компилятор соптимизирует. :)

 
 
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение22.11.2011, 19:54 

(Оффтоп)

Maslov в сообщении #506461 писал(а):
Стесняюсь спросить, это почему? По-моему, так исключительно дело вкуса.

Я и не настаивал -- лишь порекомендовал. Второе заведомо не менее эффективнее первого, и бросается в глаза, что потенциально эффективнее. Почему -- только что сказали. Тут дело ещё и в том, дрессировался ли программист на ассемблерах и чувствует ли он, пусть даже инстинктивно, какая конструкция в какую цепочку кодов транслируется. Паскаль же в этом смысле очень прозрачен (как ещё более прозрачным был древний Фортран, и как совершенно непрозрачным был Алгол, мир праху его, но своё дело он сделал-таки).

 
 
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение22.11.2011, 20:29 

(Оффтоп)

ewert в сообщении #506706 писал(а):
Тут дело ещё и в том, дрессировался ли программист на ассемблерах и чувствует ли он, пусть даже инстинктивно, какая конструкция в какую цепочку кодов транслируется.
Ну по нонешним временам Java, C#, PHP и т.п., полезность подобной дрессировки весьма ограничена; написание ясного кода, на мой взгляд, гораздо важнее.

 
 
 [ Сообщений: 16 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group