Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Visual_Studio_2010

.pdf
Скачиваний:
109
Добавлен:
03.03.2016
Размер:
5.94 Mб
Скачать

Задание5

1.В программе предусмотрите вывод двоичных эквивалентов для введенных чисел.

2.Измените программу так, чтобы операции с переключателем switch выполнялись в функции printHex2Bin().

3.Создайте функцию и сформируйте в ней одномерный массив символов двоичного эквивалента заданного шестнадцатеричного числа. Предусмотрите вывод результата.

4.Выполните программу со всеми поразрядными операциями при вводе чисел (года и дня рождения пользователя).

5.Напишите программу перевода десятичных чисел в восьмеричные (вместо *dec2hex()). Предусмотрите также поразрядные операции с выводом двоичных эквивалентов.

6.В программе предусмотрите копирование консольного содержания в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.

Пример 6. Написать программу ротации битов для заданных чисел, представленных в шестнадцатеричном виде, когда биты с самых крайних разрядов не теряются, а переносятся на противоположную сторону [2].

Программный код решения примера

#include <stdio.h> #include <conio.h> #include <string.h> const char basestr[16] =

{'0','1','2','3','4','5','6','7','8','9',

'A','B','C','D','E','F'};

int main (void) { int n;

unsigned int number, uns;

char *NUM1, str[128] = "0x", un[] = "u";

FILE *fid;

// Прототипы функций

char *dec2hex (unsigned int var);

unsigned int rotate (unsigned int value, int n);

printf("\n The program for demonstration of bit-by-bit rotation

\n of the numbers set in a hexadecimal kind\n");

printf("\n\t Enter the unsigned decimal: "); scanf_s("%u", &number);

printf("\t Enter the number of bits of rotation: "); scanf_s("%d", &n);

//Для контроля перевода десятичного числа в шестнадцатеричное printf("\n\t Hexadecimal numbers: %X\n", number);

281

NUM1 = dec2hex(number); strcat_s(str, 127, NUM1); strcat_s(str, 127, un);

fopen_s(&fid,"temp.txt", "w"); fprintf(fid,"%s", str); fclose(fid);

fopen_s(&fid,"temp.txt", "r"); fscanf_s(fid,"%x", &uns); fclose(fid);

printf("\n\t After rotating %d-bits: %X\n", n, rotate(uns, n)); printf("\n\n Press any key: ");

_getch(); return 0; }

//Функция перевода десятичного числа в шестнадцатеричное char *dec2hex(unsigned int var)

{

int number[64]; int i, j, k = 0;

unsigned int base = 16; char Hex[128], *PTR; PTR = Hex;

do {

number[k] = var % base; ++ k;

var /= base;

} while (var != 0);

for (i = k-1, j = 0; i >= 0; --i, ++j) { Hex[j] = basestr[number[i]];

PTR[j] = Hex[j];

}

PTR[j] = '\0';

return (PTR);

}

//Функция ротации числа влево или вправо unsigned int rotate (unsigned int var, int n)

{

unsigned int result, bits;

// Ограничение диапазона ротации if (n > 0)

n = n % 32;

else

n = -(-n % 32); if (n == 0)

result = var;

282

else

if (n > 0) // ротация влево

{

bits = var >> (32 - n); result = var << n | bits;

}

else // ротация вправо

{

n = -n;

bits = var << (32 - n); result = var >> n | bits;

}

return (result);

}

В программе сначала формируется символьное выражение шестнадцатеричного числа с помощью функции dec2hex(). Затем оно приводится к стандартному виду посредством функции strcat_s(), которая к имеющемуся значению добавляет содержимое строки от функции dec2hex(). После этого добавляется суффикс u типа unsigned int. Для получения собственно шестнадцатеричного числа выполнена операция записи строки в файл и чтения из файла в шестнадцатеричном формате. Далее используется функция rotate(). Ротация переменной на n битов влево производится в соответствии с алгоритмом, состоящим из трех шагов [2]. Сначала извлекаются левые n бит исходного значения в отдельную переменную (bits), которая сдвигается вправо (с помощью поразрядного сдвига >>) на количество позиций (32 – n). Затем исходное значение (var) сдвигается влево на n битов, и наконец, над получившимся значением и извлеченными битами производится операция поразрядной дизъюнкции ИЛИ. Аналогичные действия выполняются при сдвиге вправо.

Возможный результат реализации программы показан на рис.16.6.

Рис. 16.6. Результат ротации заданного числа

283

Задание6

1.Дополните программу выводом на консоль прочитанного числа из текстового файла.

2.В качестве вводимых данных используйте год и месяц рождения пользователя (студента).

3.Выполните ротацию шестнадцатеричных чисел, записанных в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа. В качестве тестовых чисел и числа битов ро-

тации примите: 1) 0xABCDEF00u, 8; 2) 0xABCDEF00u,16;

3) 0xFFFF1122u, 4;

4) 0xFFFF1122u, 2;

5)0xABCDEF00u, 0; 6) 0xABCDEF00u, 44.

4.Напишите программу по ротации восьмеричных чисел.

Пример 7. Написать программу по решению следующего примера. С клавиатуры вводятся два целых числа. Остатки от деления их на 16 заносятся соответственно в 4 младших и 4 старших разряда одного байта. Затем следует напечатать изображение содержимого сформированного байта [3].

Программный код решения примера

#include <stdio.h>

#include <conio.h> #include <locale.h>

// Прототипы функций

void binar (unsigned char);

unsigned char code16 (unsigned int, unsigned int);

int main (void)

{

unsigned int m, n; unsigned char k;

setlocale(LC_ALL, ".1251");

printf("\n\t Введите первое беззнаковое число N1: "); scanf_s("%u", &m);

printf("\t Введите второе беззнаковое число N2: "); scanf_s("%u", &n);

k = code16(m, n);

printf("\n\t Код двух остатков старших и младших разрядов байта:

%u", k); binar(k);

printf("\n Нажмите любую клавишу: ");

_getch(); return 0;

}

284

// Определение функции

unsigned char code16 (unsigned int a, unsigned int b){

//Объединение с вложенной структурой union

{

unsigned char z; struct

{

unsigned int x : 4; // младшие биты unsigned int y : 4; // старшие биты

}hh;

}un;

un.hh.x = a % 16; un.hh.y = b % 16; return (un.z);

}

// Определение функции

void binar (unsigned char ch)

{

int i;

//Объединение с вложенной структурой union {

unsigned char ss;

//Структура с битовыми полями

struct

{

unsigned int a0:1; unsigned int a1:1; unsigned int a2:1; unsigned int a3:1; unsigned int a4:1; unsigned int a5:1; unsigned int a6:1; unsigned int a7:1;

}byte;

}cod;

cod.ss = ch;

printf("\n\n\t Число разрядов:\n\t");

for (i = 0; i < 8; ++i) printf("%4d", 7 - i);

printf("\n\t Значения битовых полей:\n\t"); printf("%4d%4d%4d%4d%4d%4d%4d%4d",\

cod.byte.a7, cod.byte.a6, cod.byte.a5, cod.byte.a4,\ cod.byte.a3, cod.byte.a2, cod.byte.a1, cod.byte.a0); printf("\n\n");

}

Возможный результат выполнения программы показан на рис.16.7.

285

Рис. 16.7. Значения битов остатков от деления двух чисел

В программе используются две переменные типа объединения и две структурные переменные. Объединение имеет свойство, при котором переменные разных типов занимают одну область памяти, соответствующую наибольшему размеру в байтах. Поэтому если инициализируются переменные одного типа (например, un.hh.x = a % 16; un.hh.y = b % 16;), то перемен-

ная другого типа (unsigned char z;) будет располагаться в той же области памяти, что и первые (unsigned int (x и y)). В связи с этим якобы неинициализированная переменная un.z возвращается функцией code16(). Размеры полей задаются программистом с учетом того, чтобы в них помещалось соответствующее число, представленное в двоичной системе. Например, если размерность поля равна 2, то в него можно записать десятичное число 3, так как двоичный эквивалент числа равен 11, в поле с размерностью 8 можно записать число 140, так как его двоичный эквивалент равен 10001100.

Задание7

1.Выведите на консоль размерность в байтах объединений и структур, определенных в программе.

2.Проанализируйте результат выполнения программы при изменении размера битовых полей в структуре функции code16().

3.Видоизмените программу для ввода трех чисел и определения значений разрядных (битовых) полей после занесения в них остатков от деления на целое число 8.

4.Определите размер в байтах объединения.

5.Определите размер в байтах вложенной структуры.

Пример 8. Используя битовые поля структуры, написать программу вывода на экран дисплея двоичного кода ASCII символа, вводимого с клавиатуры.

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

ASCII (american standard code for information interchange – американский стан-

дартный код для обмена информацией). Таблицу символов ASCII можно посмотреть в работе [1].

286

Программный код решения примера

#include <stdio.h> #include <conio.h>

//Шаблон структуры с битовыми полями struct byte {

int b1 : 1; int b2 : 1; int b3 : 1; int b4 : 1; int b5 : 1; int b6 : 1; int b7 : 1; int b8 : 1; };

//Определение объединения с вложенной структурой union bits {

char ch;

struct byte bit; } un;// un - переменная типа объединения

//Прототип функции

void decode (union bits bt, int ch);

// Главная функция int main (void) {

printf("\n\t Enter any symbol or Ctrl+Z to quit:\n"); do {

printf("\n\t Enter: "); un.ch = getchar();

if ( (un.ch) == EOF) break; decode(un, un.ch);

} while ((un.ch = getchar())!= EOF);

printf("\n Press any key: "); _getch();

return 0; }

// Функция двоичного представления символов void decode (union bits bt, int ch)

{

printf("\tBinary code of '%c':\n", ch); if (bt.bit.b8) printf("%2c 1", ' '); else printf("%2c 0", ' ');

if (bt.bit.b7) printf("%2c 1", ' '); else printf("%2c 0", ' ');

if (bt.bit.b6) printf("%2c 1", ' '); else printf("%2c 0", ' ');

if (bt.bit.b5) printf("%2c 1", ' '); else printf("%2c 0", ' ');

if (bt.bit.b4) printf("%2c 1", ' '); else printf("%2c 0", ' ');

if (bt.bit.b3) printf("%2c 1", ' ');

287

else printf("%2c 0", ' ');

if (bt.bit.b2) printf("%2c 1", ' '); else printf("%2c 0", ' ');

if (bt.bit.b1) printf("%2c 1", ' '); else printf("%2c 0", ' '); printf("\n");

}

Программа ориентирована на 8 бит одного байта целочисленного значения, которым кодируется символ, вводимый с клавиатуры. В функции decode() использовано форматирование на основе символа «пробел».

Возможный результат выполнения программы приведен на рис.16.8.

Рис. 16.8. Пример вывода двоичных кодов заданных символов

Задание8

1.Вместо цикла do – while примените другой оператор цикла.

2.Напишите программу вывода всех строчных букв латинского алфавита и их двоичных эквивалентов в кодировке ASCII без ввода их с клавиатуры.

3.Определите размер в байтах вложенной структуры.

288

Пример 9. Написать программу левого поразрядного сдвига для вводимого с клавиатуры целого числа с выводом его двоичного эквивалента и повторными сдвигами влево.

В программе решения примера следует предусмотреть перевод числа из десятичной системы счисления в двоичную. При поразрядном сдвиге влево на освободившееся место (места) двоичного числа записываются нули.

Программный код решения примера

#include <stdio.h> #include <conio.h>

// Главная функция int main (void)

{

long int a; unsigned int m, n;

//Прототип функции

void dec2(long int var, unsigned int m, unsigned int n);

printf("\n\t Enter an integer: "); scanf_s("%ld", &a);

_flushall();

printf("\t Enter a value shift: "); scanf_s("%u", &m);

_flushall();

printf("\t Enter number of repeated shifts: "); scanf_s("%u", &n);

_flushall(); dec2(a, m, n);

printf("\n\n Press any key: "); _getch();

return 0; }

// Функция поразрядного сдвига

void dec2(long int var, unsigned int m, unsigned int n)

{

unsigned int b, i;

long int mask = 1 << 31; long int M[128];

for (i = 0; i < n; ++i)

M[i] = var << i*m;

printf("\n\t Decimal and its binary equivalent after the shift:\n");

for (i = 0; i < n; ++i) { if (i == 0) {

printf("\n Initial number %ld:\n\t", M[0]);

for (b = 1; b <= 32; ++b) { printf("%c", M[0] & mask ? '1' : '0');

M[0] <<= 1; // or: var = var << 1;

289

if (b % 8 == 0) putchar(' ');

}

}

else {

printf("\n The following number %ld:\n\t", M[i]);

for (b = 1; b <= 32; ++b) { printf("%c", M[i] & mask ? '1' : '0'); M[i] <<= 1;

if (b % 8 == 0) putchar(' ');

}

}

printf("\n");

}

}

Вывод двоичного эквивалента сделан побайтно с учетом того, что в одном байте находится 8 бит.

Возможный результат выполнения программы показан на рис.16.9.

Рис. 16.9. Поразрядный сдвиг влево заданного числа

Задание9

1.Проверьте результат выполнения программы с помощью инженерного калькулятора (calc).

290

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]