|
Паскаль.Задачка к ЕГЭ С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)Зачем здавать ЕГЭ по программированию, если не его?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |