Помощь начинающему

Форум для изучающих FPC и их учителей.

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

Re: Помощь начинающему

Сообщение Vadim » 09.12.2012 14:16:19

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

Re: Помощь начинающему

Сообщение Leon » 12.12.2012 18:58:59

nikolay61,зайди в Виндоузе в панель настройки языков (Панель управления ->Языки и региональные стандарты->Дополнительно) и посмотри какие там стоят галки.Во всяком случае должна быть галка напротив КОИ-8 (20866).Если не поможет,посмотри,стоят ли галки напротив кириллических языков.Если нет - выставь,презагрузись и посмотри,чо вышло.Твоя система пишет крякозябры потому,что в шрифте,который она использует для консоли,видимо нет кириллицы.Такая фича бывает иногда при запуске ДОС приложений,которые требуют установки старенького keyrus'а.
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: Помощь начинающему

Сообщение nikolay61 » 17.12.2012 00:52:32

Leon писал(а):nikolay61,зайди в Виндоузе в панель настройки языков (Панель управления ->Языки и региональные стандарты->Дополнительно) и посмотри какие там стоят галки.Во всяком случае должна быть галка напротив КОИ-8 (20866).Если не поможет,посмотри,стоят ли галки напротив кириллических языков.Если нет - выставь,презагрузись и посмотри,чо вышло.Твоя система пишет крякозябры потому,что в шрифте,который она использует для консоли,видимо нет кириллицы.Такая фича бывает иногда при запуске ДОС приложений,которые требуют установки старенького keyrus'а.

У меня Винд7 Порылся но такого не нашел. Но все ровно благодарю.
Нашел причину крякозябров: когда поменял шрифт у ФПК и вот началось. поставил назад как было по умолчанию - все работает.

Добавлено спустя 19 часов 23 минуты 44 секунды:
Всем доброго! Не могу найти ошибку с переводом строковой величины в числовую величину. с программы ответ должен быть (по моему) 500, а на самом деле y=0.
Код: Выделить всё
program perevod_v_chislo;
uses Crt;
   var a: string;
   r,x,y:integer;
Begin
   Clrscr;
   a:=‘100 лет’;
   val(a,x,r);
Y:=5*x;
Write(‘Y=‘,y);
readkey;    
END.
nikolay61
новенький
 
Сообщения: 27
Зарегистрирован: 15.08.2012 16:58:46

Re: Помощь начинающему

Сообщение Mr.Smart » 17.12.2012 21:45:31

А это a:=‘100 лет’; по вашему число?
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Помощь начинающему

Сообщение nikolay61 » 17.12.2012 23:09:38

Mr.Smart писал(а):А это a:=‘100 лет’; по вашему число?

Так я тогда не пойму. Если строковая величина не преобразуется в числовую, т.е не число, то зачем эта фкнкция нужна и где ее используют?
nikolay61
новенький
 
Сообщения: 27
Зарегистрирован: 15.08.2012 16:58:46

Re: Помощь начинающему

Сообщение bormant » 17.12.2012 23:25:04

Код: Выделить всё
  a := '100';
  val(a, x, r);
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Помощь начинающему

Сообщение Mr.Smart » 17.12.2012 23:26:03

Что тут не понятного? Строка преобразуется в число если в ней содержится ТОЛЬКО число т.е. символы -+0123456789Ee!
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Помощь начинающему

Сообщение nikolay61 » 18.12.2012 19:27:00

Mr.Smart писал(а):+0123456789Ee!

Все теперь понятно, благодарю. Просто должны быть символами цифры.
nikolay61
новенький
 
Сообщения: 27
Зарегистрирован: 15.08.2012 16:58:46

Re: Помощь начинающему

Сообщение nikolay61 » 25.12.2012 14:33:03

Всем доброго!
Нужно в столбик написать слово ПАПА звездочками. Можно ли использовать цикл for в цикле for. Суть: звездочками набрано слог "ПА" и чтобы его снова не набирать - использовать снова цикл, чтобы программа вывела второй слог "ПА"
program papa;

uses crt;
var i:byte;
BEGIN
clrscr;
writeln('*****');
for i:=1 to 5 do
writeln('* *');
writeln();
writeln(' *');
writeln(' * *');
writeln(' *****');
writeln(' * *');

writeln();
readkey
END.
nikolay61
новенький
 
Сообщения: 27
Зарегистрирован: 15.08.2012 16:58:46

Re: Помощь начинающему

Сообщение Leon » 26.12.2012 12:30:05

А почему бы не написать и без цикла? Типа:

...
Writeln('**** ** **** ** ');
Writeln('* * * * * * * *');
Writeln('* * ****** * * ******');
Writeln('* * * * * * * * ');

....
readln;


просто и без заморочек
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: Помощь начинающему

Сообщение nikolay61 » 26.12.2012 13:37:51

Благодарю!

Добавлено спустя 21 час 26 минут 7 секунд:
Доброго! Есть задача.
{Три брата вернулись из изнурительной дороги. Они попросили мать напечь любимых крекеров, но не дождались и уснули. Мать занесла блюдо с крекерами и тихо закрыла дверь. Первым проснулся старший брат, съел треть лакомства и заснул опять. Затем наступила очередь среднего брата, который поступил так же, и наконец дело дошло до молодого. (Отметим, что количество крекеров всегда нацело делилась на три). Наутро на блюде осталось N крекеров. Напишите программу, которая бы определяла, сколько крекеров из остатка должны забрать каждый из братьев, чтобы всем в итоге досталось поровну.}
{
Проверка: Пример
Ввод - 16 Вывод - 0 6 10 Разъяснение. Мать спекла 54 крекера (по 18 каждому). Старший съел 18, средний (54-18)/3=12, а младший (54-18-12)/3=8 крекеров. Поэтому остатки будут 0, 6 и 10 соответственно.
Не могу понять как построить программу, чтобы ввести ОСТАТОК (16) и она разложила куму сколько нужно добрать. С общего количества крекеров я сложил и выходит, а вот с остатком - проблема.
}
program cracker;
uses crt;
var b1,{старший брат}b2,{средний брат}b3:{младший брат}real;
i:byte; {цикл}
n:integer;{всего крекеров}
k,k1,k2,k3,p:{остаток крекеров}real;
BEGIN
clrscr;
repeat
writeln('Введите общее количество крекеров');
readln(n);
p:=(n/3); {Сколько на каждого}
b1:=(n/3);
b2:=(n-b1)/3;
b3:=(n-b1-b2)/3;
writeln(b1:5:0, ' ',b2:5:0 , b3:5:0);

writeln('cколько осталось съесть');
k1:=p-b1;
Writeln('Старшему ', k1:5:0);
k2:=p-b2;
writeln('среднему ',k2:5:0);
k3:=p-b3;
writeln('меньшему ',k3:5:0);
writeln('Далее - 1, или - 0');
readln(i);
until i=0 ; writeln('END');
readln;
END.
nikolay61
новенький
 
Сообщения: 27
Зарегистрирован: 15.08.2012 16:58:46

Re: Помощь начинающему

Сообщение bormant » 27.12.2012 12:39:26

nikolay61 писал(а):Не могу понять как построить программу, чтобы ввести ОСТАТОК (16) и она разложила куму сколько нужно добрать.

Подсказка. Пусть n -- остаток. Тогда это 2/3 того, что видел младший. Аналогично ещё дважды.
В итоге, 2-му надо добрать 1/9, а 3-му -- 5/27 (1/9+2/27) от того, что было.
Задачка имеет аналитическое решение, и циклы ни к чему :wink:

Добавлено спустя 2 часа 17 минут 30 секунд:
И на закуску, решение для произвольного количества братьев:
Код: Выделить всё
var
  k, m, n, i: longword;
begin
  write('Введите количество братьев и остаток крекеров: ');
  readln(k, n);
  for i := 1 to k do n := n * k div (k - 1);
  writeln('Всего крекеров: ', n, '. Добор:');
  m := n div k;
  for i := 2 to k do begin
    n := n - n div k;
    writeln(i, ': ', m - n div k);
  end;
end.
Прогон:
Код: Выделить всё
Введите количество братьев и остаток крекеров: 3 16
Всего крекеров: 54. Добор:
2: 6
3: 10

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

Re: Помощь начинающему

Сообщение nikolay61 » 27.12.2012 16:51:58

bormant писал(а):Введите количество братьев и остаток крекеров: 3 16
Всего крекеров: 54. Добор:
2: 6
3: 10

Что-то не выходит. Делаем прогон на 9 крекеров в остаче. Результат - 28 крекеров и для 2:3, а 3:5.
А должно: 30 всего и 2:3, а 3:6
nikolay61
новенький
 
Сообщения: 27
Зарегистрирован: 15.08.2012 16:58:46

Re: Помощь начинающему

Сообщение bormant » 27.12.2012 18:13:11

nikolay61 писал(а):Делаем прогон на 9 крекеров в остаче. Результат - 28 крекеров и для 2:3, а 3:5.
А должно: 30 всего и 2:3, а 3:6

Некорректные исходные данные, не соответствуют условию:
nikolay61 писал(а):(Отметим, что количество крекеров всегда нацело делилась на три)

Проверим раз. В остатке 9. Это 2/3 от того, что видел второй, значит второй видел 9*3/2 = 27/2 = 13.5. Но 13.5 не является целым числом.
Тем не менее, продолжим. 2-й видел 13.5*3/2 = 20.25, 3-й видел 30.375, что не равно 30.
Проверим два. Исходно 30. 1-й взял 1/3 -- 10 шт., осталось 20. 20 не делится нацело на 3, второй не может взять 1/3 от 20 в целых крекерах.
Тем не менее, продолжим. 2-й взял 20/3 = 6+2/3 шт., осталось 13+1/3 шт. 3-й взял (13+2/3)/3 = 4+1/3 + 2/6 = 4+2/3, осталось 8+2/3 шт., что не равно 9.

ps. Отсюда новые 2 задачи:
1) напишите программу для генерации корректных условий
2) модифицируйте программу для точного расчёта в дробных значениях (знаменатель дроби k^(k-1) вполне подойдёт).
Для неточного расчёта (в десятичных дробях) достаточно поменять тип m, n на real (double, extended), целочисленное деление div -- на "/" и, возможно, задать формат вывода.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Помощь начинающему

Сообщение nikolay61 » 28.12.2012 00:15:44

nikolay61 писал(а): (Отметим, что количество крекеров всегда нацело делилась на три).

А мне почему-то кажется, что КОЛИЧЕСТВО есть аргументом общего количества крекеров. Спорить не буду, но логичнее так.
nikolay61
новенький
 
Сообщения: 27
Зарегистрирован: 15.08.2012 16:58:46

Пред.След.

Вернуться в Обучение Free Pascal

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

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

Рейтинг@Mail.ru