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

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

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

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

Сообщение Paster Fob » 17.05.2012 14:56:10

Добрый день.У меня вопрос по заданию д) в гл. 42. "Папа Карло опасался Буратино..."
Не пойму как его решать надо,через массивы двочным поиском?Я вот что написал,но думаю что не то.
Код: Выделить всё
var num,kod:integer;
begin
  randomize;
  kod:=1001+random(8999);
  repeat
    write('введите число ');
    readln(num);
      if num=kod then begin
        writeln('вы угадали,загаданное число ',kod);
        break;
      end;
      if num<kod then
        writeln('загаданное число больше')
      else
        writeln('загаданное число меньше');
  until false;
  readln;
end.
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

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

Сообщение Oleg_D » 17.05.2012 15:30:06

В Вашем варианте компьютер загадывает число, а человек угадывает.
А надо наоборот, вот пример сообщений от компьютера:
Код: Выделить всё
Загадайте число от 0 до 9999, запишите на бумаге и нажмите Enter
Ваше число больше 5000? (y/n)
Ваше число больше .... ? (y/n)
Ваше число больше .... ? (y/n)
...
Вы задумали число NNNN
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

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

Сообщение Paster Fob » 19.05.2012 16:46:30

Вот что у меня получилось.Только решение мне что-то не нравиться.Но лучше ничего не придумал. :cry:

Код: Выделить всё
var l,m,r:integer;
    ch:char;
begin
  writeln('Загадайте число от 1 до 9999 и нажмите Enter');
  readln;
  l:=1;r:=9999;
  m:=5000;
  while l<=r do begin
    writeln('ваше число больше ',m,' ?  (Y/N)');
    readln(ch);
      case ch of
        'Y','y' :  l:=m+1;
        'N','n' :  r:=m-1;
      end;
    m:=(l+r) div 2;
  end;
  writeln('Вы загадали число ',l);
  readln;
end.
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

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

Сообщение Oleg_D » 20.05.2012 20:18:12

Да нормальное решение, годится. ЗачОт :)
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Разбор примеров из книги "Песни о Паскале"

Сообщение BigBen » 17.08.2012 23:06:53

Помогите пожалуйста! Начал изучать паскаль по этой чудесной книге, но вот не могу справиться с задачей "А слабо?" из главы 9 задача "Г", в ответах её почему то нету...Так вот 1й вариант задачи я написал и все работает, а другой с обьединением строк нет *( помгите пожалуйста разобраться с ошибкой когда дело доходит до вывода цифр то ошибка. Вот когда переменная Х вводится то ошибка в ней (11,16) Error: Incompatible types: got "SmallInt" expected "ShortString"
Код: Выделить всё
var     X, P : integer;
        C, S, R, T, Y, U : string;

begin
Writeln('Напишите Ваш город:'); Readln(C);
Writeln('теперь улицу:'); Readln(S);
Writeln('а теперь номер дома пожалуйста:'); Readln(X);
Writeln('и конечно же номер квартиры:'); Readln(P);
R := 'Город: ' + C + ' ';
T := 'Улица: ' + S + ' ';
Y := 'Дом: ' + X;
U := 'Квартира: ';
Writeln(R + T + Y + U);
Writeln('Спасибо, теперь нажмите Enter'); Readln
end.
BigBen
незнакомец
 
Сообщения: 2
Зарегистрирован: 17.08.2012 22:29:03

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

Сообщение bormant » 17.08.2012 23:13:49

'Дом: ' -- это ShortString, X -- это Integer, оператор "+" для такого случая (строка + число) не определён.

ps. В общем случае, номер дома не всегда число, например, "20 А" или "4 Б".
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

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

Сообщение BigBen » 18.08.2012 01:08:18

bormant А как же тогда решить эту задачку? Ведь в главе 9 рассказывается про этот метод...

Добавлено спустя 8 минут 59 секунд:
Я тут вроде разобрался, если кому в будущем похожее будет, вообщем я убрал тип переменной в цифрах и оставил только переменные строковые, но вот интересно если использовать переменные цифрами и строками то работать никак не будет? Вот нынешний работающий код
Код: Выделить всё
var
        C, S, R, X, P : string;

begin
Writeln('Напишите Ваш город:'); Readln(C);
Writeln('теперь улицу:'); Readln(S);
Writeln('а теперь номер дома пожалуйста:'); Readln(X);
Writeln('и конечно же номер квартиры:'); Readln(P);
R := 'Город: ' + C + ' ' + 'Улица: ' + S + ' ' + 'Дом: ' + X + ' ' + 'Квартира: ' + P;
Writeln(R);
Writeln('Спасибо, теперь нажмите Enter'); Readln
end.
BigBen
незнакомец
 
Сообщения: 2
Зарегистрирован: 17.08.2012 22:29:03

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

Сообщение Paster Fob » 18.08.2012 08:09:42

Если использовать целочисленные типы,то сложить их со строкой не получится.В вашем случае R лишняя переменная.

Добавлено спустя 38 минут 33 секунды:
Вот 1 из вариантов решения:
Код: Выделить всё
var
  c,s:string;
begin
  writeln('напишите ваш город:');
  readln(s);
  writeln('теперь улицу:');
  readln(c);
  s:='город:'+s+',улица:'+c;
  writeln('а теперь номер дома:');
  readln(c);
  s:=s+',дом:'+c;
  writeln('и конечно номер квартиры:');
  readln(c);
  s:=s+',квартира:'+c;
  writeln(s+'.');
  writeln('спасибо,теперь нажмите Enter');
  readln
end.
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

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

Сообщение Oleg_D » 18.08.2012 21:37:24

BigBen писал(а):Я тут вроде разобрался, если кому в будущем похожее будет, вообщем я убрал тип переменной в цифрах и оставил только переменные строковые, но вот интересно если использовать переменные цифрами и строками то работать никак не будет?

Уважаемый BigBen, вероятно, вы уже немного изучали Паскаль, поэтому применили тип Integer. Но в книге в 9-й главе об этом типе данных ещё не сказано и предполагается только String. О работе с числами будет сказано дальше.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

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

Сообщение Paster Fob » 06.09.2012 00:16:35

Что-то не совсем мне понятно задание 45_б:
Добавьте в модель сортировочной горки возможность обработки нескольких составов. Исходные «составы» (строки) должны вводиться с
клавиатуры или файла, признак окончания ввода – пустая строка.


Вот что у меня получилось:

Код: Выделить всё
type tarray=array [1..20] of string;

procedure push(var stack:string;ch:char);
begin
  stack:=stack+ch;
end;

function pop(var stack:string;var ch:char):boolean;
begin
  if length(stack)=0 then
    pop:=false
  else begin
    ch:=stack[length(stack)];
    delete(stack,length(stack),1);
    pop:=true;
  end;
end;

procedure stacksort(var amas:tarray;var asize:byte);
var s,sa,sb,sc:string;
    c:char;i:byte;
begin
  sa:='';sb:='';sc:='';
  for i:=1 to asize-1 do begin
    s:=amas[i];
    writeln('Начальный состав: ',s);
    writeln;
    while pop(s,c) do
      case c of
        'A'..'Z' : push(sa,c);
        'a'..'z' : push(sb,c);
        '0'..'9' : push(sc,c);
      end;
    while pop(sa,c) do push(s,c);
    writeln('состав А: ',s);
    writeln;
    s:='';
    while pop(sb,c) do push(s,c);
    writeln('состав В: ',s);
    writeln;
    s:='';
    while pop(sc,c) do push(s,c);
    writeln('состав С: ',s);
    writeln;
  end;
end;

var mas:tarray;
    i:byte;
begin
  i:=0;
  repeat
    inc(i);
    readln(mas[i]);
  until mas[i]='';
  stacksort(mas,i);
  readln
end.


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

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

Сообщение Oleg_D » 06.09.2012 10:41:25

Paster Fob писал(а):Возник вопрос,почему если не инициализировать переменные sa,sb,sc,то программа выдаёт абру-кадабру для 1-го состава.

Тут всё очевидно. Ведь пока переменные не инициализированы, там валяется "мусор", вот вы его и получаете.
А вообще программка сильно накручена, я подразумевал нечто попроще: очищаем тупики (глобальные переменные), загоняем туда в цикле составы, пока не пустая строка, затем освобождаем тупики и печатаем результат. Без всяких там массивов (или вы их для тренировки туда вставили?). Вот так примерно.
Код: Выделить всё
procedure push(var stack:string;ch:char);
begin
// тра-ля-ля
end;

function pop(var stack:string;var ch:char):boolean;
begin
// тра-ля-ля
end;

var sa,sb,sc:string;  // тупики

procedure Sort(var arg: string);
var c: char;
begin
  while pop(arg,c) do
    case c of
      'A'..'Z' : push(sa,c);
      'a'..'z' : push(sb,c);
      '0'..'9' : push(sc,c);
    end;
end;

procedure PrintResult(const aText: string; var aTupik: string);
var s: string; c: char;
begin
  s:='';
  while pop(aTupik,c) do push(s,c);
  writeln(aText,s);    writeln;
end;

var s:string;

begin
  // Очищаем тупики
  sa:=''; sb:=''; sc:='';
  // Обработка вводимых строк
  repeat
    Write('Состав: '); Readln(s);
    if Length(s)=0 then Break;
    Sort(s);
  until false;
  // Освобождение тупиков и формирование отправляемых составов
  PrintResult('состав А: ',sa);
  PrintResult('состав B: ',sb);
  PrintResult('состав C: ',sc);
  Readln;
end.

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

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

Сообщение Paster Fob » 06.09.2012 20:22:10

Oleg_D писал(а):Тут всё очевидно. Ведь пока переменные не инициализированы, там валяется "мусор",

Да,но в вашей учебной программе P_45_2 они тоже не инициализированы.

Oleg_D писал(а):А вообще программка сильно накручена, я подразумевал нечто попроще: очищаем тупики (глобальные переменные), загоняем туда в цикле составы, пока не пустая строка, затем освобождаем тупики и печатаем результат. Без всяких там массивов (или вы их для тренировки туда вставили?).

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

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

Сообщение Oleg_D » 06.09.2012 23:35:27

Paster Fob писал(а):Да,но в вашей учебной программе P_45_2 они тоже не инициализированы.

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

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

Сообщение Paster Fob » 13.09.2012 23:14:52

долго извращался я над задачей из главы 46 А) Постройте сверхбольшие числа на основе строковых переменных (количество цифр – не более 255).
Вот что у меня получилось:
Код: Выделить всё
{программа Р_46_А}

program P_46_3;

procedure fillbignumber(var arg:string);
var i,n:byte;
begin
  readln(n);
  for i:=1 to n do
    arg:=arg+char(random(100) mod 10+ord('0'));
end;

procedure writebignumber(var arg:string);
var i:byte;
begin
  for i:=length(arg) downto 1 do
    write(arg[i]);
  writeln;
  writeln;
end;

procedure countbignumber(var arg1,arg2:string);
var n1,n2,sum,ovr,i,j:integer;
begin
  if length(arg1)>length(arg2) then
    begin
      j:=length(arg1)-length(arg2);
      for i:=1 to j do
        arg2:=arg2+'0';
    end
  else
    if length(arg2)>length(arg1) then
    begin
      j:=length(arg2)-length(arg1);
      for i:=1 to j do
        arg1:=arg1+'0';
    end;
  ovr:=0;
  for i:=1 to length(arg1) do begin
    n1:=ord(arg1[i])-ord('0');
    n2:=ord(arg2[i])-ord('0');
    sum:=(n1+n2+ovr) mod 10;
    ovr:=(n1+n2+ovr) div 10;
    arg1[i]:=char(sum+ord('0'));
  end;
  if ovr<>0 then arg1:=arg1+'1';
end;

var s1,s2:string;

begin
  randomize;
  s1:='';s2:='';
  writeln('введите кол-во цифр 1-го числа(макс.254)');
  fillbignumber(s1);
  writeln('введите кол-во цифр 2-го числа(макс.254)');
  fillbignumber(s2);
  writeln;
  writeln('первое число:');
  writebignumber(s1);
  writeln('второе число:');
  writebignumber(s2);
  countbignumber(s1,s2);
  writeln('результат сложения:');
  writebignumber(s1);
  readln
end.

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

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

Сообщение tema » 14.09.2012 00:43:24

Можно упростить и нужно исправить немного. Дело в том, что readln в теле процедуры не есть гуд:
Код: Выделить всё
{программа Р_46_А}

program P_46_3;

procedure fillbignumber(const n:integer;var arg:string);
var i:byte;
begin
  for i:=1 to n do
    arg:=arg+char(random(100) mod 10+ord('0'));
end;

procedure countbignumber(var arg1,arg2:string);
var n1,n2,sum,ovr,i,j:integer;
begin
  if length(arg1)>length(arg2) then
    begin
      j:=length(arg1)-length(arg2);
      for i:=1 to j do
        arg2:=arg2+'0';
    end
  else
    if length(arg2)>length(arg1) then
    begin
      j:=length(arg2)-length(arg1);
      for i:=1 to j do
        arg1:=arg1+'0';
    end;
  ovr:=0;
  for i:=1 to length(arg1) do begin
    n1:=ord(arg1[i])-ord('0');
    n2:=ord(arg2[i])-ord('0');
    sum:=(n1+n2+ovr) mod 10;
    ovr:=(n1+n2+ovr) div 10;
    arg1[i]:=char(sum+ord('0'));
  end;
  if ovr<>0 then arg1:=arg1+'1';
end;

var s1,s2:string;
n:integer;
begin
  randomize;
  s1:='';s2:='';
  writeln('введите кол-во цифр 1-го числа(макс.254)');
readln(n);
  fillbignumber(s1);
  writeln('введите кол-во цифр 2-го числа(макс.254)');
readln(n);
  fillbignumber(s2);
  writeln;
  writeln('первое число:');
  writeln(s1);
  writeln('второе число:');
  writeln(s2);
  countbignumber(s1,s2);
  writeln('результат сложения:');
  writeln(s1);
  readln
end.

countbignumber лучше сделать функцией, возвращающей сумму.

Добавлено спустя 45 минут 27 секунд:
Не мог спокойно работать. Мысль возвращалась сюда :-)
Код: Выделить всё
function countbignumber(arg1,arg2:string):string;
var i:integer;
s:string;
begin
  if length(arg1)<length(arg2) then
  begin
    s:=arg2;
    arg2:=arg1;
  end
else
    s:=arg1;

s:='0'+s;
      for i:=1 to abs(length(arg2)-length(s)) do
        arg2:='0'+arg2;

  sum:=0;
  for i:=length(s) downto 1 do
  begin
    sum:=sum+ord(s[i])+ord(arg2[i])-2*(ord('0'));
    s[i]:=chr(ord('0')+(sum mod 10));
    sum:=sum div 10;
  end;
  if s[1]='0' then delete(s,1,1);
  countbignumber:=s;
end;
tema
постоялец
 
Сообщения: 375
Зарегистрирован: 24.03.2011 20:19:27

Пред.След.

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

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

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

Рейтинг@Mail.ru