Форум » Обработка числовых последовательностей » С4 №50 » Ответить

С4 №50

п: Здравствуйте! В решении этой задачи Вы используете оператор BREAK. (Можно обойтись и без него с помощью WHILE или REPEAT. Но с оператором BREAK как-то "по-крестьянски" проще.) Я слышала, что использование этого оператора не приветствуется проверяющими. Так ли это?

Ответов - 11

Поляков: п пишет: Я слышала, что использование этого оператора не приветствуется проверяющими. Так ли это? Нигде в критериях оценки работ я не видел, чтобы за использование break снижались баллы. Мое (спорное) мнение по поводу break можно посмотреть в блоге.

проол: Спасибо! Еще хотелось бы спросить, почему решение так закручено: создание массива маленьких чисел, сравнение каждого со значением этого массива... Разве не проще так: program qqq; const n=555; var f,i,nom:integer; max,a: real; begin max:=0; f:=0; For i:= 1 to n do begin readln(a); if (a<1)and (a>max) then begin max:= a; nom:=i; end; if a>1 then begin writeln('номер',i); f:=1; end; end; if f=0 then writeln('номер',nom); end. Неудобство только в том, что ввод данных перемежается с выводом результатов. Это существенно?

Поляков: проол пишет: Неудобство только в том, что ввод данных перемежается с выводом результатов. Это существенно? Да. Возможно, в критериях у проверяющих это будет прописано.


проол: Здравствуйте! Предлагаю другое решение задачи №50. program qqq; const n=5; type nom=set of byte; var f,i,j:integer; max,a: real; MNN:nom; begin max:=0; For i:= 1 to n do begin readln(a); if (a<1)and (a>max) then begin max:= a; j:=i; end; if a>=1 then begin f:=1; Include(MNN,i); end; end; if f=0 then writeln(j) else for i:=1 to n do if i in MNN then begin write(i:5); Exclude(MNN,i); end; end. Хотелось бы учесть Ваши замечания.

Поляков: >> Сигналов может быть очень много,... Если вы взяли set of byte, можете зафиксировать только 255 значений. Не пойдет.

Lavanda: Вот мой вариант: var n,i,m,j,nmax:integer; x,max:real; a:array[1..10] of integer; begin readln(n); for i:=1 to 10 do a:=0; max:=0; nmax:=0; m:=0; for i:=1 to n do begin readln(x); if (x<1) and (x>max) then begin max:=x; nmax:=i end; if x<1 then begin m:=m+1; a[m]:=i end; end; if n=m then writeln(nmax) else begin j:=1; for i:=1 to n do if (a[j]=0) or (i<a[j]) then write(i,' ') else j:=j+1 end; writeln; readln end. В массиве А я запоминаю только номера которые не будут печататься (их м.б. не больше 9) и поскольку они там получаются отсортированными, то цикл в цикле не нужен

Поляков: Lavanda пишет: поскольку они там получаются отсортированными Не уверен.

DF:

Lavanda: 100% В массиве А никак не сохраняются значения найденных маленьких чисел (меньших единицы), а только их номера, т.е. А[1] - это номер первого встретившегося в потоке числа меньшего единицы, само число при этом м.б. равно 0.5 В тексте программы, к сожалению, неправильно отобразилась строка начального заполнения массива А нулями (после Readln(n))

oval: Lavanda в вашем решении есть ошибка, при N>10 возможен выход за пределы массива в строке if (a[j]=0) or (i<a[j]) then write(i,' ') else j:=j+1 можно изменить условие на (j>10) or (a[j]=0) or (i<a[j]) А в общем, Ваше решение действительно проще. Константин Юрьевич, я думаю это решение стоит включить в answC4.doc

Поляков: oval пишет: думаю это решение стоит включить в answC4.doc Добавлено.



полная версия страницы