
2.Оператор if
1.2.0.Неформальное напоминание 1.
Обычно операторы выполняются последовательно, в том порядке, в котором они записаны в программе.
Оператор1; |
оператор2; |
оператор3; |
оператор4; V
УСЛОВНЫЙ ОПЕРАТОР
if(условие) оператор1;
...продолжение...
Работает так:
Вычисляется условие.
Если оно истинно, то выполняется оператор1,
затем выполняется продолжение. Если оно ложно, то сразу выполняется продолжение, а оператор1 не выполняется.
Если нам надо выполнить при истинности условия несколько операторов,
мы должны заключить их в скобки { ... } - это так называемый
"составной оператор".
if(условие) {
оператор1;
оператор2;
...
}
продолжение
После } точка с запятой НЕ СТАВИТСЯ (можно и поставить, но не нужно).
Условный оператор изображают на схемах приблизительно так:
оператор
Продолжение
Имеется вторая форма, с частью "иначе":
if(условие) оператор1_//если_истинно;
else оператор2_//если_ложно;
"или то, или другое" (но не оба сразу)
Оператор
2Оператор 1
Продолжение
1.2. Реализация оператора IF
Сначала будет рассмтривать работу с ЦЕЛЫМИ числами. Потом — с вещественными.
Пример.1. Определить, является ли введенное число днем недели, т.е. входит ли число в диапазон от 1 до 7.
int i;
if (( 1<=i) && ( i<=7) )
puts ( “ Yes”);
else
puts ( “ No”);
Assembler .( черновик)
Mov eax, I
IF :
cmp eax, 1
jL NO_LbL
cmp eax, 7
jG NO_LbL
Yes_LbL:
mov EBX , 1
JMP end_if
NO_LbL:
mov EBX , 0
end_if:
Mov J,ebx
; j== 1 <===> истина
; j == 0 <===> ложь
ПОЛНАЯ программа на ВСС5.5
// Лаб1 Пример.1. Определить, является ли введенное число днем недели,
//т.е. входит ли число в диапазон от 1 до 7.
//------------------------
//#pragma inline
#include <stdio.h>
#include <conio.h> // clrscr();
#include <limits.h>
//проверяет, что a - в границах short int
//
int test_w( long int a)
{return (a>=SHRT_MIN) && (a<=SHRT_MAX);
}
void Pr_an_key()
{ char ch;
puts("\n press any key... ");
ch=getchar(); putchar(ch);
}//Pr_an_key()
int main ()
{ long int li;
short int i,j,in_1_7 ;
char ch;
clrscr();
printf(" input a[-32768..32767]->");
scanf(" %ld",&li);
printf(" li==>%ld",li);
if (test_w(li) )
{ i = (short int)li;
printf(" i==>%d",i);
}
else { printf(" Error!!! a Not in [-32768..32767]->");
Pr_an_key();
return 0;
}
if (( 1<=i) && ( i<=7) )
printf("\n C-kod==> YES !!! I in [1..7] ");
else
printf("\nC-kod==> No !!! I NOT in [1..7] ");
Asm_comp:
asm{
Mov ax, i
IF_0 :
cmp ax, 1
jL NO_LbL
cmp ax, 7
jG NO_LbL
Yes_LbL:
mov BX , 1
JMP end_if_0
NO_LbL:
mov BX , 0
end_if_0:
Mov in_1_7,bx
; in_1_7== 1 <===> истина
; in_1_7 == 0 <===> ложь
}
if (in_1_7==1)
{printf("\nASM ==> YES !!! I in [1..7]");
Pr_an_key();
}
else if (in_1_7==0)
{printf("\nASM==> No !!! I NOT in [1..7] ");
Pr_an_key();
}
else
{printf("\n AsM Error!!! NOT in_1_7==0 OR==1 ");
Pr_an_key();
}
return 0;
return 1;
}//-----------main -------------
Пример2:Вычислить действительные корни квадратного уравнения:
a*x*x + b*x + c = 0
Примечание 1. а,b,c, - вводятся в программе на С, здесь приведен ОТДЕЛЬНЫЙ ассемблерный модуль .
Это 16 — битовый ассемблер, но нас интересует как идет обработка сравнения для переменных single ( выделено жирным шрифтом).
Для Пентиум командаfwait вроде не нужна , но таков пример в книге Голубь Н.Г.( используем сопроцессор 8087 , а не хотя бы 487 ).
title real8087 (CopyRight by Голубь Н.Г., 1993, 1998, 2001)
; 13.4. Пример программы на языке Ассемблера
; Вычислить действительные корни квадратного уравнения:
; a*x*x + b*x + c = 0
; TASM.EXE QUADR.ASM /l /r /ml
; Особая ситуация d=b2-4*a*c<0 обрабатывается здесь
;-----------------------------------------------------------
.486
.model large,C
.data
EXTRN C a:Dword,b:Dword,c:Dword,x1:dword,x2:dword,d:dword,f:byte
EXTRN C ac:Dword,bb:Dword
.code
public quadr
; Слово состояния сопроцессора
status dw ?
;------- КОНСТАНТЫ
four dd 4.
two dd 2.
quadr proc C far
finit ;иниц. 8087
;-------ST(0)-------!------ST(1)------!
fild b ;b !?
fmul st(0),st(0) ;b*b !?
FST bb ;копиpование веpшины стека ==> bb
fild a ;a !b*b
fmul four ;4*a !b*b
fimul c ;4*a*c !b*b
FST ac ;копиpование веpшины стека ==> ac
fsubP st(1),st(0) ;d=b*b-4*a*c !?
fst d ;копиpование веpшины стека ==> d
ftst ;пpовеpка d=0
fstsw status ;cлово состояния программы
fwait
mov ah,byte ptr status+1
sahf ;ah->cf,pf,af,zf,sf
jb im ;d<0 (cf=1)
fsqrt ;sqrt(d) !?
fld st(0) ;sqrt(d) !sqrt(d)
fchs ;-sqrt(d) !sqrt(d)
fiadd b ;b-sqrt(d) !sqrt(d)
fchs ;-b+sqrt(d) !sqrt(d)
fxch st(1) ;sqrt(d) !-b+sqrt(d)
fiadd b ;b+sqrt(d) !-b+sqrt(d)
fchs ;-b-sqrt(d) !-b+sqrt(d)
fidiv a ;-b-sqrt(d)/a !-b+sqrt(d)
fdiv two ;-b-sqrt(d)/a/2 !-b+sqrt(d)
fstp x2 ;-b+sqrt(d) !?
fidiv a ;-b+sqrt(d)/a !-b+sqrt(d)
fdiv two ;-b+sqrt(d)/a/2 !?
fstp x1 ;? !?
mov f,0 ; ok! ;? !?
ret
im:
mov f,1 ; d<0 ;d !?
ret
quadr endp
end
Найти максимум из 3-х чисел.
Int I,j,k;
пример 3. С клавиатуры вводятся буквы латинского алфавиты. В зависимости от буквы произвести те или иные действия.
Пример4:
Пример 5:
Пример 8.
1.Дан отрезок на прямой , заданный своими концевыми точками –a,b. Задана точка С. Лежит С внутри отрезка или снаружи?
Решение. Типовое (неправильное)
В условии НЕ СКАЗАНО, что а - левый конец отрезка….
Более правильное решение приведено ниже.
3. Реализация оператор switch (переключатель)
реализация 1. последовательности IF опратора switch возможна несколькими способами .
Самый простой — свести switch к последовательности IF
Пример 1.
cin >> I;
switch ( I)
{ 1: puts ( “ one “ ); break;
2: puts ( “ два “) ; break;
3: puts ( “ три “ ); break;
4: puts ( “ четыре “) ; break;
5: puts ( “ пять “ ); break;
default : puts ( “ Error!!! “ );
}
_asm{
mov ax, I
cmp ax,1
je L_1
cmp ax,2
je L_2
cmp ax,3
je L_3
cmp ax,4
je L_4
cmp ax,5
je L_5
jmp L_error
}
реализация 2 МАССИВ МЕТОК . Если метки оператора switch идут последоватеьно , то можно сделать что-то вроде массива меток . Это достаточно элегантный метод , но требуется тщательность в программировании и проверить границы массива ( можно командой Bound).
Реализация 3. ,БИНАРНОЕ ДЕРЕВО Если метки идут НЕ непрерывно , то можно попробовать реализацию типа БИНАРНОЕ ДЕРЕВО . ( годится и для непрерывных значений , если их больше скажем 8 — это что-то типа оптимизации — минимизирует число сравнений ).
Пример. 1 <= I <= 8. .
_asm{
mov ax, I
cmp ax,4
JLE l_LE4
; I > 4
cmp ax,6
JLE L_LE6
; I > 6
cmp ax,7
JE L_7
; ==8
jmp end_sw
L_LE4 :
cmp ax, 2
JLE l_LE2
; 2<i <=4
cmp ax,3
je L_3
; I ==4
L_4 : /////
L_LE6: ; 4<i <=6
cmp ax,5
je L_5
; I ==6
jmp end_sw
L_5 : ///////
end_sw: NOP
4. Задачи
Студент должен решить
-либо две простые задачи,
-либо одну задачу средней сложности.
3.1.Простые задачи
1. Написать программу , которая по номеру дня недели (целое от 1 до 7) выдает в качестве результата количество уроков в вашей группе на этот день.
2. написать программу, позволяющую по последней цифре целого числа определить последнюю цифру его квадрата . Вариант – число типа Float, double /не целое, дробное/.
3. Составить программу , которая по заданному году y и номеру месяца m определяет количество дней в году и этом месяце.
Замечание. Учесть, что грегорианский календарь действует прибл. с 1582 г.
Високосный год – это тот, который делится на 4 и не делится на 100 или делится на 400.
В книге K&Rнаписана функция, которая указывает, високосный год или нет.
4. Для каждой введенной цифры (0-9) вывести ее названия на русском и английском
(немецком, французском ) языках . Пример . 0- нуль ,zero ;1- один, one; 2- два, two ;
5. Написать программу, которая по данному числу (1-12) выводит название соответствующего ему месяца.
6. Составить программу,
а)позволяющую получать словесное наименование оценок (1- «плохо», 1-«очень Плохо», 2- «НЕудовлетворительно», 3- «удовлетворительно», 4-«Хорошо», 5- «отлично»).
Б) переводящую оценку в диапазоне 0-100 баллов в пятибалльную систему из вар.а). /с равномерным разбиением, т.е. число отводимых для «1» в 100-бальной шкале == число отводимых для «2» и т.д.).
7. Пусть элементами круга являются радиус (1-й элемент), диаметр ( 2-й элемент-) , и длина окружности ( 3-й элемент). Составить программу , которая по номеру элемента запрашивала бы его значение и вычисляла бы площадь круга.
Замечание . Длина всегда положительна., в крайнем случае ==0.
8. Пусть элементами прямоугольного равнобедренного треугольника являются
катет а;
гипотенуза с ;
высота h , опущенная из вершины прямого угла на гипотенузу ;
площадь S .
Составить программу , которая по заданному номеру и значению соотвествующего элемента вычисляла бы занчения всех остальнывх элементов треугольника.
9.Написать программу , которая по номеру месяца выдает название следующего за ним месяца ( 1-> февраль, 2-> март , 3-> апрель и т.д.)
10.Написать программу , которая по введенному номеру времени года ( 1- зима, 2-весна, 3- лето, 4- осень) выдавала бы месяцы , соответствующие этому сезону и число дней в каждом месяце (предусмотреть ввод года) . Замечание .Учесть, что грегорианский календарь действует прибл. С 1582 г. См. зам. К задаче 3.
11.Старояпонский (восточный) календарь. В нем был 12- летний цикл. Годы внутри цикла носили название животных : крысы, коровы , тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, курицы(петуха), собаки и свиньи. Написать программу , которая вводит номер года и печатает его название по восточному календарю.
1996 г. – год Крысы – начало очередного цикла.
Вариант. Учесть, что восточный календарь – лунный, т.е. в нем новый год начинается не с 1-го января, а в феврале/ марте.
12. Общая точка. Два отрезка на ПРЯМОЙ заданы координатами своих концов. Определить, имеют ли эти отрезки общие точки., И ЕСЛИ ИМЕЮТ БОЛЬШЕ ОДНОЙ , ТО ДЛИНУ ОБЩЕЙ ЧАСТИ.
Замечание. Необходимо рассмотреть различные случаи взаимной ориентации отрезков.
Тестирование должно предусмотреть все такие ситуации.
Точность – до 5 значащих цифр. Т.е. если координаты различаются в 6 знаке, то точки – совпадают.
ВНУТРИ ,НА ГРАНИЦЕ, «НА УГЛУ» ИЛИ СНАРУЖИ ? Задана точка (x1,y1) на плоскости и прямоугольник, заданный координатами своих левой верхней и правой нижней вершин ( xL,yL), (xR,yR). Где расположена точка относительно прямоугольника (ВНУТРИ ,НА ГРАНИЦЕ , «НА УГЛУ» ИЛИ СНАРУЖИ)?
Замечание. РАССМОТРЕТЬ случай угловых точек прямоугольника..
см. зам. К задаче 12.
14. ВНУТРИ ,НА ГРАНИЦЕ, «НА УГЛУ»ИЛИ СНАРУЖИ ? Задана точка (x1,y1,z1)в пространстве R^3 и ПРЯМОУГОЛЬНЫЙ ПАРАЛЛЕЛЕПИПЕД ( ОСНОВАНИЕ- ПРЯМОУГОЛЬНИК), заданный координатами своих Вершин ( x1,y1),…, (x8,y8). Где расположена точка относительно ПАРАЛЛЕЛЕПИПЕДА (ВНУТРИ ,НА ГРАНИЦЕ , «НА УГЛУ»ИЛИ СНАРУЖИ)?
см. зам. К задаче 12.
15. Заданы квадрат на плоскости., длина ребра ==L. Левый нижний угол квадрата находится в начале координат. В квадрат вписан круг(малый круг) и около него описан круг(большой круг). Задана точка (x1,y1) на плоскости. Где она находится ? Варианты – Вне описанного круга, в описанном круге (но не в прямоугольнике) в прямоугольнике (но не во вписанном круге), во вписанном круге.
см. зам. К задаче 12.
16. Кратные пары. Среди заданных целых чисел к, l, т найти пары кратных.
17. тестирование абитуриента . Даны оценки аттестата (10 предметов, 5 предметов – технических , и 5- гуманитарных), а также результаты тестирования (2 –технических и 2 – гуманитарных). Определите , куда идти абитуриенту – на гуманитарное (средний балл выше 3,5; средний балл по гум. предметам больше, чем средний балл по техн.. предметам), техническое отделение ВУЗА(средний балл выше 3,5 И средний балл по гум. предметам ниже среднего балла по техн.. предметам оценки), или в техникум (средний балл ниже 3,5)?
18. Ввести действительные числа а,b,c. Можно ли составить треугольник со сторонами , длины которых равны соотвественно а,b,c? Если можно, то какой это треугольник – прямоугольный, тупоугольный, остроугольный ?
19. написать программу, которая вводит время дня и желает – хорошего раннего утра (4- 6 ч. утра), хорошего утра (6-7ч), хорошего дня (8-12,13-17), хорошего обеда (12-13), хорошего ухода с работы (17-20 ч), хорошего вечера(19-22), доброй ночи (22-2ч).
20. Ввести действительные числа а,b,c,d. Упорядочены ли числа а,b,c,d? Если ДА- то напечатать –УПОРЯДОЧЕНЫ, ИНАЧЕ – Упорядочить(отсортировать) их.
21. Ввести действительные числа а,b,c,d,e. Упорядочены ли числа а,b,c,d,e? Если ДА- то напечатать –УПОРЯДОЧЕНЫ, ИНАЧЕ – Упорядочить(отсортировать) их.