В массиве B(20) определить элементы, делящиеся на 4 без остатка, и сформировать из них новый массив C, подсчитав количество таких элементов и минимальный и максимальный среди них.
Помогите решить задачу, пожалуйста.
Atos
28.10.2004 19:31
У-у, какая сложная и непонятная задача! ghost, а у тебя самого какие-нибудь мысли есть по поводу решения? Может быть ты даже какие-нито книги по Паскалю читать пробовал?
Atos
28.10.2004 19:33
Ладно, шутю...
Код
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.
Лита
28.10.2004 19:48
Цитата(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.
Лита
28.10.2004 19:52
Цитата(Atos @ 28.10.04 15:33)
Ладно, шутю...
а если в массиве нет отрицательных элементов? а вы минимальному присвоили ноль, а потом сравниваете с ним элементы, делящиеся на 4, которые вовсе необязательно могут быть меньше нуля...
volvo
28.10.2004 19:54
Лита Тогда так:
Код
min:=maxint; max:=-maxint;
Лита
28.10.2004 20:25
Цитата(volvo @ 28.10.04 15:54)
Код
min:=maxint; max:=-maxint;
ну можно и так... <_< так даже попроще... :yes:
Atos
28.10.2004 22:00
Согласен, недосмотрел...
ghost
30.10.2004 19:48
Спасибо всем, что помогли=)
Добавлено (2.11.04 14:00): Как будет выглядеть блок-схема к этой проге?
Гость_Лита
2.11.2004 19:16
Цитата(ghost @ 2.11.04 15:00)
Как будет выглядеть блок-схема к этой проге?
ну как все обыкновенные блок-схемы... :D даже если я ее нарисую, как я ее тут размещу?
APAL
2.11.2004 19:27
Цитата(Гость_Лита @ 2.11.04 16:16)
даже если я ее нарисую, как я ее тут размещу?
Ничего смешного. У нас есть возможность вставки рисунков. В крайнем случае можно картинку закачать в файловый архив, который тоже у нас имеется.
ghost
3.11.2004 0:27
Или можно на мыло мне кинуть.
Лита
3.11.2004 5:56
Цитата(APAL @ 2.11.04 15:27)
Ничего смешного. У нас есть возможность вставки рисунков.
хе... признаю свою оплошность, не посмотрела, что вошла под гостем... исправлюсь...
Лита
3.11.2004 6:31
Цитата(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
12.11.2004 16:39
Немного пределанная прога
Код
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
12.11.2004 16:44
Цитата
А как сделать чтобы в этой проге массив А можно было задать самому, без рандомайза? Как в этом случае будет выглядет блок схема?
В блок-схеме замени b[i]:=random(40) на Readln(b[i])
ghost
12.11.2004 16:48
Ну а в самой проге что надо изменить?
И ещё, в первоначальной блок схеме после начала написано ввод n, m. Мы же ничего не вводим, зачем они?
APAL
12.11.2004 17:40
То что надо изменить я уже обозначил.
Лита
12.11.2004 17:53
Цитата(ghost @ 12.11.04 12:48)
Ну а в самой проге что надо изменить?
И ещё, в первоначальной блок схеме после начала написано ввод n, m. Мы же ничего не вводим, зачем они?
В самой программе меняешь тоже самое: b[i]:=random(40) меняешь на readln(b[i]);
а с n,m я проперлась, осталось с другой блок-схемы. :p2: надо просту выкинуть этот кусок из нее
ghost
13.11.2004 16:39
После замены в проге, можно вводить самому массив А, но как-то странно он вводится. Я ввёл число, нажал enter и то число, которое я ввёл переносится на следующую строку. Пример: 5 56 63 37 79 95 50 07 Как это исправить? И ещё, как сделать чтобы вводимые числа писались не в столбик, а в сторку?
Лита
14.11.2004 9:41
Ну, во-первых там надо было убрать строку 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
24.11.2004 21:27
Большое спасибо, но у меня появилась ещё пара вопросов.
Напишите пожалуйста описание идентификаторов.
Как сделать так, чтобы если введут число не из данного диапозона или введут букву, то появлялось бы надпись, которая сообщала что это не правильно и надо так-то...?
Лита
24.11.2004 22:06
Цитата(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
24.11.2004 22:16
Лита А если без 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;
Лита
24.11.2004 22:22
Цитата(volvo @ 24.11.04 18:16)
А если без Goto?
Можно и без GoTo... ;)
ghost
24.11.2004 22:32
Под описанием я имел в виду, для чего он(идентификатор), какую роль играет в проге. Например, зачем нужны min, max, i, j?
В идентификаторах появилась буква k, опечатка?
"Условие, накладываемое на b[i], не выполняется" А что за условие?
А вот насчёт ограничений, например мне надо чтобы можно было вводить числа от -32768 до 32767. А насчёт буквы, мне как раз надо чтобы прога не прерывалась автоматически, если бы я ввёл букву, а вывела сообщение, что так нельзя и можно было бы работать дальше.
volvo
24.11.2004 23:01
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
24.11.2004 23:45
Ничего не могу понять, куда чего Не мог бы кто-нибудь сделать исправленную (чтобы выводилось сообщение, о том что так нельзя, если будет введена цифра не из диапозона или будет введена буква, другими словами мне нужна "защита от дурака") прогу на основе вот этой:
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
24.11.2004 23:57
ghost Смотри пост выше...
ghost
25.11.2004 0:09
Не работает "защита от дурака" При вводе, например, числа 4 - пишет, что число не в диапозоне (Number not in range -32768 .. 32767. Try once more!), хотя оно в диапозоне. А при вводе буквы, прога автоматически останавливается как и раньше.
GoodWind
25.11.2004 0:12
Цитата
If (next > -32768) and (next < 32767) Then
по моему так:
if not ((next > -32768) and (next < 32767)) then
volvo
25.11.2004 0:31
GoodWind Прав 100%. Я просто не исправил. Сейчас порядок... ghost Смотри программу выше
ghost
25.11.2004 0:47
Спасибо, помогло Но теперь в массив А вводится больше 20 элементов, а должно быть ровно 20.
volvo
25.11.2004 0:48
Не вводится больше 20... вводится ровно 20, исключая ошибочные (я проверял)
ghost
25.11.2004 0:59
В том сообщении, где вы исправляли программу, на основе моей, вводится больше 20 эл-ов.
volvo
25.11.2004 1:09
ghost Ничего подобного - я еще раз перепроверил прямо с того сообщения - вводится ровно 20 элементов...
ghost
25.11.2004 1:17
Хихи, странно, перед тем как написать предыдущее своё сообщение, я проверял, и 20 не получалась, щас получается.=) Моя ошибка, извини=) Всем огромное спасибо!
ghost
30.11.2004 22:20
Помогите пожалуйста Совсем забыл про блок схему. В ней появится какие-нибудь изменения после всех этих переделок? Если да, то какие?
И ещё идентификаторы: min, max, i, j, next, again, todo опишите их роль плиз, для чего служат?
Добавлено (13.12.04 12:30): А как сделать так чтобы, в проге можно было бы обработать кол-во элементов от 2 до 100, а не только 20?
volvo
13.12.2004 17:38
ghost А для чего в программе пишется:
const n=20;
для красоты? По-моему, не только. Меняем на пюбое другое - и программа работает...
Лита
13.12.2004 20:47
volvo ага, вот только еще удостоверится, что массив описан так, что позволяет менять константу на любое другое :D
volvo
13.12.2004 21:13
Лита Я по-другому не пишу... (и Вам не советую)
ghost
14.12.2004 1:57
Цитата(volvo @ 13.12.04 13:38)
ghost А для чего в программе пишется:
Код
const n=20;
для красоты? По-моему, не только. Меняем на пюбое другое - и программа работает...
Нет, я имел в виду, чтобы прога спрашивала у юзера, сколько эл-ов он хочет обработать и, соответсвенно, обрабатывала это кол-во.
volvo
14.12.2004 2:44
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
14.12.2004 2:46
Есть как минимум два способа, чтобы
Цитата
чтобы прога спрашивала у юзера, сколько эл-ов он хочет обработать и, соответсвенно, обрабатывала это кол-во
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
14.12.2004 2:49
mithquessir :nono: Неверно... Не нужно вводить количество элементов в цикле (смысл какой?), это нужно делать в самом начале работы программы... Не вводи народ в заблуждение...
mithquessir
14.12.2004 2:59
Упс. Опечатка Исправил
ghost
14.12.2004 18:31
Big thx
ghost
22.12.2004 23:56
Спасите меня с блок схемой плз, никак не получается
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.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.