Автор Тема: Вспоминаем Turbo Pascal и решаем задачи на нём  (Прочитано 49111 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля

Хочу научиться использовать метки , но в интернете в основном написано что-то типа " не стоит их использовать так что расписывать как ими пользоваться не будем..." , то что ими злоупотреблять не стоит я понял , но всё же я хочу научиться пользоваться и ими .Подскажите кто разбирается плыз как их обозначать в описании переменных и как потом вызывать в самой программе , можно на примере любой простенькой програмульки  .

Оффлайн RBM13s

  • Emu-Land Team
  • Сообщений: 2922
  • Пол: Мужской
  • Тролль-виртуал!
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #1 : 27 Октябрь 2009, 18:00:18 »
http://pascal.proweb.kz/index.php?page=12
Про метки в ТР, но использовать реально не стоит. Лучше освоить циклы.

Оффлайн Йобан Матич

  • Emu-Land Team
  • Сообщений: 2593
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #2 : 27 Октябрь 2009, 18:02:25 »
Цитата
j := 0;
for i := 0 to 10 do
begin
      j := j + 1;
      if j = 5 then break
end;

По рукам за такое бить надо.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #3 : 27 Октябрь 2009, 18:07:22 »
RBM13s, с метками разобрался .

Добавлено позже:
Йобан Матич, а за что конкретно хоть ?Что в примере приведённом на той странице не так? :)

Оффлайн aUruM

  • Emu-Land Team
  • Сообщений: 1793
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #4 : 27 Октябрь 2009, 18:38:22 »
Цитата: RBM13s
использовать реально не стоит
Надо заметить, что, хотя использование меток и goto в языках высокого уровня считается дурным тоном, в некоторых случаях в реальной жизни к этому приему приходится прибегать. Например, в случае, когда надо выйти сразу из нескольких вложенных циклов.

Оффлайн Йобан Матич

  • Emu-Land Team
  • Сообщений: 2593
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #5 : 27 Октябрь 2009, 20:05:38 »
Цитата: gepar
а за что конкретно хоть ?
Может пример немного неудачен, но можно написать так:
Цитата
i := 4;
j := 5;
Результат будет тем же =)

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #6 : 27 Октябрь 2009, 23:08:24 »
Проблема: у меня есть три условия и если они все три не выполняются я хочу чтобы выполнялось 4ое условие else .
Вопрос:как это сделать ?Если без if , а с использованием case то тоже как это сделать ?
Задача программы:вывести наибольшее число из 3ёх введённых чисел .
Код НЕработающей программы :
Заранее спасибо ответившему .
« Последнее редактирование: 27 Октябрь 2009, 23:11:18 от gepar »

Оффлайн aUruM

  • Emu-Land Team
  • Сообщений: 1793
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #7 : 27 Октябрь 2009, 23:17:28 »
gepar, а что мешает сделать вложенные if'ы? Например, вот так:
if (a>b) and (b>c)
  then
    writeln(a)
  else
    if (b>a) and (a>c)
      then
        writeln(b)
      else
        if (c>a) and (c>b)
            then
              writeln(c)
            else
              writeln ('2 chisla sovpadaut');
« Последнее редактирование: 27 Октябрь 2009, 23:21:26 от aUruM »

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #8 : 27 Октябрь 2009, 23:27:21 »
aUruM, спасибо за подсказку .В том учебнике что я читал (откуда и упражнения кстати) я не нашёл информации о вложенных if'ах и лишь после твоей наводки нагуглил инфу о вложенных if'ах .

Оффлайн RBM13s

  • Emu-Land Team
  • Сообщений: 2922
  • Пол: Мужской
  • Тролль-виртуал!
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #9 : 27 Октябрь 2009, 23:40:43 »
Надо заметить, что, хотя использование меток и goto в языках высокого уровня считается дурным тоном, в некоторых случаях в реальной жизни к этому приему приходится прибегать. Например, в случае, когда надо выйти сразу из нескольких вложенных циклов.
А что мешает тем же break'ом при определенном условии выходить из циклов? Хотя лучше приведи пример, мне понятнее будет о чём ты.

Оффлайн aUruM

  • Emu-Land Team
  • Сообщений: 1793
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #10 : 27 Октябрь 2009, 23:50:57 »
Цитата: RBM13s
А что мешает тем же break'ом при определенном условии выходить из циклов?
В принципе, ничто не мешает. Но куда проще один раз написать goto метка, чем в каждом из вложенных циклов прописывать условия выхода.

Оффлайн RBM13s

  • Emu-Land Team
  • Сообщений: 2922
  • Пол: Мужской
  • Тролль-виртуал!
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #11 : 28 Октябрь 2009, 01:54:14 »
У меня до сих пор от таких "простых выходов" бросает в дрожь. Как представлю, что потом надо будет блок-схему чертить XD

Онлайн HardWareMan

  • Модератор
  • Сообщений: 7422
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #12 : 28 Октябрь 2009, 06:17:11 »
Может пример немного неудачен, но можно написать так:Результат будет тем же =)
А кто говорит, что требуется именно результат? Может задача стоит в том, чтобы научиться прерывать цикл. Например все тот же код, но несколько измененный:
j := 0;
for i := 0 to 10 do
begin
     inc(j);
     if j = d then break
end;
(Извините, не удержался. Не люблю конструкции типо x:=x+1, я предпочитаю inc/dec) А d может изменяться перед вызовом этого куска кода.

У меня до сих пор от таких "простых выходов" бросает в дрожь. Как представлю, что потом надо будет блок-схему чертить XD
Сразу видно, кто тут АСМа не нюхал.  :D Нарисуй блок-схему проги на асме и ты поймешь, что ты еще только в песочнице, а на стройку тебе еще рано.
Касаемо goto - согласен. Моя первая программа на пасе (лет 10 назад) после АСМа содержала порядка 80(!) меток, но работала стабильно (+ метки я привык обзывать тематически, поэтому всегда понятно что и куда). Сейчас уже лет 8 как в моих программах метки если встречаются, то только в ассемблерных вставках, и то, стараюсь все делать линейно.

Например, надо выйти из куска кода, если ни одно условие не выполнено. Казалось бы, заюзай goto и будет тебе счастье, так ведь нет - дурной тон. Ок, второй вариант - break, но он работает только для циклов. Тогда приходится делать так:
var ok:boolean;
// Наш код
...
// Точка входа в кусок кода, который и проверяет что-то
while true do begin
 ok:=false;
 if (....) then break;
// Чтонить делаем и еще проверяем
 if (....) then break;
// Еще чтото сделаем
 if (....) then break;
// Делаем
....
// Выход из секции
  ok:=true;
  break;
  end;
// Проверяем, выполнен ли весь инит?
if ok then begin
  // Все ОК, работаем
  end else begin
  // Чтото обломалось, скажем юзеру
  end;
В принципе все понятно, ведь правда? И гораздо аккуратнее и более читабельнее, чем вложенные условия. Если вложенных циклов несколько, то все будет так же:
// Наш код
while a<b do begin
  ok:=false;
  // Код
  for d:=0 to 30 do begin
      // Код
      if (....) then break;
      if (....) then ok:=true;
      // Еще код
      end;
  if not ok then break;
  // Продолжающийся код
  end;
Ну, в общем идея понятна, да? Работаем с флагами. Кстати, прием хорошо работает и на асме.

В случае с case'ом все по другому. Как и в циклах, там есть жесткое ограничение типов переменных, которые можно использовать. Например, можно использовать любые целые числа и делать условия:
var a:integer(byte, word, longint, dfword, etc...);

case a of
  0     : // Код
  3     : // Код
  8..10 : // Код
  else // Код
  end;
Третье условие показывает диапазон значений, а else сработает только если не сработает ни одно из условий. case - это однопроходная структура, нужно помнить, что срабатывает только одно из условий и остальные не выполняться. Можно использовать даже char:
var key,ext:char;

key:=readkey;
case key of
  'Y','y' : //Код
  #10  : //Код
  #0   : begin ext:=readkey;
               case ext of
                #$33 : // код
                end;
               end;
  end;
Видно, что я читаю код нажатой клавиши и делаю какие-то действия. Если код клавиши =0 (это символ, поэтому это будет chr(0) или #0), то надо дополнительно считать код расширенной клавиши и обработать вложенным case, так опрашивают курсоры, функционалы и нумпад.
Можно использовать перечисления:
type TMode = (mdIdle, mdRun, mdStop);
var Mode:TMode;
     key:char;
// Наш код
key:=readkey;
case key of
  'R','r' : Mode:=mdRun;
  'S','s' : Mode:=mdStop;
  else Mode:=mdIdle;
// Теперь заюзаем наш флаг
case Mode of
  mdIdle  : sleep(1000);
  mdStop : // Код
  mdRun  : // Код
  else Mode:=mdIdle; // На всякий атас
  end;
Понятно? Кстати, булево так и описано: type boolean = (false, true);. Перечисления - на самом деле обычный байт (если их много, то больше: слово). Поэтому, первое обозначение получает код 0, второе 1 и т.д. Т.е. этот код эквивалентен предыдущему:
const mdIdle = 0;
      mdRun = 1;
      mdStop = 2;
var Mode:byte;
     key:char;
// Наш код
key:=readkey;
case key of
  'R','r' : Mode:=mdRun;
  'S','s' : Mode:=mdStop;
  else Mode:=mdIdle;
// Теперь заюзаем наш флаг
case Mode of
  mdIdle  : sleep(1000);
  mdStop : // Код
  mdRun  : // Код
  else Mode:=mdIdle; // На всякий атас
  end;
Но первый более элегантен.
« Последнее редактирование: 28 Октябрь 2009, 07:08:50 от HardWareMan »

Оффлайн RBM13s

  • Emu-Land Team
  • Сообщений: 2922
  • Пол: Мужской
  • Тролль-виртуал!
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #13 : 28 Октябрь 2009, 11:45:58 »
Сразу видно, кто тут АСМа не нюхал.  :D Нарисуй блок-схему проги на асме и ты поймешь, что ты еще только в песочнице, а на стройку тебе еще рано.
В общем-то это я и так знаю. Пасквиль помню по лекциям из ВУЗа. Сейчас вообще только быдлокодю на PHP.

Онлайн HardWareMan

  • Модератор
  • Сообщений: 7422
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #14 : 28 Октябрь 2009, 14:04:29 »
В общем-то это я и так знаю. Пасквиль помню по лекциям из ВУЗа. Сейчас вообще только быдлокодю на PHP.
Индусский код?

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #15 : 28 Октябрь 2009, 23:32:56 »
Задание :вычислить сумму ряда s=sin(1)+sin(2)+...sin(n) , для n введённого с клавиатуры .
Перед этим был текст с repeat until , как решить не могу понять так как не могу понять что надо будет задать until тоесть начало у меня получилось таковое
а как дальше поступить что-то не могу придумать так как ни разу не сталкивался с таким условием .

Оффлайн Fly

  • Пользователь
  • Сообщений: 1896
  • Пол: Мужской
    • Steam
    • Youtube
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #16 : 29 Октябрь 2009, 00:21:06 »
Во-первых, советую в начале написать:
var
  s:real;
  i,n:byte;
и
begin
  write('Enter n: ');
  readln(n);
  s:=0; i:=1;
Ну а потом
  repeat
    s:=s+sin(i);
    inc(i)
  until i>n;


Добавлено позже:
А можно даже так:
var
  s:real;
  n:byte;
begin
  write('Enter n: ');
  readln(n);
  s:=0;
  repeat
    s:=s+sin(n);
    dec(n)
  until n=0;

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #17 : 29 Октябрь 2009, 01:04:39 »
А dec(n) и  inc(i) что по сути делают ?Если можно распиши .

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9372
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #18 : 29 Октябрь 2009, 01:11:06 »
dec(n) это n:=n-1
inc(i) i:=i+1

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #19 : 29 Октябрь 2009, 01:28:32 »
Если можно , то лучше напишите пожалуйста как прошлое упражнение должен был выполнить новичок , ато так как я не разобрался с тем упражнением я не могу выполнить последующие типа этого :
Вычислить A *(A+1)*(A+2)*(A+3)* (A+N), где A и N вводятся с клавиатуры , а разобрацца с задачкой то ведь хоццо  :)

Добавлено позже:
MetalliC, понял , сейчас испытаю этот способ на други примерах .

Добавлено позже:
мда , что-то с последним уравнением тоже возникла проблемка - я снова никак не могу придумать как задать в паскале такое условие .Подскажите плыз , хотя возможно что я утром на свежую голову и придумаю что-то , но помощ если что не помешает  :)

Оффлайн Fly

  • Пользователь
  • Сообщений: 1896
  • Пол: Мужской
    • Steam
    • Youtube
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #20 : 29 Октябрь 2009, 01:46:18 »
Объясню кусок кода.
Обнуляем сумму s, счётчику i присваиваем 1.
Далее цикл. Предположим, n = 3.
1. К переменной s прибавляем значение sin(i). Поскольку i = 1, прибавляется sin(1).
2. Увеличиваем i на единицу. Теперь i = 2.
3. Проверяем условие выхода. 2 не больше 3, значит, цикл продолжается.
4. К переменной s прибавляем значение sin(i). Поскольку i = 2, прибавляется sin(2).
5. Увеличиваем i на единицу. Теперь i = 3.
6. Проверяем условие выхода. 3 не больше 3, значит, цикл продолжается.
7. К переменной s прибавляем значение sin(i). Поскольку i = 3, прибавляется sin(3).
8. Увеличиваем i на единицу. Теперь i = 4.
9. Проверяем условие выхода. 4 больше 3, цикл закончен.

Онлайн HardWareMan

  • Модератор
  • Сообщений: 7422
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #21 : 29 Октябрь 2009, 06:24:35 »
Циклы.
FOR ... TO/DOWNTO ... DO
Цикл FOR организует счетчик. Поэтому, переменная управления должна быть числовая целая. Обычно, задается начальное значение числовой переменной и конечное. Шаг фиксирован и равен +1 при использовании TO и -1 при использовании DOWNTO. Пример:
var a:integer;
    b:byte;
...
for a:=0 to 3 do //Код

for b:=5 downto 2 do //Код
В конце цикла переменная-счетчик всегда будет иметь значение, указанное в поле TO/DOWNTO. Для досрочного выхода из цикла можно применить уже известный BREAK и тогда значение переменной-счетчика буде то, на котором цикл был прерван. Можно так же внутри цикла сразу задать значение переменной-счетчика конечному значению и цикл прервется сам, но это уже из разряда дурного тона, ибо тяжело отслеживается.

WHILE ... DO
Цикл WHILE позволять крутить кусок кода, пока выполняется требуемое условие. Если на момент входа условие не было выполнено - этот цикл не выполнится. Этот цикл гибче, чем FOR, потому как условие может быть любым. Примеры:
// Условие по счетчику
var a,b:integer;
...
a:=0; b:=0;
while a<5 do begin
  b:=b*a;
  inc(a); // Если этого не сделать, то цикл станет вечным
  end;

// Условие по значению
var a,b:integer;
...
a:=1; b:=1;
while b<1000 do begin
  b:=b*a;
  inc(a); // Если этого не сделать, то цикл станет вечным
  end;

// Или можно организовать ожидание семафора / синхронизацию событий и потоков
var WaitEvent:boolean;
... // Код
while WaitEvent do sleep(100); // Ждем события, поток спит не нагружая процессор
... // Продолжение кода
// А в другом потоке или прерывании делать присвоение значений WaitEvent

REPEAT ... UNTIL
Цикл REPEAT позволять крутить кусок кода, пока не выполняется требуемое условие. Он имеет свойства цикла WHILE, но отличается тем, что один раз он выполняется всегда (при первом входе), а потом зацикливается, пока не выполнится условие в поле UNTIL. Примеры с WHILE, адаптированные под REPEAT (условие выхода требуется инвертировать по логике):
// Условие по счетчику
var a,b:integer;
...
a:=0; b:=0;
repeat
  b:=b*a;
  inc(a); // Если этого не сделать, то цикл станет вечным
until a>5;

// Условие по значению
var a,b:integer;
...
a:=1; b:=1;
repeat
  b:=b*a;
  inc(a); // Если этого не сделать, то цикл станет вечным
until b>1000;

// Или можно организовать ожидание семафора / синхронизацию событий и потоков
var WaitEvent:boolean;
... // Код
repeat
  sleep(100);
until not WaitEvent; // Ждем события, поток спит не нагружая процессор
... // Продолжение кода
// А в другом потоке или прерывании делать присвоение значений WaitEvent
Вот как-то так, если говорить в кратце.
« Последнее редактирование: 29 Октябрь 2009, 06:28:37 от HardWareMan »

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #22 : 30 Октябрь 2009, 12:53:28 »
Fly, большое спасибо за подробное разъяснение  :)
Прочитал о массивах и типе char и снова что-то много вопросов появилось притом не пойму почему в книге даются такие упражнения , задать которые прочитав инфу только этой книги я бы сказал просто невозможно .
Теперь возникшие вопросы о char :
1)В одном из заданий задано мол нужно найти символы '+' и '*' введённые с клавиатуры , но так как последний символ не указан то мне нужно задать причину чтобы цыкл повторялся со всеми символами до нажатия enter , как это сделать ?Я задал что последний символ '/' и всё работает , но я хочу узнать как всё же задать что последним будет нажатия кнопки enter , у неё ведь и кода то нет в таблице символов .Код программы
2)Задание : Дана последовательность из n символов .Выяснить имеются ли в последовательности два подряд идущих символа ',-'
Вопрос : как сделать так чтобы при выполнении цикла считывалось по 2 символа ?
3)Задание :Дана последовательность из n символов , известно что в ней есть хотя-бы одна запятая .Найти номер первой и последней запятой .Вопрос: как определять номера введённых символов , в частности  тех отдельных символов (запятых) что найдет программа ?
4)Задание :Вывести на экран изображение всех возможных символов вместе с их номерами
Вопрос : как это сделать то ?Просто вывести все символы я могу вот так :
а вот как ещё и номера приписать перед каждым символом ...
« Последнее редактирование: 30 Октябрь 2009, 13:45:17 от gepar »

Онлайн HardWareMan

  • Модератор
  • Сообщений: 7422
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #23 : 30 Октябрь 2009, 13:43:43 »
Длина строки будет length(). Или нулевой элемент в строке (Дельфи не дает туда обращаться).
Твой код:
var l:string;
    a,b,c:integer;
    s:char;
begin
     writeln('Input line, confirm input by <ENTER> key:');
     readln(l);
     if length(l)>0 then begin
        a:=0; b:=0;
        for c:=1 to length(l) do begin // Стринги идут от 1!!! 0й элемент - длинна
            s:=l[c];
            case s of
              '*' : inc(a);
              '+' : inc(b);
              end;
            end;
        writeln('* = ',a,', +',b);
        end else writeln('Zero length string are not allowed!');
end.
Вывод всех ASCII:
var c:byte;
begin
     for c:=$20 to $FF do write('<',chr(c),'> = ',c); // Символы менее 20H (32) являются служебными
end.
Про 3е задание надо покурить хелпик пасовский. Там ЕМНИП есть функция поиска символа (типо LEFT/RIGHT/MID), которая и укажет на позицию требуемого символа. Касаема 2го задания, то я вижу это примерно так:
var l:string;
    c:integer;
begin
     writeln('Input string:');
     readln(l);
     if length(l)>2 then begin
        for c:=1 to Length(l)-1 do
            if (l[c]=',') and (l[c+1]='-') then writeln('Match "',l[c],l[c+1],'" found at position ',c);
        end else writeln(String must have at least 2 symbols!');
end.
« Последнее редактирование: 30 Октябрь 2009, 14:10:48 от HardWareMan »

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #24 : 30 Октябрь 2009, 13:57:13 »
Цитата: HardWareMan
if length(l)>0 then begin
А можно в двух словах что за length и с чем его едят ну или ссылку на соответствующую инфу , ато в первых 17 пунктах той книги о паскале о такой штуке ни слова .
P.S по логике я так понял что это типа лента чисел ну или что-то типа массива , я правильно понял или есть ещё какието особенности в отличии от массива ?

Добавлено позже:
Ну и по-поводу массивов :
1)Задание: напишите программу которая сначала вводит десять чисел в одномерный массив , а затем складывает отдельно все положительные элементы и выдаёт полученные результаты.Проблема заключается в том что  как заставить паскаль ввести 10 чисел "от себя" не написано да и как рассортировать  отдельно положительные и отрицательные числа я тоже пока что не знаю (ну не забивать же если 1 элемент больше 0 знать прибавлять к a , в ином случае прибавлять к b и так 10 раз  :)  ).

Добавлено позже:
HardWareMan, большое спасибо за помощ , сейчас буду разбираться с  написанными тобой остальными кодами .
« Последнее редактирование: 30 Октябрь 2009, 13:59:22 от gepar »

Онлайн HardWareMan

  • Модератор
  • Сообщений: 7422
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #25 : 30 Октябрь 2009, 14:20:30 »
Стринги - это массив чаров. В TP его длина равняется 255 символам. Стало быть, массив состоит из 256 байт, первый байт которого является его длиной, а остальные  - непосредственно символами. Отличие стринга от обычного массива в том, что у стрингов есть сервис, для поиска, фильтрования, обрезания и т.д. Ну и выводить их легко: write()/writeln() и все. Функция length() возвращает текущую длину стринга (при задании стрингу значения '' - два апострофа, то длина равна 0). В TP7 и BP7 значение функции length() равно нулевому элементу стринга. Дельфи запрещает прямое обращение к нулевому элементу стринга.

Добавлено позже:
Ну и по-поводу массивов :
1)Задание: напишите программу которая сначала вводит десять чисел в одномерный массив , а затем складывает отдельно все положительные элементы и выдаёт полученные результаты.Проблема заключается в том что  как заставить паскаль ввести 10 чисел "от себя" не написано да и как рассортировать  отдельно положительные и отрицательные числа я тоже пока что не знаю (ну не забивать же если 1 элемент больше 0 знать прибавлять к a , в ином случае прибавлять к b и так 10 раз  :)  ).
var c,n,e:integer;
    l:string;
    num:array[1..10] of integer;
begin
     c:=1;
     repeat
       write('#',c,' Input integer decimal number '); readln(l);
       val(l,n,e); //Преобразовываем число
       if e=0 then begin
          num[c]:=n; inc(c);
          end else writeln('Error in number, repeat input.');
     until c>10;
     n:=0;
     for c:=1 to 10 do
         if num[c]>=0 then begin
            writeln('Found positive number ',num[c],' at position ',c);
            n:=n+numc[c];
            end;
     writeln('Total summ of positive numbers are ',n);
end.
Как-то так.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #26 : 20 Ноябрь 2009, 17:50:50 »
Cлегка попроще задание , вот только немогу догадаться в чём именно здесь хитрость .
Переменная X содержит трехзначное число .Поместить в переменную S сумму цифр этого числа .
Как определить второе и третее числа ?Первое я могу разделив на 100 и откинув остаток , а остальные как ? :)

Оффлайн BaNdiT

  • Пользователь
  • Сообщений: 586
  • Пол: Мужской
  • Предводитель Автоботов
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #27 : 20 Ноябрь 2009, 18:09:47 »
div - целочисленное деление (результат деления без учёта остатка).
mod - остаток от деления.
Соответственно, первая цифра числа = <число> div 100 (или 1 000, или 10 000... - смотря сколько цифр в числе). Последняя цифра = <число> mod 10. Все остальные находятся комбинацией div и mod (например, вторая с конца = (<число> mod 100) div 10 - т.е. сначала выделяешь две последние цифры, а потом отсекаешь самую последнюю).

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #28 : 21 Ноябрь 2009, 00:40:13 »
BaNdiT,спасибо за разъяснение .

Добавлено позже:
Задание Напишите программу калькулятор , позволяющую вычислять по выбору одну из четырёх основных арифметических операций .
Я тут планировал все сделаать через case , но что-то лыжи не едут , а именно как я понял case и char  несовместимы  :
Задание вообще как я понял относиться к лёгким , но что-то мне оно таковым не показалось .
UPD: При выполнении другого задания вспомнил что символы же нужно брать в скобки , и как я мог это забыть .В итоге получилось вот что :
Программа работает что радует , хотя я почему то уверен что эту программу можно сделать как-то проще /быстрее/лучше/всё вместе(и проще и быстрее и лучше) если я прав то вдруг кому не лень напишите пожалуйста как это задание было бы лучше выполнить .И вообще хотелось бы узнать у специалистов по паскалю нормально ли я  сам код программы пишу , или есть какието замечания ?Не хочеться же в итоге индусский код писать то . :)
« Последнее редактирование: 21 Ноябрь 2009, 01:18:41 от gepar »

Оффлайн aUruM

  • Emu-Land Team
  • Сообщений: 1793
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #29 : 21 Ноябрь 2009, 01:46:59 »
1. Считать два операнда и символ операции, выбрать требуемую операцию, посчитать значение результата и вывести на экран - я не вижу, что тут можно сократить. Ну разве что можно сэкономить одну строчку вот таким способом:
   '/': writeln('summa=',a/b,' ');
    '*': writeln('summa=',a*b,' ');
    '+': writeln('summa=',a+b,' ');
    '-': writeln('summa=',a-b,' ');
То есть, не помещать результат вычислений в отдельную переменную, а сразу вывести на экран.

2. От goto неплохо бы избавиться, например, использовав цикл until.