Страница 2 из 8

Re: Объясните новичку.

Добавлено: 22.03.2011 22:06:57
Paster Fob
ну вот к примеру прочитал про оператор Case и пробую сделать задание без учебника.

Код: Выделить всё

var a:integer;
begin
    repeat
    readln(a);
    if a=0 then break;
    case a of
    1:writeln('Первый');
    2:writeln('Второй');
    3:writeln('Третий');
    4:writeln('Четвёртый');
    5:writeln('Пятый');
    end;
    until false;
    readln;
end.

вот и не знаю как правильно написать то ли 1:=writeln...,то ли 1=writeln...Попробовал ,в результате ошибки,пока не написал 1:writeln.Вот мне и нужно понять какой знак когда ставится,что бы не перебирать их поочереди.

Re: Объясните новичку.

Добавлено: 22.03.2011 22:14:38
Mr.Smart
Конструкции языка нужно знать, а не гадать на кофейной гуще...

Re: Объясните новичку.

Добавлено: 22.03.2011 22:20:53
Maxizar
Это никак не связано с операторами типа присвоить (:=) или оператор проверки равенства (=), Это правила оператора выбора case:
Чтобы таких вопросов не возникало, можно прочитать любую книгу по делфи или Free Pascal, бесплатную можно скачать например вот эту:
Основы программирования в среде Lazarus
Автор: К.Т.Мансуров
Можно взять на сайте в разделе книги...
Например в ней оператор выбора описан на стр. 124.

Просто нужно хотябы раз, где описаны основы синтаксиса все же прочитать, иначе у вас будут вопросы, ответы на которые будут иметь такой вид:
Прочитайте на стр 124, на второй вопрос стр 125 и т.д. Не ответить, плохо, но отвечать в таком духе, просто рано или поздно вам просто перестанут это делать как скажем перестали dangreen-у....

Re: Объясните новичку.

Добавлено: 22.03.2011 22:28:54
Paster Fob
Я читал в других книжках только там всё на заумном,а мне нужно по-простому.А книгу я ещё днём скачал.Бегло просмотрел.Завтра почитаю.Спасибо за совет.

Re: Объясните новичку.

Добавлено: 24.03.2011 07:48:00
Азотирование
Да, по книгам сложновато. Если и достигаются хорошие результаты, то через какое то время, поэтому нужен учитель

Re: Объясните новичку.

Добавлено: 24.03.2011 10:35:55
Mr.Smart
Азотирование писал(а):Да, по книгам сложновато. Если и достигаются хорошие результаты, то через какое то время, поэтому нужен учитель

А вы знаете, что за работу Учителя нужно платить?! Ах да на пост советском пространстве это не принято...

Re: Объясните новичку.

Добавлено: 24.03.2011 11:59:28
Vadim
Paster Fob писал(а):Вот мне и нужно понять какой знак когда ставится,что бы не перебирать их поочереди.

Всё смешалось в доме Обломских: люди, кони... :D
Вот это как раз пример по Вашему вопросу. ;) У каждого языка есть свой синтаксис. Язык программирования здесь не исключение. Паскаль - не Си и создавался он более-менее человекообразным, поэтому к нему нужно применять те критерии правильности синтаксиса, которые Вы применяете к Вашему языку общения. А точнее - к английскому. Давайте перейдём к английскому словарю, чтобы было понятнее:
Case - выбор значения
of - из
а далее, всё как в том примере, что я Вам привёл выше - Вы задаёте значение "дом Обломских", далее следует двоеточие, т.к. Вам нужно отделить значение от зависимых от этого значения действий или данных. Заметьте, всё как в обычном языке. В обычном языке двоеточие служит символом-разделителем и в Паскале двоеточие тоже служит символом-разделителем между каким-то данным и зависимыми от него обстоятельствами.

Re: Объясните новичку.

Добавлено: 01.04.2011 18:31:45
Paster Fob
Азотирование писал(а):Да, по книгам сложновато. Если и достигаются хорошие результаты, то через какое то время, поэтому нужен учитель

Значит далее изучил я цикл со счётчиком for...to...do и тут же задание:Напишите программу, которая, запросив число N, печатала бы числа от 1 до N в обратном порядке,например:
n = 3
3
2
1
Я долго ломал голову как это сделать,но так и не догадался,в ответах вот что увидел:

Код: Выделить всё

var n,i:integer;
begin
   write('n = ');
   readln(n);
   for i:=1 to n do writeln(n+1-i);
   readln
end.

Так я и не смог понять принципа работы этой программы,почему цифры на экране появились в обратном порядке?

Re: Объясните новичку.

Добавлено: 01.04.2011 18:48:05
Little_Roo
Paster Fob писал(а):Значит далее изучил я цикл со счётчиком for...to...do

Может придется (но это ведь так сложно :( ) поизучать далее...
или прочитать где-нибудь (в любом учебнике по Паскалю) про downto
Но по уровню задачи - в каком классе Вы, Paster Fob , а ???

Re: Объясните новичку.

Добавлено: 01.04.2011 19:03:35
Paster Fob
или прочитать где-нибудь (в любом учебнике по Паскалю) про downto

Я маленько не дописал,было предложено выполнить задание в 2-ух вариантах с помощью downto и так как выше я писал.Так вот вариант с downto я решил сам,а вот тот про который я расписал выше не смог,вот и объясните мне как так вышло?В книге примеров почти нет.А как я должен учиться?
по уровню задачи - в каком классе Вы, Paster Fob , а ???

какой нафиг класс,я школу в 1999 году закончил.Мне 28 лет.

Re: Объясните новичку.

Добавлено: 02.04.2011 04:13:44
Vadim
Paster Fob писал(а):Так я и не смог понять принципа работы этой программы,почему цифры на экране появились в обратном порядке?

Действительно, если распишете на бумажке получающиеся в цикле цифры, то поймёте запросто. ;)
К примеру, Вы ввели n:=5. Теперь смотрим, какие цифры в резцльтате получаются:
WriteLn(5+1-1); //5
WriteLn(5+1-2); //4
WriteLn(5+1-3); //3
WriteLn(5+1-4); //2
WriteLn(5+1-5); //1

Re: Объясните новичку.

Добавлено: 02.04.2011 07:07:27
informat
Paster Fob писал(а):ну вот к примеру прочитал про оператор Case и пробую сделать задание без учебника.

Код: Выделить всё

var a:integer;
begin
    repeat
    readln(a);
    if a=0 then break;
    case a of
    1:writeln('Первый');
    2:writeln('Второй');
    3:writeln('Третий');
    4:writeln('Четвёртый');
    5:writeln('Пятый');
    end;
    until false;
    readln;
end.

вот и не знаю как правильно написать то ли 1:=writeln...,то ли 1=writeln...Попробовал ,в результате ошибки,пока не написал 1:writeln.Вот мне и нужно понять какой знак когда ставится,что бы не перебирать их поочереди.


Я вижу тут проблему хуже.
Стиль, которым написана эта программа, переведёт автора к серьёзным проблемам для больших кодах.
Бесконечный цикл их которого выпрыгивают "на ходу" преведёт к плохо понимаемому коду!
Что мешает написать так:

Код: Выделить всё

var a:integer;
begin
    repeat
      readln(a);
      case a of
        1:writeln('Первый');
        2:writeln('Второй');
        3:writeln('Третий');
        4:writeln('Четвёртый');
        5:writeln('Пятый');
      end;
    until a=0;
    readln;
end.

?

Re: Объясните новичку.

Добавлено: 02.05.2011 22:27:26
Paster Fob
Всем привет.дошёл я до процедур и мой мозг вскипел.Значит так на примере этой программы показана работа с отладчиком,как находить ошибки.Задание такое,ввести 3 строки и поменять в них буквы A на b.Внутри процедуры всё работает,после выхода из неё программа работает не правильно.Но дело не в этом.Мне не понятно как в параметр arg попала переменная s?Объясните пожалуйста.

Код: Выделить всё

var s:string;
    k:integer;
procedure Scan(arg:string);
var k:integer;
begin
    for k:=1 to length(arg) do
      if arg[k]='a' then arg[k]:='b';
end;

begin
    for k:=1 to 3 do begin
      write('Введите строку: ');
      readln(s);
      Scan(s);
      writeln(s);
    end;
end.

Re: Объясните новичку.

Добавлено: 02.05.2011 23:06:24
Padre_Mortius
Мне не понятно как в параметр arg попала переменная s

Вы сами ее передаете как аргумент процедуры вот этим вызовом процедуры

Код: Выделить всё

Scan(s);

Re: Объясните новичку.

Добавлено: 03.05.2011 10:00:41
Putnick
Уважаемый Paster Fob, предполагая Ваше дальнейшее затруднение с тем, что
Paster Fob писал(а):Внутри процедуры всё работает,после выхода из неё программа работает не правильно.
, спешу Вас уведомить, что в Паскале у процедуры есть как параметры-значения, так и параметры-переменные. Последние в описании процедуры оформляются с использованием ключевого слова var. Таким образом, если Вы замените строку

Код: Выделить всё

procedure Scan(arg:string);
на

Код: Выделить всё

procedure Scan(var arg:string);
, то программа начнет работать правильно.
С уважением, Алексей.