Лабораторная работа оператор присваивания. Оператор
![]()
|
Пример 6 [Керниган,Ритчи,Фьюэр,1985,с.197]. /* Демонстрация синтаксиса и семантики условной операции */ /* ----------------------------------------------------- */ #include #include { int x,y,z,r; /* ----------- */ x=y=z=1; x+=y+=z; r=x /* ---------------- */ r=z>=y&&y>=x; /* Операции 5 */ printf("5. r=%d\n\n",r); getch(); return 0; } Результат работы программы: 3 2 3 3 4 4 4 0 1 Комментарии результата работы программы. Операции 1. x=3; y=2; z=1; r=x (r=(FALSE?(y):(x)); В этой задаче значение условия - "ложь", поэтому значением всего выражения будет значение выражения, соответствующего ложному значению условия. (r=(x)); 3 Операции 2. x=3; y=2; z=1; r=x (r=(y++)); Так как операция x++ не выполнялась, то значение x остается равным 3. 2 Операции 3. x=3; y=3; z=1; z+=x (z+=((y++)); (z+=(3)); (z=4); 4 Операции 4. x=3; y=4; z=4; r=(z>=y>=x)?1:0; (r=(((z>=y>)=x)?(1):(0))); (r=(TRUE>=x)?(1):(0)); Значение самого внутреннего условия - "истина". Оно сравнивается со значением целого x. Хотя это и законно в языке C и со значением "истина" обходятся вольно, считая его целым числом, в данном случае это 1. Однако часто, как и в этой задаче, это не приносит желаемых результатов. (r=(1>=x)?(1):(0)); (r=(FALSE?(1):(0))); (r=((0)); 0 Операции 5. Следующий фрагмент показывает правильный способ для сравнения трёх величин. x=3; y=4; z=4; r = z>=y&&y>=x; (r=(z>=y)&&(y>=x)); Вычисляем значение выражения слева направо: (r=TRUE&&(y>=x)); (r=(TRUE&&TRUE)); (r=TRUE); (r=1); 1 Пример 7. /* Демонстрация операции приведения типов */ /* -------------------------------------- */ #include #include { float f; int i; /* ----------------------------------------- */ f=32.57; i=(int)f; /* Приведение к типу int */ printf("f=%f, i=%d\n",f,i); i=4; f=(float)i; /* Приведение к типу float */ printf("f=%f, i=%d\n",f,i); f=i/3; printf("f=%f\n",f); f=(float)i/3; printf("f=%f\n",f); getch(); return 0; } Результат работы программы: f=32.570000, i=32 f=4.000000, i=4 f=1.000000 f=1.333333 Пример 8. /* Демонстрация синтаксиса и семантики операции "запятая" */ /* ------------------------------------------------------ */ #include #include { int s,t,i=74; /* ------------------------------- */ s=(3.14,i%9,200); printf("s=%d\n",s); s=3,i%=9,t=9; printf("s=%d, i=%d, t=%d\n",s,i,t); getch(); return 0; } Результат работы программы: s=200 s=3, i=2, t=9 Пример 9 [Керниган,Ритчи,Фьюэр,1985,с.198]. /* Демонстрация выполнения операций и их приоритетов */ /* ------------------------------------------------- */ #include #include { int x,y,z,r; /* ------ */ x=y=z=1; r=++x||++y&&++z; printf("1. r=%d,x=%d,y=%d,z=%d\n",r,x,y,z); /* 1 */ /* ------------------------------------- */ x=y=z=1; r=++x&&++y||++z; printf("2. r=%d,x=%d,y=%d,z=%d\n",r,x,y,z); /* 2 */ /* ------------------------------------- */ x=y=z=1; r=++x&&++y&&++z; printf("3. r=%d,x=%d,y=%d,z=%d\n",r,x,y,z); /* 3 */ /* ------------------------------------- */ x=y=z=-1; r=++x&&++y||++z; printf("4. r=%d,x=%d,y=%d,z=%d\n",r,x,y,z); /* 4 */ /* ------------------------------------- */ x=y=z=-1; r=++x||++y&&++z; printf("5. r=%d,x=%d,y=%d,z=%d\n",r,x,y,z); /* 5 */ /* ------------------------------------- */ x=y=z=-1; r=++x&&++y&&++z; printf("6. r=%d,x=%d,y=%d,z=%d\n\n",r,x,y,z); /* 6 */ getch(); return 0; } Результат работы программы: r=1,x=2,y=1,z=1 r=1,x=2,y=2,z=1 r=1,x=2,y=2,z=2 r=0,x=0,y=-1,z=0 r=0,x=0,y=0,z=-1 r=0,x=0,y=-1,z=-1 Комментарии результата работы программы. Операции 1. x=y=z=1; r=++x||++y&&++z; Сопоставляем операнды с операциями: r=((++x)||((++y)&&(++z))); Вычисляем выражение слева направо: r=(2||((++y)&&(++z))); Поскольку левый операнд операции || имеет значение "истина", бессмысленно проводить вычисления дальше. В языке C гарантируется, что в подобных случаях вычисления прекращаются. Операции 2. x=y=z=1; r=++x&&++y||++z; r=(((++x)&&(++y))||(++z)); Вычисляем выражение слева направо: r=((TRUE&&(++y))||(++z)); x=2; r=((2&&2)||(++z)); y=2; r=(TRUE||(++z)); r=1; Значение z не меняется. Операции 3. x=y=z=1; r=++x&&++y&&++z; r=(((++x)&&(++y))&&(++z)); r=((2&&2)&&(++z)); x=2; y=2; r=(TRUE&&(++z)); r=(TRUE&&TRUE); z=2; r=1; Операции 4. x=y=z=-1; r=++x&&++y||++z; r=(((++x)&&(++y))||(++z); r=((0&&(++y))||(++z)); x=0; r=((FALSE&&(++y))||(++z)); r=(FALSE||(++z)); Здесь нет необходимости вычислять ++y, т.к. левый операнд логической операции && есть "ложь". Но результат логической операции || пока ещё неизвестен. r=(FALSE||(0)); z=0; r=(FALSE||FALSE); r=0; Операции 5. x=y=z=-1; r=++x||++y&&++z; r=((++x)||((++y)&&(++z))); r=(FALSE||((++y)&&(++z))); x=0; r=(FALSE||(FALSE&&(++z))); y=0; r=(FALSE||FALSE); r=0; Операции 6. x=y=z=-1; r=++x&&++y&&++z; r=(((++x)&&(++y))&&(++z); r=((FALSE&&(++y))&&(++z)); x=0; r=(FALSE&&(++z)); r=0; Пример 10. /* Демонстрация нахождения наибольшего из двух целых */ /* чисел a и b */ /* ------------------------------------------------- */ #include #include { int a,b; printf("Введите первое число: "); scanf("%d",&a); printf("Введите второе число: "); scanf("%d",&b); if (a==b) printf("Заданные числа равны.\n"); else if (a>b) printf("Первое число больше второго.\n"); else printf("Второе число больше первого.\n"); getch(); return 0; } Результат работы программы: Введите первое число: 321 Введите второе число: 832 Второе число больше первого. Пример 11. /* Демонстрация определения того, является ли заданное */ /* четырехзначное число палиндромом */ /* --------------------------------------------------- */ #include #include { int x,y,z,s,a; /* --------------------------------------------------- */ printf("Введите четырёхзначное число: "); scanf("%d",&a); x=a%10; y=((a-x)/10)%10; z=((((a-x)/10)-y)/10)%10; s=(((((a-x)/10)-y)/10)-z)/10; if (x==s && z==y) printf("Да, является.\n"); else printf("Нет, не является.\n"); getch(); return 0; } Результат работы программы: Введите четырёхзначное число: 3223 Да, является. Пример 12. /* Демонстрация синтаксиса и семантики конструкции else/if */ /* ------------------------------------------------------- */ #include #include { int legs; printf("Задумайте животное.\nСколько у него ног? "); scanf("%d",&legs); if (legs==4) printf("Возможно это лошадь.\n"); else if (legs>4) printf("Это не лошадь.\n"); else { legs++; printf("Теперь животное имеет ещё одну ногу.\n"); } getch(); return 0; } Результат работы программы: Задумайте животное. Сколько у него ног? 40 Это не лошадь. Пример 13 [Керниган,Ритчи,Фьюэр,1985,с.202]. /* Демонстрация семантики оператора ветвления */ /* ------------------------------------------ */ #include #include { int x,z,y=1; /* ------ */ if (y!=0) x=5; printf("1. %d\n",x); /* Управление 1 */ /* ---------------------------------------- */ if (y==0) x=3; else x=5; printf("2. %d\n",x); /* Управление 2 */ /* ---------------------------------------- */ if (y<0) if (y>0) x=3; else x=5; printf("3. %d\n",x); /* Управление 3 */ /* ---------------------------------------- */ if (z=y<0) x=3; else if (y==0) x=5; else x=7; printf("4. %d %d\n",x,z); /* Управление 4 */ /* ---------------------------------------- */ if (z=(y==0)) x=5; x=3; printf("5. %d %d\n",x,z); /* Управление 5 */ /* ---------------------------------------- */ if (x=z=y); x=3; printf("6. %d %d\n\n",x,z); /* Управление 6 */ getch(); } Результат работы программы: 5 5 5 7 0 3 0 3 1 Комментарии результата работы программы. Управление 1. y=1; if (y!=0) x=5; (y!=0) (1!=0) x=5; На первом шаге вычисляются условия. Так как условие - "истина", то выполняется первая часть оператора ветвления. Управление 2. y=1; if (y==0) x=3; else x=5; (y==0) (1==0) x=5; Вычисляем условие. Выполняем else-часть условного оператора. Управление 3. y =1; if (y<0) if (y>0) x=3; else x=5; (y<0) (1<0) x=5; Условие первого условного оператора "ложь", так что часть оператора, соответствующая истинному значению условия, пропускается. Выполняется оператор, следующий за else. Управление 4. y=1; if (z=y<0) x=3; else if (y==0) x=5; else x=7; (z=(y<0)) (z=(1<0)) (z=0) (y==0) x=7; Начинаем с вычисления первого условия. Как и прежде, мы будем использовать скобки для обозначения соответствия операций и операндов. Так как условие первого if - "ложь", выполняется вторая часть этого оператора, которая опять оказывается условным оператором; значит, вычисляется его условие. Условие - "ложь", поэтому выполняется вторая часть второго условного оператора. Управление 5. y=1; if (z=(y==0)) x=5; x=3; (z=(y==0)) (z=0) x=3; if (z=(y==0)) { x=5; } x=3; Первая часть условного оператора может быть одиночным оператором или блоком и следует сразу за условием. Вычисляем условие. Управление 6. y =1; if (x=z=y); x=3; (x=(z=y)) (x=(z=1)) (x=1) x=3; if (x=z=y) { ; } x=3; Первая часть условного оператора есть пустой оператор. Вычисляем условие. Условие - "истина", поэтому выполняется первая часть оператора, но поскольку там пустой оператор, то выполняется оператор, следующий за условным. Пример 14. /* Демонстрация синтаксиса и семантики оператора */ /* выбора switch */ /* --------------------------------------------- */ #include #include { int c; printf("Введите цифру от 1 до 7: "); c=getchar(); printf("Соответствующий день недели:"); switch (c) { case '1': { printf("\nПонедельник - день тяжёлый!\n"); break; } case '2': { printf("\nВторник!\n"); break; } case '3': { printf("\nСреда!\n"); break; } case '4': { printf("\nЧетверг!\n"); break; } case '5': { printf("\nПятница!\n"); break; } case '6': { printf("\nСуббота!\n"); break; } default: printf("\nВоскресенье! Ура!\n"); } getch(); } Результат работы программы: Введите цифру от 1 до 7: 9 Соответствующий день недели: Воскресенье! Ура! Пример 15. /* Демонстрация семантики оператора выбора switch: если не */ /* использовать оператор завершения break, то по окончании */ /* выполнения списка операторов выбранного варианта прои- */ /* зойдёт переход на следующий вариант из списка */ /* ------------------------------------------------------- */ #include #include { char c; printf("Введите заглавную русскую букву (от 'А' до 'Д'): "); c=getchar(); printf("Расширьте свой кругозор:"); switch (c) { case 'А': printf("\n аргали, дикий горный азиатский бара\ н;"); case 'Б': printf("\n бабирусса, дикая малайская свинья;"); case 'В': printf("\n выхухоль, водоплавающий крот;"); case 'Г': printf("\n гиббон, длиннорукая обезьяна;"); case 'Д': printf("\n даман древесный."); default : printf("\nНа первый раз достаточно!\n"); } getch(); return 0; } Результат работы программы: Введите русскую заглавную букву (от 'А' до 'Д'): Б Расширьте свой кругозор: бабирусса, дикая малайская свинья; выхухоль, водоплавающий крот; гиббон, длиннорукая обезьяна; даман древесный. На первый раз достаточно! Пример 16. /* Демонстрация семантики оператора выбора switch: если для */ /* нескольких значений выражения в операторе switch требует- */ /* ся выполнить одну и ту же последовательность операторов, */ /* то в списке вариантов следует подряд перечислить эти ва- */ /* рианты с пустым списком операторов для всех вариантов, */ /* кроме последнего */ /* --------------------------------------------------------- */ #include #include { char c; printf("Нажмите любую из клавиш 'А,Б,В,Г,Д': "); c=getchar(); printf("Расширьте свой кругозор:"); switch (c) { case 'a': case 'A': case 'а': case 'А': printf("\n аргали, дикий горный азиатский баран;"); case 'b': case 'B': case 'б': case 'Б': printf("\n бабирусса, дикая малайская свинья;"); case 'w': case 'W': case 'в': case 'В': printf("\n выхухоль, водоплавающий крот;"); case 'g': case 'G': case 'г': case 'Г': printf ("\n гиббон, длиннорукая обезьяна;"); case 'd': case 'D': case 'д': case 'Д': printf ("\n даман древесный."); default : printf ("\nНа первый раз достаточно!\n"); } getch(); return 0; } Результат работы программы: Нажмите любую из клавиш 'А,Б,В,Г,Д': а Расширьте свой кругозор: аргали, дикий горный азиатский баран; бабирусса, дикая малайская свинья; выхухоль, водоплавающий крот; гиббон, длиннорукая обезьяна; даман древесный. На первый раз достаточно! Пример 17. // Демонстрация организации простейшего ввода/вывода // в языке C++ // --------------------------------------------------------- #include { double x; cout << "\nВведите double: "; // Вывод строки на экран cin >> x; // Ожидание получения значения переменной x, преоб- // разованное из строки, введённой с клавиатуры. // Строка представляет собой значение, которое дол- // жно быть типа double или совместимое с типом // double; другие типы будут ошибочными int i; cout << "Введите положительное целое число: "; cin >> i; if (i<1) cerr << "Ошибка: i=" << i << endl; // Операторы выполняются слева направо. // endl - идентификатор, называемый манипулятором и // позволяющий перевести ввод/вывод на новую строку else cout << "i*x=" << i*x << endl; // Вывод строки "i*x=", за которой следует вывод // значения double выражения i*x return 0; } Результат работы программы: Введите double: 3.5 Введите положительное целое число: 4 i*x=14 ЗАДАЧИ ДЛЯ САМОСТОЯТЕЛЬНОГО РЕШЕНИЯ Теория и практика - оба слова греческие, по-русски ближе всего, не вполне передаваемые словами: обсуждение и действие. Отсюда ясно общее соотношение между теорией и практикой. Можно обсуждать не действуя, но гораздо хуже действовать без обсуждения. Теория без практики мертва или бесплодна, практика без теории невозможна или пагубна. Для теории нужно главным образом знание, для практики - сверх того и умение. А.Н.Крылов 1. Даны два числа. Выведите на экран их значения и определите большее из них. 2. Даны три числа. Выведите на экран их значения и определите большее из них. 3. Дано натуральное число n (n<10000). Определите сумму цифр данного числа n. 4. Определите, является ли заданное целое число нечётным двухзначным числом. 5. Определите, имеется среди трёх заданных целых чисел хотя бы одно чётное. 6. Дано натуральное двузначное число. Напишите программу, определяющую, входят ли в него цифры 4 и 7. 7. Определите, есть ли среди цифр заданного целого трёхзначного числа одинаковые. 8. Даны три числа. Выведите на экран эти числа в порядке возрастания. 9. Даны три числа. Выведите на экран те из них, которые принадлежат заданному отрезку [𝑎; 𝑏]. 10. Составьте программу, которая из трёх введённых с клавиатуры чисел возводит в квадрат положительные, а отрицательные оставляет без изменения. 11. Определите и выведите на экран номер квадранта, в котором расположена точка 𝐴(𝑥, 𝑦), где x и y - заданные целые числа. 12. Составьте программу, определяющую принадлежность точки 𝐶(𝑥, 𝑦) прямой AB, заданной координатами точек 𝐴(𝑥 1 , 𝑦 1 ) и 𝐵(𝑥 2 , 𝑦 2 ). 13. Напишите программу, которая определяет принадлежит ли данная заданная точка 𝐴(𝑥 1 , 𝑦 1 ) закрашенной области. Границы, которые принадлежат области, проведены сплошной линией, а те, которые не принадлежат, - пунктирной. (1) (7) (2) (8) (3) (9) (4) (10) (5) (11) (6) (12) 14. Определите, принадлежит ли заданная точка одной из сторон треугольника, заданного координатами его вершин. 15. Составьте программу, определяющую, содержит ли график функции 𝑦 = 𝑥 2 − 7𝑥 + 2 заданную точку с координатами (𝑎, 𝑏). 16. Проверьте, можно ли построить треугольник из отрезков с длинами x, y, z. 17. Удалите избыточные скобки в операторах присваивания: (а) y=(x==y)?(x+((y*2)+(y/x))):(y+x+(x*3)); (б) h=(a|(((4+c)>>b)&7))||(b>(a%3)); (в) a=(b|=((1^(c&d))==b)); (г) b=(((c&&y)!=z)?((x+q) (д) x=(((x==q)?(x==y):(y!=z))?((z==b)?(b==c):(c!=d)):(d==q)); |