Файлы

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

20 мар 2007, 12:04

Не перестаю поражаться, как преподаватели дают студентам задачи, полностью убивающие программерский стиль мышления! Хорошо еще если в стиле: "Дан гвоздь, надо забить его в стену. Можете воспользоваться микроскопом", а то зачастую "Даны гвоздь и микроскоп, забейте в стену одно с помощью другого"!
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

20 мар 2007, 12:57

Хыиуду писал(а):Не перестаю поражаться, как преподаватели дают студентам задачи, полностью убивающие программерский стиль мышления! Хорошо еще если в стиле: "Дан гвоздь, надо забить его в стену. Можете воспользоваться микроскопом", а то зачастую "Даны гвоздь и микроскоп, забейте в стену одно с помощью другого"!
Не уверен, что это корректное сравнение.
А как еще продемонстрировать использование (закрепить на практике) типированных файлов? Дается задание с указанием применить "изучаемый материал" (т.е. в данном случае - типированных файлов).
Еще раз: не путайте учебную задачу (программу) с практической.

Для сравнения. Существуют шахматные задачи. Ну, типа, "белые начинают и выигрывают", "белые начинают и дают мат в два хода". Так вот, во многих задач расстановка фигур такова, что она вообще вряд ли когда-нибудь возникнет в реальной партии.
Далее, сущеcтвует род шахматных задач "кооперативный мат". Т.е. когда и черные, и белые играют "на одну руку". Чего в реальной партии уж точно не бывает. И, тем не менее, подобные задачи составляются и их решают. И никто не говорит "Ну что за идиот такую задачу поставил, ведь в жизни такого не бывает!"
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

20 мар 2007, 14:14

Ну тогда сделали бы file of record: name:string;phone:longint; end;, уже было бы логичнее и практичнее. А то с помощью двух пользовательских типов записать в файл текст-константу - имхо, не очень помогает обучению программированию. У меня после этого возник бы закономерный вопрос: "А зачем в этой программе эти два пользовательских типа?"
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

20 мар 2007, 14:34

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

20 мар 2007, 15:48

Ну, свалил все в одну строку я, люблю иногда емкость кода в ущерб читаемости сделать ;) А вот насчет всего остального - куда-то мы ушли в сторону киевских дядек и заросших бузиной огородов.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
Колядин Максим
Сообщения: 285
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

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.
После просмотра этого сайта, у меня сложилось впечатление, что преподаватель автора хотел объяснить ему, что такое лабелы, и в качестве примера давал ему задачи, где они совершенно не уместны! И вот результат... - они всегда и везде!!! Так что, я всеми этими фактами хочу поддержать мнение Хыиуды (надеюсь, это существительное склоняется-) ;) , а именно, предложение о том, что преподаватели своими "тупыми" примерами использования, в данном случае типов, убивают программерский стиль мышления.
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

21 мар 2007, 10:54

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

21 мар 2007, 12:18

Хыиуду писал(а): ... У нас многие преподаватели вообще требовали обходиться без меток именно потому, что они убивают структурированность программы....
Ага, у нас такое тоже было. И, в принципе, они, конечно, правы (т.е., "метки убивают структурированность"). Хрен сразу найдешь все входы и выходы в/из процедуры :)
Аватара пользователя
Колядин Максим
Сообщения: 285
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

21 мар 2007, 15:04

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

21 мар 2007, 15:55

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

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