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

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

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

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

Сообщение 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.Вот мне и нужно понять какой знак когда ставится,что бы не перебирать их поочереди.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Конструкции языка нужно знать, а не гадать на кофейной гуще...
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

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

Просто нужно хотябы раз, где описаны основы синтаксиса все же прочитать, иначе у вас будут вопросы, ответы на которые будут иметь такой вид:
Прочитайте на стр 124, на второй вопрос стр 125 и т.д. Не ответить, плохо, но отвечать в таком духе, просто рано или поздно вам просто перестанут это делать как скажем перестали dangreen-у....
Аватара пользователя
Paster Fob
постоялец
Сообщения: 188
Зарегистрирован: 22.02.2011 20:53:36
Откуда: Новосибирск.

Сообщение Paster Fob »

Я читал в других книжках только там всё на заумном,а мне нужно по-простому.А книгу я ещё днём скачал.Бегло просмотрел.Завтра почитаю.Спасибо за совет.
Азотирование
незнакомец
Сообщения: 1
Зарегистрирован: 24.03.2011 07:37:20

Сообщение Азотирование »

Да, по книгам сложновато. Если и достигаются хорошие результаты, то через какое то время, поэтому нужен учитель
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

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

А вы знаете, что за работу Учителя нужно платить?! Ах да на пост советском пространстве это не принято...
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

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

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

Сообщение 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.

Так я и не смог понять принципа работы этой программы,почему цифры на экране появились в обратном порядке?
Аватара пользователя
Little_Roo
энтузиаст
Сообщения: 639
Зарегистрирован: 27.02.2009 18:56:36
Откуда: Санкт-Петербург

Сообщение Little_Roo »

Paster Fob писал(а):Значит далее изучил я цикл со счётчиком for...to...do

Может придется (но это ведь так сложно :( ) поизучать далее...
или прочитать где-нибудь (в любом учебнике по Паскалю) про downto
Но по уровню задачи - в каком классе Вы, Paster Fob , а ???
Аватара пользователя
Paster Fob
постоялец
Сообщения: 188
Зарегистрирован: 22.02.2011 20:53:36
Откуда: Новосибирск.

Сообщение Paster Fob »

или прочитать где-нибудь (в любом учебнике по Паскалю) про downto

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

какой нафиг класс,я школу в 1999 году закончил.Мне 28 лет.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение 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
Аватара пользователя
informat
новенький
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name
Контактная информация:

Сообщение 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.

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

Сообщение 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.
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Мне не понятно как в параметр arg попала переменная s

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

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

Scan(s);
Putnick
новенький
Сообщения: 62
Зарегистрирован: 18.03.2009 12:02:56

Сообщение Putnick »

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

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

procedure Scan(arg:string);
на

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

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