Задачи по языку С



         

Пояснения:


Стиль программирования 2.1

done=i=0; while(i<MAXI&&!done) { if((x/2)>1) i++; else done++; } Первое наблюдение - конструкция if...continue действует как if...else. Так и используйте if...else.
i=0; while(i<MAXI&&(x/2)>1))i++; Далее становится ясно что:

  • условие продолжения цикла требует, чтобы done было ЛОЖЬ;
  • done - ЛОЖЬ, пока условие в условном операторе ИСТИНА;
  • таким образом, одно из условий продолжения цикла (x/2)>1.

Укажите это явно.

for (i=0; i<MAXI&&(x/2)>1; i++); Оператор while, которому предшествует инициация и который содержит изменение управляющей переменной, есть в точности оператор for.

Стиль программирования 2.2

Обычно некоторую некоторую идею в С можно реализовать многими способами. Полезно объединять эти идеи в некоторые группы (нечто целое). В языке есть несколько уровней представления таких групп:

  • самый низший уровень - идея становится выражением;
  • выражения объединяются в операторы;
  • операторы объединяются в блоки и функции.

В этой задаче существуют два уровня иерархии. На низшем уровне находятся выражения B, D, F и G. Вместе они существуют как взаимоисключающие варианты одного переключателя. Более органичным представлением переключателя будет конструкция if...else if.

if (A) B; else if(C) D; else if(E) F; else G; return;

Стиль программирования 2.3

Самое главное, что надо обнаружить в этой задаче, - это то, что используемая конструкция эквивалентна переключателю с тремя взаимоисключающими вариантами.

plusflg=zeroflg=negflg=0; (if( a>0 ) ++plusflg; (if( a==0 ) ++zeroflg; else ++negflg;

Стиль программирования 2.4

i=0; while((c=getchar())!=EOF&&c!='\n') { if(c!='\n'&&c!='\t') { s[i++]=c; continue; } if(c=='\t') c=' '; s[i++]=c; } Первое, что надо сделать, - это переписать выражения, выделив вложенность операторов. Затем обратить внимание на операторы разрыва и продолжения, действительно ли они нужны. От оператора разрыва легко избавиться, если добавить отрицание его условия к условию в операторе while.
i=0; while((c=getchar())!=EOF&&c!='\n') { if(c!='\t') { s[i++]=c; continue; } if(c=='\t') c=' '; } Теперь можно убрать первое условие в условном операторе. (c!='\n' находится теперь в условии цикла, значит, в теле цикла оно всегда будет истинно.)
i=0; while((c=getchar())!=EOF&&c!='\n') { if(c!='\t') s[i++]=c; else s[i++]=' '; } Оператор продолжения действует как конструкция if...else.
for(i=0; (c=getchar())!=EOF&&c!='\n'; i++) { if(c!='\t') s[i]=c; else s[i]=' '; } Наконец, очевидно, что s[i] - следующий символ, если это не табуляция; иначе же это пробел.
for(i=0; (c=getchar())!=EOF&&c!='\n'; i++) s[i] = c!='\t' ? c : ' '; Другими словами, здесь происходит замена табуляции на пробелы. Последние два варианта показывают это достаточно ясно. Очевидно также и сходство между условным оператором и условным выражением. В этом примере в условном операторе акцент делается на проверке на табуляцию, а в условном выражении - на присваивании s[i].

Стиль программирования 2.5

if (j>k) y=j/(x!=0 ? x : NEARZERO); else y=k/(x!=0 ? x : NEARZERO); В этой задаче очевидно, что x!=0 не основное соображение; проверка просто предохраняет от деления на 0. Условное выражение естественно реализует эту проверку.
y=MAX(j,k)/(x!=0 ? x : NEARZERO); Далее можно прийти к выводу, что основное здесь - присваивание переменной y, которое включает обе проверки (MAX - функция, выдающая наибольший их ее двух параметров).




Содержание  Назад