Важная информация
Показано с 1 по 5 из 5

Тема: Обработка массивов данных.

  1. #1 Обработка массивов данных. 
    Новичок
    Регистрация
    17.02.2017
    Сообщений
    7
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    ЗАДАНИЕ: Составить массив B[5] из суммы элементов строк матрицы A[5*6].
    Я составил программу, но выдает какую-то ошибку. Помогите найти её и исправить.
    Вот текст программы, который я написал.

    Pascal Code:
    1. const
    2. m = 5;
    3. n = 6;
    4. var
    5. a: array[1..m,1..n] of byte;
    6. s: array[1..5] of byte;
    7. i,j, sum: byte;
    8. begin
    9. randomize;
    10. for i := 1 to m do begin
    11. for j := 1 to n do begin
    12. a[i,j] := random(10);
    13. write (a[i,j]:3)
    14. end;
    15. writeln
    16. end;
    17. writeln ('vvivod:');
    18. for j := 1 to n do begin
    19. for i := 1 to m do begin
    20. s[j] := s[j] + a[i,j];
    21. sum := sum + a[i,j]
    22. end;
    23. write (s[j]:3)
    24. end;
    25. write ('sum = ', sum);
    26. readln
    27. end.
    Последний раз редактировалось >Quiet Snow<; 26.03.2017 в 18:30. Причина: +Теги
     

  2. #2  
    Профи Аватар для Сионист
    Регистрация
    21.01.2016
    Адрес
    Галактика Млечный Путь
    Сообщений
    509
    Сказал(а) спасибо
    11
    Поблагодарили 21 раз(а) в 20 сообщениях
    Ну во-первых индексы не только в листигах разделяются запятыми, они так читабельней, чем линерализация двумерных массивов. Во-вторых кто будет теги расставлять? Билл? Не уподобляйтесь сэру Клайву, без тегов даже, знаете ли, не уверен, что правильно прочитал этот листинг. А в-третьих что пишет? Да, кто Вас учил убирать пустой оператор перед end? Именно так проще всего пропустить точку с запятой там, где она нужна. do - отдельная история, заголовок цикла - не есть завершённая инструкция, точка с запятой не ставится. И где инициируются суммы?

    Ну точно, суммы неинициированы.

    Pascal Code:
    1. const m = 5;
    2.       n = 6;
    3. var a: array[1..m,1..n] of byte;
    4.     b: array[1..m] of byte;
    5.     i,j, sum: byte;
    6. begin
    7.      randomize;
    8.      for i := 1 to m do
    9.      begin
    10.           for j := 1 to n do
    11.           begin
    12.                a[i,j] := random(10);
    13.                write (a[i,j]:3)
    14.           end;
    15.           writeln;
    16.      end;
    17.      writeln ('vvivod:');
    18.      sum:=0;
    19.      for i := 1 to m do
    20.      begin
    21.           b[i]:=0;
    22.           for j := 1 to m do
    23.           begin
    24.                b[i] := b[i] + a[i,j];
    25.                sum := sum + a[i,j];
    26.           end;
    27.           write (b[i]:3);
    28.      end;
    29.      write ('sum = ', sum);
    30.      readln;
    31. end.
    На c/c++ использование не имеющих значений переменных где либо кроме левой части оператора присваивания или параметра подпрограммы (функции в тамошней терминологии), через который данные только возвращаются - не ошибка, а предупреждение и неопределённые значения в результате исполнения программы. Именно значения, не действия, если только используемые без получения начальных значений переменные не будут с чем то ещё и сравниваться. На бейсике - ошибка, так как переменные вообще не существуют, пока не получат значения. Как оно на паскале не знаю, вроде бы неопределённое поведение компилятора.

    Да, порядок прохода по массиву был перепутан: по столбцам и после исчерпания столбца переход к следующему столбцу. То есть j - это номер столбца, а не строки. А массив s (у меня и в задании b) индексировался именно счётчиком внешнего цикла, то есть как раз j. Номером столбца. А надо номером строки, иначе при таких размерах массивов выйдете за пределы массива s. И даже если
    Pascal Code:
    1. const m = 5;
    2.       n = 6;
    3.      for j := 1 to n do
    4.      begin
    5.           for i := 1 to m do
    6.           begin
    7.                s[j] := b[j] + a[i,j];
    8.                sum := sum + a[i,j];
    9.           end;
    10.      end;
    , то инициировать массив s придётся до этого цикла и вводить после: [PASCAL]
    Pascal Code:
    1. const m = 5;
    2.       n = 6;
    3. var a: array[1..m,1..n] of byte;
    4.     b: array[1..m] of byte;
    5.     i,j, sum: byte;
    6. begin
    7.      randomize;
    8.      for i := 1 to m do
    9.      begin
    10.           for j := 1 to n do
    11.           begin
    12.                a[i,j] := random(10);
    13.                write (a[i,j]:3)
    14.           end;
    15.           writeln;
    16.      end;
    17.      writeln ('vvivod:');
    18.      sum:=0;
    19.      for i:=1 to m do
    20.      begin
    21.           b[i]:=0;
    22.      end;
    23.      for j := 1 to n do
    24.      begin
    25.           for i := 1 to m do
    26.           begin
    27.                b[i] := b[i] + a[i,j];
    28.                sum := sum + a[i,j];
    29.           end;
    30.      end;
    31.      for i:=1 to m do
    32.      begin
    33.           writeln(b[i]:3);
    34.      end;
    35.      write ('sum = ', sum);
    36.      readln;
    37. end.
    Последний раз редактировалось >Quiet Snow<; 26.03.2017 в 19:38. Причина: Объединение сообщений
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на си.
     

  3. #3  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,852
    Сказал(а) спасибо
    1,816
    Поблагодарили 947 раз(а) в 809 сообщениях
    Записей в блоге
    1
    Цитата Сообщение от Сионист Посмотреть сообщение
    На бейсике - ошибка, так как переменные вообще не существуют
    На классических бейсике(QuickBasic) и Паскале(TurboPascal) числовые переменные всегда инициализируются нулём.
    И такое понятие как неинициализированные данные применимо только к операциям непосредственной работы
    с памятью, т.е. указатели, объекты и т.п.. Исключением для бейсика является пожалуй Erase\ReDim, но это опять
    же является непосредственным управлением памятью(т.е. для опытных).
    И это всё к теме студенческих задач имеет чуть более чем никакое отношение.

    Порфирий
    Pascal Code:
    1. Uses Crt;
    2. Const
    3. M = 5;    {  Строки   }
    4. N = 6;    {  Столбцы  }
    5.  
    6. Var
    7. A: Array[1..N, 1..M] of Byte;
    8. B: Array[1..M] of Integer;
    9. ix, iy, Sum: Integer;
    10.  
    11. Begin
    12. ClrScr;    {  Очистка текстового экрана  }
    13. Randomize; {  Инициализ. случайности  }
    14.  
    15. {  Заполняем и выводим матрицу  }
    16.   WriteLn('Matrica:');
    17. For iy := 1 To M Do Begin
    18.     For ix := 1 To N Do Begin
    19.        A[ix, iy] := Random(10);
    20.        Write( A[ix, iy]:3 );
    21.     End;
    22.     WriteLn;
    23. End;
    24.  
    25. {  Считаем суммы  }
    26. For iy := 1 To M Do Begin
    27.     Sum := 0;
    28.     For ix := 1 To N Do Begin
    29.        Sum := Sum + A[ix, iy]
    30.     End;
    31.     B[iy] := Sum;
    32. End;
    33.  
    34. {  Выводим суммы  }
    35. WriteLn('Summi:');
    36. For iy := 1 To M Do
    37.     WriteLn (B[iy]:4);
    38. Repeat Until KeyPressed;
    39. End.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
     

  4. #4  
    Профи Аватар для Сионист
    Регистрация
    21.01.2016
    Адрес
    Галактика Млечный Путь
    Сообщений
    509
    Сказал(а) спасибо
    11
    Поблагодарили 21 раз(а) в 20 сообщениях
    Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
    На классических бейсике(QuickBasic) и Паскале(TurboPascal) числовые переменные всегда инициализируются нулём.
    То, что не существует, не может быть инициировано. А переменные на бейсике не существуют, пока не получат конкретные значения, будучи использованы в левой части оператора присваивания или в качестве счётчика цикла for. На счёт паскаля могу ошибаться, в книгах инфы на эту тему не встречал, а существуют переменные с как минимум с begin соответствующей области видимости. И это не begin цикла. О том, что на c/c++ переменные существуют с того момента, как доберёшься до соответствующей декларации, предсказуемые значения в этот момент получают или явно, или в конструкторах (причём, второй случай - только на c++, но не на c), иначе неявно инициируются мусором, но могут быть использованы при условии только существования сказано явно. И когда это квик стал классикой? Да, массивы на бейсике ведут себя иначе. Они создаются не первым присваиванием, или в цикле, а
    Basic Code:
    1. dim <имя массива>(размерность)
    и существуют с момента первого указания размерности. Чем инициируются элементы не знаю. Но из двух его не присвоенных переменных одна скалярна, а скаляр не существует до создания присваиванием, или циклом for.

    Basic Code:
    1. dim s(5,6)
    2. dim b(5)
    3. randomize
    4. for i=1 to 5 step 1
    5.     for j=1 to 6 step 1
    6.         a(i,j)=random
    7.         print a(i,j),
    8.     next j
    9.     print
    10. next i
    11. print "vviviod"
    12. for i=1 to 5 do
    13.     for j=1 to 6 do
    14.         let s(i)=s(i)+a(i,j)
    15.         let sum=sum+a(i,j): rem сначала разбирается sum+a(i,j). Откуда при этом интерпретатору знать, что sum надо инициировать? Она пока не существует, так как до let sum= интерпретатор ещё не дошёл.
    16.     next j
    17.     print s(i)
    18. next i
    19. print sum
    Я такие мессаги об ошибках много раз получал именно на бейсике. И квик, и турбо, и спектрумовском. На смолбейсике есть одна особенность - до начала итерпретации уже существует 26 переменных с однобуквенными латинскими именами. Но это только один диалект, хоть как раз он и классика, остальной же бейсик этой особенности не имеет.

    Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
    Исключением для бейсика является пожалуй Erase\ReDim, но это опять
    же является непосредственным управлением памятью(т.е. для опытных).
    Массивы на бейсике изучаются до строк и даже до форматирования вывода. Причём, сразу многомерные. И ни какие указатели для этого как раз не нужны.
    Последний раз редактировалось >Quiet Snow<; 26.03.2017 в 20:57. Причина: Объединение сообщений
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на си.
     

  5. #5  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,852
    Сказал(а) спасибо
    1,816
    Поблагодарили 947 раз(а) в 809 сообщениях
    Записей в блоге
    1
    Слишком много флуда не по теме. Тема закрыта.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Разработка массивов данных.
    от Порфирий в разделе Pascal
    Ответов: 0
    Последнее сообщение: 10.03.2017, 01:08
  2. Ответов: 1
    Последнее сообщение: 18.06.2015, 15:53
  3. Считывание и обработка данных из текстового файла
    от Владимир Стайловский в разделе C/C++
    Ответов: 0
    Последнее сообщение: 14.07.2013, 15:17
  4. Обработка символьных массивов
    от qwerty24 в разделе C/C++
    Ответов: 0
    Последнее сообщение: 14.11.2012, 18:44
  5. Ответов: 2
    Последнее сообщение: 28.04.2012, 14:39
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •