Страница 3 из 11
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 17.05.2012 14:56:10
Paster Fob
Добрый день.У меня вопрос по заданию д) в гл. 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.
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 17.05.2012 15:30:06
Oleg_D
В Вашем варианте компьютер
загадывает число, а человек
угадывает.
А надо наоборот, вот пример сообщений от компьютера:
Код: Выделить всё
Загадайте число от 0 до 9999, запишите на бумаге и нажмите Enter
Ваше число больше 5000? (y/n)
Ваше число больше .... ? (y/n)
Ваше число больше .... ? (y/n)
...
Вы задумали число NNNN
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 19.05.2012 16:46:30
Paster Fob
Вот что у меня получилось.Только решение мне что-то не нравиться.Но лучше ничего не придумал.
Код: Выделить всё
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.
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 20.05.2012 20:18:12
Oleg_D
Да нормальное решение, годится. ЗачОт

Разбор примеров из книги "Песни о Паскале"
Добавлено: 17.08.2012 23:06:53
BigBen
Помогите пожалуйста! Начал изучать паскаль по этой чудесной книге, но вот не могу справиться с задачей "А слабо?" из главы 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.
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 17.08.2012 23:13:49
bormant
'Дом: ' -- это ShortString, X -- это Integer, оператор "+" для такого случая (строка + число) не определён.
ps. В общем случае, номер дома не всегда число, например, "20 А" или "4 Б".
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 18.08.2012 01:17:17
BigBen
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.
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 18.08.2012 08:48:15
Paster Fob
Если использовать целочисленные типы,то сложить их со строкой не получится.В вашем случае 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.
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 18.08.2012 21:37:24
Oleg_D
BigBen писал(а):Я тут вроде разобрался, если кому в будущем похожее будет, вообщем я убрал тип переменной в цифрах и оставил только переменные строковые, но вот интересно если использовать переменные цифрами и строками то работать никак не будет?
Уважаемый
BigBen, вероятно, вы уже немного изучали Паскаль, поэтому применили тип Integer. Но в книге в 9-й главе об этом типе данных ещё не сказано и предполагается только String. О работе с числами будет сказано дальше.
Re: Разбор примеров из книги
Добавлено: 06.09.2012 00:16:35
Paster Fob
Что-то не совсем мне понятно задание 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-го состава.
Re: Разбор примеров из книги
Добавлено: 06.09.2012 10:41:25
Oleg_D
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.
Возможны варианты, конечно.
Re: Разбор примеров из книги
Добавлено: 06.09.2012 20:22:10
Paster Fob
Oleg_D писал(а):Тут всё очевидно. Ведь пока переменные не инициализированы, там валяется "мусор",
Да,но в вашей учебной программе P_45_2 они тоже не инициализированы.
Oleg_D писал(а):А вообще программка сильно накручена, я подразумевал нечто попроще: очищаем тупики (глобальные переменные), загоняем туда в цикле составы, пока не пустая строка, затем освобождаем тупики и печатаем результат. Без всяких там массивов (или вы их для тренировки туда вставили?).
Я задание не понял.Нужно было ввести несколько строк(составов),отсортировать и вывести результат в 3 строки(состава).А я каждую строку сортировал и выводил результаты после сортировки.
Re: Разбор примеров из книги
Добавлено: 06.09.2012 23:35:27
Oleg_D
Paster Fob писал(а):Да,но в вашей учебной программе P_45_2 они тоже не инициализированы.
Да, тут промашка у меня, надо исправить.
Ну, а то, что задание себе усложнили, так это вам же на пользу.

Кстати, в реальной жизни составы сортируются примерно так, как в моём варианте.
Re: Разбор примеров из книги
Добавлено: 13.09.2012 23:14:52
Paster Fob
долго извращался я над задачей из главы 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.
Надеюсь всё правильно?Просьба оценить.
Re: Разбор примеров из книги
Добавлено: 14.09.2012 01:28:51
tema
Можно упростить и нужно исправить немного. Дело в том, что 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;