Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2015, 21:33   #1
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
Восклицание Работа с двумерном массивом, ошибка в ответе (Pascal)

Здравствуйте,

Условие: Дан двумерный массив размера N, вывести его в виде таблицы. Также найти произведение наибольших значений по столбцам этой матрицы и их среднее значение.

Код программы:
Код:
Program raschetka_14;
  uses crt;
  Var A:array [1..100,1..100] of integer;
      i,j,max,S,q,P,N:integer;
      {i-строка массива;
      j-столбец массива;
      max-максимальное значение;
      S-cумма max элементов;
      q-кол-во max элементов в солбце;
      P-произведение max элементов;
      N-размерность массива.}
      Sr:real;
      {Sr-среднее значение}
    Begin
      clrscr;
      randomize;
      P:=1;
      {Задается размер двумерного массива A} 
      Write('N= ');
        readln(N);
      {Двумерный массив A заполняется рандомно}  
        begin
          For i:=1 to N do
            begin
              For j:=1 to N do
                begin
                  A[i,j]:=-10+random(20);
                  max:=A[1,1];
                end;
           end;
         end;
    clrscr;
    {Вывод двумерного массива A ввиде Таблицы}
    writeln('Таблица:');
    For i:=1 to N do
      begin
       For j:=1 to N do
        begin
          write(A[i,j]:4);
          if (j mod N) = 0 then writeln;
        end;
      end;
    {Нахождение произведение и ср.значение max элементов массива по столбцам}  
    For j:=1 to N do
      begin
        max:=A[1,j];
        For i:=1 to N do
         begin
            if max<A[i,j] then
               begin
                  max:=A[i,j];
                  P:=P*max;
                  S:=S+max;
                  q:=q+1;
              end; 
          end;   
       end;
    {Нахождение среднего значения}   
    Sr:=S/q;  
    writeln;
    {Вывод полученных значений}
    writeln('Ответ:');
      writeln('Сумма= ',S:4,' Кол-во max элементов= ',q:4,' Произведение= ',P:4,' Среднее значение= ',Sr:4:2);
    readln;
  End.
У меня возникла проблема конкретно с этим куском кода.

Код:
 {Нахождение произведение и ср.значение max элементов массива по столбцам}  
    For j:=1 to N do
      begin
        max:=A[1,j];
        For i:=1 to N do
         begin
            if max<A[i,j] then
               begin
                  max:=A[i,j];
                  P:=P*max;
                  S:=S+max;
                  q:=q+1;
              end; 
          end;   
       end;
    {Нахождение среднего значения}   
    Sr:=S/q;  
    writeln;
    {Вывод полученных значений}
    writeln('Ответ:');
      writeln('Сумма= ',S:4,' Кол-во max элементов= ',q:4,' Произведение= ',P:4,' Среднее значение= ',Sr:4:2);
    readln;
  End.
Вроде сделал всё по логике. Но вместо ответа выводит ересь. Прошу помочь мне разъяснить в чём я здесь неправ. Заранее благодарен!
artems67 вне форума Ответить с цитированием
Старый 17.11.2015, 21:42   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Запустил код у себя:
Безымянный.jpg
Что не так?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.11.2015, 21:54   #3
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
По умолчанию

Цитата:
Сообщение от artems67 Посмотреть сообщение
Также найти произведение наибольших значений по столбцам этой матрицы
Исходя из этой формулировки (задание дали в ВУЗе) я думал, что нужно max для КАЖДОГО столбца матрицы найти. Тогда по идеи кол-во max значений должно совпадать с кол-вом столбцов в матрице.

А у меня не совпадает.

По вышему скрину должно получиться:

Сумма = 9+9+1+8+8= 35
Кол-во max элементов = 1+1+1+1+1=5
Произведение = 9*9*1*8*8=5184
Ср.значение= 35/5 =7


Я условие задачи понял так,поправте если я ошибаюсь. А вот реализовать подобный алгоротим нахождения суммы, произведения и т.д. у меня не получается.

UPD: Я понимаю, что моя программа работает по алгоритму, находя конкретно max значение для всей матрицы, но поиск осуществляется через столбцы.

Но вот это условие:

Цитата:
Также найти произведение наибольших значений по столбцам этой матрицы и их среднее значение.
Я понимаю двояко и склоняюсь больше к варианту max для КАЖДОГО столбца.

UPD2: Прогнал прогу, получил такой результат




Кол-во max значений в ответ и в матрице НЕ СОВПАДАЮТ. Почему так ? Где ошибка в моем коде ?

Последний раз редактировалось Stilet; 17.11.2015 в 22:34.
artems67 вне форума Ответить с цитированием
Старый 17.11.2015, 22:40   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Мдя... Подскажу как делать правильно:
Цитата:
Дан двумерный массив размера N, вывести его в виде таблицы. Также найти произведение наибольших значений по столбцам этой матрицы и их среднее значение.
Код:
  Var A:array [1..100,1..100] of integer; Max:Array[1..100] of integer;
      i,j,N,p:integer;
      Sr:real;
    Begin
      clrscr;
      randomize;
      P:=1;
      {Задается размер двумерного массива A} 
      Write('N= ');
        readln(N);
      {Двумерный массив A заполняется рандомно}  
        begin
          For i:=1 to N do
            begin
              For j:=1 to N do
                begin
                  A[i,j]:=-10+random(20);
                  if (max[j]<A[i,j]) or (i=1) then max[j]:=A[i,j];
                end;
           end;
         end;

    clrscr;
    {Вывод двумерного массива A ввиде Таблицы}
    writeln('Таблица:');
    For i:=1 to N do
      begin
       For j:=1 to N do
        begin
          write(A[i,j]:4);
        end; writeln;
      end;

writeln('Ответ:');
    {Нахождение произведение и ср.значение max элементов массива по столбцам}  
    For j:=1 to N do begin Sr:=Sr+max[j];p:=p*max[j]; end;
writeln('Сумма= ',S:4
 ,' Кол-во max элементов= ',N:4
 ,' Произведение= ',P:4
 ,' Среднее значение= ',Sr/N:4:2
);

    readln;
  End.
Вот как-то так...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.11.2015, 12:25   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Кол-во max значений в ответ и в матрице НЕ СОВПАДАЮТ. Почему так ? Где ошибка в моем коде ?
Смотри комментарии
Код:
if max<A[i,j] then
               begin
                  max:=A[i,j]; //ЗАМЕНА на новый (лучший) максимальный 
                  P:=P*max; // не один раз на самый лучший а каждый раз при улучшении
                  S:=S+max;// прибавляем не ОДИН последний (лучший) а каждый лучший (смотри 
                  q:=q+1; // и КОЛИЧЕСТВО таких замен  но не количество м. эл-тов в строке(столбце) 
              end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 18.11.2015, 13:18   #6
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
Хорошо

Stilet, спасибо большое за код исправленный. Программа заработала корректно. Интересный хинт с доп.массивом, возьму на вооружение

evg_m спасибо за комментарии, буду анализировать. )

P.S. Проблема решена. Тему можно закрыть.
artems67 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с двумерным массивом в Pascal gromanov Помощь студентам 1 04.11.2014 23:56
Работа с одномерным массивом в Pascal DeadKeLeVRa Помощь студентам 1 17.06.2013 20:13
free pascal. Где-то Ошибка. Бинарный поиск в двумерном динамическом целочисленном массиве. Решетова Алена Помощь студентам 2 15.12.2012 06:22
В чем ошибка? В ответе выдает нули. Fatalita Помощь студентам 2 31.03.2012 20:03
Работа с массивом, ошибка admiral121 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 17.12.2010 17:35