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

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


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

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


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

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


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

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

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

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


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

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

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

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

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


Такой файловый ввод-вывод это средство примерно того же плана, что сортировки: при низкой практической ценности это мощное дидактическое средство, замены которому до сих пор не придуманы.
Перейти к обобщённой сериализации, имея представление о вводе-выводе, как раз проще. А вот обучать на сериализации невозможно — оно превратится в представление о магическом хранилище где-то в астрале без моральной готовности понимать его проблемы.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.