Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие_2_изд_испр.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
2.27 Mб
Скачать

3. Литералы.

(МВ) Для трансляторов языка C, в которых не предусмотрены логические данные, разумно ввести в программу логические литералы.

#define TRUE 1

#define FALSE 0

Не следует забывать, что логические данные в программе на языке Basic занимают в памяти 2 байта, значения хранятся в виде true (-1), false (0), а на языке C они занимают в памяти 1 байт и хранятся в виде true (1), false (0).

(В) Старайтесь избегать в тексте программы литералов, заменяйте их символическими константами с помощью директивы #define (язык C).

4. (В) Массивы.

Для языка C следует отметить такие особенности.

Если возможно изменение размеров массивов, определяйте их размеры с помощью директивы #define.

Пример.

#define PAZM 5

float Matrix[PAZM][PAZM];

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

В языке Basic для массивов, размеры которых могут изменяться, при описании используется инструкция dim с пустыми скобками.

Пример.

Dim Matrix( ) As Single

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

Пример.

ReDim Matrix(1 To 10, 1 To 10)

Такая инструкция в теле процедуры может использоваться многократно. Более подробно синтаксис и область применения инструкции redim будет изложена ниже.

5. (ОВ) В языке C необходимо помнить об особенностях операторов деления / и остатка % при работе с целыми операндами. При делении целого на целое результат всегда целый. Оператор % используйте только для целых операндов.

6. (В) Для логических операторов && и || в языке C вычисление выражения прекращается, как только результат определен, а для аналогичных операторов and и or в языке Basic проверяются оба операнда.

Пример.

Выражение i<100 && x[ i ]<0 при i=100 в языке C примет значение false и выполнение программы продолжится, тогда как в языке Basic вычисление выражения i<100 and x( i )<0 при тех же условиях вызовет ошибку: Subscript out of range (Индекс вне диапазона), поскольку элемента массива x(100) не существует.

7. (ОВ) В языке C при использовании библиотечных функций не забудьте включить файл прототипов.

Пример.

#include <stdio.h>

#include <math.h>

8.(В) Не забывайте об удобных возможностях языка С: многократном присваивании, операторах: ++ -- <знак>=.

9. (ОВ) Ввод-вывод (C):

- при вводе информации функцией scanf в списке данных необходимо использовать оператор нахождения адреса &;

- не забывайте заканчивать ввод данных инструкции scanf клавишей Enter;

- не забывайте заканчивать управляющую строку инструкции printf символом '\n' (перевод на новую строку);

- при неизвестном диапазоне выводимых значений данных с плавающей точкой используйте спецификацию g.

Вопросы для самопроверки и контроля

Вопросы для самопроверки

  1. Как разумно размещать инструкции текста программы?

  2. Какую роль играют отступы при размещении вложенных инструкций?

  3. В чем суть "венгерской" нотации имен?

  4. На что, вероятно, указывает предупреждение при трансляции?

  5. В чем различие в применении операторов "И" и "ИЛИ" в языках C и Basic?

  6. Чем отличается действие оператора деления / в языках C и Basic?

Контрольные вопросы

  1. В каких местах нужно осуществлять перенос инструкции, если она не входит в строку?

  2. Перечислите типы комментариев к программе.

  3. Почему нежелательно использовать в программе схожие имена?

  4. Зачем нужно явно объявлять все объекты программы?

  5. Почему следует избегать инструкций перехода?

  6. В чем преимущество работы с массивами в языке Basic?

10. ДАННЫЕ. ДОПОЛНЕНИЕ

Материал данного раздела содержит информацию о типах и совокупностях данных, специфических для конкретного языка программирования, поэтому ниже рядом с названием раздела в скобках будет указываться принадлежность описываемой конструкции к языку: C (C++) и BBasic.

10.1. Перечислимый тип

10.1.1. Тип enum (C)

Относится к целым типам данных. Применяется для объявления целых переменных, которые могут принимать только строго определенные значения, число которых можно перечислить в нужном порядке. Сначала объявляется новый тип данных:

enum <имя_типа>{<имя_элемента>[=<значение>],

[<имя_элемента> [=<значение>]]...};

Пример.

enum spectr{RED, ORANGE, YELLOW, GREEN, BLUE, VIOLET};

Затем можно определять переменные этого типа:

[enum] spectr color1, color2;

В языке C++ указание ключевого слова enum при объявлении переменных перечислимого типа не является обязательным, если инструкция объявления этого типа записана в программе раньше. Ключевое слово enum является сокращением от enumeration – перечисление.

Запись из примера эквивалентна введению символических констант вида:

#define RED 0

#define ORANGE 1

#define YELLOW 2

#define GREEN 3

#define BLUE 4

#define VIOLET 5

Переменные типа spectr могут принимать только указанные значения. При попытке присваивания им другого значения транслятор выдает ошибку.

Пример.

color1=GREEN; // Допустимо

color2=WHITE; // Ошибка!

Если при объявлении типа символическим константам из списка не задается значений, то первая из них по умолчанию получает значение 0, последующие на 1 больше. Если какой-либо из констант задается значение, а последующим нет, то они получают следующее по порядку целое значение.

Пример.

enum RussianCop{one=1, five=5, ten=10, fifty=50};

enum RussianRoub{One=1, Two, Five=5, Ten=10, Fifty=50, Hundred=100, FiveHundred=500, Thousand=1000};

enum mark{BAD=2, MIDDLE, GOOD, FINE};

Как известно, в языке C не определен логический тип данных, однако он легко вводится с помощью объявления вида: enum bool{ false, true };

Фактически разумными при работе с данными перечислимых типов являются только следующие операторы: присваиваниеcolor1=VIOLET; и сравнениеcolor1==color2.

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

10.1.2. Тип enum (B)

Практически аналогичен такому же типу языка C.

Формат объявления типа:

enum <имя_типа>

<имя_элемента>[=<значение>]

[<имя_элемента>[=<значение>] ]

.......................................................

end enum

Пример.

enum spectr

Red

Orange

Yellow

Green

Blue

Violet

end enum

Объявление переменных имеет вид:

dim color1 as spectr, color2 as spectr

Правила объявления и использования переменных этого типа полностью совпадают с правилами языка C. Имеются только 2 отличия:

- значения переменных и перечисляемых констант относятся к типу long;

- при присвоении переменной значения не из списка констант ошибки не возникает.

10.2. Тип currency (B)

Данные этого типа представляют собой десятичные значения с фиксированной точкой с 15 цифрами в целой части и 4 цифрами – в дробной. Элемент данных занимает в памяти 8 байтов. Диапазон представления:

-922,337,203,685,477.5808 - 922,337,203,685,477.5807.

Литералы данного типа не определены.

Пример объявления переменных.

dim sum1 as currency, TotalSum as currency

Эти данные полезны при денежных расчетах и вычислениях с фиксированной точкой с заданной точностью.

10.3. Тип date (B)

Данные этого типа в памяти представляются специальным форматом с плавающей точкой, точно знать который нет необходимости. Каждый элемент занимает в памяти 8 байтов. Целая часть значения хранит дату, дробная – время. Диапазон представления дат от 1 января 100 года до 31 декабря 9999 года, времени – от 0:00:00 до 23:59:59.

Литералы данного типа заключаются между символами #. Они могут записываться в различных форматах, однако после окончания ввода среда преобразует введенный формат даты/времени в формат, принятый в USA: m/d/yyyy h:mm:ss {AM|PM}, где m - № месяца (1 или 2 цифры в зависимости от значения), d - № дня в месяце (аналогично), yyyy – год, h – час (1 или 2 цифры), mm – минуты, ss – секунды, AM (ante meridiem – до полудня), PM (post meridiem – после полудня) – указатели 12-часовой шкалы.

Пример.

#01 Jan 2001# #1/1/2001#

#13:03:03# #1:03:03 PM#

#13/11/2001 5:54:56# #11/13/2001 5:54:56 AM#

Подобное преобразование может привести к ошибке. Например, запись вида #9/3/2001# будет интерпретироваться как: 3 сентября 2001 года, тогда как, возможно, имелось в виду 9 марта 2001 года (принятый в России краткий формат даты). Поэтому разумно записывать литералы даты/времени как строки. При этом преобразования формата в среде не будет.

Пример.

"09/03/2001 18:34:30"  9 марта 2001 года 6 часов 34 минут 30 секунд вечера

При выводе значений (печать, экран) используются установленные в пункте НастройкаПанель управленияЯзык и стандарты форматы (для даты – краткий, например, 11/03/2001).

Пример объявления переменных.

dim BirthDay as date

С данными этого типа можно манипулировать непосредственно. Например, разницу в датах можно получить так:

dim day1 as date, day2 as date, day3 as integer

day1 = #3/9/1999#

day2 = #3/10/2001#

day3 = day2 - day1

Получим 732 дня.

К дате можно прибавлять дни. Им соответствуют целые значения. Прибавление 1 часа – 1/24, 1 минуты – 1/(24*60), 1 секунды – 1/(24*3600).

Пример.

day2=day1+2 #3/11/1999#

При преобразовании данных различных типов в тип date значение слева от десятичной точки представляет дату, справа – время. 0 означает полночь, 0.5 – полдень. Отрицательные целые числа представляют даты до 30 декабря 1899 года.

Для облегчения манипуляций с данными типа date имеются следующие библиотечные функции:

Date – возвращает системную дату;

Time – возвращает системное время;

Now – возвращает системные дату и время.

DateAdd(интервал, число, дата) – возвращает дату, отстоящую от дата на число интервалов. Возможные значения аргумента интервал:

- yyyy – год,

- q – квартал,

- m – месяц,

- ww – неделя,

- d – день,

- h – час,

- n – минута,

- s – секунда.

Пример.

DateAdd("m", 1, #1/31/2000#) #02/29/2000#

DateDiff(интервал, дата1, дата2) – возвращает число интервалов между дата2 и дата1. Если дата1 > дата2, возвращается число < 0. Функция имеет 2 необязательных аргумента: первый день недели и первая неделя года и значение интервала = "w – день недели. Употребление этих значений изучить самостоятельно.

Пример.

DateDiff("d", #3/9/2000#, #3/10/2001#) 366

DatePart(интервал, дата) – возвращает заданную интервалом часть дата. Функция также имеет 2 необязательных аргумента: первый день недели и первая неделя года. По умолчанию первым днем недели считается Воскресенье. В примере показано как с помощью символической константы сделать первым днем Понедельник. Аналогичные константы есть и для других дней недели.

Пример.

DatePart("yyyy", #3/9/2003#, vbMonday) 2003 ' vbMonday=2

DatePart("q", #3/9/2003#, vbMonday) 1

DatePart("m", #3/9/2003#, vbMonday) 3

DatePart("d", #3/9/2003#, vbMonday) 9

DatePart("ww", #3/9/2003#, vbMonday) 10

DatePart("w", #3/9/2003#, vbMonday) 7

Day(дата) – возвращает день месяца.

Weekday(дата[, 1-й день недели]) – возвращает порядковый № дня недели.

Month(дата) – возвращает № месяца.

Year(дата) – возвращает год.

Пример.

Day(#3/9/2003#) 9

WeekDay(#3/9/2003#, 2) 7

Month(#3/9/2003#) 3

Year(#3/9/2003#) 2003

Hour(время) – возвращает целое от 0 до 23 (час аргумента).

Minute(время) – возвращает минуты (0 – 59).

Second(время) – возвращает секунды (0 – 59).

Пример.

Hour(#6:34:30 PM) 18

Minute(#6:34:30 PM) 34

Second(#6:34:30 PM) 30

10.4. Тип void (С)

Так называемый "пустой" тип. Служит для согласования синтаксиса функций, не возвращающих значений или не имеющих аргументов.

Пример.

void putmsg(void){

printf("Hello, world!\n");

} /* End putmsg */

Этот тип также используется для формирования "универсальных" указателей void *, о которых пойдет речь в другом разделе.