Имя: Пароль:
IT
 
Паскаль.Задачка к ЕГЭ С4. Глюк read?
0 боксер
 
13.07.15
16:40
1Сники все знают. Помогите коллеги.Сын готовится к ЕГЭ.
Уже не в первый раз сталкиваемся с "глюками" паскаля. Уже разные сборки качали- не помогает.Сейчас установил последнюю PASCALABC.NET сборка 970.Виндовс 8 64. Может какие особенности есть? Ведь все же сдают и большинство на паскале.

Пример по ссылке.
http://s020.radikal.ru/i715/1507/61/b31e62734dad.png

При первом вводе строки I=1 все ОК. Сразу дает ввести read().
При втором в отладчике проскакивает read() меняет f=1 и программа работает некорректно.

Если Read поменять ReadLN то вообще бесконечный цикл- хотя по сути они идентичны.

Ну и текст если у кого паскаль под рукой:

program z1025;

const
  N1 = 10;
var
  b: array[1..N1] of string;
  s, ini, name, otch: string;
  ch: char;
  N, i, j, k: integer;
  f: byte;

begin
  k := 0;
  readln(s);
  readln(N);
  for i := 1 to N do
  begin
    for j := 1 to 2 do
    begin
      f := 0;
      repeat
        read(ch);
        if f = 0 then ini := ini + ch;
        f := 1;
        name := name + ch;
      until ch = ' ';
    end;
    read(otch);
    ini := ini + copy(otch, 1, 1);
    name := name + otch;
    if ini = s then begin k := k + 1;b[k] := name; end;
    ini := '';
    name := '';
  end;
  for i := 1 to k do
  begin
    WRITE(B[K]);
  end;
end.
1 Отладчик
 
13.07.15
16:41
Пишите на 1С, будьте мужиками!
2 DTXqueque
 
13.07.15
16:43
Ентер у тебя проскакивает, судя по всему.
3 DTXqueque
 
13.07.15
16:43
readln надо + изменить условие выхода из цикла, если хотите посимвольно вводить.
Иначе нужно всё строку целиком забивать.
4 боксер
 
13.07.15
16:45
(3)какое условие выхода?
ReadLN то вообще бесконечный цикл
5 боксер
 
13.07.15
16:45
на 2-х компах пробовали результат один
6 боксер
 
13.07.15
16:46
про через одну строку понятно.хочется этот вариант добить- он вроде оптимальный и таких задач полно
7 Aceforg
 
13.07.15
16:46
read(otch);
поменять
readln(otch);
8 H A D G E H O G s
 
13.07.15
16:47
Обнули переменные в начале задачи
  s, ini, name, otch:
9 AlexNV
 
13.07.15
16:48
И нормальные имена для переменных так же пропиши, сразу будет видно где не работает
10 Garykom
 
гуру
13.07.15
16:48
(7) да уж насоветовал, там вообще то посимвольно читают char

(8) гыгы
11 Xapac
 
13.07.15
16:48
(8)+100500 дело говорит это же ПАСКАЛЬ
12 Garykom
 
гуру
13.07.15
16:49
(0) подсказка... как отделяется 1-я строка от 2-й при вводе?
13 DTXqueque
 
13.07.15
16:49
(4) ReadLn то вообще не цикл.
например, когда пустую строку считаете.
14 боксер
 
13.07.15
16:49
(7) чувак, ты крут!!!! Огромное спасибо. заработало!!!
щас врубаться буду.Пока не дошло
15 DTXqueque
 
13.07.15
16:51
Если у тебя будет цикл с read, и ты введешь "А" и нажмёшь ентер, а потом введёшь "Б" и нажмёшь ентер, то в цикле у тебя обработаются
А
Ентер
Б
Ентер

(7) (14) Ха-ха
>Если Read поменять ReadLN то вообще бесконечный цикл- хотя по сути они идентичны.
16 Garykom
 
гуру
13.07.15
16:51
(14) спорим что "не заработало", точнее "неправильно заработало"?
17 Garykom
 
гуру
13.07.15
16:52
(15) Оооо... хоть кто то в программировании шарит :)
18 боксер
 
13.07.15
16:53
(8)все обнуляется, только часть в конце цикла. не могу сына приучить обнулять вначале.
(15) я в (0) имел ввиду read(ch); - тут менять
а там ниже еще read(otch); его поменял на readln(otch); и заработало
19 Garykom
 
гуру
13.07.15
16:54
(18) ну да ввел инициалы "не побуквенно" и шо? где разные строки то ввод?
20 Garykom
 
гуру
13.07.15
16:55
блин вообще то 1С это "паскаль переведенный промптом" и не уметь?
21 Xapac
 
13.07.15
16:55
(20) тупая шутка
22 Mikeware
 
13.07.15
16:57
(18) расскажи ему анекдот про буратино....
23 Garykom
 
гуру
13.07.15
16:57
(21) никакой шутки, можно для интереса поинтересоваться у разрабов

тогда было очень много программистов знавших паскаль/дельфи которые и писали учетные программы

вот их и заюзали в качестве целевой, а уж чем там переводили это хз
24 Mikeware
 
13.07.15
16:58
Но вообще, за такой код надо тапком....
Учи дитеныша сразу нормально именовать переменные...
25 Mikeware
 
13.07.15
16:58
(23) свзи с паскалем никакой. хотя бы начиная с того, что паскаль - язык со строгой типизацией.
26 Mikeware
 
13.07.15
16:59
+(25)  скорее, 1с ближе к бэйсику. Но тоже отличий дофига.
27 Garykom
 
гуру
13.07.15
17:00
(25) ок, синтаксис "языка 1С" это некая смесь vb и pascal/delphi так пойдет?
28 Господин ПЖ
 
13.07.15
17:00
>Учи дитеныша сразу нормально именовать переменные...

да ладно... в паскеле всегда так и было

и-тое и джи-тое в циклах
29 Mikeware
 
13.07.15
17:02
(28) да кроме и-того и джи-того, в вышеприведенном еще много переменных...
(27) да нифига
30 Garykom
 
гуру
13.07.15
17:02
(0) кстати для решения задачи вывода ФИО с нужными инициалами массива для хранения (ФИО) не нужна, только все усложняет
31 боксер
 
13.07.15
17:02
(22)какой?
т.е. в паскале важно переменные вначале объявлять?

короче если везде readln писать то бесконечный цикл. работает если везде readln и один раз  read(ch)
32 Garykom
 
гуру
13.07.15
17:03
(29) "да нифига" - да мне как бы пофиг... но вот от С++ там точно ничего нету
33 боксер
 
13.07.15
17:03
переменные у него везде по одной букве, это я для форума переименовал :-)
как получилось, привый на русском 1Сить
34 Mikeware
 
13.07.15
17:04
(31) собственно, именно за обязательное объявление и строгую типизацию паскаль и применяют в качестве учебного языка...
35 боксер
 
13.07.15
17:04
(30) это часть задачи. там еще сортировать и считать людей дальше нужно
36 Mikeware
 
13.07.15
17:05
(32) от плюсов - точно, а вот с ансишным - при желании сходства найти можно не меньше, чем с паскалем.
37 боксер
 
13.07.15
17:06
(34)а было что то у нас похожее. переменная вроде при объявлении имеет значение по умолчанию, но не объявили и была ошибка- пришлось объявлять. понял.
38 Mikeware
 
13.07.15
17:09
(37) Буратине дали 5 яблок. 3 яблока он съел.
Вопрос: Сколько яблок осталось у Буратино?
Думаете 2?
А вот фик вам!
Неизвестно, сколько яблок было у Буратино ДО того, как ему дали 5 яблок.

Мораль: обнуляйте переменные!
©
39 ДенисЧ
 
13.07.15
17:11
(38) Это не наш метод! (с)
40 Garykom
 
гуру
13.07.15
17:11
(38) мораль нефиг жрать непомытые и непонятно откуда взявшиеся яблоки
41 Garykom
 
гуру
13.07.15
17:14
(40) а в (0) я вижу объявление переменных в начала = инициализация с начальными (0-ми) значениями
42 Garykom
 
гуру
13.07.15
17:18
(0) да правило №1 для студентов - всегда использовать ReadLn() и WriteLn() никаких урезанных (кроме случаев когда пишем игрушку с ловлей кнопок)
43 боксер
 
13.07.15
17:22
(42)спасибо. понятно теперь окончательно стало с ловлей кнопок- в них собака зарыта
Всем спасибо. вроде все поняли.
44 Кирпич
 
13.07.15
17:23
зачем строки инициализировать? строки компилятор инициализирует. инициализировать нужно то, что на стеке. ну и объекты там всякие.
45 H A D G E H O G s
 
13.07.15
17:54
Ну вот как то так правильно надо решать эту задачу

program Project3;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

type
  PPeople = ^TPeople;

  TPeople = record
    FIO: String[250];
    SmallFIO: string[3];
  end;

var
  count: integer;
  i, j: integer;
  CurrentPeople: PPeople;
  Peoples: array of PPeople;
  tmpvalue: string;
  inputvalue: string;
  CountOfSpace: integer;

procedure BeforeExit();
begin
  for i := 0 to length(Peoples) - 1 do
  begin
    FreeMem(Peoples[i]);
  end;
  setlength(Peoples, 0);
end;

begin
  write('Введите число людей ');
  readln(count);
  for i := 0 to count - 1 do
  begin
    while True do
    begin
      Write('Введите ФИО ' + IntToStr(i + 1) + ' человека ');
      readln(inputvalue);
      CountOfSpace := 0;
      for j := 1 to length(inputvalue) do
      begin
        if (copy(inputvalue, j, 1) = ' ') and (j < length(inputvalue)) then
          inc(CountOfSpace);
      end;
      if CountOfSpace <> 2 then
      begin
        Write('ФИО человека не соответствует формату. Попробуем еще раз (y/n)');
        readln(tmpvalue);
        if tmpvalue = 'y' then
          Continue
        else
        begin
          BeforeExit();
          exit;
        end;
      end;
      break;
    end;
    GetMem(CurrentPeople, sizeof(TPeople));
    CurrentPeople^.FIO := inputvalue;
    CurrentPeople^.SmallFIO := copy(inputvalue, 1, 1);
    for j := 1 to length(inputvalue) do
    begin
      if copy(inputvalue, j, 1) = ' ' then
        CurrentPeople^.SmallFIO := CurrentPeople^.SmallFIO +
          copy(inputvalue, j + 1, 1);
    end;
    setlength(Peoples, length(Peoples) + 1);
    Peoples[length(Peoples) - 1] := CurrentPeople;
  end;
  while True do
  begin
    write('Введите искомые инициалы ');
    inputvalue := '';
    while True do
    begin
      readln(inputvalue);
      if length(inputvalue) <> 3 then
      begin
        Write('Инициалы человека не соответствует формату. Попробуем еще раз (y/n)');
        tmpvalue := '';
        readln(tmpvalue);
        if tmpvalue = 'y' then
          Continue
        else
        begin
          BeforeExit();
          exit;
        end;
      end;
      break;
    end;
    for i := 0 to count - 1 do
    begin
      CurrentPeople := Peoples[i];
      if CurrentPeople^.SmallFIO = inputvalue then
        writeln(CurrentPeople^.FIO + ' есть в нашей базе');
    end;
    Write('Продолжим поиск (y/n)');
    readln(tmpvalue);
    if tmpvalue = 'y' then
      Continue
    else
    begin
      BeforeExit();
      exit;
    end;
  end;

end.
46 SUA
 
13.07.15
17:59
(38)паскалю пофигу там default значения есть (если не пойнтеры)
47 MKZM
 
13.07.15
18:51
(45) Охереть. Надо еще на что нибудь проверить. Или спросить.
48 Garykom
 
гуру
13.07.15
19:39
(45) "извращенец" :) начала объектности и динамическая работа с памятью... для студентов... нуну
49 Garykom
 
гуру
13.07.15
19:42
(48) но самое главное а нафига так много? кода?

когда реально для (0) один цикл и все, ну если нескольких по инициалам искать то 2 цикла вложенных
50 H A D G E H O G s
 
13.07.15
20:12
(48) (49) вот так надо учить программированию

контроль входящих данных, независимость от размерности массивов, оптимизация (массив указателей, а не записей)

никакой объектности тут нет.
51 Garykom
 
гуру
13.07.15
20:39
(50) ага так препод и поверил что ученик/студент "защиту от дурака" догадался сам сделать и т.д.

ЗЫ
program people;
uses sysutils;
var
  fioCur,initials, initialsCur:string;
  fioCount, fioNum, posImya, posOtchestvo:integer;
  fio: array[1..100] of string;
begin
  write('Vvedite kol-vo FIO (chislo): ');
  readln(fioCount);

  for fioNum:=1 to fioCount do begin
    write('Vvedite (cherez probel) FIO '+IntToStr(fioNum)+': ');
    readln(fio[fioNum]);
  end;

  write('Vvedite initialy dlya poiska (bez probela): ');
  readln(initials);

  for fioNum:=1 to fioCount do begin
    initialsCur := '';
    fioCur := fio[fioNum];
    initialsCur := initialsCur + Copy(fioCur,1,1);

    posImya := Pos(' ', fioCur);
    Delete(fioCur, 1, posImya);
    initialsCur := initialsCur + Copy(fioCur,1,1);

    posOtchestvo := Pos(' ', fioCur);
    Delete(fioCur, 1, posOtchestvo);
    initialsCur := initialsCur + Copy(fioCur,1,1);

    if initialsCur=initials then writeln('Nashli: '+fio[fioNum]);
  end;

  readln;
end.
52 Garykom
 
гуру
13.07.15
20:42
(51) че та я подзабыл паскаль... 25 минут писал офигеть
53 Провинциальный 1сник
 
13.07.15
20:45
read(ch) - это НЕ посимвольное чтение. Это чтение СИМВОЛА, с завершением ввода нажатием ENTER (символом конца строки). Чтобы ловить нажатые символы - есть другие процедуры, но они в стандарт не входят и зависят от среды исполнения или компилятора.
54 Garykom
 
гуру
13.07.15
20:49
(53) ну давай задвигай нам про readkey/keypressed...
55 Провинциальный 1сник
 
13.07.15
20:52
(54) Ну да.. оно самое.. но это уже борланд придумал. И в общем и целом стандартом не является. Ибо в те дремучие годы, когда создавался стандарт, для интерактивной работы с пользователем использовались телетайпы. А дисплей лишь эмулировал телетайп, разумеется, со строчным вводом-выводом..
56 Kvant1C
 
13.07.15
21:09
57 Domovoi
 
14.07.15
13:09
(0)Зачем здавать ЕГЭ по программированию, если не его?
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший