Amigo
Л/р №11
05 November 2005 18:06
Можно ли в 11 лабораторной использовать:
1) массивы
2) строковый тип

zzz
Re: Л/р №11
05 November 2005 18:06
Привет, Amigo!

> Можно ли в 11 лабораторной использовать:
> 1) массивы

Нежелательно (массивы и файлы мы ещё не проходили, а то Вы узнали бы, что "самый маленький файл больше самого большого массива", да и не нужны они в этой задаче вообще!). Впрочем, в предновогодней горячке на 3 балла иногда проходит.

> 2) строковый тип

Нельзя (нарушение стандарта языка!)

Amigo
Re: Л/р №11
05 November 2005 18:06
Валентин Евгеньевич, а в 11 и 12 лабораторной работах ввод данных должен производиться из входного текстового файла?

zzz
Re: Л/р №11
05 November 2005 18:06
> Валентин Евгеньевич, а в 11 и 12 лабораторной работах ввод
> данных должен производиться из входного текстового файла?
>

Да, именно так. В Паскале он называется input и указывается в заголовке программы, если, конечно, нужен.

Amigo
Re: Л/р №11
06 November 2005 12:12
Какое значение надо брать в качестве maxint, если на машине лабораторной оно равно 2 147 483 647, хотя по идее это же MaximumInteger и должно быть равно 32 767???

zzz
Re: Л/р №11
06 November 2005 14:02
Привет, Amigo!
Скоро Вы узнаете (лекции к зачёту № 4), что на лабораторной машине maxint на самом деле равен 9223372036854775807, на телефонах и пылесосах -- 2 147 483 647, а на кухонных процессорах и холодильниках -- всего лишь 32 767!
Вообще, maxint -- это максимальное положительное целое число для аппаратно реализованного целого типа в конкретной системе программирования на Паскале.
Compile
Re: Л/р №11
08 November 2005 19:07
Валентин Евгеньевич, в этой лабе в некоторых задачах требуется обработать числа в тексте,а если исходные данные содержат слова, не являющиеся числами, то что мне делать: выдавать сообщение об ошибке или просто пропустить это слово.
zzz
Re: Л/р №11
08 November 2005 19:07
Привет!
Вообще-то согласно заданию надо диагностировать, но, ввиду большого объёма словесной руды, главное -- добыча радия, т.е. печать итогов поиска по каждой строке входного файла, и, наверное, по всему файлу. Сплошная диагностика интересна только в некоторых заданиях или когда она нетривиальна.
Юрий 08-101
Re: Л/р №11
17 November 2005 16:04
в случае взаимодействия с римскими цифрами, которые по сути являются латинскими литерами, надо подсчитывать комбинации из данных литер отделенные от остального текста пробелом сзади и спереди? или просто вычленять из других слов?
zzz
Re: Л/р №11
17 November 2005 21:09
Юрий 08-101 писал(а):

> в случае взаимодействия с римскими цифрами, которые по сути
> являются латинскими
Заглавными!
> литерами, надо подсчитывать комбинации из
> данных литер отделенные от остального текста пробелом сзади и
> спереди? или просто вычленять из других слов?
Искомые лексемы, конечно же, отдельно стоящие слова!
Надо проверить слова из файла input на принадлежность римскоциферному алфавиту (необходимое условие). Судя по Вашему вопросу, Вы не очень точно представляете размещение слов в текстовом файле. Сзади у слова может быть и конец строки, и конец файла, а спереди -- начало строки (файла)! Чтобы справиться с этой задачей, надо выделить состояния распознающего алгоритма (от q0 до, скажем, q99), составить таблицу и/или диаграмму переходов (a la Тьюринг).

Задача проверки полной синтаксической правильности (числовой интерпретации) римскоциферного слова здесь не ставится, она сложнее. Но на экзамене может возникнуть. Там надо соображать и принимать правильные решения.
Юрий 08-101
Re: Л/р №11
18 November 2005 16:04
>Судя по Вашему вопросу, Вы не очень точно представляете >размещение слов в текстовом файле. Сзади у слова может быть и >конец строки, и конец файла, а спереди -- начало строки (файла)!
это понятно. но каково количество литер, которое может выводиться на экран в терминальном классе по горизонтали?
или тоже надо писать скритпик для их подсчета?
zzz
Re: Л/р №11
18 November 2005 19:07
Юрий 08-101 писал(а):

> >Судя по Вашему вопросу, Вы не очень точно представляете
> >размещение слов в текстовом файле. Сзади у слова может быть и
> >конец строки, и конец файла, а спереди -- начало строки
> (файла)!
> это понятно. но каково количество литер, которое может
> выводиться на экран в терминальном классе по горизонтали?
Элементарно: 14" -- диагональ VT-340 -- египетского треугольника (катеты 3:4), далее несложные выкладки (75 dpi etc.) и Вы получаете 80!
> или тоже надо писать скритпик для их подсчета?
Вы имеете в виду что-то вроде
while not eoln(output) do
begin i:=i+1; write(i mod 10) end ?
Лучше сумейте считать из термкапа.

Re: Л/р №11
18 November 2005 21:09
хорошо. Спасибо
YaQ
Re: Л/р №11
19 November 2005 18:06
Посоветуйте пожалуйста, где можно поподробнее почитать про правила записи чисел в римской системе счисления.
zzz
Re: Л/р №11
19 November 2005 21:09
Кроме [80], п. 4 ничего за 5 минут не нашёл. Обратитесь к проф. Титову В.К. (08-102), он много чего знает!

Re: Л/р №11
20 November 2005 22:10
Извиняюсь за глупый вопрос, но есть проблема, как задать конец файла в windows? соответвенно в цикле:
while not eof
begin while not eoln
Commando
Re: Л/р №11
20 November 2005 23:11
Точно так же - через eof. А уже компилятор позаботится о том, чтобы конец строки распознавался правильно. Такой код должен работать вне зависимости от системы.

Re: Л/р №11
21 November 2005 00:12
Нет, смотри, программа запущена и скомпилирована, работаю с Delphi, теперь, вводим значения, построчно, соответвенно нажимая Enter так вот, как задать конец, мол что всё, больше не вводим, в Unix это соответственно ^D, а в Windows?
Мангуст
Re: Л/р №11
21 November 2005 08:08
Если я не ошибаюсь ^D ^C
В VC++ работает
zzz
Re: Л/р №11
21 November 2005 15:03
Как мне авторитетно сказали, в MS Windows это Ctrl-Z. В UNIX Ctrl-Z имеет совсем другое значение!
Re: Л/р №11
21 November 2005 16:04
Огромное спасибо! Работает...
Re: Л/р №11
21 November 2005 17:05
А использование множеств в данной работе не возбраняеться? Просто для упрощения записи.
Re: Л/р №11
21 November 2005 21:09
Для того чтобы программа читала входящий поток из файла в Unixe как я сегодня узнал можно прописать assign(input,'file') а затем reset(input)
ну или конечно просто перенаправить ввод. Такой вопрос а работает ли это в винде? Я просто не очень уверен по поводу операторов в паскале и к тому же слышал что и в винде из командной строки ввод тоже можно както перенаправлять. Не подскажите как всё это правильно делается?
zzz
Re: Л/р №11
21 November 2005 21:09
Здесь следует отработать обычную технику вложенных if-ов без множеств. Пригодится при программировании на Си, где нет множеств!
zzz
Re: Л/р №11
21 November 2005 21:09
Zelgadis писал(а):

> Для того чтобы программа читала входящий поток из файла в Unixe
> как я сегодня узнал можно
Нельзя (нет в стандарте!).
> прописать assign(input,'file') а
> затем reset(input)
> ну или конечно просто перенаправить ввод.
Да!
> Такой вопрос а
> работает ли это в винде?
В ДОСе работало!
>Я просто не очень уверен по поводу
> операторов в паскале и к тому же слышал что и в винде из
> командной строки ввод тоже можно както перенаправлять. Не
> подскажите как всё это правильно делается?
Старым казачьим способом <>. Там даже конвейеры работали!
Re: Л/р №11
21 November 2005 22:10
пытался прописать именно дословно описанным выше образом, поток ввода из файла, по ни pc ни gpc не скомпилировали. ПишуТ,, что не знают функции assign
Re: Л/р №11
21 November 2005 22:10
Uriy 08-101 писал(а):

> пытался прописать именно дословно описанным выше образом, поток
> ввода из файла, по ни pc ни gpc не скомпилировали. пишу что не
> знают функции assign
Ну не знаю. Если ты про Юникс то седня я доделал прогу на лабе и по крайней мере gpc ничего не сказал pc правда не пробовал. Если же ты имеешь в виду винду то ничего не могу сказать ибо сам ещё не пробовал. Завтра расскажи поподробнее.

zzz писал(а):

>Нельзя (нет в стандарте!).
по крайней мере gpc при запуске без дополнительных ключей ничего мне на assign, reset не говорил но если действительно нельзя то приму к сведению спасибо.
Re: Л/р №11
21 November 2005 23:11
Только что для простого примера написал небольшую прогу тестового назначения компилил free pascal'ем он всё схавал не поперхнувшиь smiling smiley
листинг проги:
Program test(input,output);
var ch : char;
Begin
#assign(input,'test.txt');
#reset(input);
#while not eof do
#begin
##while not eoln do
##begin
###read(ch);
###write(ch);
##end;
##readln;
#end;
end.//изза того что форум не отражал пробелы перд началом строки
поставил решетки
Содержание test.txt:
It's just a test .
Thanks!
Вывел мне:
It's just a test .Thanks!
единственное что плохо так это то что несмотря на поставленный readln прога не перевела строку и написала всё в ряд.
А так всё работает не знаю в чём утебя косяк.
dsh
Re: Л/р №11
21 November 2005 23:11
> Здесь следует отработать обычную технику вложенных if-ов
> без множеств. Пригодится при программировании на Си,
> где нет множеств!

Кроме того рикну предположить, что кострукция if c in ['A'..'Z'] менее эффективна, нежели if (c>='A') and (c<='Z'), т.к. подразумевает создание константы множественного типа и выполнение над ней операции принадлежности.



----
Сошников Д.В.
доцент кафедры Вычислительной математики и программирования МАИ
[www.mailabs.ru]
dsh
Re: Л/р №11
21 November 2005 23:11
> > Нельзя (нет в стандарте!).

> по крайней мере gpc при запуске без дополнительных ключей
> ничего мне на assign, reset не говорил но если действительно
> нельзя то приму к сведению спасибо.

Для проверки соответствия программы стандарту необходимо использовать ключи компиляции --standard-pascal и -pedantic. Учите теорию к зачету №3!



----
Сошников Д.В.
доцент кафедры Вычислительной математики и программирования МАИ
[www.mailabs.ru]
journeys
Re: Л/р №11
22 November 2005 17:05
Здравствуйте!
Уточните, пожалуйста, что понимать под словом "выделить" в 11 лабораторке? Как это должно выглядеть?
journeys
Re: Л/р №11
22 November 2005 18:06
И ещё у меня возник такой вопрос: Как можно работать с числами, если мы читаем текст посимвольно? Разберём это на конкретном примере:

Вот допустим нам надо "напечатать значение пятиричных чисел, не являющихся троичными числами в десятичной системе". Получается, что в типе char мы должны сохранять каждый символ числа, до тех пор пока не увидим пробел, или символ, не входящий в алфавит пятиричной системы счисления. В первом случае нам надо распечатать - все сохранённые символы подряд, и мы увидим на экране число, а во втором же случае необходимо удалить эти значения из памяти - чтобы потом применить тот же алгоритм при обработке следующего слова. Но если нельзя использовать массивы и на длину слов нет никаких ограничений кроме длины строки, то тогда возникает вопрос - сколько же надо таких переменных??? Это неразумно. А как тогда действовать? Применять технику if -ов????? Расписывать всевозможные случаи как в диаграммах Тьюринга???? И сколько будет таких if - ов?? Как никак, Паскаль - язык высокого уровня... Мне непонятен такой подход к решению задачи, подскажите, пожалуйста, как её нужно правильно решать?
Commando
Re: Л/р №11
22 November 2005 18:06
На самом деле для хранения значения той части числа, которая уже считана, достаточно одной переменной типа integer, если использовать вычисление по схеме Горнера при считывании каждой следующей цифры:
...
read(c);
x := x * 5 + (c - '0');
...
тем более что таким способом число можно сразу выводить в десятичном представлении. Такое пройдет только для не очень больших чисел (около 12-13 цифр, наверное, раз числа пятиричные), но, видимо, именно это и имелось в виду.

P.S. Кстати, в прошлогоднем варианте стоит ограничение как раз в 12 цифр smiling smiley
journeys
Re: Л/р №11
22 November 2005 18:06
Извините, может я что-то не понимаю, но каким образом мы можем присвоить тип char типу integer?
Re: Л/р №11
22 November 2005 19:07
Для этого надо сделать так:
a:= ord('9')-ord('0') даст а значение 9, a: integer ^_^.
В_место конкретных чисел можно вставлять и переменные. Например: ord(ch) - ord('0'), где ch: char.
zzz
Re: Л/р №11
22 November 2005 19:07
journeys писал(а):

> Здравствуйте!
> Уточните, пожалуйста, что понимать под словом "выделить"

Отыскивать отдельно стоящие слова и направлять в выходной поток только их.

> в 11 лабораторке? Как это должно выглядеть?
zzz
Re: Л/р №11
22 November 2005 20:08
Zelgadis писал(а):

> Только что для простого примера написал небольшую прогу
> тестового назначения компилил free pascal'ем он всё схавал не
> поперхнувшиь smiling smiley
pc -std iso l11.p это не примет. GNU с соотв. ключом -- тоже. Стандарт Паскаля см. в книжке Йенсен, Вирт или ISO 7185.
> листинг проги:
> Program test(input,output);
> var ch : char;
> Begin
Следующие две строки не нужны, input -- предописанный входной текстовый файл, а сопоставлять ему заранее заготовленный тестовый файл надо переадресацией ввода ./a.out < test.txt
> #assign(input,'test.txt');
> #reset(input);
> #while not eof do
> #begin
> ##while not eoln do
> ##begin
> ###read(ch);
> ###write(ch);
> ##end;
> ##readln;

{Здесь должно быть writeln, если Вы действительно хотите скопировать input в output!}

> #end;
> end.//изза того что форум не отражал пробелы перд началом
> строки
> поставил решетки
> Содержание test.txt:
> It's just a test .
> Thanks!
> Вывел мне:
> It's just a test .Thanks!
> единственное что плохо так это то что несмотря на поставленный
> readln прога не перевела строку и написала

read = писать?

> всё в ряд.

Программа всегда делает не то, что Вы хотели, а то, что Вы написали! Есть readln -- читает с новой строки, нет writeln -- не переходит на новую строку.

> А так всё работает не знаю в чём утебя косяк.
journeys
Re: Л/р №11
22 November 2005 21:09
Спасибо большое!!! Теперь понял как это должно работать и как делать задачку, которая была у меня на зачёте.. Даже жалко, что сам не додумался до такого простого приёма smiling smiley)
Re: Л/р №11
23 November 2005 23:11
zzz писал(а):


> Программа всегда делает не то, что Вы хотели, а то, что Вы
> написали! Есть readln -- читает с новой строки, нет writeln --
> не переходит на новую строку.

Спасибо Валентин Евгеньевич. Действительно не заметил.

Кстати хотел бы задать вопрос когда мы используем (<) текстовый файл как стд. поток ввода для программы мы можем прочитать используя цикл с eof и eoln файл только один раз да? раз мы сдвигаем readln строки то дойдём до последней строки и до конца файла ест-но. А нельзя начать чтение файла сначала? или во время чтения каким нибудь способом вернуться назад? Или это неосуществимо?
Заранее благодарен за ответ.
zzz
Re: Л/р №11
25 November 2005 14:02
Входной поток в связи с особенностями устройств ввода (инерцией электромеханических устройств и т.д.) обычно нельзя прочесть повторно. Обработка должна осуществляться за один проход например потому, что многие приборы-генераторы данных не имеют памяти. Когда мы будем изучать файлы, Вы узнаете, что не грех скопировать input в какой-нибудь внутренний рабочий файл. Но здесь всё это не нужно. Ваша задача -- создать алгоритм, не страдающий излишествами.
Re: Л/р №11
29 November 2005 22:10
Проблема улажена, все работает...
К сожалению, только зарегистрированные пользователи могут писать в этом форуме.

Авторизоваться на форуме