Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1 / Labs1_v1(if,switch)_Орг_ЭВМ_(Ассемб)_v1.odt
Скачиваний:
14
Добавлен:
27.05.2015
Размер:
63.55 Кб
Скачать

2.Оператор if

1.2.0.Неформальное напоминание 1.

Обычно операторы выполняются последовательно, в том порядке, в котором они записаны в программе.

Оператор1; |

оператор2; |

оператор3; |

оператор4; V

УСЛОВНЫЙ ОПЕРАТОР

if(условие) оператор1;

...продолжение...

Работает так:

Вычисляется условие.

Если оно истинно, то выполняется оператор1,

затем выполняется продолжение. Если оно ложно, то сразу выполняется продолжение, а оператор1 не выполняется.

Если нам надо выполнить при истинности условия несколько операторов,

мы должны заключить их в скобки { ... } - это так называемый

"составной оператор".

if(условие) {

оператор1;

оператор2;

...

}

продолжение

После } точка с запятой НЕ СТАВИТСЯ (можно и поставить, но не нужно).

Условный оператор изображают на схемах приблизительно так:

оператор

Продолжение

Имеется вторая форма, с частью "иначе":

if(условие) оператор1_//если_истинно;

else оператор2_//если_ложно;

"или то, или другое" (но не оба сразу)

Оператор 1

Оператор 2

Продолжение

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, - вводятся в программе на С, здесь приведен ОТДЕЛЬНЫЙ ассемблерный модуль .

  1. Это 16 — битовый ассемблер, но нас интересует как идет обработка сравнения для переменных single ( выделено жирным шрифтом).

  2. Для Пентиум команда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. Пусть элементами прямоугольного равнобедренного треугольника являются

  1. катет а;

  2. гипотенуза с ;

  3. высота h , опущенная из вершины прямого угла на гипотенузу ;

  4. площадь S .

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

9.Написать программу , которая по номеру месяца выдает название следующего за ним месяца ( 1-> февраль, 2-> март , 3-> апрель и т.д.)

10.Написать программу , которая по введенному номеру времени года ( 1- зима, 2-весна, 3- лето, 4- осень) выдавала бы месяцы , соответствующие этому сезону и число дней в каждом месяце (предусмотреть ввод года) . Замечание .Учесть, что грегорианский календарь действует прибл. С 1582 г. См. зам. К задаче 3.

11.Старояпонский (восточный) календарь. В нем был 12- летний цикл. Годы внутри цикла носили название животных : крысы, коровы , тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, курицы(петуха), собаки и свиньи. Написать программу , которая вводит номер года и печатает его название по восточному календарю.

1996 г. – год Крысы – начало очередного цикла.

Вариант. Учесть, что восточный календарь – лунный, т.е. в нем новый год начинается не с 1-го января, а в феврале/ марте.

12. Общая точка. Два отрезка на ПРЯМОЙ заданы координатами своих концов. Определить, имеют ли эти отрезки общие точки., И ЕСЛИ ИМЕЮТ БОЛЬШЕ ОДНОЙ , ТО ДЛИНУ ОБЩЕЙ ЧАСТИ.

Замечание. Необходимо рассмотреть различные слу­чаи взаимной ориентации отрезков.

Тестирование должно предусмотреть все такие ситуации.

Точность – до 5 значащих цифр. Т.е. если координаты различаются в 6 знаке, то точки – совпадают.

  1. ВНУТРИ ,НА ГРАНИЦЕ, «НА УГЛУ» ИЛИ СНАРУЖИ ? Задана точка (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? Если ДА- то напечатать –УПОРЯДОЧЕНЫ, ИНАЧЕ – Упорядочить(отсортировать) их.

Соседние файлы в папке 1