- •5.1. Разработка алгоритма решения
- •5.2. Определение переменных программы
- •5.3. Разработка текста программы
- •5.4. Результат работы программы представлен на рисунке:
- •Int a; // глобальная переменная
- •Int с; // локальная переменная
- •5.6. Выводы
- •6. Контрольные вопросы
- •Приложение 1. Математические функции.
- •Приложение 2. Порядок создания консольного приложения в интегрированной среде разработки Microsoft Visual Studio 10.0
- •5. Пример решения задачи (вариант 30)
- •5.1. Разработка алгоритма решения
- •5.1.1. Общий метод решения
- •5.2. Определение переменных программы
- •5.3. Разработка текста программы
- •5.4. Отладка программы
- •5.5. Результаты работы программы
- •5.6. Выводы
- •6. Контрольные вопросы
- •Приложение 2. Некоторые функции стандартного ввода-вывода
- •5. Пример решения задачи (вариант 30)
- •5.1. Программа упаковки
- •5.1.1. Разработка алгоритма решения.
- •5.1.2. Определение переменных программы
- •5.2. Программа распаковки
- •5.2.1. Разработка алгоритма решения.
- •5.3. Выводы
- •6. Контрольные вопросы
- •5. Пример решения задачи (вариант 30)
- •5.1. Программа упаковки
- •5.1.1. Разработка алгоритма решения.
- •5.1.2. Определение переменных программы
- •5.2. Программа распаковки
- •5.2.1. Разработка алгоритма решения.
- •5.3. Выводы
- •6. Контрольные вопросы
- •5.2. Определение переменных программы
- •5.3. Разработка текста программы
- •5.4. Отладка программы
- •5.5. Результаты работы программы
- •5.6. Выводы
- •Задание 1.
- •Задание 2
- •6. Контрольные вопросы
5.4. Отладка программы
При отладке программы можно использовать пошаговый режим отладки с отслеживанием значений переменных - тех, которые вводятся. Если возникнут проблемы с вводом переменных, есть смысл вводить каждую переменную отдельным оператором.
Аккуратный формат таблицы достигается несколькими запусками программы с последующим выравниванием столбцов по результатам запуска.
5.5. Результаты работы программы
При работе программы на экран было выдано следующее:
1. Введите: название, школу, количество, площадь > Тодайдзи Т 220 368.8
2. Введите: название, школу, количество, площадь > Якусидзи С 50 54.7
3. Введите: название, школу, количество, площадь > Дайаедзи Д 10 12.2
----------------------------------------------
|Буддийские монастыри Японии периода Нара |
|--------------------------------------------|
| Название | Школа | Количество|Площадь земли|
| | | монахов | (га) |
|----------|-------|-----------|-------------|
| Тодайдзи | Т | 220 | 368.8 |
| Якусидзи | С | 50 | 54.7 |
| Дайаедзи | Д | 10 | 12.2 |
|--------------------------------------------|
| Примечание: Т - Тендай; С - Сингон; |
| Д - Дзедзицу |
----------------------------------------------
5.6. Выводы
При выполнении практического занятия изучены вопросы:
-
типы данных в языке C, объявление переменных в программе
-
ввод и вывод данных, форматизация вывода.
6. Контрольные вопросы
-
Для каких типов данных используются суффиксы при инициализации переменных?
-
Чем отличаются функции printf() и puts() при консольном выводе информации?
-
При использовании функции gets_s() с какими разделителями может происходить считывание информации с консоли?
-
Какой тип данных возвращает функция gets_s() при считывании информации?
-
Как осуществляются автоматическое и принудительное приведение типов в языке С(С++)?
Приложение 1. Базовые типы данных языка С++
Название типа |
Пояснения |
Диапазон значений |
short |
Краткое целое число |
-128 . . . 127 |
unsigned short |
Краткое целое число без знака |
0 . . . 255 |
int |
Целое число |
-32768 . . . 32767 |
unsigned int |
Целое число |
0 . . . 65535 |
long |
Длинное целое число |
-230 . . . 230-1 |
unsigned long |
Длинное целое число без знака |
0 . . . 231-1 |
char |
Один символ |
символы кода ASCII |
char[ ] |
Строка |
|
float |
Число с плавающей точкой |
3.4 10-38 . . . 3.4 10+38 |
double |
Число с плавающей точкой двойной точности |
1.7 10-308 . . . 1.7 10+308 |
Приложение 2. Некоторые функции стандартного ввода-вывода
Функции стандартного ввода - вывода описаны в файле stdio.h.
printf() - форматный вывод на экран:
int printf(char *format, <список вывода>);
Первый параметр является символьной строкой, которая задает спецификации формата. Остальные параметры - перечисление переменных и выражений, значения которых выводятся. Каждая спецификация формата имеет вид (параметры в квадратных скобках необязательны):
%[flags][width][.prec][F|N|h|l]type
где:
type - |
тип спецификации |
d или i |
целое десятичное число со знаком |
u |
десятичное число без знака |
x |
целое 16-ричное число без знака |
f |
число с плавающей точкой |
e |
число в E-форме |
g |
число с плавающей точкой или в E-форме |
c |
один символ |
s |
строка |
% |
символ % |
flags - |
признак выравнивания: |
+ или пусто |
выравнивание по правому краю |
- |
выравнивание по левому краю |
width - |
целое число - общая ширина поля. Если это число начинается с цифры 0, вывод дополняется слева нулями до заданной ширины. В заданную ширину входят все символы вывода, включая знак, дробную часть и т.п. |
prec - |
целое число, количество знаков после точки при выводе чисел с плавающей точкой |
F - |
соответствующий элемент списка вывода является дальним указателем |
N - |
соответствующий элемент списка вывода является близким указателем |
l - |
соответствующий элемент списка вывода является long int или double |
scanf() - форматный ввод с клавиатуры:
int scanf(char *format, <список ввода>);
Первый параметр является символьной строкой, которая задает спецификации формата (см. функцию printf()). Остальные параметры - перечисление адресов переменных, в которые вводятся данные. В этом списке перед именами всех переменных, кроме тех, которые вводятся по спецификации типа %s, должен стоять символ &.
В таких средах разработки как MS Visual Studio 2008 и 2010 рекомендуется для безопасной работы применять функцию scanf_s(). Для этой функции при чтении символа следует указать его размер в байтах. Например, scanf_s("%c", &ch, 1). В Visual Studio 2010 тип данных char занимает 1 байт.
putchar() - вывод одного символа на экран:
int putchar(int ch);
Параметр функции - код символа, который выводится. При успешном выполнении функция возвращает этот же код, при неуспешном - EOF.
getchar() - ввод одного символа с клавиатуры:
int getchar(void);
Функция возвращает код введенного символа.
puts() - вывод строки символов на экран:
int puts(char *string);
Параметр функции - указатель на начало той строки, из которой выводятся данные. Функция возвращает количество выведенных символов.
gets() - ввод строки символов с клавиатуры:
char *gets(char *string);
Параметр функции - указатель на начало той строки, в которую вводятся данные. Функция возвращает тот же самый указатель. Функция gets() читает символы (включая пробелы) из стандартного потока stdin и помещает их в массив символов, адресуемый указателем *str (далее это массив символов). Символы читаются до тех пор, пока не встретится разделитель строк или значение EOF. Для реализации EOF на клавиатуре следует набрать одновременно Ctrl+Z. Вместо разделителя строк в конец строки вставляется нулевой символ, свидетельствующий о ее завершении. Следует учесть, что нет способа ограничить количество символов, которое прочитает функция gets(). Поэтому массив, адресуемый указателем *str, может переполниться, и тогда программа выдаст непредсказуемые результаты [23].
В Microsoft Visual Studio 2010 рекомендуется использовать gets_s(), чтобы не было предупреждений.
Практическое занятие №3. Битовые операции
1. Цель работы
Целью практического занятия является получение практических навыков в работе с побитовыми логическими операциями и операциями сдвига языка C.
2. Темы для предварительного изучения
Побитовые логические операции и операции сдвига.
3. Задание для выполнения
Составить две программы, первая из которых вводит составные части структуры данных, приведенной в Вашем варианте индивидуального задания, и формирует из них заданную упакованную структуру. Вторая программа вводит упакованную структуру как 16-ричное число и выводит значения отдельных ее составных частей.
4. Варианты индивидуальных заданий
Вариант 1
Физический адрес на диске представляется в виде:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Значение |
H |
H |
T |
T |
T |
T |
T |
T |
T |
T |
T |
S |
S |
S |
S |
S |
где:
HH - |
номер головки |
T..T - |
номер дорожки |
S..S - |
номер сектора |
Вариант 2
Слово состояния программы в вычислительной системе представляется в виде:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
C |
C |
C |
C |
E |
I |
P |
0 |
0 |
0 |
K |
K |
K |
0 |
0 |
0 |
где: C..C - |
маски каналов 0 - 3 |
E - |
маска внешнего прерывания |
I - |
маска внутреннего прерывания |
P - |
маска программного прерывания |
KKK - |
ключ защиты памяти |
Вариант 3
Слово состояния канала в вычислительной системе представляется в виде:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
N |
N |
N |
N |
E |
C |
C |
C |
C |
C |
C |
C |
C |
C |
0 |
P |
где:
N..N - |
номер канала |
E - |
признак ошибки |
C..C - |
код причини прерывания |
P - |
признак завершения программы в канале |
Вариант 4
Формат команды загрузки/сохранения в вычислительной системе имеет вид:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
D |
R |
R |
R |
R |
A |
A |
A |
A |
где:
D - |
направление передачи - в регистр(0)/в память(1) |
R..R - |
1-й операнд - регистр |
A..A - |
регистр адреса 2-го операнда |
Вариант 5
Слово состояния оборудования для вычислительной системы представляется в виде:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
P |
P |
P |
0 |
F |
F |
0 |
H |
H |
H |
H |
0 |
0 |
V |
V |
V |
где:
PPP - |
количество принтеров |
FF - |
количество гибких дисков |
H..H - |
тип жесткого диска |
VVV - |
тип видеоадаптера |
Вариант 6
Формат команды сдвига в вычислительной системе имеет вид:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
1 |
1 |
0 |
1 |
T |
T |
D |
N |
N |
N |
N |
N |
N |
N |
N |
N |
где:
TT - |
тип сдвига |
D - |
направление сдвига |
N..N - |
количество разрядов сдвига |
Вариант 7
Блок управления буфером кеша в вычислительной системе представляется в виде:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
S |
S |
S |
0 |
D |
0 |
F |
0 |
B |
B |
B |
B |
B |
B |
B |
B |
где:
SSS - |
код системной области или 000 |
D - |
признак "грязного" буфера |
F - |
признак свободного буфера |
B..B - |
номер блока, который отображен в буфере |
Вариант 8
Элемент списка безопасности объекта в вычислительной системе представляется в виде:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
U |
U |
U |
U |
U |
U |
U |
U |
R |
W |
E |
0 |
0 |
0 |
0 |
X |
где:
U..U - |
идентификатор пользователя |
R - |
право читать |
W - |
право писать |
E - |
право выполнять программный код |
X - |
явный запрет доступа |
Вариант 9
Формат команды канала в система ввода-вывода имеет вид:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
O |
O |
O |
O |
O |
C |
D |
N |
N |
N |
N |
N |
N |
N |
N |
N |
где:
O..O - |
код операции |
C - |
признак цепочки команд |
D - |
признак цепочки данных |
N..N - |
количество байтов для передачи |
Вариант №10
Элемент профиля пользователя в вычислительной системе представляется в виде:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
G |
G |
G |
G |
G |
G |
G |
G |
S |
S |
S |
S |
P |
0 |
0 |
0 |
где:
G..G - |
идентификатор группы, к которой принадлежит пользователь |
S..S - |
код системы, которая загружается для пользователя |
P - |
признак привилегированного пользователя |
Вариант 11
Информация о состоянии устройства в системе ввода-вывода представляется в виде:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
C |
C |
C |
U |
U |
U |
U |
U |
E |
E |
E |
E |
E |
E |
0 |
B |
где:
CCC - |
номер канала |
U..U - |
номер устройства в канале |
E..E - |
код состояния |
B - |
признак занятости устройства |
Вариант 12
Формат команды сложения в вычислительной системе имеет вид:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
D |
A |
A |
A |
B |
B |
B |
0 |
где:
D - |
сложение байтов/слов - 0/1 |
AAA - |
регистр - 1-й операнд |
BBB - |
регистр - 2-й операнд |
Вариант 13
Формат представления текущей даты в некоторых системных структурах имеет вид:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
D |
D |
D |
D |
D |
M |
M |
M |
M |
M |
Y |
Y |
Y |
Y |
Y |
Y |
где:
D..D - |
день |
M..M - |
месяц |
Y..Y - |
год после 1980 |
Вариант 14
Формат представления текущего времени в некоторых системных структурах имеет вид:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
S |
S |
S |
S |
S |
M |
M |
M |
M |
M |
M |
H |
H |
H |
H |
H |
где:
S..S - |
секунды/2 |
M..M - |
минуты |
H..H - |
часы |
Вариант 15
Дескриптор сегмента для системы виртуальной памяти представляется в виде:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
F |
F |
F |
F |
F |
F |
F |
F |
R |
W |
L |
L |
L |
L |
L |
L |
где:
F..F - |
номер блока, с которого начинается сегмент |
R - |
доступ для чтения |
W - |
доступ для записи |
L..L - |
размер сегмента в блоках |
Вариант 16
Атрибут файла в файловой системе представляется в виде:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
T |
T |
T |
T |
A |
A |
A |
0 |
I |
I |
I |
I |
I |
I |
I |
I |
где:
T..T - |
код типа файла |
AAA - |
код доступа |
I..I - |
номер файлового индекса |
Вариант 17
Блок управления памятью в операционной системе имеет формат:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
O |
O |
O |
O |
O |
O |
O |
O |
0 |
P |
L |
L |
L |
L |
L |
L |
где:
O..O - |
идентификатор владельца блока |
P - |
признак программного блока |
L..L - |
размер блока |
Вариант 18
Точка изображения на 16-цветном дисплее с размером экрана 64х64 описывается в формате:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
X |
X |
X |
X |
X |
X |
Y |
Y |
Y |
Y |
Y |
Y |
C |
C |
C |
C |
где:
X..X - |
горизонтальная координата |
Y..Y - |
вертикальная координата |
C..C - |
цвет |
Вариант 19
Управляющее слово программируемого таймера имеет формат:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
C |
C |
F |
F |
D |
D |
D |
D |
D |
D |
D |
D |
D |
D |
D |
D |
где:
CC - |
номер канала таймера |
FF - |
форма сигнала |
D..D - |
коэффициент деления опорной частоты |
Вариант 20
Информация о критической ошибке на диске представляется в виде:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
O |
A |
A |
R |
R |
R |
0 |
1 |
D |
D |
D |
D |
D |
D |
D |
D |
где:
O - |
тип операции - чтение/запись (0/1) |
AA - |
код области диска |
RRR - |
возможные реакции на ошибку |
D..D - |
номер диска |
Вариант 21
Дескриптор сообщения в системе телекоммуникаций имеет формат:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
N |
N |
N |
N |
0 |
P |
P |
P |
U |
U |
U |
U |
U |
U |
U |
U |
где:
N..N - |
номер узла, из которого пришло сообщение |
PPP - |
приоритет сообщения |
U..U - |
идентификатор пользователя - автора сообщения |
Вариант 22
Дескриптор семафора, который защищает пул ресурсов, имеет формат:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
N |
N |
N |
M |
M |
M |
0 |
L |
W |
W |
W |
W |
W |
W |
W |
W |
где:
N..N - |
текущее количество свободных единиц ресурса |
M..M - |
общее количество единиц ресурса |
L - |
признак блокирования/разблокирования семафора (1/0) |
W..W - |
количество процессов, которые ожидают доступа к ресурсу |
Вариант 23
Заголовок кадра в системе передачи данных имеет формат:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
S |
S |
S |
S |
S |
S |
D |
D |
D |
D |
D |
D |
0 |
C |
C |
C |
где:
S..S - |
адрес источника |
D..D - |
адрес приемника |
CCC - |
управляющий код |
Вариант 24
Заголовок пакета в системе передачи данных имеет формат:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
T |
T |
T |
0 |
S |
S |
S |
S |
L |
L |
L |
L |
L |
L |
L |
L |
где:
TTT - |
тип пакета |
S..S - |
идентификатор источника |
L..L - |
длина пакета |
Вариант 25
Поле управления диспетчером кадра в протоколе управления логическим каналом имеет формат:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
1 |
0 |
C |
C |
0 |
0 |
0 |
0 |
P |
N |
N |
N |
N |
N |
N |
N |
где:
CC - |
управляющий код |
P - |
признак запроса или завершения (0/1) |
N..N - |
номер последовательности |
Вариант 26
Формат заголовка пакета в системе ретрансляции кадров такой:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
C |
C |
C |
C |
C |
C |
C |
C |
C |
C |
R |
E |
E |
E |
E |
E |
где:
C..C - |
идентификатор канала передачи |
R - |
признак команды / ответа (0/1) |
E..E - |
расширение адреса |
Вариант 27
Формат элемента доступа к объекту в системе безопасности такой:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
0 |
A |
A |
A |
T |
T |
M |
0 |
G |
G |
G |
G |
G |
G |
G |
G |
где:
AAA - |
код доступа к объекту из группы PUBLIC |
TT - |
доступ для чтения и/или доступ для записи |
G..G - |
код группы доступа, к которой принадлежит объект |
Вариант 28
Дескриптор массива, который формируется компилятором языка программирования, имеет формат:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
L |
L |
L |
L |
0 |
0 |
B |
B |
B |
B |
B |
E |
E |
E |
E |
E |
где:
L..L - |
размер элемента массива |
B..B - |
начальный индекс |
E..E - |
конечный индекс |
Вариант 29
Блок управления сегментом памяти в системе с реальной памятью имеет формат:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
T |
T |
T |
T |
T |
0 |
A |
0 |
L |
L |
L |
L |
L |
L |
L |
L |
где:
T..T - |
идентификатор задачи, которой принадлежит сегмент или 0 - для свободного сегмента |
A - |
признак активности задачи (1/0) |
L..L - |
длина сегмента |
Вариант 30
Слово состояния устройства в системе ввода-вывода представляется в виде:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
C |
C |
C |
C |
C |
0 |
F |
B |
N |
N |
N |
N |
N |
N |
N |
N |
где:
C..C - |
код состояния |
F - |
признак ошибки (1/0) |
B - |
признак занятости (0/1) |
N..N - |
количество байт, переданных в последней операции |