Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Упражнения. 1. Создайте защиту от повторного включения файла заголовка STRING.H.⇐ ПредыдущаяСтр 173 из 173
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;
|