Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
933 Кб
Скачать
☆

3. Литералы.

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

#define TRUE 1

#define FALSE 0

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

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

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

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

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

Пример.

#define SIZE 50

float Matrix[SIZE][SIZE];

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

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

Пример.

Dim Matrix(,) As Single

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

Пример.

ReDim Matrix(10, 10)′ 10-верхняя граница индекса

′ Память под матрицу 11х11

Такая инструкция в теле процедуры может использоваться многократно. Более подробно синтаксис и область применения инструкции ReDim будет изложена разделе 10.6. «Динамические массивы».

Минимальное значение индекса также всегда равно 0, поэтому не следует применять разрешенную правилами инструкцию вида: <имя массива>(<нижняя граница> to <верхняя граница>). Это приводит к избыточному выделению памяти.

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

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

Пример.

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

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

Пример.

#include <stdio.h>

#include <math.h>

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

9. Ввод-вывод:

C (ОВ):

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

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

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

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

Basic (В)

Так как в отличие от языка С, здесь используется методы, входящие в состав класса, то для сокращения объема кода разумно использовать инструкцию Imports System.<имя класса>. Это позволит не записывать имя класса при обращении к методам этого класса.

Пример.

Imports System.Math

Imports System.Console

…………………………….

y=Cos(x)+Sin(x)

WriteLine("y={0:g5}", y)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

10.1.1. Тип enum (C++)

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

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

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

Пример.

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

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

spectr color1, color2;

Ключевое слово 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{five=5, ten=10, fifty=50};

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

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

Фактически разумными при работе с данными перечислимых типов являются только следующие операторы: присваивание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, color2 As spectr

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

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

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

10.2. Тип decimal (B)

Данные этого типа занимают в памяти 16 байтов, 12 из которых отводится для целого значения со знаком. Остальные отводятся для хранения масштабирующего коэффициента, определяющего во внешнем представлении число знаков после десятичной точки. Масштабирование выполняется при задании переменной значения.

Примерный диапазон представления (по абсолютной величине):

1e-28 – 7.93e+28.

Литералы данного типа определяются добавлением в конец значения символа d.

Значение по умолчанию (как для всех числовых типов) равно 0.

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

Dim sum1, TotalSum as Decimal

………………………………………

sum1 = 12345.678905e-15D

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

sum1 = 0.000000000012345678905D

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

Замечание. До версии Visual Basic.NET (2008) в языке существовал тип данных Currency, предназначенный для проведения денежных расчетов, который относился к десятичным данным с фиксированной точкой (4 знака после точки). В связи с тем, что платформа Visual Studio является многоязыковой средой разработки (языки C++, VB, C#, F#) и требует одинаковые типы данных для них, указанный тип, начиная с версии VS2008, был заменен на тип данных Decimal.

10.3. Тип date (B)

Данные этого типа в памяти представляются специальным форматом, точно знать который нет необходимости. Каждый элемент занимает в памяти 8 байтов. Диапазон представления дат от 1 января 0001 года до 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, day2 As Date, day3 As Integer

day1 = #3/9/1999#

day2 = #3/10/2001#

day3 = day2 - day1

Получим 732.

Замечание. Visual Studio.NET различных версий является многоязыковой средой разработки, которую часто называют платформой .NET Framework или Dot NET (dot – точка). Она использует типы данных, общие для всех языков. В конкретных языках для обозначения типов данных используют псевдонимы для этих общих типов. Например, тип Short соответствует Int16, тип Integer – Int32. Для типа Date таким общим типом является DateTime. Тип DateTime предоставляет пользователю различные методы (функции) для обработки данных, содержащих даты и/или время. При обращении к ним перед именем метода должен стоять префикс Date или имя переменной типа Date, для которой выполняется манипуляция.

Ниже приводятся наиболее популярные функции, методы и свойства, которые разделены на 3 группы по виду обращения.

Обращение без префикса.

DateString – возвращает системную дату в формате mm-dd-yyyy.

TimeString – возвращает системное время в виде hh:mm:ss.

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

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

- 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/2015#, vbMonday) 2015 ' vbMonday=2

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

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

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

DatePart("ww", #3/9/2015#, vbMonday) 11

DatePart("w", #3/9/2015#, vbMonday) 1 ‘w – день недели

DateSerial(год, месяц, день) – возвращает значение типа Date.

Пример.

DateSerial(2014, 2, 26) 26.02.2014 0:00:00

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

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

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

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

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

Timer – возвращает значение типа Double, показывающее количество секунд, прошедших с начала суток.

DateString – возвращает системную дату в виде строки.

Пример.

Day(#3/9/2015#) 9

Weekday(#3/9/2015#, vbMonday) 1

Month(#3/9/2015#) 3

Year(#3/9/2015#) 2015

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

Обращение с префиксом имя переменной.

Используется для преобразования значения дата/время в строку.

Data1.ToString – преобразует значение типа Date в строку.

Data1.ToShortDateString – то же в короткий формат даты.

Data1.ToLongDateString - то же в длинный формат даты.

Пример.

Dim data1As Date="26.2.2014"

data1.ToString 26.02.2014 0:00:00

data1.ToShortDateString 26.02.2014

data1.ToLongDateString 26 февраля 2014 г.

Обращение с префиксом date.

Date.IsLeapYear(год) – возвращает True, если год високосный, False, если нет.

Date.DaysInMonth(год, месяц) – возвращает число дней в месяце заданного года.

10.4. Тип void (С)

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

Пример.

void putmsg( ){

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

} /* End putmsg */

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