Re: Изложение вопроса "Сохранение чис. данных в текстовом файле" (Pascal)
От: wildwind Россия  
Дата: 28.11.17 18:25
Оценка: 1 (1) +3
Здравствуйте, _hum_, Вы писали:

__>в каком варианте все-таки лучше излагать вопрос


Рассмотреть оба варианта, показать разницу, плюсы/минусы.

__>Какой подход концептуально более распространенный (хотелось бы дать студентам на примере Паскаля общее представление о наиболее фундаментальных концептах и принципах программирования, которое позволит им легко потом освоить другой императивный язык, а не ориентироваться ан специфику самого языка)?


В языках со строгой типизацией приведение и преобразование типов это достаточно фундаментальные концепции, заслуживающие детального рассмотрения.
Re: Изложение вопроса "Сохранение чис. данных в текстовом файле" (Pascal)
От: siberia2 Россия  
Дата: 29.11.17 07:44
Оценка: +2 :)
Здравствуйте, _hum_, Вы писали:

Явную конвертацию нужно давать. Тем более, что десятичный разделитель может быть разным. Или даже конвертация в римскую запись
Проблема России не в том, что она не может накормить бедных, а в том, что богатые никак не нажрутся
Re: Изложение вопроса "Сохранение чис. данных в текстовом файле" (Pascal)
От: Александр Кузнецов Россия  
Дата: 30.11.17 05:28
Оценка: +3
Здравствуйте, _hum_, Вы писали:

__>Какой подход концептуально более распространенный (хотелось бы дать студентам на примере Паскаля общее представление о наиболее фундаментальных концептах и принципах программирования, которое позволит им легко потом освоить другой императивный язык, а не ориентироваться ан специфику самого языка)?


Во-первых, стоит явно дать понять, что данные на диске хранятся в виде набора байт, и хранение данных в виде текста с необходимостью последующего преобразования — это просто организация файла в формате, удобном для чтения челокеком.

Во-вторых, явно нужно дать чтение с преобразованием, т.к. могут быть разные форматы записи данных, от обычного текста, до необходимости вручную распарсить какой-нибудь XML. Причём здесь желательно показать, что сохранение в файл нужно не только для своей программы, но и для обмена данными. В зависимости от того, что студенты знают, можно им, например, дать задание нагенерировать какой-нибудь набор данных, сохранить в CSV формате, а потом открыть экселем и построить график.

В третьих, да, нужно рассказать о том, что мир не стоит на месте и на большинство типовых операций уже есть 100500 готовых библиотечных функций, которые сразу дают результат в нужном формате. Начиная от конвертации строки в число и заканчивая, опять же, разбором какого-нибудь XML, или вордовского документа.

Я думаю, что так наиболее правильно будет.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Re[2]: Изложение вопроса "Сохранение чис. данных в текстовом файле" (Pascal)
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 02.12.17 08:33
Оценка: +2
Здравствуйте, elmal, Вы писали:

E>А с файлами далее пусть учатся открывать, закрывать, переходить к произвольному индексу, читать в буффер как массив байт и как строку и т.д. Но пусть не смешивают понятие сериализации и файла. Иначе потом хрен отучишь от такого. Тем более, что скорее всего к тому моменту, когда студентов должны учить высокоуровневым концепциям, они скорее всего уже посещать занятия и вообще ходить в институт не будут, а будут выполнять какую черновую работу на фултайме. И большинство так и не научатся нормально программировать в результате, и программирование у них так и будет ассоциироваться с паскалем, массивами и вот такими спагетти.


Такой файловый ввод-вывод это средство примерно того же плана, что сортировки: при низкой практической ценности это мощное дидактическое средство, замены которому до сих пор не придуманы.
Перейти к обобщённой сериализации, имея представление о вводе-выводе, как раз проще. А вот обучать на сериализации невозможно — оно превратится в представление о магическом хранилище где-то в астрале без моральной готовности понимать его проблемы.
The God is real, unless declared integer.
Изложение вопроса "Сохранение чис. данных в текстовом файле" (Pascal)
От: _hum_ Беларусь  
Дата: 28.11.17 17:54
Оценка:
Если речь про 1-ый курс технического ВУЗА и преподавание на Pascаl основ программирования, то в каком варианте все-таки лучше излагать вопрос о сохранении числовых данных (например, данных массива целых чисел) в текстовом файле —
1) с использованием явной конвертацией числовых данных в строковые и обратно, наподобие
  code
begin
 var F:text;
 
 AssignFile(F, 'd:\test_pascal.txt');
 rewrite(F);
  
  var Arr:array [1..10] of integer;
  
  //<...>
  //--- запись
  for var i:=1 to 10 do
  begin
    var S:string := IntToStr(Arr[i]);
    writeln(F, S);
  end;
  
  Close(F);
  //--- чтение 
  Reset(F);
  
  for var i:=1 to 10 do
  begin
    var S:string; 
    readln(F, S);
    Arr[i]:= StrToInt(S);
  end;
end.

2) с автоконвертацией
  code
begin
 var F:text;
 
 AssignFile(F, 'd:\test_pascal.txt');
 rewrite(F);
  
  var Arr:array [1..10] of integer;
  
  //<...>
  //--- запись
  for var i:=1 to 10 do
  begin
    writeln(F, Arr[i]);
  end;
  
  Close(F);
  //--- чтение 
  Reset(F);
  
  for var i:=1 to 10 do
  begin
    readln(F, Arr[i]);
  end;
end.


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

п.с. Кстати, а с++ вариант автоконвертации у потоков ввода-вывода и файловых прописан в стандарте?
Re: Изложение вопроса "Сохранение чис. данных в текстовом файле" (Pascal)
От: Pzz Россия https://github.com/alexpevzner
Дата: 28.11.17 18:58
Оценка:
Здравствуйте, _hum_, Вы писали:

__>Какой подход концептуально более распространенный (хотелось бы дать студентам на примере Паскаля общее представление о наиболее фундаментальных концептах и принципах программирования, которое позволит им легко потом освоить другой императивный язык, а не ориентироваться ан специфику самого языка)?


Не знаю, как там с этим в Паскале, но обычно когда используют какую-нибудь автоконвертацию, то по дороге из программы в текстовый файл особой разницы нет, а вот при чтении файла, если в файле имеются ошибки, то хорошо бы иметь внятную диагностику, а не "ашипка данных при чтении файла xxx.txt". А внятную диагностику трудно получить, не написав свой парсер.

Но если библиотечный парсер вменяем, то почему бы и нет?
Re: Изложение вопроса "Сохранение чис. данных в текстовом файле" (Pascal)
От: elmal  
Дата: 30.11.17 07:31
Оценка:
Здравствуйте, _hum_, Вы писали:

__>Какой подход концептуально более распространенный (хотелось бы дать студентам на примере Паскаля общее представление о наиболее фундаментальных концептах и принципах программирования, которое позволит им легко потом освоить другой императивный язык, а не ориентироваться ан специфику самого языка)?

ИМХО в текущем виде говорить о таких вещах, как сохранение данных в файл именно в таком виде для студентов будет крайне вредно. Ибо они решают низкоуровневую и одновременно узкоспециализированную задачу. Если говорить о концепциях, то распространена такая концепция, как сериализация. Это высокоуровневая концепция. В зависимости от варианта сериализации, есть возхможность сериализации в бинарный формат (у тебя это пункт 1) и в строковый формат (у тебя это пункт 2). Распространены оба варианта. Первый вариант обычно работает быстрее и требует меньше накладных расходов, но формат нечитабелен для человека. Второй вариант соответственно наоборот. Сериализация может делаться в файл, передаваться по сети, может сериализация делаться вообще в памяти для того, чтоб managed код подружить с unmanaged — файл только вариант.

Потому нельзя студентам прививать именно такое понятие, как сохранение в файл. Это тупо низкоуровневая хреновина. Нужно прививать такое понятие, как сериализация, причем универсальная сериализация чего угодно. И отдельно нужно рассматривать работу с файлами. При этом рассматривая такие концепции, как потоки ввода вывода. И возможно такие вещи рассматривать позднее. А для практических задач просто написать или найти (я не знаю, есть ли такое для паскаля) библиотеки поддержки персистентности. С методами что то вроде persist(pathToFile, referenceToElementToPersist) и restore(pathToFile, referenceToElementToPersist). И пусть сразу привыкают к высокоуровневым понятиям и пользоваться библиотеками.

А с файлами далее пусть учатся открывать, закрывать, переходить к произвольному индексу, читать в буффер как массив байт и как строку и т.д. Но пусть не смешивают понятие сериализации и файла. Иначе потом хрен отучишь от такого. Тем более, что скорее всего к тому моменту, когда студентов должны учить высокоуровневым концепциям, они скорее всего уже посещать занятия и вообще ходить в институт не будут, а будут выполнять какую черновую работу на фултайме. И большинство так и не научатся нормально программировать в результате, и программирование у них так и будет ассоциироваться с паскалем, массивами и вот такими спагетти.
Re: Изложение вопроса "Сохранение чис. данных в текстовом файле" (Pascal)
От: AleksandrN Россия  
Дата: 30.11.17 14:37
Оценка:
Здравствуйте, _hum_, Вы писали:

__>Если речь про 1-ый курс технического ВУЗА и преподавание на Pascаl основ программирования, то в каком варианте все-таки лучше излагать вопрос о сохранении числовых данных (например, данных массива целых чисел) в текстовом файле -

__>1) с использованием явной конвертацией числовых данных в строковые и обратно, наподобие
__>2) с автоконвертацией

Когда учился я, в первом семестре был Паскаль, а во втором Си.
На Паскале, использовали file of ... и преобразование в текстовый вид (вроде с автоконвертацией, но сейчас уже не помню), а на Си — и сохранение в бинарном виде и в текстовом.
Думаю, для учебных задач, неплохо было бы студентам сделать самостоятельное преобразование из строки в число и обратно. Но — в отдельной работе, а в этой сосредоточится на работе с файлами и показать разные подходы.

А потом будут для студентов более сложные задачи — сохранить в один файл данные разных типов и чтение этих данных из файла?
Re: Изложение вопроса "Сохранение чис. данных в текстовом файле" (Pascal)
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 02.12.17 08:17
Оценка:
Здравствуйте, _hum_, Вы писали:

__>Если речь про 1-ый курс технического ВУЗА и преподавание на Pascаl основ программирования, то в каком варианте все-таки лучше излагать вопрос о сохранении числовых данных (например, данных массива целых чисел) в текстовом файле -

__>1) с использованием явной конвертацией числовых данных в строковые и обратно
__>2) с автоконвертацией

Оба, но указать общую проблему — в частности, что первый гибче в плане разбора структуры данных в каждой строке, но требует несколько больше ручной работы; второй нормально годится только для формата с принципом "всё разделяется пробелами или переводами строк" и нормально не позволяет, например, вписать поле произвольного текста без эскейпинга.

Пример на ограничения второго — задачку видел недавно — во входных данных поступает описание направленного графа в виде: строчка, в которой вершина "откуда" и список вершин "куда" для этой "откуда"; список заканчивается переводом строки, никакой явной длины у него нет. Для C я показал подход с циклом из getchar() на пропуски и ungetc()+scanf(), когда наткнулся на начало числа. Для Pascal аналога ungetc() не существует, и выбор между преобразованием последовательности цифр в число вручную и чтением строки целиком с последующим разбиением по пробелам.

__>Какой подход концептуально более распространенный (хотелось бы дать студентам на примере Паскаля общее представление о наиболее фундаментальных концептах и принципах программирования, которое позволит им легко потом освоить другой императивный язык, а не ориентироваться ан специфику самого языка)?


Вот тут нельзя ответить, потому что в "большом" реальном мире "более распространённым" является ни первый, ни второй, а другие подходы — бинарные форматы, JSON, XML, и так далее, многие из них откровенно грамматические по конструкции.

Ввод-вывод рассматриваемых тут форматов — частично база, на которой строятся другие методы, частично подходы, которые не масштабируются далее.

__>п.с. Кстати, а с++ вариант автоконвертации у потоков ввода-вывода и файловых прописан в стандарте?


Да. Например, конструкция типа cout << i, где i — целое, форматирует его в текст в соответствии с текущим режимом выходного потока. Аналогично для входного.
The God is real, unless declared integer.
Re[2]: Изложение вопроса "Сохранение чис. данных в текстовом файле" (Pascal)
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 02.12.17 08:21
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Не знаю, как там с этим в Паскале, но обычно когда используют какую-нибудь автоконвертацию, то по дороге из программы в текстовый файл особой разницы нет, а вот при чтении файла, если в файле имеются ошибки, то хорошо бы иметь внятную диагностику, а не "ашипка данных при чтении файла xxx.txt". А внятную диагностику трудно получить, не написав свой парсер.


К своему парсеру тут есть много промежуточных шагов, которые дают вполне удовлетворительный результат. Например, можно прочитать позицию в файле и вывести "ошибка на символе N". Можно, кроме этого, прочитать 10-20 символов до и после и вывести этот кусок текста вокруг. Можно вести подсчёт номера текущей строки. И так далее...

Pzz>Но если библиотечный парсер вменяем, то почему бы и нет?


Он же не строит разбор грамматики, для студентов этого уровня такое ещё совсем рано.
Вначале надо чуть понабивать шишек на вводе из отдельных легкоразличаемых полей.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.