Если речь про 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)
Здравствуйте, _hum_, Вы писали:
__>в каком варианте все-таки лучше излагать вопрос
Рассмотреть оба варианта, показать разницу, плюсы/минусы.
__>Какой подход концептуально более распространенный (хотелось бы дать студентам на примере Паскаля общее представление о наиболее фундаментальных концептах и принципах программирования, которое позволит им легко потом освоить другой императивный язык, а не ориентироваться ан специфику самого языка)?
В языках со строгой типизацией приведение и преобразование типов это достаточно фундаментальные концепции, заслуживающие детального рассмотрения.
Re: Изложение вопроса "Сохранение чис. данных в текстовом файле" (Pascal)
Здравствуйте, _hum_, Вы писали:
__>Какой подход концептуально более распространенный (хотелось бы дать студентам на примере Паскаля общее представление о наиболее фундаментальных концептах и принципах программирования, которое позволит им легко потом освоить другой императивный язык, а не ориентироваться ан специфику самого языка)?
Не знаю, как там с этим в Паскале, но обычно когда используют какую-нибудь автоконвертацию, то по дороге из программы в текстовый файл особой разницы нет, а вот при чтении файла, если в файле имеются ошибки, то хорошо бы иметь внятную диагностику, а не "ашипка данных при чтении файла xxx.txt". А внятную диагностику трудно получить, не написав свой парсер.
Но если библиотечный парсер вменяем, то почему бы и нет?
Re: Изложение вопроса "Сохранение чис. данных в текстовом файле" (Pascal)
Здравствуйте, _hum_, Вы писали:
__>Какой подход концептуально более распространенный (хотелось бы дать студентам на примере Паскаля общее представление о наиболее фундаментальных концептах и принципах программирования, которое позволит им легко потом освоить другой императивный язык, а не ориентироваться ан специфику самого языка)?
Во-первых, стоит явно дать понять, что данные на диске хранятся в виде набора байт, и хранение данных в виде текста с необходимостью последующего преобразования — это просто организация файла в формате, удобном для чтения челокеком.
Во-вторых, явно нужно дать чтение с преобразованием, т.к. могут быть разные форматы записи данных, от обычного текста, до необходимости вручную распарсить какой-нибудь XML. Причём здесь желательно показать, что сохранение в файл нужно не только для своей программы, но и для обмена данными. В зависимости от того, что студенты знают, можно им, например, дать задание нагенерировать какой-нибудь набор данных, сохранить в CSV формате, а потом открыть экселем и построить график.
В третьих, да, нужно рассказать о том, что мир не стоит на месте и на большинство типовых операций уже есть 100500 готовых библиотечных функций, которые сразу дают результат в нужном формате. Начиная от конвертации строки в число и заканчивая, опять же, разбором какого-нибудь XML, или вордовского документа.
Я думаю, что так наиболее правильно будет.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Re: Изложение вопроса "Сохранение чис. данных в текстовом файле" (Pascal)
Здравствуйте, _hum_, Вы писали:
__>Какой подход концептуально более распространенный (хотелось бы дать студентам на примере Паскаля общее представление о наиболее фундаментальных концептах и принципах программирования, которое позволит им легко потом освоить другой императивный язык, а не ориентироваться ан специфику самого языка)?
ИМХО в текущем виде говорить о таких вещах, как сохранение данных в файл именно в таком виде для студентов будет крайне вредно. Ибо они решают низкоуровневую и одновременно узкоспециализированную задачу. Если говорить о концепциях, то распространена такая концепция, как сериализация. Это высокоуровневая концепция. В зависимости от варианта сериализации, есть возхможность сериализации в бинарный формат (у тебя это пункт 1) и в строковый формат (у тебя это пункт 2). Распространены оба варианта. Первый вариант обычно работает быстрее и требует меньше накладных расходов, но формат нечитабелен для человека. Второй вариант соответственно наоборот. Сериализация может делаться в файл, передаваться по сети, может сериализация делаться вообще в памяти для того, чтоб managed код подружить с unmanaged — файл только вариант.
Потому нельзя студентам прививать именно такое понятие, как сохранение в файл. Это тупо низкоуровневая хреновина. Нужно прививать такое понятие, как сериализация, причем универсальная сериализация чего угодно. И отдельно нужно рассматривать работу с файлами. При этом рассматривая такие концепции, как потоки ввода вывода. И возможно такие вещи рассматривать позднее. А для практических задач просто написать или найти (я не знаю, есть ли такое для паскаля) библиотеки поддержки персистентности. С методами что то вроде persist(pathToFile, referenceToElementToPersist) и restore(pathToFile, referenceToElementToPersist). И пусть сразу привыкают к высокоуровневым понятиям и пользоваться библиотеками.
А с файлами далее пусть учатся открывать, закрывать, переходить к произвольному индексу, читать в буффер как массив байт и как строку и т.д. Но пусть не смешивают понятие сериализации и файла. Иначе потом хрен отучишь от такого. Тем более, что скорее всего к тому моменту, когда студентов должны учить высокоуровневым концепциям, они скорее всего уже посещать занятия и вообще ходить в институт не будут, а будут выполнять какую черновую работу на фултайме. И большинство так и не научатся нормально программировать в результате, и программирование у них так и будет ассоциироваться с паскалем, массивами и вот такими спагетти.
Re: Изложение вопроса "Сохранение чис. данных в текстовом файле" (Pascal)
Здравствуйте, _hum_, Вы писали:
__>Если речь про 1-ый курс технического ВУЗА и преподавание на Pascаl основ программирования, то в каком варианте все-таки лучше излагать вопрос о сохранении числовых данных (например, данных массива целых чисел) в текстовом файле - __>1) с использованием явной конвертацией числовых данных в строковые и обратно, наподобие __>2) с автоконвертацией
Когда учился я, в первом семестре был Паскаль, а во втором Си.
На Паскале, использовали file of ... и преобразование в текстовый вид (вроде с автоконвертацией, но сейчас уже не помню), а на Си — и сохранение в бинарном виде и в текстовом.
Думаю, для учебных задач, неплохо было бы студентам сделать самостоятельное преобразование из строки в число и обратно. Но — в отдельной работе, а в этой сосредоточится на работе с файлами и показать разные подходы.
А потом будут для студентов более сложные задачи — сохранить в один файл данные разных типов и чтение этих данных из файла?
Re: Изложение вопроса "Сохранение чис. данных в текстовом файле" (Pascal)
Здравствуйте, _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)
Здравствуйте, Pzz, Вы писали:
Pzz>Не знаю, как там с этим в Паскале, но обычно когда используют какую-нибудь автоконвертацию, то по дороге из программы в текстовый файл особой разницы нет, а вот при чтении файла, если в файле имеются ошибки, то хорошо бы иметь внятную диагностику, а не "ашипка данных при чтении файла xxx.txt". А внятную диагностику трудно получить, не написав свой парсер.
К своему парсеру тут есть много промежуточных шагов, которые дают вполне удовлетворительный результат. Например, можно прочитать позицию в файле и вывести "ошибка на символе N". Можно, кроме этого, прочитать 10-20 символов до и после и вывести этот кусок текста вокруг. Можно вести подсчёт номера текущей строки. И так далее...
Pzz>Но если библиотечный парсер вменяем, то почему бы и нет?
Он же не строит разбор грамматики, для студентов этого уровня такое ещё совсем рано.
Вначале надо чуть понабивать шишек на вводе из отдельных легкоразличаемых полей.
The God is real, unless declared integer.
Re[2]: Изложение вопроса "Сохранение чис. данных в текстовом файле" (Pascal)
Здравствуйте, elmal, Вы писали:
E>А с файлами далее пусть учатся открывать, закрывать, переходить к произвольному индексу, читать в буффер как массив байт и как строку и т.д. Но пусть не смешивают понятие сериализации и файла. Иначе потом хрен отучишь от такого. Тем более, что скорее всего к тому моменту, когда студентов должны учить высокоуровневым концепциям, они скорее всего уже посещать занятия и вообще ходить в институт не будут, а будут выполнять какую черновую работу на фултайме. И большинство так и не научатся нормально программировать в результате, и программирование у них так и будет ассоциироваться с паскалем, массивами и вот такими спагетти.
Такой файловый ввод-вывод это средство примерно того же плана, что сортировки: при низкой практической ценности это мощное дидактическое средство, замены которому до сих пор не придуманы.
Перейти к обобщённой сериализации, имея представление о вводе-выводе, как раз проще. А вот обучать на сериализации невозможно — оно превратится в представление о магическом хранилище где-то в астрале без моральной готовности понимать его проблемы.