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

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

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

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

Сообщение Paster Fob » 21.05.2011 11:06:14

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

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

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

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Odyssey » 21.05.2011 11:25:07

Это значит, что если в строке нужно найти букву "z", и таких букв в строке несколько (например "abzcdzefzg"), то программа должна вернуть позицию первой буквы "z" (т.е. в данном примере 3, а не 6 или 9).
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Paster Fob » 22.05.2011 10:56:44

Ну тогда понятно.В книге нет ответа на эту задачу,вот что у меня получилось:
Код: Выделить всё
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.

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

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Oleg_D » 22.05.2011 11:08:36

Ага. Только без переменной 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;
Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Paster Fob » 22.05.2011 11:43:17

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

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Maxizar » 22.05.2011 12:32:10

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

Да нет все верно, просто всегда нужно стремится к меньшему числу переменных и к более короткому коду, но это приходит с опытом (я вот иногда простую задачу решу так, что просто стыдно показывать :oops: а опыта, хоть и любительского, но все же около 3 лет. Так что Программирование, это та область где можно совершенствоваться практически бесконечно). Так что Вы молодец, ваш энтузиазм просто радует.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Valeriy » 03.09.2011 17:34:40

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

Код: Выделить всё
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);
Результат получился одинаковый, но функция вызывается уже один раз.
Valeriy
новенький
 
Сообщения: 14
Зарегистрирован: 02.09.2011 06:13:57

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение pda » 04.09.2011 04:12:37

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

Особенно, если учесть, что значение B неопределено. ;)
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Максим » 04.09.2011 16:06:47

Valeriy

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

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

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Valeriy » 04.09.2011 17:06:42

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

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

    Где именно опечатка?
    Подскажите пожайлуста.
Valeriy
новенький
 
Сообщения: 14
Зарегистрирован: 02.09.2011 06:13:57

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Oleg_D » 04.09.2011 17:41:17

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 }

Но это фрагменты, а не законченная программа.
Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Valeriy » 04.09.2011 19:56:26

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

В книге даны два варианта вызова функции:
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.

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

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Oleg_D » 04.09.2011 22:17:25

Ага, годится.
Для кратости в книге часто приводятся фрагменты кода, а не полноценные программы.
Разумеется, что переменные надо объявлять и инициализировать.
Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Valeriy » 31.01.2012 17:26:20

Подскажите пожайлуста!
Есть файл - C:\File.txt с текстом:
Код: Выделить всё
2
4
6
8

И программа как в Главе 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.

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

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Oleg_D » 31.01.2012 17:52:11

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

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

След.

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

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

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

Рейтинг@Mail.ru