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