Вопросы по теме книги

Книга адресована школьникам средних и старших классов, желающим испытать себя в «олимпийских схватках». Может быть полезна студентам-первокурсникам и преподавателям информатики.

Модераторы: Oleg_D, Модераторы

Re: Вопросы по теме книги

Сообщение Oleg_D » 14.09.2012 09:55:33

Испытайте эту программку, откомпилировав FPC.
Код: Выделить всё
var S : AnsiString;    T : String;
BEGIN
  S:= 'AnsiString';  T:= 'String';
  Writeln(SizeOf(S));  { 4 }
  Writeln(SizeOf(T));  { 256 }
  Readln;
END.

Дело в том, что переменные типа AnsiString - это указатели. Вообще, прежде чем делать что-то со строкой, составьте себе чёткое представление, с каким именно типом вы работаете.
А возвращаясь к FillChar, добавлю, что процедура эта трактует заполняемую область памяти как некий массив байтов, без учёта типа. На практике её лучше применять к массивам и записям (структурам).
Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Re: Вопросы по теме книги

Сообщение Paster Fob » 16.12.2012 11:37:31

Олег Виленович.Не могу никак разобраться.
Глава 48
Совместив сдвиг с логическими операциями, можно исследовать отдельные биты слова. Перед вами булева функция TestBit, принимающая два параметра:ARG — число, в котором проверяется состояние некоторого бита, и BIT — номер этого бита. Функция возвращает TRUE, если проверяемый бит содержит единицу, и FALSE в противном случае.
Код: Выделить всё
function TestBit (arg: longint; bit : byte): Boolean;
begin
  TestBit := (arg and (1 shl bit)) <> 0
end;


Исходя из выше сказанного пишу такой вот код для проверки функции.

Код: Выделить всё
function testbit(arg:integer;bit:byte):boolean;
begin
  testbit:=(arg and (1 shl bit))<>0;
end;


var
  num:longint;i:byte;
  s:string;c:char;

begin
  readln(num);
  for i:=8 downto 1 do
    if testbit(num,i) then
      write(1)
    else
      write(0);
  writeln;
  s:='';
  for i:=1 to 8 do begin
    c:=char ((num mod 2)+ord('0'));
    s:=c+s;
    num:=num div 2;
  end;
  writeln(s);
  readln
end.


Ввёл я например число 5 в отве получил 00000010 хотя должно быть 00000101
Так что я не понял,в чём смысл функции?
Я так понимаю что двоичное представление числа,это и есть биты.Т.е. получается что 8-ой бит содержит 1; 7 => 0 ; 6 => 1 ; остальные 0.Но функция показывает совсем другое.Или я что-то попутал и не так понял?
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Вопросы по теме книги

Сообщение bormant » 16.12.2012 11:42:10

for i:=7 downto 0 do ...

потому как младший бит 0-й, для его проверки 1 сдвигать влево не нужно (1 shl bit).
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Вопросы по теме книги

Сообщение Oleg_D » 16.12.2012 12:08:36

Меня опередили :-)
Да, у программистов принято нумеровать биты с нуля, проверил, работает. Можно будет в книжке сказать об этом.
Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Re: Вопросы по теме книги

Сообщение bormant » 16.12.2012 13:15:17

По поводу "нумеровать с 0" -- программистам обычно удобнее оперировать не порядковым номером, а смещением от базы, отсюда и 0.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Вопросы по теме книги

Сообщение Oleg_D » 16.12.2012 13:55:40

bormant писал(а):По поводу "нумеровать с 0" -- программистам обычно удобнее оперировать не порядковым номером, а смещением от базы, отсюда и 0.

Так я и говорю -- привычка уже. Один знакомый программист, заполняя анкету, в графе "количество детей" так и написал: 0. Кадровичка долго "въезжала", что это значит, потом потребовала: напиши "нет". :-)
Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Re: Вопросы по теме книги

Сообщение Vadim » 16.12.2012 15:34:28

Oleg_D писал(а): потом потребовала: напиши "нет". :-)

И тогда он написал:
Код: Выделить всё
SELECT NOT ISNULL(`дети`) FROM `анкета`;

:D
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Вопросы по теме книги

Сообщение Paster Fob » 17.12.2012 15:33:47

bormant писал(а):for i:=7 downto 0 do ...

потому как младший бит 0-й, для его проверки 1 сдвигать влево не нужно (1 shl bit).


Oleg_D писал(а):Да, у программистов принято нумеровать биты с нуля, проверил, работает. Можно будет в книжке сказать об этом.


Всё ясно,значит я всё правильно понял.Только о нумерации не подумал.
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Пред.

Вернуться в Книга "Песни о Паскале"

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru