IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> Отличие type и var, Отличие type и var
-notpron
сообщение 5.07.2011 18:44
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


Всем добрый вечер, не могу никак понять, в чем разница между type и var? Скорее всего - я немного не допонял саму функцию type.
И я совсем запутался в порядковых типах данных, для чего они нужны? Как(не теоритически) можно проверить функцию, например, ord(x)? Заранее спасибо)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
-notpron
сообщение 5.07.2011 22:59
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


Не надо ругаться, спокойнее. Просто аргументированный спор(хотя какой спор я могу вам предложить не знаю массивы smile.gif )
Конструированный тип данных это тот тип, который конструируется(извините за тафтологию) самим программистом. Разве не так?
И потом dec(min_element)= max_element не?
возьмем тип данных
Код
type sixteen = 0..15;

И вместе ненавистного вам dec возьмем inc, который действует по аналогичной системе. Inc(x) возвращает значение, следующее за х (для арифметических типов данных это эквивалентно оператору x:=x+1). Правильно?
15 это 1111 в двоичной системе. 1111 + 1 получается 1 0 0 0 0. Начальную единицу откидываем и получается inc(15)=0. Разве нет? Я не спорю - ошибаться могу, 100%.
Спасибо большое за программу для использование порядковых типв данных, правда, очень пригодилось. И насчет FPC спасибо, но я использую school pack, ибо на mac я ничего не нашел ;)
И насчет 10 чисел - вывести не через цикл а через перечисляемый тип данных.
Не надо агрессии, правда. Я бы не хотел этого)

Сообщение отредактировано: -notpron - 6.07.2011 5:00
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 6.07.2011 5:09
Сообщение #3


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Я извиняюсь за встрятие..

Цитата(-notpron @ 5.07.2011 23:59) *
Не надо ругаться, спокойнее. Просто аргументированный спор(хотя какой спор я могу вам предложить не знаю массивы smile.gif )
-notpron, а кто ругался и где? Покажи мне то место, плз. А манера говорить у каждого своя - ты волен не слушать.. И учти, если ты будешь нести чушь, приговаривая при этом "я прав", - ты будешь получать ответы в таком именно духе. Само по себе нести чушь - пожалуйста, на то и форум. Но не говори "вы не правы" тем, кто тысячи таких как ты научил уже..

Цитата
Конструированный тип данных это тот тип, который конструируется(извините за тафтологию) самим программистом. Разве не так?
Нет, не так, и IUnknown тебе уже говорил это. У конструируемого есть синоним (или перевод на русский, если хочешь) - "составной". То есть он может состоять минимум из двух квантов определения типов. Но раз ты не знаешь массивы (и, наверное, записи), я затрудняюсь привести пример. А вообще - избегай "свободной трактовки терминов на основе здравого смысла и опыта", действуй только на основе определений.

Цитата
И потом dec(min_element)= max_element не?
Нет.

Цитата
возьмем тип данных
Код
type sixteen = 0..15;

И вместе ненавистного вам dec возьмем inc, который действует по аналогичной системе. Inc(x) возвращает значение, следующее за х (для арифметических типов данных это эквивалентно оператору x:=x+1). Правильно?
15 это 1111 в двоичной системе. 1111 + 1 получается 1 0 0 0 0. Начальную единицу откидываем и получается inc(15)=0. Разве нет? Я не спорю - ошибаться могу, 100%.
Ошибаешься, 100% yes2.gif
Твоя ошибка, по-видимому, есть результат трех факторов.

1. Неудачно выбран пример - я имею в иду вот это:
   Week = (sun, mon, tue, wed, thu, fri, sat);
(кстати, ставь, пожалуйста, ПРАВИЛЬНЫЕ теги; прочти Правила форума и правила этого раздела - там все подробно написано)
Почему неудачно? Потому что дни недели действительно зациклены, причем идеально (т.е. лучше, чем, скажем, числа в месяцах). Но это есть всего лишь свойство дней недели, а не общая математическая закономерность. Например, в некоторых карточных играх, шестерка бьет туза, а в некотороых - нет, не бьет.

2. Ты знаешь, как устроено машинное представление чисел (и это хорошо), но, видимо, не до конца (или кое-что не учитываешь). Если при сложении двух байт (или беззнаковых целых) происходит переполнение, действительно в результате будет число с отрезанным верхним разрядом. Но! Но при этом будет установлен признак переполнения. Иными словами, обрезание при переполнении есть вынужденная мера (поскольку любая реальная разрядная сетка конечна), но есть и средство исправить ситуацию.

3. У тебя в опциях компилятора выключена проверка выхода за пределы диапазона (range check). Вот это - очень плохо! Рекомендую тебе зайти в опции и установить ее range check в дефолт. И убирай его ТОЛЬКО после полной отладки программы, и ЕСЛИ собираешься отдать программу в эксплуатацию. Иначе ты хлебнешь горя.. ))

Вот тебе пример программы, которая либо будет работать неправильно, либо выдаст три (ну, не одновременно)) ошибки выхода за диапазон.
{$R+} // замени + на -, и прога пройдет - но результат будет неверный
type
tHex= 1 .. 15;
tWeek = (sun,mon);

var
a,b,c: tHex;
d: tWeek;

begin
d:= mon;
Inc(d); // тут будет ошибка 201 при исполнении
writeln(Ord(d));
a:= 8;
b:= 15;
c:= a+b; // тут будет ошибка 201 при исполнении
writeln©;
Inc(b); // тут будет ошибка 201 при исполнении
writeln(b);
readln
end.


Зацикленные целые множества (группы "по модулю") весьма часто бывают нужны. Встроенной поддержки их в языке Pascal нет. Если у тебя в программе нужна такая функциональность (те же дни недели, например), ты должен сам явным образом определить сложение/вычитание (при этом очень удобно использовать перезагрузку операторов).

Цитата
насчет FPC спасибо, но я использую school pack, ибо на mac я ничего не нашел ;)
Да? странно.. А про что тогда строчка: "Mac OS X and several crosscompilers" на странице скачивания FreePascal? Я сам, правда, эту ссылку не пробовал..

Добавлено через 12 мин.
Вдогонку еще один простенький примерчик использования типов. Допустим, твоя программа производит сложные расчеты. Ты использовал тип single для представления чисел в ней. Но потом (когда прога на много килобайт кода была уже написана) понял, что в некоторых случаях все же лучше использовать double (для большей точности). И ты начинаешь ползать по всей программе, состоящей из нескольких модулей, и менять там все single на double.. Причем, некоторые переменные могут не относиться к собственно расчетам, и их можно (и нужно) оставить single. И ты кусаешь локти..
А если бы у тебя было в самом начале:
type
tReal = single;
- а потом везде (где надо) стояло бы tReal, то тебе надо было бы сделать всего одно изменение:
type
tReal = double;


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
-notpron   Отличие type и var   5.07.2011 18:44
IUnknown   Type - это не функция. Это зарезервированное слово...   5.07.2011 19:03
-notpron   2 IUnknown А можно не на примере массивов? Просто ...   5.07.2011 19:19
IUnknown   не на примере массивов? Ну, напечатай первые 10 че...   5.07.2011 20:36
-notpron   2 IUnknown Не, до циклов я дошел) И вы не правы - ...   5.07.2011 20:55
IUnknown   Ты это "можете проверять" кому-нибудь др...   5.07.2011 22:07
-notpron   Не надо ругаться, спокойнее. Просто аргументирован...   5.07.2011 22:59
Lapp   Я извиняюсь за встрятие.. Не надо ругаться, споко...   6.07.2011 5:09
IUnknown   Кстати, встроенной поддержки циклических перечисле...   6.07.2011 10:37
-notpron   2 Lapp Я понимаю что манера говорить у всех своя, ...   6.07.2011 11:18
Lapp   Чем вас не устраивает тег [cоde]? По-моему его мо...   6.07.2011 22:50
-TarasBer-   это тролль, не реагируйте   6.07.2011 14:52
-notpron   Не надо оффтопить, есть что сказать по теме - скаж...   6.07.2011 14:56
-TarasBer-   канонично...   6.07.2011 15:07
-notpron   Ну и сразу дурацкий вопрос - а как копипастить в t...   6.07.2011 16:13
sheka   .pas - текстовый документ. Создавай новые темы в н...   6.07.2011 17:27
-notpron   Ну про этот способ мне известно, но все равно спас...   6.07.2011 17:41
-notpron   2 Lapp 2. Все тексты фрагментов программ должны по...   7.07.2011 18:52
Lapp   2. Все тексты фрагментов программ должны помещатьс...   7.07.2011 22:21


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 17.07.2025 8:45
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"