Разбор примеров из книги

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

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

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

Разбор примеров из книги

Сообщение Paster Fob »

Понятно...
Попробовал решить первое задание в главе 23 из раздела "А вам слабо?",сделал.А вот смысл второго задания,не понял.вот оно.
Напишите функцию для определения позиции буквы в заданной строке.Функция должна вернуть позицию первой такой буквы или ноль,если буквы в строке нет.Напишите программу для проверки функции.

Первое предложение понятно,а вот дальше,что означает строка
Функция должна вернуть позицию первой такой буквы или ноль,если буквы в строке нет

Про ноль понятно,а первую часть предложения,никак понять не могу.
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Это значит, что если в строке нужно найти букву "z", и таких букв в строке несколько (например "abzcdzefzg"), то программа должна вернуть позицию первой буквы "z" (т.е. в данном примере 3, а не 6 или 9).
Аватара пользователя
Paster Fob
постоялец
Сообщения: 188
Зарегистрирован: 22.02.2011 20:53:36
Откуда: Новосибирск.

Сообщение Paster Fob »

Ну тогда понятно.В книге нет ответа на эту задачу,вот что у меня получилось:

Код: Выделить всё

function poisk(str:string;ch:char):integer;
var i,n:integer;
begin
    for i:=1 to length(str) do
      if str[i]=ch then
        begin
          n:=i;
          break;
        end
      else n:=0;
    poisk:=n;
end;
var s:string;
begin
    writeln('введите строку');
    readln(s);
    writeln(poisk(s,'a'));
    readln
end.

Так надо было сделать?
Oleg_D
постоялец
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Сообщение Oleg_D »

Ага. Только без переменной n можно обойтись.
----------

Код: Выделить всё

function poisk(str:string;ch:char):integer;
var i : integer;
begin
    poisk:=0;
    for i:=1 to length(str) do
      if str[i]=ch then
        begin
          poisk:=i;
          break;
        end
end;
Аватара пользователя
Paster Fob
постоялец
Сообщения: 188
Зарегистрирован: 22.02.2011 20:53:36
Откуда: Новосибирск.

Сообщение Paster Fob »

Что-то я не подумал,поторопился...но так ведь то же считается?
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Paster Fob писал(а):Что-то я не подумал, поторопился...но так ведь то же считается?

Да нет все верно, просто всегда нужно стремится к меньшему числу переменных и к более короткому коду, но это приходит с опытом (я вот иногда простую задачу решу так, что просто стыдно показывать :oops: а опыта, хоть и любительского, но все же около 3 лет. Так что Программирование, это та область где можно совершенствоваться практически бесконечно). Так что Вы молодец, ваш энтузиазм просто радует.
Valeriy
новенький
Сообщения: 14
Зарегистрирован: 02.09.2011 06:13:57

Сообщение Valeriy »

С процедурами немного разобрался, а вот с функциями что-то не очень.
В этом примере функция вызывается дважды, не понимаю с какой целью?

Код: Выделить всё

function Max(arg1, arg2 : integer) : integer; 
begin
  if arg1 > arg2
    then Max:= arg1
    else Max:= arg2
end;

var A,B:integer;
begin
 A:= Max( 20, 10 );    { A = 20 }
 Writeln( Max( A, B ) );   { печатается большее из A и B }
readln
end.


Я изменил строку - Writeln( Max( A, B ) );
на - Writeln(A);
Результат получился одинаковый, но функция вызывается уже один раз.
Аватара пользователя
pda
постоялец
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение pda »

Valeriy писал(а):В этом примере функция вызывается дважды, не понимаю с какой целью?

Особенно, если учесть, что значение B неопределено. ;)
Аватара пользователя
Максим
энтузиаст
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Сообщение Максим »

Valeriy

В данном случае вы не понимаете абсолютно правильно. :D

Это опечатка в примере.
Valeriy
новенький
Сообщения: 14
Зарегистрирован: 02.09.2011 06:13:57

Сообщение Valeriy »

Максим писал:

В данном случае вы не понимаете абсолютно правильно.
Это опечатка в примере.

    Где именно опечатка?
    Подскажите пожайлуста.
Oleg_D
постоялец
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Сообщение Oleg_D »

Valeriy писал(а):Где именно опечатка?Подскажите пожайлуста.

Да, именно, где?
На стр. 149 есть фрагменты кода:
--------

Код: Выделить всё

Созданная нами функция может вызываться так.
A:= Max( 20, 10 ); { A = 20 }
Writeln( Max( A, B ) ); { печатается большее из A и B }
Вызов функции можно использовать как фактический параметр в её
собственном вызове, то есть организовать вложенные вызовы, например.
A:= Max ( Max( 20, 10 ), 40 ); { A = 40 }
A:= Max ( Max( 20, 10 ), Max( 200, 100 ) ); { A = 200 }

Но это фрагменты, а не законченная программа.
Valeriy
новенький
Сообщения: 14
Зарегистрирован: 02.09.2011 06:13:57

Сообщение Valeriy »

Вроде бы понял.

В книге даны два варианта вызова функции:
A:= Max( 20, 10 );
или
Writeln( Max( A, B ) );

А я решил что они оба одновременно входят в текст програмы.

Значит програма должна выглядеть либо так:

Код: Выделить всё

function Max(arg1, arg2 : integer) : integer; 
begin
if arg1 > arg2
then Max:= arg1
else Max:= arg2
end;

var A:integer;
begin
A:= Max( 20, 10 );
Writeln(A);
readln
end.

либо так:

Код: Выделить всё

function Max(arg1, arg2 : integer) : integer; 
begin
if arg1 > arg2
then Max:= arg1
else Max:= arg2
end;

var A,B:integer;
begin
A:=20;
B:=10;
Writeln( Max( A, B ) );
readln
end.

Спасибо!
Oleg_D
постоялец
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Сообщение Oleg_D »

Ага, годится.
Для кратости в книге часто приводятся фрагменты кода, а не полноценные программы.
Разумеется, что переменные надо объявлять и инициализировать.
Valeriy
новенький
Сообщения: 14
Зарегистрирован: 02.09.2011 06:13:57

Сообщение Valeriy »

Подскажите пожайлуста!
Есть файл - C:\File.txt с текстом:

И программа как в Главе 29 (Полицейская база данных, версия 1),только я
её упростил. Она ищет цифру которую вы вводите.

Код: Выделить всё

var N,S: integer;
      F: text;
begin
   write('Введите номер - ');
   readln(N);
   Assign(F,'C:\File.txt');
   Reset(F);
    while not Eof(F) and (S<>N) do begin
     readln(F,S);
    end;
     if S=N
      then writeln('Есть такой номер')
      else writeln('Нет такого номера');
   close(F);
  readln
end.

А как сделать так чтобы она эту цифру удаляла?
Заранее спасибо.
Oleg_D
постоялец
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Сообщение Oleg_D »

Во-первых, в Вашей программе есть маленькая неточность: перед WHILE надо инициализировать переменную S

Во-вторых, удалить что-то из текстового файла нельзя.
Но можно скопировать из одного файла все номера, кроме удаляемого, в другой файл. А потом из этого другого файла скопировать все в первый. Так получится удаление. Сделайте ради упражнения. В реальных БД так, конечно, не делается, там используют не текстовые файлы, а файлы прямого доступа. Но эта тема выходит за рамки "песен".
Ответить