42618

Системы счисления. Десятичная система счисления

Лабораторная работа

Информатика, кибернетика и программирование

Для задачи Rounder функция min имеет вид: void minvoid { Rounder s; int res = s.round1234567; printf d n res; } Калькулятор зарплаты SlryClcultor Работая в компании за первые 200 часов работник получает зарплату в размере p1 долларов в час каждый месяц. void minvoid { SlryClcultor s; double res = s.clcHours82812140; printf lf n res; } Убежать из прямоугольника EscpeFromRectngle Вы находитесь в точке x y внутри прямоугольника нижний левый угол которого имеет координаты 0 0 а правый верхний w...

Русский

2013-10-30

100 KB

4 чел.

Лабораторная работа №5

СИСТЕМЫ СЧИСЛЕНИЯ

   В повседневной жизни мы пользуемся десятичной системой счисления, которая имеет 10 цифр: 0, 1, …, 8, 9. Каждое натуральное число  можно представить в виде

n = an * 10n + an-1 * 10n-1 + … + a1 * 10 + a0

   Например, 123 = 1 * 102 + 2 * 101 + 3 * 100.

   В двоичной системе счисления пользуются лишь двумя цифрами: 0 и 1. В восьмеричной – цифрами от 0 до 7, а в шестнадцатеричной – цифрами от 0 до 9 и буквами от 'A' до 'F', которые соответствуют числам от 10 до 15. В следующей таблице показаны записи чисел от 1 до 16 в разных системах счисления:

десятичная

двоичная

восьмеричная

шестнадцатиричная

1

1

1

1

2

10

2

2

3

11

3

3

4

100

4

4

5

101

5

5

6

110

6

6

7

111

7

7

8

1000

10

8

9

1001

11

9

10

1010

12

A

11

1011

13

B

12

1100

14

C

13

1101

15

D

14

1110

16

E

15

1111

17

F

16

10000

20

10

   Если b – основание системы счисления, то числу n, имеющему в ней запись , в десятичной системе соответствует число

n = an * bn + an-1 * bn-1 + … + a1 * b + a0

   Примеры перевода чисел из разных систем счисления в десятичную:

   1. 1111 из двоичной: 11112 = 1 * 23 + 1 * 22 + 1 * 21 + 1 = 1510

   2. 16 из восьмеричной: 168 = 1 * 81 + 6 = 1410

   3. FF из шестнадцатеричной: FF16 = 15 * 161 + 15 = 25510

    Для перевода из десятичной системы счисления в двоичную (восьмеричную, шестнадцатеричную, …) пользуются делением в столбик. При делении числа n на 2 под числом n записываем остаток от деления n на 2, под двойкой – частное. Процесс деления оканчиваем, когда частное станет равным 1. Далее следует записать последнее частное (единицу) и все остатки от деления в обратном порядке. Например, найдем двоичное представление числа 20:

20

2

 

 

 

0

10

2

 

 

 

0

5

2

 

 

 

1

2

2

 

 

 

0

1

   Записав остатки в обратном порядке, получим: 2010 = 101002.

   Найдем шестнадцатеричное представление числа 511:

511

16

 

15 = F

31

16

 

15 = F

1

   Из таблицы получим: 51110 = 1FF16.

   При умножении на 10 в десятичной системе счисления к числу приписывается справа 0. Например, 71 * 10 = 710. Аналогично при умножении на b числа n в b - значной системе счисления к числу n приписывается справа 0. Например:

   5 * 2 = 10, в двоичной системе счисления: 1012 * 210 = 10102;

   255 * 162 = 65280, в шестнадцатеричной системе счисления: FF16 * 1610 * 1610 = FF0016;

   Упражнение 2.1. Найти двоичное, восьмеричное и шестнадцатеричное представление десятичного числа 31.

   Упражнение 2.2. Найти двоичное представление следующих чисел:

а) 22 + 24           б) 26 – 1          в) 3 * 82

 3. Методы класса

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

Округление (Rounder)

   Для заданного числа n найти ближайшее целое, которое делится на b. Если таких чисел несколько, то найти наибольшее.

   Класс: Rounder

   Метод: int round(int n, int b)

   Ограничения: 1 ≤ n ≤ 106, 2 ≤ b ≤ 500.

   Вход. Два числа n и b.

    Выход. Ближайшее целое к n, которое делится на b. Если n находится строго посредине двух чисел, делящихся на b, то вернуть наибольшее.

   Пример входа

n

b

5

10

4

10

100

3

49

7

   Пример выхода

   10

   0

   99

   49

 РЕШЕНИЕ

   Ближайшим к n целым, делящимся на b, будет число  . Если n находится строго посредине двух чисел, делящихся на b, это значение будет наибольшим среди них. В языке Си выражение примет вид: (n + b / 2) / b * b.

   Класс Rounder и метод round имеют следующий вид:

#include < stdio.h >

class Rounder

{

public:

  int round(int n, int b)

  {

    return ((n + (b / 2)) / b) * b;

  }

};

   Заметим, что после объявления класса следует ставить точку с запятой. Методом называется функция, объявленная в классе. Функцию следует объявить публичной (public) для того чтобы ее можно было вызывать извне. Именно в таком виде следует сдавать задачу.

   Для тестирования метода следует написать функцию main. Она должна содержать создание экземпляра класса, вызов метода с конкретными входными данными и вывод результата. Для задачи Rounder функция main имеет вид:

void main(void)

{

  Rounder s;

  int res = s.round(123456,7);

  printf("%d\n",res);

}

Калькулятор зарплаты (SalaryCalculator)

   Работая в компании, за первые 200 часов работник получает зарплату в размере p1 долларов в час каждый месяц. За остальные часы до конца месяца ставка работника составляет p2 долларов в час. Вычислить, какое наименьшее количество часов должен работать работник в месяц, чтобы получить суммарную зарплату в salary долларов.

   Класс: SalaryCalculator

   Метод: double calcHours(int p1, int p2, int salary)

   Ограничения: 1 ≤ p1, p2 ≤ 100, 1 ≤ salary ≤ 106.

   Вход. Ежемесячная зарплата работника в час за первые 200 часов и за последующие часы.

   Выход. Наименьшее количество часов должен работать работник в месяц, чтобы получить суммарную зарплату в salary долларов.

   Пример входа

p1

p2

salary

10

15

1000

10

15

3000

82

8

12140

   Пример выхода

   100.0

   266.6666666666667

   148.0487804878049

РЕШЕНИЕ

   За 200 часов работник получит t = p1 * 200 долларов. Если эта сумма больше salary, то достаточно работать salary / p1 часов. Иначе следует отработать 200 часов с зарплатой p1 долларов в час, а остальное время с зарплатой p2 долларов в час. При этом количество часов, когда зарплата будет составлять p2 долларов в час, равна (salaryt) / p2.

#include < stdio.h >

class SalaryCalculator

{

public:

  double calcHours(int p1, int p2, int salary)

  {

    int t = p1 * 200;

    if (t >= salary) return 1.0 * salary / p1;

    return 200 + 1.0 * (salary - t) / p2;

  }

};

   Для тестирования функции calcHours следует написать функцию main.

void main(void)

{

  SalaryCalculator s;

  double res = s.calcHours(82,8,12140);

  printf("%lf\n",res);

}

Убежать из прямоугольника (EscapeFromRectangle)

   Вы находитесь в точке (x, y) внутри прямоугольника, нижний левый угол которого имеет координаты (0, 0), а правый верхний (w, h). Найти наименьшее расстояние, которое Вам следует преодолеть чтобы достичь границы прямоугольника.

   Класс: EscapeFromRectangle

   Метод: int shortest(int x, int y, int w, int h)

   Ограничения: 2 ≤ w, h ≤ 1000, 1 ≤ x ≤ w-1, 1 ≤ y ≤ h-1.

   Вход. Целочисленные координаты Вашего положения (x, y) и правой верхней вершины прямоугольника (w, h).

   Выход. Наименьшее расстояние, которое следует преодолеть для достижения границы прямоугольника.

   Пример входа

x

y

w

h

1

1

5

5

653

375

1000

1000

161

181

762

375

   Пример выхода

   1

   347

   161

РЕШЕНИЕ

   Находим расстояния от точки (x, y) до всех четырех сторон прямоугольника, которые соответственно равны x, y, wx, hy. Возвращаем наименьшее из этих значений.

#include < stdio.h >

class EscapeFromRectangle

{

public:

  int shortest(int x, int y, int w, int h)

  {

    int res = x;

    if (y < res) res = y;

    if (w - x < res) res = w - x;

    if (h - y < res) res = h - y;

    return res;

  }

};

   Далее при разборах задач с Топкодера функцию main приводить не будем.

Наибольший прямоугольник (BiggestRectangleEasy)

   У Джона есть n спичек, каждая из которых имеет длину 1. Он хочет составить из них прямоугольник наибольшей площади. Ломать спички нельзя. Джону не обязательно использовать все спички.

   Класс: BiggestRectangleEasy

   Метод: int findArea(int n)

   Ограничения: 4 ≤ n ≤ 10000.

   Вход. Количество спичек n, которое имеется в наличии у Джона.

   Выход. Наибольшая площадь прямоугольника, который может составить Джон при помощи имеющихся у него спичек.

   Пример входа

n

11

5

7254

   Пример выхода

   6
   1
   3288782

РЕШЕНИЕ

   Если одна из сторон прямоугольника равна x, то другую можно найти по формуле:

y = (n – 2*x) / 2

   Площадь полученного прямоугольника равна S(x) = x * (n – 2*x) / 2. Она будет наибольшей в такой точке x, в которой S’(x) = 0. Имеем: S’(x) = (n – 4*x) / 2 = 0, x = n / 4. То есть искомым прямоугольником будет квадрат.

   Если n не делится на 4, то выполняя целочисленные деления, получим правильный результат.

#include < stdio.h >

class BiggestRectangleEasy

{

public:

  int findArea(int n)

  {

    int x = n / 4;

    int y = (n - 2 * x) / 2;

    return x * y;

  }

};


 

А также другие работы, которые могут Вас заинтересовать

71607. ОРГАНЫ МЕСТНОГО САМОУПРАВЛЕНИЯ КАК ОРГАНЫ ОПЕКИ И ПОПЕЧИТЕЛЬСТВА: ПРОБЛЕМЫ РЕГИОНАЛЬНОГО ЗАКОНОДАТЕЛЬСТВА 81 KB
  Еще в период существования советского государства законодатель наделил местные администрации в РСФСР полномочиями на осуществление функций опеки и попечительства установив их компетенцию в Положении об органах опеки и попечительства в РСФСР от 30 апреля 1986 г.
71608. ПРОЕКТИРОВАНИЕ ТЯГОВОЙ ПОДСТАНЦИИ ПЕРЕМЕННОГО ТОКА 1.4 MB
  Электрическая тяга является основным потребителем электроэнергии на железнодорожном транспорте. Удовлетворение потребностей железнодорожного транспорта в электроэнергии осуществляется в основном путем присоединения железнодорожных установок к районным сетям энергосистемы.
71610. Каузальная атрибуция в межличностном общении студентов 158 KB
  Изначально идея познания человеком окружающего мира находилась в русле философской теории познания и рассматривалась только в русле отношений с природой. Если первое относится только к миру духовных сущностей идей то второе годно для познания чувственных вещей которые изменчивы...
71612. 11 ТО которая может длительно использоваться при температуре 1200 С. 1.28 MB
  Газы из баллонов с метаном и диоксидом углерода подаются через редукторы на блок ИРГ3 измерение расходов газов и затем на манометры. Этот хроматограф мы используем для определения водорода азота монооксида углерода диоксида углерода и метана.
71613. Рекомендации по совершенствование процесса управления ассортиментом в ООО «Овен» 1.59 MB
  Сущность элементы и задачи ассортиментной политики Ассортимент товаров совокупность их видов разновидностей и сортов объединенных или сочетающихся по определенному признаку. Основными тематическими признаками товаров являются сырьевой производственный и потребительский.
71614. ШУРАНОВ Б.М. ЗАБЕСКОНЕЧНОСТЬ «ЗАПИРАЕТ» БЕСКОНЕЧНОСТЬ 273.64 KB
  Статья рассматривает проблемы дальнейшего развития предикабилии «забесконечность» в свете ведущихся вокруг её содержания философских дискуссий. Предназначена для широкого круга любителей философии и специалистов - философов, логиков. ЗАБЕСКОНЕЧНОСТЬ «ЗАПИРАЕТ» БЕСКОНЕЧНОСТЬ ШУРАНОВ Б.М.
71615. Методика раскрытия и расследования преступлений, совершаемых несовершеннолетними 71.67 KB
  Понятие и структура криминалистической характеристики преступлений совершаемых несовершеннолетними. По данному поводу в разное время высказалось немало авторов хотя стоит учесть что криминалистическая характеристика преступлений сравнительно новое понятие в криминалистической науке.