singlepost

Pascal (вопрос по задаче 3) << На главную или назад  

Всем опять привет. Сёдня чё-то себя плохо чувствую, но всё=же

вообщемкак найти в двуммерном массиве , номера строк с наибольшой суммой элем( таких строк может быть несколько)

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

то что смог написать:

program num_str;
const n=4;m=5;
var a:array[1..n,1..m] of integer;
i,j:1..m; s,max:integer; num_s:1..m;
Begin randomize; writeln('poluch nas');
……for i:=1 to n do
……for j:=1 to m do
……a[i,j]:=random(n-1)*2;
… for i:=1 to n do begin
….for j:=1 to m do
……write(a[i,j]:3);
……. writeln; end; max:=s;
……….for i:=1 to n do begin s:=0;
………. for j:=1 to m do
………. s:=s+a[i,j];
………. writeln('summa v ',i,' stroke =',s);end;
………. {ifs>max then begin max:=s; num_s:=i; end;
……….. writeln('max v ',num_s,' stroke');}
………. readln
End.

15 ответов в теме “Pascal (вопрос по задаче 3)”

  1. 15
    Сергей Владимирович ответил:

    аха, понятно! Спасибо тебе!

  2. 14
    Андрей Запышный ответил:

    Потому что тогда сумму надо снова считать в следующем цикле.
    Попробуй так написать))):

    program num_str;
    const n=4;m=5;
    var
    a:array[1..n,1..m] of integer;
    b:array[1..n] of integer;
    j:1..m;
    i,k:1..n;
    sum,max:integer;
    Begin
    …writeln('poluch nas');
    /*init*/
    …randomize;
    …for i:=1 to n do
    ……for j:=1 to m do
    ………a[i,j]:=random(n-1)*2;
    /*source out*/
    …for i:=1 to n do begin
    ……for j:=1 to m do
    ………write(a[i,j]:3);
    ……writeln;
    …end;
    /*action*/
    …max:=0;
    …for i:=1 to n do begin
    ……sum:=0;
    ……for j:=1 to m do
    ………sum:=sum+a[i,j];
    ……writeln('summa v ',i,' stroke =',sum);
    ……if sum>max then
    ………max:=sum;
    …end;
    …k=0;
    …for i:=1 to n do begin
    ……sum:=0;
    ……for j:=1 to m do
    ………sum:=sum+a[i,j];
    ……if sum=max then begin
    ………k:=k+1;
    ………b[k]:=i;
    ……end;
    …end;
    /*result out*/
    …for i:=1 to k do
    ……write(b[i],' ');
    …readln;
    End.

  3. 13
    Сергей Владимирович ответил:

    а тогда почему прога не работает с элементами (если sum[i] заменитьна sum)?

  4. 12
    Андрей Запышный ответил:

    Массив нужен, чтобы второй раз не рассчитывать суммы, можно обойтись и без него. Как бы добавляем столбец к матрице и делаем меньше вычислений. В данной ситуации: за 16 байт памяти делаем на 20 сложений меньше.

  5. 11
    Сергей Владимирович ответил:

    Огромное спасибо, прога работает, а зачем массив sum[i]?

  6. 10
    Андрей Запышный ответил:

    Попробуй так написать:

    program num_str;
    const n=4;m=5;
    var
    a:array[1..n,1..m] of integer;
    b:array[1..n] of integer;
    sum:array[1..n] of integer;
    j:1..m;
    i,k:1..n;
    max:integer;
    Begin
    …writeln('poluch nas');
    /*init*/
    …randomize;
    …for i:=1 to n do
    ……for j:=1 to m do
    ………a[i,j]:=random(n-1)*2;
    /*source out*/
    …for i:=1 to n do begin
    ……for j:=1 to m do
    ………write(a[i,j]:3);
    ……writeln;
    …end;
    /*action*/
    …max:=0;
    …for i:=1 to n do begin
    ……sum[i]:=0;
    ……for j:=1 to m do
    ………sum[i]:=sum[i]+a[i,j];
    ……writeln('summa v ',i,' stroke =',sum[i]);
    ……if sum[i]>max then
    ………max:=sum[i];
    …end;
    …k=0;
    …for i:=1 to n do begin
    ……if sum[i]=max then begin
    ………k:=k+1;
    ………b[k]:=i;
    ……end;
    …end;
    /*result out*/
    …for i:=1 to k do
    ……write(b[i],' ');
    …readln;
    End.

  7. 9
    Сергей Владимирович ответил:

    попоробую задать вопрос по другому:
    Как правильно вывести ответ из номеров строк?

  8. 8
    Андрей Запышный ответил:

    этот код, неясно, работает ли вообще:
    …for k:=1 to k do
    ……write(b[k],' ');
    лучше заменить на:
    …for i:=1 to k do
    ……write(b[i],' ');

  9. 7
    Андрей Запышный ответил:

    Во-первых:
    На этих данных код будет работать неправильно:
    1 1 1 1 1
    2 2 2 2 2
    2 2 2 2 2
    1 1 1 1 1
    Вывод будет:
    1
    2
    3
    а должен быть:
    2
    3
    Во-вторых:
    это: b:array[1..m] of integer; вроде как массив для номеров строк. непонятно почему в нем количество элементов равно количеству столбцов.
    Возможное решение:
    Нужно добавить массив для сумм. В первом цикле считать суммы и максимум. Сделать второй цикл, для того, чтобы вносить номера только нужных строк.

  10. 6
    Сергей Владимирович ответил:

    Леонид,прога работает, но вот выдаёт рез-т допустим:
    2 2
    а надо
    2 4

  11. 5
    Федор Фурсов ответил:

    Чем вариант не подходит то? у меня даже кажись циклов меньше чем у вас;) в таком нечитабельном коде я не буду разбиратся

  12. 4
    Леонид Максимов ответил:

    пример форматирования (заменять три точки на пробелы или табы), + немного поправил:

    program num_str;
    const n=4;m=5;
    var
    a:array[1..n,1..m] of integer;
    b:array[1..m] of integer;
    i:1..n;
    j:1..m;
    k:1..m
    s:integer;
    max:integer;
    num_s:1..n;
    Begin
    …writeln('poluch nas');
    /*init*/
    …randomize;
    …for i:=1 to n do
    ……for j:=1 to m do
    ………a[i,j]:=random(n-1)*2;
    /*source out*/
    …for i:=1 to n do begin
    ……for j:=1 to m do
    ………write(a[i,j]:3);
    ……writeln;
    …end;
    /*action*/
    …max:=0;
    …k:=0
    …for i:=1 to n do begin
    ……s:=0;
    ……for j:=1 to m do
    ………s:=s+a[i,j];
    ……writeln('summa v ',i,' stroke =',s);
    ……if s>max then begin
    ………max:=s;
    ………num_s:=i;
    ………k:=0
    ……end;
    ……if s=max then
    ………k:=k+1;
    ……b[k]:=num_s;
    …end;
    /*result out*/
    …writeln('max=',max,' nomer str=',num_s);
    …for k:=1 to k do
    ……write(b[k],' ');
    …readln
    End.

    не понятен, правда, вывод результатов (в том отношении, что один из них выводится дважды)

  13. 3
    Леонид Максимов ответил:

    мне, например, не нравится вот это:
    i,j,k:1..m

    … for i:=1 to n do
    и стиль форматирования

  14. 2
    Сергей Владимирович ответил:

    спасибо конечно, но этот вариант не подходит(

    вот мой переделанный вариант, может кто ещё поможет.

    program num_str;
    const n=4;m=5;
    var a:array[1..n,1..m] of integer; b:array[1..m] of integer;
    i,j,k:1..m; s,max:integer; num_s:1..n;
    Begin randomize; writeln('poluch nas');
    … for i:=1 to n do
    … for j:=1 to m do
    …. a[i,j]:=random(n-1)*2;
    ….for i:=1 to n do begin
    …..for j:=1 to m do
    …… write(a[i,j]:3);
    …….writeln; end;
    ………max:=0;
    ……….. for i:=1 to n do begin s:=0;
    ………..for j:=1 to m do
    ………….. s:=s+a[i,j];
    …………writeln('summa v ',i,' stroke =',s);
    ………………. ifs>max then begin max:=s; num_s:=i;end;
    …………………if s=max thenk:=k+1; b[k]:=num_s; end;
    ……………… writeln('max=',max,' nomer str=',num_s);
    ……………….. for k:=1 to k do
    ……………… write(b[k],' ');
    readln
    End.

  15. 1
    Федор Фурсов ответил:

    Если ваще не думаю и не оптимизируя и тупо, то вот что первое пришло в голову:
    max:=0;
    sum:=0;
    for i:=1 to n do
    begin
    for j:=1 to m do
    begin
    sum:=sum+a[i,j];
    end;
    if (sum>max) then max:=sum;
    sum:=0;
    end;

    for i:=1 to n do
    begin
    for j:=1 to m do
    begin
    sum:=sum+a[i,j];
    end;
    if (sum=max) then writeln(i);
    sum:=0;
    end;

    где все переменные интеджеры, а массив н*м тож инт, забьешь сам.
    Не тестил но думаю работает:)

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.