2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Помогите найти ошибку в простой паскалевской программе.
Сообщение21.11.2011, 13:25 
Аватара пользователя


18/11/11
54
Мне нужно вычислить среднее арифметическое квадратов элементов заданной матрицы, расположенных выше побочной диагонали и присвоить это значение всем элементам главной диагонали.
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Админ форума
Аватара пользователя


19/03/10
8952
Переехали в "Программирование".

 Профиль  
                  
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение21.11.2011, 15:57 
Заслуженный участник


26/07/09
1559
Алматы
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 


15/03/11
137
Скорее не соответствие типов у переменной s. Она у вас типа integer, а присваиваете ей значение типа real
Код:
                     s:=s+sqr(a[i,j]);

 Профиль  
                  
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение21.11.2011, 17:15 
Заслуженный участник


11/05/08
32166
Да, именно тут. Кроме того, небольшой совет: вместо
Код:
readkey;
лучше писать
Код:
if readkey=#0 then  if readkey=#0 then;

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

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


17/04/11
70
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 
Заслуженный участник


11/05/08
32166
oveka в сообщении #506217 писал(а):
1. k=n*(n-1)/2 Количество елементов над диагональю.

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

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


18/11/11
54
ewert в сообщении #506190 писал(а):
Правда, это не особо актуально, поскольку программа всё равно неработоспособна (умучаешься десять тысяч чисел вручную вводить).

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

 Профиль  
                  
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение21.11.2011, 20:25 
Заслуженный участник


11/05/08
32166
shady в сообщении #506327 писал(а):
Почему она не работоспособна, я же ввожу параметр n.

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

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


18/11/11
54
ewert в сообщении #506338 писал(а):
shady в сообщении #506327 писал(а):
Почему она не работоспособна, я же ввожу параметр n.

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

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

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


26/07/09
1559
Алматы
Это философский вопрос...

 Профиль  
                  
 
 Re: Помогите найти ошибку в простой паскалевской программе.
Сообщение22.11.2011, 01:51 
Заслуженный участник


09/08/09
3438
С.Петербург
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 
Заслуженный участник


26/07/09
1559
Алматы
2Maslov
Цитата:
Стесняюсь спросить, это почему?

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

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


11/05/08
32166

(Оффтоп)

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

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

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


09/08/09
3438
С.Петербург

(Оффтоп)

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group