Файлы

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Файлы

Re: Файлы

Колядин Максим » 27 апр 2007, 17:41

Хыиуду писал(а):Обычно это бывает, когда метка находится в цикле (особенно это относится к циклам с параметром) или в подпрограмме, а goto - вне их.
Если бы... (читай цитированное тобой сообщение дальше)

Re: Файлы

Хыиуду » 27 апр 2007, 11:28

Колядин Максим писал(а): К тому же, не единичный случай, когда компилятор по неизвестной причине выдаёт ошибку, где написано что метка находится вне текущего блока.
Обычно это бывает, когда метка находится в цикле (особенно это относится к циклам с параметром) или в подпрограмме, а goto - вне их.

Re: Файлы

Хыиуду » 22 мар 2007, 09:51

Ну то ассемблер, там вообще все по сути строится на трех операторах Дейкстры (кажется) - присвоении, ветвлении и безусловном переходе. Спасибо хоть там loop есть, и то хлеб. А в языках уровня Паскаля и выше без меток все же лучше обойтись.
Тему, думаю, пора переносить.

Re: Файлы

BBB » 21 мар 2007, 15:55

Колядин Максим писал(а):Вот небольшая статья о вреде использования меток:
_______________________
..................
Безусловный переход можно осуществлять далеко не из каждого места программы. Так, нельзя с помощью этого оператора ... выйти из подпрограммы....
Ну, умельцы-то это делали. При помощи ассемблера сохраняя и востанавливая, так сказать, "образ текущего состояния" (читая - значения регистров :) )
У меня даже исходник еще тех времен имеется :)

UPD. Хотя, конечно, строго говоря, это не оператор goto, это уже пара процедур. Но "логический смысл" их - не что иное, как "длинный goto".

Re: Файлы

Колядин Максим » 21 мар 2007, 15:04

Да, входы и выходы из процедур с и правда не найдёшь... К тому же, не единичный случай, когда компилятор по неизвестной причине выдаёт ошибку, где написано что метка находится вне текущего блока. Решение проблемы – перезагрузка программы или копирование кода в новый документ.
Вот небольшая статья о вреде использования меток:
_______________________
В языке программирования Паскаль, и следовательно в системе программирования Turbo Pascal 7.0 поддерживаются современные методологии
проектирования программ (нисходящее, модульное проектирование, структурное программирование).
Концепция структурного программирования пришла в своё время на
смену линейному программированию, реализованному в таких языках программирования как Бейсик. В настоящее время наиболее применяемой является структурная концепция программирования. В структурном программировании принят естественный порядок выполнения программы: все операторы выполняются последовательно один за другим в том порядке, как они записаны. Для структурированных программ характерны легкость отладки и
корректировка, низкая частота ошибок.
Описанный в данной лабораторной работе безусловный оператор,
строго говоря, просто "запрещён" структурной концепцией как грубо нарушающий её основные принципы, и является "атавизмом" оставшимся как
воспоминание о более примитивном линейном программировании. Система
программирования Turbo Pascal 7.0 обладает достаточно мощными средствами, позволяющими полностью отказаться от применения этого оператора.
Учитывая все описанные выше причины, настоятельно рекомендуется
вообще отказаться от использования оператора безусловного перехода,
или свести его применение к минимуму. Если же вы всё-таки решили применить его в своей программе, то вы должны помнить, что использовать этот оператор следует крайне осторожно. Широкое его применение без особых на то оснований ухудшает понимание логики работы программы. Безусловный переход можно осуществлять далеко не из каждого места программы. Так, нельзя с помощью этого оператора перейти из основной программы в подпрограмму или выйти из подпрограммы, не рекомендуется осуществлять переход внутрь структурированного (составного) оператора, т.к. он может дать неправильный результат, с помощью оператора перехода, расположенного вне условного оператора или оператора цикла, нельзя перейти внутрь этого условного оператора или оператора цикла и т.д.

Re: Файлы

BBB » 21 мар 2007, 12:18

Хыиуду писал(а): ... У нас многие преподаватели вообще требовали обходиться без меток именно потому, что они убивают структурированность программы....
Ага, у нас такое тоже было. И, в принципе, они, конечно, правы (т.е., "метки убивают структурированность"). Хрен сразу найдешь все входы и выходы в/из процедуры :)

Re: Файлы

Хыиуду » 21 мар 2007, 10:54

Колядин Максим, не склоняется ;) В остальном согласен. У нас многие преподаватели вообще требовали обходиться без меток именно потому, что они убивают структурированность программы.
Что касается задачи про степень двойки - тут все можно еще сократить.
repeat
if odd(x) then begin writeln('Не является'); exit;end;
x:=x div 2;
until x=1;
writeln('Является');

Re: Файлы

Колядин Максим » 20 мар 2007, 21:50

BBB писал(а):Не уверен, что это корректное сравнение.
А как еще продемонстрировать использование (закрепить на практике) типированных файлов? Дается задание с указанием применить "изучаемый материал" (т.е. в данном случае - типированных файлов).
Еще раз: не путайте учебную задачу (программу) с практической.
Может быть ты и прав, но в данном случае я на стороне Хыиуду. С фразой "Не перестаю поражаться, как преподаватели дают студентам задачи, полностью убивающие программерский стиль мышления!" - полностью согласен. Наверное, это просто неудачный пример использования типов, - они здесь совсем не нужны. Ну, научит её преподаватель использовать типы к таким задачам - а она и начнёт применять их ко всем "ненуждающимся", тем самым, наполняя код ненужными действиями и затемняя свой разум.
Однажды бывал я на сайте для начинающих программистов и увидел там нечто очень страшное. "Грязные коды"! Здесь самая простая задача полна совсем ненужных переменных, ненужных функций и прочего. Скорее всего, у автора сайта http://www.tpxexe.narod ru был примерно такой же преподаватель, как у Justcle. По его мнению, задача с условием "В строке убрать лишние пробелы" решается так:

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

program z1] of string;
begin
clrscr;
readln(a);
i:=1;
n:=1;
for j:=1 to 100 do
begin
x[j]:=''; s[j]:='';
end;
while i<=length(a) do
begin
if a[1]=' ' then goto 3 else goto 2;
2:if (a[i]=' ') and (a[i+1]<>' ') then n:=n+1;
repeat
x[n]:=x[n]+a[i];
i:=i+1;
if a[i]=' ' then goto 2;
if i>length(a) then goto 4;
until a[i]<>' ';
3:repeat
if a[i]<>' ' then goto 2;
i:=i+1;
if i>length(a) then goto 4;
until a[i]=' ';
end;
4:for j:=1 to n do
for i:=1 to length(x[j]) do
if x[j][i]<>' ' then s[j]:=s[j]+x[j][i];
b:='';
for i:=1 to n do
b:=b+s[i]+' ';
writeln(b);
readkey;
end.
Согласитесь, очень страшный код! И автор сайта здесь не хотел объяснить случаи использования меток - здесь все такие решения. Рассмотрим ещё одну задачу с этого же сайта, под названием "Определить, является ли заданное число степенью двойки?" (ссылка http://www.tpxexe.narod.ru/017.html):

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

program z1;
uses crt;
label 1;
var a,i,k:integer;
begin
writeln('Введите число ');
readln(a);
k:=0; i:=0;
while a>1 do
begin
i:=a mod 2;
a:=a div 2;
if i<>0 then begin k:=1; goto 1; end;
end;
1:if k=0 then writeln('yes!') 
          else 
              writeln('no');
readkey;
end.
{http://www.tpxexe.narod.ru/017.html}
Опять метки! Ведь эту задачу можно было решить гораздо проще:

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

var a,b:integer;
begin
readln(a);
b:=2;
while b<a do b:=b*2;
if b<>a then write('Не является') else write('Является');
readln;
end.
После просмотра этого сайта, у меня сложилось впечатление, что преподаватель автора хотел объяснить ему, что такое лабелы, и в качестве примера давал ему задачи, где они совершенно не уместны! И вот результат... - они всегда и везде!!! Так что, я всеми этими фактами хочу поддержать мнение Хыиуды (надеюсь, это существительное склоняется-) ;) , а именно, предложение о том, что преподаватели своими "тупыми" примерами использования, в данном случае типов, убивают программерский стиль мышления.

Re: Файлы

Хыиуду » 20 мар 2007, 15:48

Ну, свалил все в одну строку я, люблю иногда емкость кода в ущерб читаемости сделать ;) А вот насчет всего остального - куда-то мы ушли в сторону киевских дядек и заросших бузиной огородов.

Re: Файлы

BBB » 20 мар 2007, 14:34

Хыиуду писал(а):Ну тогда сделали бы file of record: name:string;phone:longint; end;, уже было бы логичнее и практичнее.
По-моему, так как раз менее наглядно (менее структурированно). Все свалено "в одну строку". Начинающий только будет путаться и при чтениитакого текста, и при написании.
(Я о НЕобъявлении отдельного типа на record).
Хыиуду писал(а):У меня после этого возник бы закономерный вопрос: "А зачем в этой программе эти два пользовательских типа?"
Для наглядности, стройности и читаемости текста программы.

Вернуться к началу