Синтаксис и семантика операторов языка Си 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Синтаксис и семантика операторов языка Си



 

3.1. Перечислить все ситуации, когда в программах на Си используется составной оператор.

 

3.2. В Си точка с запятой используется в качестве признака конца оператора; в Паскале - в качестве разделителя операторов. Сравните эти решения, сформулируйте возможные «за» и «против».

 

3.3. Эквивалентны ли следующие фрагменты программы:

if (e1) if (e2) S1; else S2;

if (e1) { if (e2) S1; else S2; }

if (e1) { if (e2) S1; } else S2;

if (e1) if (e2) S1; else; else S2;

if (e1) if (e2) S1; else S2; else;

Замечание: здесь e1 и e2 - выражения допустимого в этом случае типа; S1 и S2 - произвольные операторы.

 

3.4. Описать в виде блок-схемы семантику каждого оператора цикла в Си (с учетом операторов break и continue, которые, возможно, содержатся в теле цикла).

3.5. Может ли быть определено число итераций цикла for до начала его выполнения?

a) в Паскале

b) в Си

3.6. Верно ли решена задача: «найти сумму первых 100 натуральных чисел»?

a) i = 1; sum = 0;

for (; i <= 100; i++) sum += i;

b) sum = 0;

for (i = 1; i <= 100;) sum += i++;

c) for (i = 1, sum = 0; i <= 100; sum += i+, i++);

d) for (i = 1, sum = 0; i <= 100; sum += i++);

e) for (i = 0, sum = 0; i++, i <= 100; sum += i);

 

3.7. Выразить семантику цикла for с помощью цикла while. Эквивалентны ли полученные фрагменты программ?

 

3.8. Эквивалентны ли следующие фрагменты программы:

a) for (; e2;) S; и while (e2) S;

b) for (;;) S; и while (1) S;

Замечание: здесь e2 - выражение допустимого в этом случае типа;
S - произвольный оператор.

 

3.9. Можно ли написать фрагмент программы на Си, эквивалентный данному, используя один оператор цикла for с пустым оператором в качестве тела цикла?

i = 0; c = getchar();

while (c!= ’ ’ && c!= ’\n’ && c!=’ \t’ && c!= EOF)

{ i++; c = getchar(); }

 

3.10. Сравнить семантику операторов repeat в Паскале и do-while в Си.

 

3.11. Улучшить стиль (структуру) следующих фрагментов программы на Си:

a) while (E1)

{ if (E2) continue; S; }

b) do { if (E1) continue; else S1; S2; }

while (E2);

Замечание: здесь E1, E2 - выражения допустимого в этом случае типа; S, S1, S2 - произвольные операторы.

 

3.12. Что напечатает следующая программа?

# include <stdio.h>

main()

{ int x, y, z;

x = y = 0;

while (y < 10) ++y; x += y;

printf ("x = %d y = %d\n", x, y);

x = y = 0;

while (y < 10) x += ++ y;

printf (" x= %d y = %d\n", x, y);

y = 1;

while (y < 10) { x = y ++; z = ++y;}

printf ("x = %d y = %d z = %d\n", x, y, z);

for (y =1; y < 10; y++) x = y;

printf (" x= %d y = %d\n", x, y);

for (y = 1; (x = y) < 10; y++);

printf ("x = %d y = %d\n", x, y);

for (x = 0, y = 1000; y > 1; x++, y /= 10)

printf ("x = %d y = %d\n", x, y);

}

3.13. Сравнить семантику операторов case в Паскале и switch в Си.

 

3.14. Верны ли следующие утверждения:

a) «любое выражение в Си может быть преобразовано в оператор добавлением к нему точки с запятой (;)»

b) «пустой оператор в Си - это отсутствие каких-либо символов в том месте конструкции, где по синтаксису может находиться оператор»

c) «составной оператор (блок) в Си - это совокупность операторов, заключенная в фигурные скобки { }»

d) «оператор присваивания в Си - это выражение вида

переменная = выражение»

e) «тип выражения в условии в операторе if, в условии завершения цикла в операторах цикла может быть скалярным (т.е. любым целочисленным, любым вещественным либо указателем)»

f) «в блоке описания/объявления и операторы могут располагаться в любом порядке; единственное требование - использование не должно предшествовать описанию/объявлению»

e) «цикл for (;;) является бесконечным циклом, и поэтому его использование в Си запрещено»

f) «семантика операторов цикла while и do-while в Си различается только тем, что тело цикла while может не выполниться ни разу, а тело цикла do-while выполнится хотя бы один раз.»

g) «каждая ветвь в операторе switch должна быть помечена одной или несколькими различными целочисленными константами или константными выражениями»

h) «если в операторе switch нет ветви default, то значение выражения выбора должно совпадать с одной из констант ветвей case»

i) «в операторе switch ветви case и ветвь default можно располагать в любом порядке»

 

3.15. Верно ли утверждение: «действие оператора continue; в приведенных ниже примерах эквивалентно действию оператора go to next;».

a) while (E) { S;... continue;... S; next:; }

b) do { S;... continue;... S; } while (E); next:;...

c) for (E1; E2; E3) { S;... continue;... S; next:; }

d) while (E) { S;... for (E1;E2;E3) { S;... continue;... S; }... S; next:; }

e) while (E) { S;... for (E1;E2;E3) { S;... continue;... S; next:; }... S;}

f) switch (E) { case C1: S;

case C2: S; continue;

case C3: S; }

next:;...

g) switch (E) { case C1: S;

case C2: S; continue;

case C3: next: S; }

h) next: switch (E) { case C1: S;

case C2: S; continue;

case C3: S; }

Замечание: здесь E, E1, E2, E3 - выражения допустимого в этом случае типа; S - произвольный оператор; C1, C2 C3 - константы подходящего типа.

 

3.16. Верно ли утверждение: «действие оператора break; в приведенных ниже примерах эквивалентно действию оператора go to next;».

a) while (E) { S;... break;... S; next:; }

b) while (E) { S;... break;... S; } next:;...

c) do { S;... break;... S; } while (E); next:;...

d) for (E1; E2; E3) { S;... break;... S; next:; }

e) while (E) { S;... for (E1; E2; E3) { S;... break;... S; } next:;... S; }

f) while (E) { S;... for (E1; E2; E3) { S;... break;... S; }... S; next:; }

g) while (E) { S;... for (E1; E2; E3) { S;... break;... S; }... S; } next:;

h) switch (E) { case C1: S;

case C2: S; break;

case C3: S; }

next:;...

i) switch (E) { case C1: S;

case C2: S; break; S;

case C3: next: S; }

Замечание: здесь E, E1, E2, E3 - выражения допустимого в этом случае типа; S - произвольный оператор; C1, C2 C3 - константы подходящего типа.

 

Обработка числовых данных

 

Замечание: при решении некоторых задач этого раздела необходимы минимальные знания о «стандартном» вводе и выводе целых и вещественных чисел.

 

3.17. Для данных чисел a, b и c определить, сколько корней имеет уравнение ax2+bx+c = 0, и распечатать их. Если уравнение имеет комплексные корни, то распечатать их в виде v ± iw.

 

3.18. Подсчитать количество натуральных чисел n (111 £ n £ 999), в записи которых есть две одинаковые цифры.

 

3.19. Подсчитать количество натуральных чисел n (102 £ n £ 987), в которых все три цифры различны.

 

3.20. Подсчитать количество натуральных чисел n (11 £ n £ 999), являющихся палиндромами, и распечатать их.

 

3.21. Подсчитать количество цифр в десятичной записи целого неотрицательного числа n.

 

3.22. Определить, верно ли, что куб суммы цифр натурального числа n равен n2.

 

3.23. Определить, является ли натуральное число n степенью числа 3.

 

3.24. Для данного вещественного числа a среди чисел 1, 1 + (1/2), 1 + (1/2) + (1/3),... найти первое, большее a.

 

3.25. Для данного вещественного положительного числа a найти наименьшее целое положительное n такое, что 1 + 1/2 +1/3+... + 1/n > a.

 

3.26. Даны натуральное число n и вещественное число x. Среди чисел exp(cos(x2k))sin(x3k) (k = 1, 2,..., n) найти ближайшее к какому-нибудь целому.

 

3.27. Дано натуральное число n. Найти значение числа, полученного следующим образом: из записи числа n выбросить цифры 0 и 5, оставив прежним порядок остальных цифр.

 

3.28. Дано натуральное число n. Получить все такие натуральные q, что n делится на q2 и не делится на q3.

 

3.29. Дано натуральное число n. Получить все его натуральные делители.

 

3.30. Дано целое число m > 1.Получить наибольшее целое k, при котором 4k < m.

 

3.31. Дано натуральное число n. Получить наименьшее число вида 2r, превосходящее n.

 

3.32. Распечатать первые n простых чисел (p - простое число, если
p >= 2 и делится только на 1 и на себя).

 

3.33. Даны вещественные числа x и y (x > 0, y > 1). Получить целое число k (положительное, отрицательное или равное нулю), удовлетворяющее условию yk-1 £ x < yk.

 

3.34. Распечатать первые n чисел Фибоначчи (f0 = 1; f1 = 1; fk+1 = fk-1+ fk;
k = 1, 2, 3,...)

 

3.35. Вычислить с точностью eps > 0 значение «золотого сечения» - 0.5*(1+Ö5) - предел последовательности { qi }при i ® ¥

qi = fi / fi-1, i = 2, 3,...где fi - числа Фибоначчи (см. предыдущую задачу).

Считать, что требуемая точность достигнута, если | qi-qi+1| < eps.

3.36. Распечатать числа Фибоначчи (см. задачу 3.34), являющиеся простыми числами со значениями меньше n.

 

3.37. Вычислить с точностью eps > 0 значение числа e - предел последовательности { xi }при i ® ¥

xi = (1+1/i)i, i = 1, 2,...

Считать, что требуемая точность достигнута, если | xi-xi+1| < eps.

 

3.38. Вычислить значение å i! для i, изменяющихся от 1 до n. Воспользоваться соотношением å i! = 1 + 1*2 + 1*2*3 +...+ 1*2*3*...*n = 1+2*(1+3*(1+ +n*(1)...)).

 

3.39. Пусть a0 и b0 - положительные вещественные числа. Соотношениями an+1 = Ö(anbn); bn+1 = (an+bn) / 2 при n = 0, 1, 2,... задаются две бесконечные числовые последовательности {an}и {bn}, которые сходятся к общему пределу M(a0,b0), называемому арифметико-геометрическим средним чисел a0 и b0. Найти приближенное значение M(a0,b0) с точностью eps > 0. Поскольку при
a0 < b0 ai < bi и, более того, a0 < a1 <... < ai <... bi <... < b1 < b0, то в качестве подходящего критерия прекращения вычислений можно использовать соотношение | ai - bi | < eps.

 

3.40. Вычислить квадратные корни вещественных чисел x = 2.0, 3.0,..., 100.0. Распечатать значения x, Öx, количество итераций, необходимых для вычисления корня с точностью eps > 0.

Для a > 0 величина Öa вычисляется следующим образом:

a0 = 1; ai+1 = 0.5*(ai+a/ai ) i = 0, 1, 2,...

Считать, что требуемая точность достигнута, если | ai-ai+1| < eps.

 

3.41. Найти приближенное значение числа p с точностью eps > 0. Для этого можно использовать представление числа 2/p в виде произведения корней Ö(1/2) *Ö(1/2+1/2Ö(1/2))*Ö(1/2+ 1/2Ö(1/2+1/2Ö(1/2)))*.... Вычисления прекращаются, когда два следующих друг за другом приближения для числа p будут отличаться меньше, чем на eps.

 

3.42. Для данного вещественного числа x и натурального n вычислить:

a) sin x + sin2x +... + sinnx

b) sin x + sinx2 +... + sinxn

c) sin x + sin(sin x) +... + sin (sin (... sin(sin x)...))

 

3.43. Алгоритм Евклида нахождения наибольшего общего делителя (НОД) неотрицательных целых чисел основан на следующих свойствах этой величины: пусть m и n - одновременно не равные нулю целые неотрицательные числа и m ³ n. Тогда, если n = 0, то НОД(n, m) = m, а если n ¹ 0, то для чисел m, n, и r, где r - остаток от деления m на n, выполняется равенство НОД(m, n) = НОД(n, r). Используя алгоритм Евклида, определить наибольший общий делитель неотрицательных целых чисел a и b.

 

3.44. Вычислить 1 - 1/2 + 1/3 - 1/4 +...+1/9999 - 1/10000 следующими способами:

a). последовательно слева направо;

b). последовательно справа налево;

c). последовательно слева направо вычисляются 1 +1/3 + 1/5 +... + 1/9999 и 1/2 + 1/4 +... + 1/10000, затем второе значение вычитается из первого;

d). последовательно справа налево вычисляются 1 +1/3 + 1/5 +... + 1/9999 и 1/2 + 1/4 +... + 1/10000, затем второе значение вычитается из первого.

Сравнить и объяснить полученные результаты.

 

3.45. Натуральное число называется совершенным, если оно равно сумме всех своих делителей, за исключением самого себя. Дано натуральное чис-
ло n. Получить все совершенные числа, меньшие n.

 

3.46. Определить, является ли число простых чисел, меньших 10000, простым числом.

 

3.47. Если p и q - простые числа и q = p+2, то они называются простыми сдвоенными числами или “близнецами” (twin primes). Например, 3 и 5 - такие простые числа. Распечатать все простые сдвоенные числа, меньшие N.

 

Обработка символьных данных

 

Замечание: при решении некоторых задач этого раздела необходимы минимальные знания о «стандартном» вводе и выводе литер.

 

3.48. Пусть во входном потоке находится последовательность литер, заканчивающаяся точкой (кодировка ASCII):

a) определить, сколько раз в этой последовательности встречается символ ‘a’;

b) определить, сколько символов ‘e’ предшествует первому вхождению символа ‘u’ (либо сколько всего символов ‘e’ в этой последовательности, если она не содержит символа ‘u’);

c) выяснить, есть ли в данной последовательности хотя бы одна пара символов-соседей ‘n’ и ‘o’, т.е. образующих сочетание ‘n’ ‘o’ либо ‘o’ ‘n’;

d) выяснить, чередуются ли в данной последовательности символы ‘+’ и ‘-‘, и сколько раз каждый из этих символов входит в эту последовательность;

e) выяснить, сколько раз в данную последовательность входит группа подряд идущих символов, образующих слово С++;

f) выяснить, есть ли среди символов этой последовательности символы, образующие слово char;

g) выяснить, есть ли в данной последовательности фрагмент из подряд идущих литер, образующий начало латинского алфавита (строчные буквы), и какова его длина. Если таких фрагментов несколько, найти длину наибольшего из них. Если такого фрагмента нет, то считать длину равной нулю;

h) выяснить, есть ли в данной последовательности фрагменты из подряд идущих цифр, изображающие целые числа без знака. Найти значение наибольшего из этих чисел. Если в этой последовательности нет ни одной цифры, то считать, что это значение равно нулю;

i) определить, имеет ли данная последовательность символов структуру, которая может быть описана с помощью следующих правил:

последовательность::= слагаемое + последовательность | слагаемое

слагаемое::= идентификатор | целое

идентификатор::= буква | идентификатор буква | идентификатор цифра

буква::= A | B | C | D | E | F | G | H | I | J | K

цифра::= 0 | 1 | 2 | 3 | 4 | 5

целое::= цифра | целое цифра

 

3.49. Пусть во входном потоке находится последовательность литер, заканчивающаяся точкой (кодировка ASCII). Вывести в выходной поток последовательность литер, измененную следующим образом:

a) заменить все символы ‘?’ на’!’;

b) удалить все символы ‘-‘ и удвоить все символы ‘&’;

c) удалить все символы, не являющиеся строчными латинскими буквами;

d) заменить все прописные латинские буквы строчными (другие символы копировать в выходной поток без изменения);

e) заменить все строчные латинские буквы прописными (другие символы копировать в выходной поток без изменения);

f) каждую группу рядом стоящих символов ‘+’ заменить одним таким символом;

g) каждую группу из n рядом стоящих символов ‘*’ заменить группой из n/2 рядом стоящих символов ‘+’ (n >= 2); одиночные ‘*’ копировать в выходной поток без изменения;

h) удалить из каждой группы подряд идущих цифр все начальные незначащие нули (если группа состоит только из нулей, то заменить эту группу одним нулем);

i) удалить все комбинации символов the;

j) оставить только те группы цифр, которые составлены из подряд идущих цифр с возрастающими значениями; все остальные цифры и группы цифр удалить (другие символы копировать в выходной поток без изменения);

k) заменить все комбинации символов child комбинациями символов children;

l) удалить группы символов, расположенные между фигурными скобками { и }. Скобки тоже должны быть удалены. Предполагается, что скобки сбалансированы, и внутри каждой пары скобок других фигурных скобок нет.

 

3.50. Пусть во входном потоке находится последовательность литер, заканчивающаяся маркером конца $ (кодировка ASCII). Вывести в выходной поток последовательность литер, измененную следующим образом:

a) удалить из каждой группы подряд идущих цифр, в которой более двух цифр и которой предшествует точка, все цифры, начиная с третьей (например, a+12.3456-b-0.456789+1.3-45678 преобразуется в a+12.34-b-0.45+1.3-45678);

b) удалить из каждой группы цифр, которой не предшествует точка, все начальные нули (кроме последнего, если за ним идет точка либо в этой группе нет других цифр, кроме нулей; например, a-000123+bc+0000.0008-0000+0001.07 преобразуется в a-123+bc+0.0008-0+1.07).

 

 



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 635; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.142.12.240 (0.06 с.)