2014 dxdy logo

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

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




 
 Помогите пожалуйста с массивами
Сообщение25.12.2007, 23:51 
1.Пусть В-двумерный массив целых чисел размерности N*N.Ввести его случайным образом.Поменять местами:
а)Макс.из элементов массива и мин.по модулю из элементов побочной диагонали
б)1-ую и 2-ую строки массива
в)Строки с макс. и мин. суммой квадратов элементов



2.Пусть А-одномерный массив N целых чисел
а)Поменять местами макс. по модулю элемент и элемент ближащий к числу 1.87
б)Проверить является ли 6-ой чётный элемент полож.,а если такого элемента нет вывести сообщение
в)Искл.из массива все нулевые элементы

 
 
 
 
Сообщение26.12.2007, 02:30 
Аватара пользователя
:evil: fiks
В таком виде Вам никто помочь не сможет. Программу за Вас никто писать не будет, да и не понятно — какой компилятор, какой язык, какая ось. Но главное — написание программы за Вас ничего не изменит. Вы по-прежнему ничему не научитесь.

Так что пишите свою программу. Если у Вас будут с ней затруднения, мы попытаемся помочь.

 
 
 
 
Сообщение26.12.2007, 13:08 
незваный гость писал(а):
:evil: fiks
В таком виде Вам никто помочь не сможет. Программу за Вас никто писать не будет, да и не понятно — какой компилятор, какой язык, какая ось. Но главное — написание программы за Вас ничего не изменит. Вы по-прежнему ничему не научитесь.

Так что пишите свою программу. Если у Вас будут с ней затруднения, мы попытаемся помочь.

Про язык програмирования забыл написать - паскаль...по поводу того что если за меня кто нибудь напишет программу,то мне это ничего не даст...ну в общем если у меня не будет этой программы,то собственно говоря есть возможность ,что учится в университете я не буду.(эт раз)(В случае 1 у меня не будет точно возможности научится програмировать)
2.Я раньше никогда не изучал програмирование.
3.В данное время занимаюсь на курсах,изучаю паскаль.
Если бы у меня была возможность написать программу,я сюда бы не обращался.

Так что в этом Вы ошиблись!
незваный гость писал(а):
Но главное — написание программы за Вас ничего не изменит.


Наброски программ есть.

 
 
 
 
Сообщение26.12.2007, 14:25 
могу помочь, но только на Си.
или можно вместе продумать алгоритм решения.

 
 
 
 
Сообщение26.12.2007, 23:10 
Аватара пользователя
:evil:
незваный гость писал(а):
Наброски программ есть.

Очень хорошо, поместите их здесь. Лучше всего, используя тег [cоde].

Я не думаю, что Вы правильно меня поняли. Никто не отказывается Вам помогать. Поверьте (если Вы этого не знаете сами), что помочь человеку разобраться занимает гораздо больше времени и сил, чем написать программу, подобную Вашей. И мы, участники форума на это идём. Потому, что дав Вам рыбу, мы накормим Вам обедом. А дав Вам удочку, мы обеспечим себе обед (когда Вы пригласите нас в гости). :)

А-а-а-а. Перечитав, я начал понимать, что произошло. Когда я писал «Так что пишите свою программу», я имел в виду размещение программы здесь, на форуме, а вовсе не «гуляй с миром». Извините, пожалуйста, за невнятное сообщение.

 
 
 
 
Сообщение27.12.2007, 19:04 
Это 1 программа,только не соответсвует 3 пункту задания...в задачи я поменял местами столбцы с мин и макс суммой квадратов элементов.
Как мне можно расписать в конце суммы квадратов всех столбцов?
Мне надо,чтобы на экран выводились не только значения столбцов с мин и макс сумм квадратов элементов но и всех остальных...
Код:
program Ren74;
uses crt;
const n=5;
type dar = array [1..n,1..n] of integer;
   ar=array [1..n] of longint;
var max,min,i,k,i1,i2,k1,k2,k3,save:longint;
a:dar;
b:ar;
begin
clrscr;
randomize;
max:=-10;
min:=10;
i1:=0;
i2:=0;
k1:=0;
k2:=0;
for i:=1 to n do for k:=1 to n do a[i,k]:=random (9);
for i:=1 to n do
   begin
    for k:=1 to n do write (a[i,k]:5);
     writeln;
    end;
k:=5;
k3:=0;
k1:=0;
for i:=1 to n do
    begin
     if abs(a[i,k-k3])<min then
      begin
        min:=abs(a[i,k-k3]);
        i1:=i;
        k1:=k-k3;
      end;
     k3:=k3+1;
    end;
writeln ('Min=',a[i1,k1],'[',i1,',',k1,']');
for i:=1 to n do
for k:=1 to n do
  begin
    if a[i,k]>max then
     begin
      max:=a[i,k];
      i2:=i;
      k2:=k;
     end;
  end;
writeln ('Max=',a[i2,k2],'[',i2,',',k2,']');
save:=a[i1,k1];
a[i1,k1]:=a[i2,k2];
a[i2,k2]:=save;
writeln;
writeln ('После замены');

for i:=1 to n do
begin
  for k:=1 to n do write (a[i,k]:5);
   writeln;
  end;
i1:=1;
i2:=2;
for k:=1 to n do b[k]:=a[i1,k];
for k:=1 to n do a[i1,k]:=a[i2,k];
for k:=1 to n do a[i2,k]:=b[k];
readln;
writeln('После замены 1-ой и 2-ой строки');
for i:=1 to n do
begin
  for k:=1 to n do write (a[i,k]:5);
writeln
end;
max:=-999999;
min:=999999;
for k:=1 to n do b[k]:=0;
for k:=1 to n do
   begin
      for i:=1 to n do
         begin
          b[k]:=b[k]+(a[i,k]*a[i,k]);
         end;
   end;
for k:=1 to n do
begin
  if b[k]<min then
   begin
    min:=b[k];
    k1:=k;
   end;
  if b[k]>max then
   begin
   max:=b[k];
   k2:=k;
  end;
end;
readln;
writeln ('max =',max,'');
writeln ('min =',min,'');
writeln ('После замены');
for i:=1 to n do b[i]:=a[i,k2];
for i:=1 to n do a[i,k2]:=a[i,k1];
for i:=1 to n do a[i,k1]:=b[i];
for i:=1 to n do
   begin
    for k:=1 to n do write (a[i,k]:5);
    writeln;
   end;
readln;
end.

Вот так все это выглядит
Изображение

Добавлено спустя 10 минут 16 секунд:

незваный гость писал(а):
:evil:
незваный гость писал(а):
Наброски программ есть.

Очень хорошо, поместите их здесь. Лучше всего, используя тег [cоde].

Я не думаю, что Вы правильно меня поняли. Никто не отказывается Вам помогать. Поверьте (если Вы этого не знаете сами), что помочь человеку разобраться занимает гораздо больше времени и сил, чем написать программу, подобную Вашей. И мы, участники форума на это идём. Потому, что дав Вам рыбу, мы накормим Вам обедом. А дав Вам удочку, мы обеспечим себе обед (когда Вы пригласите нас в гости). :)

А-а-а-а. Перечитав, я начал понимать, что произошло. Когда я писал «Так что пишите свою программу», я имел в виду размещение программы здесь, на форуме, а вовсе не «гуляй с миром». Извините, пожалуйста, за невнятное сообщение.

Спасибо за помощь...
Я просто думал,что для разбирающихся людей это как 2 пальца об асфальт....
Ну лучше конечно в этом самому разобратся :wink:

 
 
 
 
Сообщение30.12.2007, 00:26 
Аватара пользователя
:evil:
У меня много мыслей по поводу Вашей программы.
fiks писал(а):
Я просто думал,что для разбирающихся людей это как 2 пальца об асфальт....
Вы правы, а что? Вы думаете, пальцы не жаль?! Вы ещё об наждак посоветуйте. :D Но дело в том, что нам это не нужно. Хотя мы готовы помочь Вам.

1) Я немного переформатировал Ваш код. Мне так легче читать. Посмотрите, может и Вам понравится.

Код:
  1  program Ren74;
  2    uses crt;
  3
  4    const
  5      n = 5; (* dimmension of the array *)
  6
  7    type
  8      dar = array [1..n,1..n] of integer;
  9      ar  = array [1..n] of longint;
10
11    var
12      max, min, i, k, i1, i2, k1, k2, k3, save: longint;
13      a: dar;
14      b: ar;
15
16  begin
17    clrscr;
18
19    randomize;
20
21    max:=-10;
22    min:=10;
23    i1:=0;
24    i2:=0;
25    k1:=0;
26    k2:=0;
27
28    (* random initialization *)
29    for i:=1 to n do begin
30      for k:=1 to n do begin
31        a[i,k]:=random (9);
32      end;
33    end;
34
35    (* print array *)
36    for i:=1 to n do begin
37      for k:=1 to n do begin
38        write (a[i,k]:5);
39      end;
40      writeln;
41    end;
42
43    (* find a min of abs of the other diagonal *)
44    k:=5; k3:=0; k1:=0;
45    for i:=1 to n do begin
46      if abs(a[i,k-k3]) < min then begin
47        min:=abs(a[i,k-k3]);
48        i1:=i;
49        k1:=k-k3;
50      end;
51      k3:=k3+1;
52    end;
53    writeln ('Min=',a[i1,k1],'[',i1,',',k1,']');
54
55    (* find a max of the array *)
56    for i:=1 to n do begin
57      for k:=1 to n do begin
58        if a[i,k] > max then begin
59          max:=a[i,k];
60          i2:=i;
61          k2:=k;
62        end;
63      end;
64    end;
65    writeln ('Max=',a[i2,k2],'[',i2,',',k2,']');
66
67    (* swap them *)
68    save:=a[i1,k1]; a[i1,k1]:=a[i2,k2]; a[i2,k2]:=save;
69
70    (* print updated array *)
71    writeln;
72    writeln ('Ïîñëå çàìåíû');
73    for i:=1 to n do begin
74      for k:=1 to n do begin
75        write (a[i,k]:5);
76      end;
77      writeln;
78    end;
79
80    (* swap first and second raw *)
81    i1:=1;
82    i2:=2;
83    for k:=1 to n do begin
84      b[k]:=a[i1,k];
85    end;
86    for k:=1 to n do begin
87      a[i1,k]:=a[i2,k];
88    end;
89    for k:=1 to n do begin
90      a[i2,k]:=b[k];
91    end;
92
93    (* print updated array *)
94    readln;
95    writeln('Ïîñëå çàìåíû 1-îé è 2-îé ñòðîêè');
96    for i:=1 to n do begin
97      for k:=1 to n do begin
98        write (a[i,k]:5);
99      end;
100      writeln
101    end;
102
103
104
105    max:=-999999;
106    min:=999999;
107    for k:=1 to n do begin
108      b[k]:=0;
109    end;
110
111    for k:=1 to n do begin
112      for i:=1 to n do begin
113        b[k]:=b[k]+(a[i,k]*a[i,k]);
114      end;
115    end;
116
117    for k:=1 to n do begin
118      if b[k]<min then begin
119        min:=b[k];
120        k1:=k;
121      end;
122      if b[k]>max then begin
123        max:=b[k];
124        k2:=k;
125      end;
126    end;
127
128    readln;
129    writeln ('max =',max,'');
130    writeln ('min =',min,'');
131    writeln ('Ïîñëå çàìåíû');
132    for i:=1 to n do begin
133      b[i]:=a[i,k2];
134    end
135    for i:=1 to n do begin
136      a[i,k2]:=a[i,k1];
137    end;
138    for i:=1 to n do begin
139      a[i,k1]:=b[i];
140    end;
141
142    (* print updated array *)
143    for i:=1 to n do begin
144      for k:=1 to n do begin
145        write (a[i,k]:5);
146      end;
147      writeln;
148    end;
149    readln;
150  end.


1-а) const, type, var начинают зоны. Поэтому их лучше писать на отдельной строчке, а содержимое зоны — с отступом.

1-б) Имеет смысл группировать переменные по смыслу, а не по типу. Например, max, min, save — это содержимое массива, а остальные переменные — индексы. Если Вы поменяете тип элементов массива, тип max, min, save поменяется, а тип остальных — нет. (К тому же тип индекса int, а не longint).

1-в) Я рекомендую Вам не экономить на begin-end. Даже если это ровно один оператор, пишите их! Поверьте, искать ошибки гораздо дольше, чем набрать.

1-г) Я использую (проверьте) другую стратегию отступа:
Код:
    for i:=1 to n do begin
            (* код с отступом *)
    end;

т.е., begin находится на той же строчке, что и оператор, а end — под началом оператора. То же самое относится и к if, и к остальным.

Ну, на этот счёт существуют разные конвенции. Я не буду утверждать, что эта — лучшая в мире.

1-е) Никто ещё не разу не жаловался на осмысленные комментарии в программах. Но кроме них, полезно разбивать текст пустыми строками, подобно разбиению текста книги на абзацы — по содержанию. Обратите внимание — циклы в строчках 132-140 работают вместе, и не разбиты пустыми строками.

2) Я не увидел нигде в задании указаний на диапазон случайных чисел. Это кажется мелочью, но накладывает отпечаток на структуру программы. Например, на инициализацию min и max (строки 21, 22), и структуру цикла поиска (см. ниже).

3) Задание n константой может быть и допустимо (это зависит от преподавателя и задачи). Но раз начав, следует это делать последовательно: обратите внимание на инициализацию k в стоке 44.

4) Скриншот, очевидно, не от этой программы. Во-первых, по-видимому, n было равно 3. Во-вторых, в программе исправлена ошибка, видимая на этом скриншоте (min лежит на побочной, а не на главной диагонали).

5) Поиск min (строки 44-52) заметно упростится, если заметить, что k не меняется в цикле (и всё время равно n), а k3 всегда равно i-1 (иными словами, для a[i,j] на побочной диагонали i + j = n + 1). Поэтому и k, и k3 можно убрать.

6) Если элементы массива — произвольные целые, то задача поиска несколько усложняется (поскольку задать min и max за границами диапазона нельзя). Обычный подход — проинициализировать первым элементом, участвующим в поиске (включая инициализацию соответствующих индексов!; он всегда находится, не правда ли), а потом можно либо плюнуть на экономию и оставить всё как есть, либо начать сравнение со следующего (т.е., в Вашем случае, со второй строки).

7) Вы печатаете массив 4 раза. Не пора ли сделать процедуру печати?

8) Переставлять строки так, как это делаете Вы, конечно можно. Но не очень эффективно (на традиционном компьютере, для чистоплюев). Гораздо быстрее и практичнее заметить, что перестановка строк может быть сведена к последовательной перестановке соответствующих элементов.

9) Вы переставляете строки дважды. Ещё одна процедура?

10) Та же самая идея, что и в пункте 8: зачем нам хранить суммы квадратов элементов строк? Ведь вычислив сумму квадратов, мы можем сразу сравнить с текущими значениями min и max, после чего радостно забыть. Кроме того, см. пункты 2 и 5.

В целом, всё хорошо. Программа должна работать. Если у Вас есть вопросы, я готов ответить. Или мы можем перейти к следующей программе.

Добавлено спустя 6 минут 46 секунд:

fiks писал(а):
в)Строки с макс. и мин. суммой квадратов элементов

fiks писал(а):
Это 1 программа,только не соответсвует 3 пункту задания...в задачи я поменял местами столбцы с мин и макс суммой квадратов элементов.
Как мне можно расписать в конце суммы квадратов всех столбцов?
Мне надо,чтобы на экран выводились не только значения столбцов с мин и макс сумм квадратов элементов но и всех остальных...

К сожалению, эта часть задания я пока не могу понять. Попробуйте написать подробнее и понятнее.

На всякий случай: i-тая строка массива A: A[i, 1], A[i, 2],… A[i, n]. i-ый столбец массива A: A[1, i], A[2, i],…A[n, i]. От перестановки индексов способ работы с массивом не меняется.

 
 
 
 
Сообщение30.12.2007, 17:18 
Цитата:
незваный гость

Огромное спасибо! Ценю ваш труд!
Многое возьму на заметку...
Все же,по поводу стратегии отступа,я предпочту свою.
В Вашем методе немного путаюсь...
* :evil: * - этот смайл является обязательной частью Ваших комментариев? :D
По поводу картинки,она действительно другая(сам только что заметил...ну в итоге там нету особых изменений,если только размер массива разный)
Спасибо ещё раз!
Ну в общем,последнее задания я попозже объясню...все же праздники!

С наступающим!!! :D

 
 
 [ Сообщений: 8 ] 


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