| Другое > Hard'n'Soft |
| Вспоминаем Turbo Pascal и решаем задачи на нём |
| << < (5/15) > >> |
| Doctor Venkman:
Давайте тему переименуем в "помогите сделать уроки" :lol: |
| gepar:
--- Цитата: Doctor Venkman ---Давайте тему переименуем в "помогите сделать уроки" --- Конец цитаты --- Нет , эти задания из интернет учебника , можешь даже проверить , автора и названия я вроде где-то писал немного раньше в теме , домашние же задания обычно сдаются преподавателю для оценки так что уроками это назвать сложно . Добавлено позже: topos84, да я сегодня слегка похожее задание начал решать и после того как решил уже только понял что в прошлом была одна ошибочка :) Добавлено позже: Застрял на сортировке массивов . Задание Организуйте массив содержащий 20 целых чисел .Отсортируйте отдельно элементы с чётным индексом по возрастанию и элементы с нечётным индексом по убыванию . Вообщем то что у меня получилось ( некоторые строки сдвинуты так как я то пробовал в begin и end их заключать то проводил другие операции , но в итоге всё равно вижу что что-то не так по тому что программа не запускается . P.S Стоит отметить что подпрограммы я ещё не изучал и в учебнике они идут дальше так что по идеи это упражнение нужно сделать без их использования . P.P.S Буду благодарен если кто-то поможет отсортировать хотя бы чётные или нечётные элементы , а дальше я уже сам буду с паскалем воевать :) program proga196; uses crt; var m:array[1..20] of integer; i:integer; buf:integer; ind:boolean; Begin randomize; for i:=1 to 20 do m[ i ]:=random(21)-10; writeln('Array is : '); for i:=1 to 20 do write(m[ i ]); repeat; ind:=true; for i:=1 to 20 do if i mod 2 = 0 and m[ i ]<m[i+2] do //По сути именно с этой строкой и возникает проблема , толи я что-то задаю всё время Begin //неправильно толи х.з . buf:=m[ i ]; m:=m[i+2]; m[i+2]:=buf; ind:=false; end; until ind; for i:=1 to 20 do write(m[ i ]); end; |
| gepar:
Неужели никто не может осилить эту задачку ?Ато я второй день уже мучаюсь и никак не получаеться задать довйное условие типа if i mod 2 = 0 and m<m[i+2] then ... :( |
| topos84:
--- Цитата: gepar --- if i mod 2 = 0 and m[ i ]<m[i+2] do //По сути именно с этой строкой и возникает проблема , толи я что-то задаю всё время Begin //неправильно толи х.з . buf:=m[ i ]; m:=m[i+2]; m[i+2]:=buf; ind:=false; --- Конец цитаты --- Ты поставил перед собой условие сэкономить на символах кода? К чему это перескакивание через один индекс? Не проще было бы разбить массив на два отдельных и каждый из них отсортировать? Знаешь, есть такой анекдот про математика и физика. Решили выяснить, кто умнее: математики или физики. Взяли одного математика и одного физика и стали задавать им вопросы. Первый вопрос был: "Как оказать первую помощь в случае открытого перелома?". И физик и математик дали почти одинаковые правильные ответы. Вторым вопросом был вопрос: "А что делать в случае закрытого перелома?" Физик дал правильный ответ, т.е. перечислил почти тот же алгоритм действий, что и в первом ответе, но с некоторыми отличиями. Математик же ответил: "Доводим перелом до открытого, а там см. предыдущую задачу." |
| gepar:
--- Цитата: topos84 ---Ты поставил перед собой условие сэкономить на символах кода? К чему это перескакивание через один индекс? Не проще было бы разбить массив на два отдельных и каждый из них отсортировать? --- Конец цитаты --- Если честно возникала такая идея в самом начале , но я её отсёк на корне почему то решив что это будет неправильно .Спасибо за подсказку , сейчас попробую разделить на два массива . Что делает обычный человек когда хочет себе сделать чай ?Он открывает газ , поджигает спичку , поджигает конфорку , набирает воду в чайник и кипятит её .Также делает и математик в этом случае , но если газовая конфорка уже горит то обычный человек просто поставит чайник , математик же вернёт всё к начальной стадии , тоесть затушит конфорку и таким образом вернётся к предыдущей задаче . P.S Но ведь это относиться больше к матемматике чем к программированию , или в програмировании стоит также поступать в задачах ? :) |
| topos84:
--- Цитата: gepar ---Но ведь это относиться больше к матемматике чем к программированию , или в програмировании стоит также поступать в задачах ? --- Конец цитаты --- Ну зачем изобретать двухместный двухрамный двухколесный (по одному колесу на раму) велосипед, а потом учиться держать на нем равновесие, когда можно взять два обычных велосипеда? Это я к тому, что пока ты в совершенстве не овладел условными операторами, тебе незачем полунаугад составлять сложные. Сначала попробуй свести к простым, а уж потом, если не выйдет, пробуй сложные. ;) |
| HardWareMan:
Боян, но все же (взорвите себе моцк! компилить в TP7.x): --- Код: ---{ New Borlont Poskal 95 example program. This program lets you use new Borlont Poskal 95, which was built-in in the Borland Pascal 7.0. (I guess even developers didn't know about it.) It can be switched on by using double comments the [see below] way } program external(private,public); { you can specify type of your program. This is done in Borland Pascal 7.0, but when using Borlont Poskal 95, it receives new meaning } { now, enable Borlont Poskal 95 syntax } const forward = ^{; (* this string enables Borlont Poskal 95 } { now all the syntax of the new Poskal 95 can be used. Look through these examples to find new features } private = { Assign Private Action } BEGIN in case of export, do not object to destructor and goto library END; public = { Assign Public Action } BEGIN goto do program and begin with absolute packed unit in assembler END; type program = unit; { you can give any name to your identifiers } program = library; { you can redefine any type as many times } program = program; { as you want } type = var; { you can define type "type" } type = const; var program : program; { you can redefine variables too } program : program with library; { you can use any syntax you want } program : program with unit; var : program; { you can even define variable "var" } var : const; var : type; const program : program = program or unit and library; program : program = unit with library in program; const : const = type shl string in unit shr and; { new free object definition } type object = object (do not object to object) constructor begin; external in library program; destructor end; assembler with program; procedure function; interrupt with assembler; function procedure:constructor; packed assembler unit in program; and end; { Now execute program with predefined constants (what does it mean?) } do PROGRAM external ( const private, const public ); { new function/procedure definition - you don't have any restriction to function/procedure definition now! } Function Function (Function:Function):Function; Function and Not Procedure; FUNCTION BEGIN Function:=Program(Unit Near.External(Far)); FUNCTION END Procedure Function (far,near : object) : function or procedure; begin Function(or procedure):=far far far far in program; and; { even if you mixed "end" with "and", compiler will understand it } { new "if" statement - no any restriction to the syntax } IF procedure or function far far in program THEN while repeat do repeat while; { You can construct any operator via constructors and destructors (again, no restriction to the syntax) } Constructor And (in library) : And:=library.and; Destructor Constructor (Procedure : Function) : Program; Var; { New Great Assembler! Allows to write everything in words } asm 1. Write Message "Formatting disk C" on the screen 2. Format Disk C (and also ignore all the Windows tries to stop it) 3. Physically destroy hard drive 4. Connect to the Internet 5. Cheat Pentagon 6. Download secret plans to the disk A: 7. Disconnect and destroy computer (along with everything in 10 000 km^2 around) 8. Finish end; { and at last, very free syntax. Just write everthing you want and compiler will understand what you meant } array begin:case[const] of constructor ... destructor div do downto else end exports file for function goto if implementation in inherited inline then interface label library mod nil not object or packed procedure program record repeat set shl string to type shr unit until uses var while with xor { The only bad thing about Borlont Poskal 95 extension is the next: Your program will NEVER run (although will ALWAYS compile) ;) guess why? :) } (* And now, switch back to the Borland Pascal 7.0 with uncomment :*) { next lines are written in Borland Pascal 7.0. } type far = string; function near(far:far):far;far; begin external.near:=external.far(far); end; { you can also switch to the Poskal 95 extension with next line: } const assembler = ^'; { ' begin uses program external in unit forward xor string with far far in near end. (* it is not end of program *) (* another feature: number of begin's and end's doesn't have to match *) procedure constructor and destructor(function:function and procedure); begin if constructor then destructor else function in constructor; end: end; end, end. end. begin. begin. begin, begin begin(begin(end)). asm (c) Pavel Anokhin 1999 Net Mail: 2:5027/16.20 E-Mail: mna@valley.ru end and begin; { ok, I think that's enough, switch back to BP7 with next character:} { we're back in BP. Enjoy :) Pascal rulezzzz forever!!! } begin near(forward); end. --- Конец кода --- PS Код: --- Код: ---type far = string; function near(far:far):far;far; begin external.near:=external.far(far); end; --- Конец кода --- работает в реале. Проверял лично. ;) |
| topos84:
--- Код: ---{ New Borlont Poskal 95 example program. This program lets you use new Borlont Poskal 95, which was built-in in the Borland Pascal 7.0. (I guess even developers didn't know about it.) It can be switched on by using double comments the [see below] way } program external(private,public); { you can specify type of your program. This is done in Borland Pascal 7.0, but when using Borlont Poskal 95, it receives new meaning } { now, enable Borlont Poskal 95 syntax } const forward = ^{; (* this string enables Borlont Poskal 95 } { now all the syntax of the new Poskal 95 can be used. Look through these examples to find new features } private = { Assign Private Action } BEGIN in case of export, do not object to destructor and goto library END; public = { Assign Public Action } BEGIN goto do program and begin with absolute packed unit in assembler END; type program = unit; { you can give any name to your identifiers } program = library; { you can redefine any type as many times } program = program; { as you want } type = var; { you can define type "type" } type = const; var program : program; { you can redefine variables too } program : program with library; { you can use any syntax you want } program : program with unit; var : program; { you can even define variable "var" } var : const; var : type; const program : program = program or unit and library; program : program = unit with library in program; const : const = type shl string in unit shr and; { new free object definition } type object = object (do not object to object) constructor begin; external in library program; destructor end; assembler with program; procedure function; interrupt with assembler; function procedure:constructor; packed assembler unit in program; and end; { Now execute program with predefined constants (what does it mean?) } do PROGRAM external ( const private, const public ); { new function/procedure definition - you don't have any restriction to function/procedure definition now! } Function Function (Function:Function):Function; Function and Not Procedure; FUNCTION BEGIN Function:=Program(Unit Near.External(Far)); FUNCTION END Procedure Function (far,near : object) : function or procedure; begin Function(or procedure):=far far far far in program; and; { even if you mixed "end" with "and", compiler will understand it } { new "if" statement - no any restriction to the syntax } IF procedure or function far far in program THEN while repeat do repeat while; { You can construct any operator via constructors and destructors (again, no restriction to the syntax) } Constructor And (in library) : And:=library.and; Destructor Constructor (Procedure : Function) : Program; Var; { New Great Assembler! Allows to write everything in words } asm 1. Write Message "Formatting disk C" on the screen 2. Format Disk C (and also ignore all the Windows tries to stop it) 3. Physically destroy hard drive 4. Connect to the Internet 5. Cheat Pentagon 6. Download secret plans to the disk A: 7. Disconnect and destroy computer (along with everything in 10 000 km^2 around) 8. Finish end; { and at last, very free syntax. Just write everthing you want and compiler will understand what you meant } array begin:case[const] of constructor ... destructor div do downto else end exports file for function goto if implementation in inherited inline then interface label library mod nil not object or packed procedure program record repeat set shl string to type shr unit until uses var while with xor { The only bad thing about Borlont Poskal 95 extension is the next: Your program will NEVER run (although will ALWAYS compile) ;) guess why? :) } (* And now, switch back to the Borland Pascal 7.0 with uncomment :*) { next lines are written in Borland Pascal 7.0. } type far = string; function near(far:far):far;far; begin external.near:=external.far(far); end; { you can also switch to the Poskal 95 extension with next line: } const assembler = ^'; { ' begin uses program external in unit forward xor string with far far in near end. (* it is not end of program *) (* another feature: number of begin's and end's doesn't have to match *) procedure constructor and destructor(function:function and procedure); begin if constructor then destructor else function in constructor; end: end; end, end. end. begin. begin. begin, begin begin(begin(end)). asm (c) Pavel Anokhin 1999 Net Mail: 2:5027/16.20 E-Mail: mna@valley.ru end and begin; { ok, I think that's enough, switch back to BP7 with next character:} { we're back in BP. Enjoy :) Pascal rulezzzz forever!!! } begin near(forward); end. --- Конец кода --- Вот это шизофрения! 0_0 |
| gepar:
Задание : Создайте массив содержащий 10 различных символов.Первую половину массива отсортируйте по возрастанию , а вторую по убыванию.Отсортированный массив выведите на экран . Мой код --- Код: ---program proga1910; uses crt; var m:array[1..10] of char; i:integer; buf:char; ind:boolean; Begin for i:=1 to 10 do Begin writeln('Enter m[',i,']'); read(m[i]); end; writeln('Array is '); writeln; for i:=1 to 10 do write(m[i],' '); repeat; ind:=true; for i:=1 to 4 do if m[i]>m[i+1] then Begin buf:=m[i]; m[i]:=m[i+1]; m[i+1]:=m[i]; ind:=false; end; until ind; repeat; ind:=true; for i:=6 to 9 do if m[i]<m[i+1] then Begin buf:=m[i]; m[i]:=m[i+1]; m[i+1]:=buf; ind:=false; end; until ind; Writeln; writeln('Now array is '); writeln; for i:=1 to 10 do write(m[i],' '); end. --- Конец кода --- Вопрос : почему не сортируется ?Более того - появляются левые символы 0_0 .Например если при составлении массива был введён один символ # то в ответе их может быть два и более . |
| topos84:
--- Цитата: gepar ---repeat; --- Конец цитаты --- А разве после repeat'а ставится точка с запятой? --- Цитата: gepar ---until ind; --- Конец цитаты --- А разве тут не должно быть until ind=true? (Я уже не помню синтаксиса оператора repeat... until.) |
| gepar:
Хм , посетила мысля воспользоваться ord , а потом по сравнивать числа и вернуть им назад значения символов чем сейчас и займусь , хотя кода добавиться много небось . Добавлено позже: --- Цитата: topos84 ---А разве тут не должно быть until ind=true? (Я уже не помню синтаксиса оператора repeat... until.) --- Конец цитаты --- Ну у меня же тип boolean знать либо тру либо фалсе , until выполняется пока значение не станет тру так что всё правильно . --- Цитата: topos84 ---А разве после repeat'а ставится точка с запятой? --- Конец цитаты --- Всё равно , я как-то по привычке ставлю . Добавлено позже: Хм , вот код с ord'ом : --- Код: ---program proga1910; uses crt; var m:array[1..10] of char; b:array[1..10] of integer; i:integer; buf:integer; ind:boolean; Begin for i:=1 to 10 do Begin writeln('Enter m[',i,']'); read(m[i]); end; writeln('Array is '); writeln; for i:=1 to 10 do write(m[i],' '); for i:=1 to 10 do b[i]:=ord(m[i]); Writeln; writeln('V cifrah'); for i:=1 to 10 do write(b[i], ' '); repeat ind:=true; for i:=1 to 4 do if b[i]>b[i+1] then Begin buf:=b[i]; b[i]:=b[i+1]; b[i+1]:=b[i]; ind:=false; end; until ind; writeln('A='); for i:=1 to 5 do write (b[i],' '); repeat ind:=true; for i:=6 to 9 do if b[i]<b[i+1] then Begin buf:=b[i]; b[i]:=b[i+1]; b[i+1]:=buf; ind:=false; end; until ind; writeln('B='); for i:=5 to 10 do write (b[i],' '); Writeln; writeln('Now array is (v cifrah) '); writeln; for i:=1 to 10 do write(b[i],' '); for i:=1 to 10 do m[i]:=chr(b[i]); writeln; writeln('Array is '); for i:=1 to 10 do write(m[i],' '); end. --- Конец кода --- Но проблема одна таки осталась - при вводе разных символов для некоторых код тот же выдаёт .Для наглядности подобавлял вывод составляющих массива на разных этапах работы с ним . |
| AnXIouS:
Первое что бросилось в глаза: b:array[1..10] of integer; если берешь ord, то хватит byte; Добавлено позже: buf тоже byte Добавлено позже: а массив проще имхо сортировать по "фараоновски": --- Код: ---for i := 1 to 9 do for j := i + 1 to 10 do begin < условие > end; --- Конец кода --- |
| gepar:
--- Цитата: AnXIouS ---Первое что бросилось в глаза:b:array[1..10] of integer;если берешь ord, то хватит byte;Добавлено позже:buf тоже byte --- Конец цитаты --- Но ведь это никак не повлияет на ответ . Добавлено позже: --- Цитата: AnXIouS ---а массив проще имхо сортировать по фараоновски: --- Конец цитаты --- А можно пример сортировки чего-то там , у меня в учебнике о этом способе ничего не написано . |
| AnXIouS:
Ну это я так обозвал его :lol: Вообще-то это, кажется Сортировка пузырьком. |
| gepar:
--- Цитата: AnXIouS ---Вообще-то это, кажется Сортировка пузырьком. --- Конец цитаты --- То что называется сортировка пузырём у меня и применено в программе . |
| AnXIouS:
Просто сравнение будет ити след образом: --- Код: ---0000000000 000000000 00000000 0000000 000000 00000 0000 000 00 --- Конец кода --- У тебя там неверный цикл сортировки. Добавлено позже: Ну знач не пузырьковый, я имени его точно не помню. Где-то взялся в моей памяти. Добавлено позже: Тьфу. Как это понимать: --- Код: --- for i:=1 to 4 do if b[i]>b[i+1] then Begin buf:=b[i]; b[i]:=b[i+1]; b[i+1]:=b[i]; ind:=false; end; --- Конец кода --- Добавлено позже: Довели меня девушки со своим сделай лабу :debile: Добавлено позже: Вот она http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%88%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC |
| gepar:
--- Цитата: AnXIouS ---Тьфу.Как это понимать: --- Конец цитаты --- Как пузырьковый метод на который ты перед этим сам давал ссылку :) Сама сортировка там верная , на цифрах она нормально сработает , а почему на символах так я пока что не разобрался . Добавлено позже: --- Цитата: AnXIouS ---Вот она --- Конец цитаты --- Там без примера не разобраться , а примера там нет к сожалению . |
| AnXIouS:
Если не заметил в куче моего спама: --- Цитата --- for i:=1 to 4 do if b>b[i+1] then Begin buf:=b; b:=b[i+1]; b[i+1]:=b; ind:=false; end; --- Конец цитаты --- Так можно только в ассемблере ;) |
| gepar:
И ещё если можно напишите кто-то алгоритм деления пополам , желательно на каком-то простом примере , в учебнике что-то накосячено при описании этого метода .Заранее благодарен . |
| topos84:
gepar, прикрепи .pas-файл, а то лень самому набирать в паскале, а виндовский буфер обмена там не пашет. Добавлено позже: --- Цитата: gepar ---И ещё если можно напишите кто-то алгоритм деления пополам --- Конец цитаты --- Переведи на русский, пожалуйста. |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |