Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Упражнения. 1. Создайте защиту от повторного включения файла заголовка STRING.H.






 

1. Создайте защиту от повторного включения файла заголовка STRING.H.

#ifndef STRING_H

#define STRING_H

...

#endif

2. Напишите макрос assert(), который

• будет печатать сообщение об ошибке, а также имя файла и номер строки, если уровень отладки равен 2;

• будет печатать сообщение (без имени файла и номера строки), если уровень отладки равен 1;

• не будет ничего делать, если уровень отладки равен 0.

1: #include < iostream.h>

2:

3: #ifndef DEBUG

4: #define ASSERT(x)

5: #elif DEBUG — 1

6: #define ASSERT(x)

7: if (! (x))

S: {

9: cout < < " ERROR!! Assert " < < #x < < " failed\n";

10: }

11: #elif DEBUG == 2

12: #define ASSERT(x)

13: if (! (x))

14: {

15: cout < < " ERROR!! Assert " < < #x < < " failed\n";

16: cout < < " on line " < < __LINE__ < < " \n";

17: cout < < " in file " < < __LINE__ < < " \n";

18: }

19: #endif

3. Напишите макрос DPrint, который проверяет, определена ли лексема DEBUG, и, если да, выводит значение, передаваемое как параметр.

#ifndef DEBUG:

#define DPRINT(string)

#else

#define DPRINT(STRIN6) cout < < #STRING:

#endif

4. Напишите программу, которая складывает два числа без использования операции сложения (+). Подсказка: используйте побитовые операторы!

Если рассмотреть сложение двух битов, то можно заметить, что ответ будет содержать два бита: бит результата и бит переноса. Таким образом, при сложении двух единиц в двоичной системе бит результата будет равен нулю, а бит переноса — единице. Если сложить два двоичных числа 101 и 001, получим следующие результаты:

101 // 5

001 // 1

110 // 6

Следовательно, если сложить два соответствующих бита (каждый из них равен единице), то бит результата будет равен 0, а бит переноса — 1. Если же сложить два сброшенных бита, то и бит результата, и бит переноса будут равны 0. Если сложить два бита, один из которых установлен, а другой сброшен, бит результата будет равен 1, а бит переноса — 0. Перед вами таблица, которая обобщает эти правила сложения

Левый бит lhs Правый бит rhs Перенос Результат

0 0 0 0

0 1 0 1

1 0 0 1

1 1 1 0

Рассмотрим логику бита переноса. Если оба суммируемых бита (lhs и rhs) равны 0 или хотя бы один из них равен 0, бит переноса будет равен 0. И только если оба бита равны 1, бит переноса будет равен 1. Такая ситуация в точности совпадает с определением побитового оператора И (&).

Если подобным образом рассмотреть логику бита результата, то окажется, что она совпадает с выполнением оператора побитового исключающего ИЛИ (^): если любой из суммируемых битов (но не оба сразу) равен I, бит результата равен 1, в противном случае — 0.

Полученный бит переноса добавляется к следуюшему значимому биту. Это можно реализовать либо итеративным проходом через каждый бит, либо использованием рекурсии.

#include < iostream.h>

unsigned int add(unsigned int lhs, unsigned lnt rhs)

{

unsigned int result, carry;

while (1)

{

result = lhs ^ rhs;

carry = lhs & rhs;

if (carry == 0)

break;

lhs = carry < < 1;

rhs = result;

};

return result;

}

int main()

{

unsigned long a, b;

for (;;)

{

cout < < " Enter two numbers. (0 0 to stop): ";

cin < < a < < b:

if (! a & &! b)

break;

cout < < a < < " + " < < b < < " = " < < add(a, b) < < endl;

}

return 0;

}

В качестве альтернативного варианта эту проблему можно решить с помошью рекурсии:

#include < iostream.h>

unsigned int add(unsigned int lhs, unsigned int rhs)

{

unsignod int carry = lhs & rhs;

unsigned int result = lhs * rhs;

if (carry)

return add(result, carry < < 1);

else

return result;

}

int main()

{

unsigned long a, b;

for (;;)

{

cout < < " Enter two numbers. (0 0 to stop): **;

cin < < a < < b;

if (! a & &! b)

break;

cout < < a < < " + " < < b < < " = " < < add(a, b) < < endl;

}

return 0;

}

 

Спасибо, что скачали книгу в бесплатной электронной библиотеке Royallib.ru

Оставить отзыв о книге

Все книги автора


7. Введите текст программы, приведенный выше.

Пример 1. int main()

{

unsigned short x;

unsigned short у;

unsigned short z;

z = x * у;

return 0;

}

 

Пример 2. int main()

{

unsigned short Width;

unsigned short Length;

unsigned short Area;

Area = Width * Length;

return 0;

}

 

Оператор Ниже приводится синтаксис оператора if.

Форма 1:

if (условие)

выражение;

следующее выражение;

Если условие возвращает true, то выполняется выражение, а за ним и следующее выражение. Если условие возвратит false, то выражение игнорируется, а программа переходит к выполнению следующего выражения.

Помните, что вместо выражения может использоваться целый блок, заключенный в фигурные скобки.

Форма 2:

if (условие)

выражение1;

else

выражение2;

следующее выражение;

Если условие возвращает значение true, выполняется выражение1, в противном случае выполняется выражение2. После этого выполняется следующее выражение.

Пример:

if (SomeValue < 10);

cout < < " SomeValue is less than 10";

else

cout < < " SomeValue is not less than 10! ";

cout < < " Done." < < endl;

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.