Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача с массивом...
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
ghost
В массиве B(20) определить элементы, делящиеся на 4 без остатка, и сформировать из них новый массив C, подсчитав количество таких
элементов и минимальный и максимальный среди них.
blink.gif
Помогите решить задачу, пожалуйста.
Atos
blink.gif У-у, какая сложная и непонятная задача!
ghost, а у тебя самого какие-нибудь мысли есть по поводу решения?
Может быть ты даже какие-нито книги по Паскалю читать пробовал?
Atos
Ладно, шутю...
Код

type TElem=byte;
    Arr=array [1..20] of TElem;

procedure Obrabotka(B:Arr; var C:Arr; var max,min,kol:TElem);
var i:TElem;
begin
min:=0;
max:=0;
kol:=0;
for i:=1 to 20 do
  begin
  if (B[i]<>0) and ((B[i] mod 4)=0) then
     begin
     if B[i]>max then max:=B[i];
     if B[i]<min then min:=B[i];
     inc(kol);
     C[kol]:=B[i];
     end;
  end;
end;


var B,C:Arr;
   i,max,min,kol:Telem;
begin
randomize;
for i:=1 to 20 do B[i]:=random(100);
writeln('array B:');
for i:=1 to 20 do write(B[i],' ');
writeln(' ');
Obrabotka(B,C,max,min,kol);
if kol=0 then writeln('No exist elements that is division of 4')
  else begin
       writeln('array C:');
       for i:=1 to kol do write(C[i],' ');
       writeln(' ');
       writeln('min elements equal ',min);
       writeln('max elements equal ',max);
       writeln('in array C ', kol ,' elements');
       end;
readln;
end.
Лита
Цитата(ghost @ 28.10.04 15:04)
В массиве B(20) определить элементы, делящиеся на 4 без остатка, и сформировать из них новый массив C, подсчитав количество таких
элементов и минимальный и максимальный среди них.

Код

Uses crt;
const n=20;
Var b,c:array [1..n] of integer;
   min,max,i,j:integer;
BEGIN
clrscr;
Randomize;
For i:=1 to n do
begin
b[i]:=random(40);
write(b[i]:5);
end;
j:=0;
For i:=1 to n do
begin
If b[i] mod 4=0 then
 begin
 inc(j);
 c[j]:=b[i];
 If j=1 then
        begin
        max:=c[j];
        min:=c[j];
        end
        else
        begin
        If c[j]<min then min:=c[j];
        If c[j]>max then max:=c[j];
        end;
 end;
end;
writeln;
For i:=1 to j do
write(c[i]:4);
writeln;
writeln('vsego elementov ',j);
writeln('max=',max,'    min=',min);
readln;
end.
Лита
Цитата(Atos @ 28.10.04 15:33)
Ладно, шутю...

а если в массиве нет отрицательных элементов? а вы минимальному присвоили ноль, а потом сравниваете с ним элементы, делящиеся на 4, которые вовсе необязательно могут быть меньше нуля... blink.gif
volvo
Лита
Тогда так:

Код
min:=maxint;
max:=-maxint;
Лита
Цитата(volvo @ 28.10.04 15:54)
Код

min:=maxint;
max:=-maxint;

ну можно и так... <_< так даже попроще... :yes:
Atos
huh.gif Согласен, недосмотрел...
ghost
Спасибо всем, что помогли=)

Добавлено (2.11.04 14:00):
Как будет выглядеть блок-схема к этой проге?
Гость_Лита
Цитата(ghost @ 2.11.04 15:00)
Как будет выглядеть блок-схема к этой проге?

huh.gif ну как все обыкновенные блок-схемы... :D
даже если я ее нарисую, как я ее тут размещу? huh.gif
APAL
Цитата(Гость_Лита @ 2.11.04 16:16)
даже если я ее нарисую, как я ее тут размещу?  huh.gif

Ничего смешного. У нас есть возможность вставки рисунков.
В крайнем случае можно картинку закачать в файловый архив, который тоже у нас имеется.
ghost
Или можно на мыло мне кинуть.
Лита
Цитата(APAL @ 2.11.04 15:27)
Ничего смешного. У нас есть возможность вставки рисунков.

хе... признаю свою оплошность, не посмотрела, что вошла под гостем...
исправлюсь...
Лита
Цитата(ghost @ 2.11.04 20:27)
Или можно на мыло мне кинуть.

Вот... щас попробую прикрепить блок-схему...
только я немного изменила прогу...
Код

Uses crt;
const n=20;
Var b,c:array [1..n] of integer;
   min,max,i,j:integer;
BEGIN
clrscr;
Randomize;
For i:=1 to n do
begin
b[i]:=random(40);
write(b[i]:5);
end;
j:=0;
For i:=1 to n do
begin
If b[i] mod 4=0 then
 begin
 inc(j);
 c[j]:=b[i];
   If j=1 then
        begin
        max:=c[j];
        min:=c[j];
        end
        else
        begin
        If c[j]<min then min:=c[j];
        If c[j]>max then max:=c[j];
        end;
 end;
end;
writeln;
If k>0 then
begin
For i:=1 to j do
write(c[i]:4);
writeln;
writeln('vsego elementov ',j);
writeln('max=',max,'    min=',min);
end
else
writeln('Net elementov kratnih 4');
readln;
end.
ghost
Немного пределанная прога


Код

Uses crt;
const n=20;
label   e1, e2;
Var b,c:array [1..n] of integer;
  min,max,i,j:integer;
begin
  clrscr;
    gotoxy(18,10);
  writeln('текст');
    gotoxy(18,11);
  writeln('текст ');
    gotoxy(18,12);
  writeln('текст');
    readkey;
e1:
clrscr;
Randomize;
writeln ('Массив А');
For i:=1 to n do
begin
b[i]:=random(40);
write(b[i]:5);
end;
gotoxy (1,4);
writeln ('Массив C');
j:=0;
For i:=1 to n do
begin
If b[i] mod 4=0 then
begin
inc(j);
c[j]:=b[i];
  If j=1 then
       begin
       max:=c[j];
       min:=c[j];
       end
       else
       begin
       If c[j]<min then min:=c[j];
       If c[j]>max then max:=c[j];
       end;
end;
end;
writeln;
If j>0 then
begin
For i:=1 to j do
write(c[i]:4);
writeln;
writeln('Всего элементов ',j);
writeln('max=',max,'    min=',min);
end
else
writeln('Нет элементов кратных 4');
e2:
  gotoxy(5,20);
   writeln('Вы хотите сделать ещё один массив? y/n');
     gotoxy(25,21);
   case readkey of
   #89: goto  e1;
   #121: goto e1;
   #78: exit;
   #110: exit;
end;
goto e2;
end.

А как сделать чтобы в этой проге массив А можно было задать самому, без рандомайза?
Как в этом случае будет выглядет блок схема?
APAL
Цитата
А как сделать чтобы в этой проге массив А можно было задать самому, без рандомайза? Как в этом случае будет выглядет блок схема?

В блок-схеме замени b[i]:=random(40) на Readln(b[i])
ghost
Ну а в самой проге что надо изменить?

И ещё, в первоначальной блок схеме после начала написано ввод n, m.
Мы же ничего не вводим, зачем они?
APAL
То что надо изменить я уже обозначил.
Лита
Цитата(ghost @ 12.11.04 12:48)
Ну а в самой проге что надо изменить?

И ещё, в первоначальной блок схеме после начала написано ввод n, m.
Мы же ничего не вводим, зачем они?

В самой программе меняешь тоже самое:
b[i]:=random(40) меняешь на readln(b[i]);

а с n,m я проперлась, осталось с другой блок-схемы. :p2: надо просту выкинуть этот кусок из нее
ghost
После замены в проге, можно вводить самому массив А, но как-то странно он вводится. Я ввёл число, нажал enter и то число, которое я ввёл переносится на следующую строку.
Пример:
5
56
63
37
79
95
50
07
Как это исправить?
И ещё, как сделать чтобы вводимые числа писались не в столбик, а в сторку?
Лита
Ну, во-первых там надо было убрать строку write(b[i]:5);
А чем тебя не устраивает в столбик?
можно, конечно, поставить read(b[i]) и вводить числа через пробел, но нас учили, что иногда может неккорктно читаться информация...
А вообще, в таких случаях для красоты я делаю так: :D
Код

BEGIN
clrscr;
Randomize;
For i:=1 to n do
readln(b[i]);
clrscr;
For i:=1 to n do
write(b[i]:5);
writeln;

получается, что вводишь числа в столбик, потом отчищается экран и выводится массив в строку...
ghost
Большое спасибо, но у меня появилась ещё пара вопросов.

Напишите пожалуйста описание идентификаторов.

Как сделать так, чтобы если введут число не из данного диапозона или введут букву, то появлялось бы надпись, которая сообщала что это не правильно и надо так-то...?
Лита
Цитата(ghost @ 24.11.04 17:27)
В массиве B(20) определить элементы, делящиеся на 4 без остатка, и сформировать из них новый массив C, подсчитав количество таких
элементов и минимальный и максимальный среди них.

Как сделать так, чтобы если введут число не из данного диапозона или введут букву, то появлялось бы надпись, которая сообщала что это не правильно и надо так-то...?

Описание идентификаторов я уже писала:
Код

Uses crt;
const n=20;
Var b,c:array [1..n] of integer;
  min,max,i,j,k:integer;


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

Uses crt;
const n=20;
Var b,c:array [1..n] of integer;
  min,max,i,j,k:integer;
Label a;

i:=0;
Repeat
 inc(i);
 a:readln(b[i]);
 If {условие, накладываемое на b[i], не выполняется} then
            begin
            writeln('TRY once more!');
            goto a;
            end;
Until i>=20;
volvo
Лита
А если без Goto?
var ToDo: Boolean;
...
Repeat
 inc(i);

 repeat
   ToDo := False;
   readln(b[i]);
   If {условие, накладываемое на b[i], не выполняется} then
     begin
       writeln('TRY once more!'); ToDo := True
     end;
 until ToDo;

Until i>=20;
Лита
Цитата(volvo @ 24.11.04 18:16)
А если без Goto?

Можно и без GoTo... ;)
ghost
Под описанием я имел в виду, для чего он(идентификатор), какую роль играет в проге. Например, зачем нужны min, max, i, j?

В идентификаторах появилась буква k, опечатка?

"Условие, накладываемое на b[i], не выполняется" А что за условие?

А вот насчёт ограничений, например мне надо чтобы можно было вводить числа от -32768 до 32767. А насчёт буквы, мне как раз надо чтобы прога не прерывалась автоматически, если бы я ввёл букву, а вывела сообщение, что так нельзя и можно было бы работать дальше.
volvo
ghost
Во первых, в переменную типа Integer нельзя занести значение не попадающие в интервал от -32768 до 32767... Поэтому я делаю по другому:


Var
 {Вводим данные в тип LongInt, как более емкий по сравнению с Integer}
 next: LongInt;
...
i := 0;
Repeat
inc(i);

repeat

  (* Отключаем реакцию на ошибки ввода-вывода, читаем значение, и включаем
контроль снова (при выключенном контроле ввод буквы вместо числа приведет
к тому, что в переменную IOResult запишется код ошибки, но аварийного останова
не произойдет) *)

  {$I-} readln(next); {$I+}
  ToDo := False
  If (next < -32768) or (next > 32767) Then
    Writeln('Number not in range -32768 .. 32767. Try once more!')
  Else If IOResult <> 0 Then
           Writeln('Wrong format was entered. Try once more!')
         Else
           Begin
             b[i] := next;
{ Только здесь можно быть уверенным, что не было ошибки
при вводе данных и число находится в требуемом диапазоне.
Тогда присваиваем очередной элемент массива введенному
числу и переходим к след. элементу.}

             ToDo := True;
           End;
until ToDo;

Until i>=20;

ghost
Ничего не могу понять, куда чего blink.gif
Не мог бы кто-нибудь сделать исправленную (чтобы выводилось сообщение, о том что так нельзя, если будет введена цифра не из диапозона или будет введена буква, другими словами мне нужна "защита от дурака") прогу на основе вот этой:

Uses crt;
const n=20;
Var        b,c:array [1..n] of integer;
  min,max,i,j:integer;
  next: LongInt;
  Again, ToDo: Boolean;
begin
  clrscr;
    gotoxy  (12,10);
   writeln ('Данная программа задаёт массив А, выбирает из него числа');
    gotoxy  (15,11);
   writeln ('кратные 4 и создаёт из этих чисел новый массив С. ');
    gotoxy  (19,12);
   writeln ('Элементами вашего массива должны быть');
    gotoxy  (20,13);
   writeln ('целые числа от -32768 до 32767.');
    gotoxy  (12,15);
   writeln (текст');
    gotoxy  (27,16);
   writeln ('текст');
    gotoxy  (18,17);
   writeln ('Нажмите любую клавишу для продолжения');
    readkey;

Again := True;
While Again Do
Begin
 clrscr;
   writeln ('Вводите числа в диапозоне от -32768 до 32767');
   writeln ('Массив А');

 Begin
 For i:=1 to n do
   Repeat
     {$I-} readln(next); {$I+}
     ToDo := False;
     If (next < -32768) or (next > 32767) Then
       Writeln('Number not in range -32768 .. 32767. Try again!')
     Else If IOResult <> 0 Then
              Writeln('Wrong format was entered. Try again!')
            Else
              Begin
                b[i] := next; ToDo := True
              End;
   Until ToDo;

 clrscr;
   writeln ('Массив А');
 For i:=1 to n do
   write(b[i]:5);
   writeln;
 End;

    gotoxy (1,5);
   writeln ('Массив C');
     j:=0;
 For i:=1 to n do
begin
 If b[i] mod 4=0 then
begin
 inc(j);
  c[j]:=b[i];
   If j=1 then
       begin
       max:=c[j];
       min:=c[j];
       end
       else
       begin
       If c[j]<min then min:=c[j];
       If c[j]>max then max:=c[j];
       end;
end;
end;
writeln;
If j>0 then
begin
For i:=1 to j do
  write(c[i]:4);
  writeln;
  writeln('Всего элементов ',j);
  writeln('max=',max,' min=',min);
end
else
  writeln('Нет элементов кратных 4');

   writeln('Вы хотите сделать ещё один массив? y/n');
   case UpCase(readkey) of
   #89:;
   #78: Again := False;
   end;
End; { While Again }
end.

Я исправил программу. Должна работать.
volvo
ghost
Смотри пост выше...
ghost
Не работает "защита от дурака" sad.gif
При вводе, например, числа 4 - пишет, что число не в диапозоне (Number not in range -32768 .. 32767. Try once more!), хотя оно в диапозоне.
А при вводе буквы, прога автоматически останавливается как и раньше.
GoodWind
Цитата
If (next > -32768) and (next < 32767) Then

по моему так:
if not ((next > -32768) and (next < 32767)) then
volvo
GoodWind
Прав 100%. Я просто не исправил. Сейчас порядок...
ghost
Смотри программу выше
ghost
Спасибо, помогло rolleyes.gif
Но теперь в массив А вводится больше 20 элементов, а должно быть ровно 20.
volvo
Не вводится больше 20... вводится ровно 20, исключая ошибочные (я проверял)
ghost
В том сообщении, где вы исправляли программу, на основе моей, вводится больше 20 эл-ов.
volvo
ghost
Ничего подобного - я еще раз перепроверил прямо с того сообщения - вводится ровно 20 элементов...
ghost
Хихи, странно, перед тем как написать предыдущее своё сообщение, я проверял, и 20 не получалась, щас получается.=)
Моя ошибка, извини=)
Всем огромное спасибо!
ghost
Помогите пожалуйста
Совсем забыл про блок схему. В ней появится какие-нибудь изменения после всех этих переделок? Если да, то какие?

И ещё идентификаторы:
min, max, i, j, next, again, todo опишите их роль плиз, для чего служат?

Добавлено (13.12.04 12:30):
А как сделать так чтобы, в проге можно было бы обработать кол-во элементов от 2 до 100, а не только 20?
volvo
ghost
А для чего в программе пишется:
const n=20;

для красоты? По-моему, не только. Меняем на пюбое другое - и программа работает...
Лита
volvo
ага, вот только еще удостоверится, что массив описан так, что позволяет менять константу на любое другое :D
volvo
Лита
Я по-другому не пишу... (и Вам не советую) angry.gif
ghost
Цитата(volvo @ 13.12.04 13:38)
ghost
А для чего в программе пишется:
Код
const n=20;

для красоты? По-моему, не только. Меняем на пюбое другое - и программа работает...

Нет, я имел в виду, чтобы прога спрашивала у юзера, сколько эл-ов он хочет обработать и, соответсвенно, обрабатывала это кол-во.
volvo
ghost
Тогда измени самое начало программы вот так:

Uses crt;
const maxN=200; { можно и больше }
Var        b,c:array [1..maxN] of integer;
 min,max,i,j:integer;
 next: LongInt;
 Again, ToDo: Boolean;

Var n: Integer;
begin
 repeat
   write('n = '); readln(n)
 until (n >= 2) and (n <= maxN);
 clrscr;
 ... { далее - без изменений }
end.

mithquessir
Есть как минимум два способа, чтобы
Цитата
чтобы прога спрашивала у юзера, сколько эл-ов он хочет обработать и, соответсвенно, обрабатывала это кол-во

1. Меняешь:
Код

const maxn=1000;
Var        b,c:array [1..maxn] of integer;
 min,max,i,j,n:integer;
 next: LongInt;
 Again, ToDo: Boolean;

Затем до
Код

While Again Do
Begin
clrscr;
...

пишешь:
Код

WriteLn('Cколько эл-ов вы хотите обработать?');
ReadLn(n);

2. Динамическое программирование. Про него можно почитать в ФАК`е.
volvo
mithquessir
:nono: Неверно... Не нужно вводить количество элементов в цикле (смысл какой?), это нужно делать в самом начале работы программы... Не вводи народ в заблуждение...
mithquessir
Упс. blink.gif
Опечатка
Исправил
ghost
Big thx smile.gif
ghost
Спасите меня с блок схемой плз, никак не получается

Uses crt;
const maxn=200;
Var        b,c:array [1..maxn] of integer;
 min,max,i,j,error:integer;
 next: LongInt;
 Again, ToDo: Boolean;
Var n: Integer;
label e1;
begin
 clrscr;
   gotoxy  (12,10);
  writeln ('Данная программа задаёт массив А, выбирает из него числа');
   gotoxy  (15,11);
  writeln ('кратные 4 и создаёт из этих чисел новый массив С. ');
   gotoxy  (19,13);
  writeln ('Элементами вашего массива должны быть');
   gotoxy  (20,14);
  writeln ('целые числа от -32768 до 32767.');
   gotoxy  (12,16);
  writeln ('текст');
   gotoxy  (27,17);
  writeln ('текст');
   gotoxy  (18,19);
  writeln ('Нажмите любую клавишу для продолжения');
   readkey;

e1:
Again := True;
clrscr;
repeat
  write('Сколько эл-ов вы хотите обработать? (Кол-во эл-ов от 2 до 200!!!)');
  {$I-}
  readln(n);
  error:=ioresult;{$I+}
  IF (n<2) or (n>maxn) OR (ERROR<>0)
  then  writeln ('Ошибка! Кол-во эл-ов от 2 до 200!');
until (n >= 2) and (n <= maxN) AND (ERROR=0);
 clrscr;
While Again Do
Begin
 clrscr;
  writeln ('Вводите целые числа в диапозоне от -32768 до 32767');
  writeln ('Массив А');
Begin
For i:=1 to n do
  Repeat
    {$I-} readln(next); {$I+}
    ToDo := False;
    If (next < -32768) or (next > 32767) Then
      Writeln('Введённое вами число вне диапозона (-32768 .. 32767). Повторите ввод!')
    Else If IOResult <> 0 Then
             Writeln('Введён неверный формат. Повторите ввод!')
           Else
             Begin
               b[i] := next; ToDo := True
             End;
  Until ToDo;

clrscr;
  writeln ('Массив А');
For i:=1 to n do
  write(b[i]:5);
  writeln;
End;

   gotoxy (1,5);
  writeln ('Массив C');
    j:=0;
For i:=1 to n do
begin
If b[i] mod 4=0 then
begin
inc(j);
 c[j]:=b[i];
  If j=1 then
      begin
      max:=c[j];
      min:=c[j];
      end
      else
      begin
      If c[j]<min then min:=c[j];
      If c[j]>max then max:=c[j];
      end;
end;
end;
writeln;
If j>0 then
begin
For i:=1 to j do
 write(c[i]:5);
 writeln;
 writeln('Всего элементов ',j);
 writeln('max=',max,' min=',min);
end
else
 writeln('Нет элементов кратных 4');

  writeln('Вы хотите сделать ещё один массив? y/n');
  case UpCase(readkey) of
  #89:goto e1;
  #121:goto e1;
  #78: exit;
  #110: exit;
  end;
End; { While Again }
end.

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.