Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» проблемы Turbo Pascal

Автор: STEEL
Дата сообщения: 27.03.2005 13:10
OdesitVadim
Вводим число.
Задаём кол-во битов.
Побитно сдвигаем его влево или вправо.
Автор: OdesitVadim
Дата сообщения: 27.03.2005 13:36
STEEL
в паскале есть такие операции shl shr - сдвиг влево и вправо. Применение

Код:
a:=5 shl 2;
Автор: rail
Дата сообщения: 04.04.2005 14:45
Кто поможет, сыну в школу надо.
Имеется d,m,g -день, месяц, год, надо подсчитать какая дата будет через 100 дней.
Желательно и високосные года как то сюда впереть. Приблизительно понимаю как сделать, но записать не получается. (tp7)

Добавлено:
Во, наваял. уже считает, осталось високос впереть.


Цитата:
program 123;
const{дней в месяце}
dnvm: array [1..12] of integer= (31,28,31,30,31,30,31,31,30,31,30,31);
var d,m,g,i: integer;
begin
read (d,m,g);
writeln (d,' ',m,' ',g,' ');
d:=100+d-dnvm [m];
m:=m+1;
if m>12 then begin
g:=g+1;
m:=m-12;end;
while d>dnvm[m] do begin
d:=d-dnvm [m];
m:=m+1;
if m>12 then begin
g:=g+1;
m:=m-12;
end;end;
write ('+100= ',d,' ',m,' ',g,' ');
end.

Автор: STEEL
Дата сообщения: 24.04.2005 21:28

Код: program MyGraph;
uses Graph;
var
grDriver: Integer;
grMode: Integer;
ErrCode: Integer;
begin
grDriver := Detect;
InitGraph(grDriver, grMode,'');
ErrCode := GraphResult;
if ErrCode = grOk then
begin
OutTextXY(0,0,'Perfected!');
Readln;
end
else
writeln('Graphics error: ', GraphErrorMsg(ErrCode));
end.
Автор: ShIvADeSt
Дата сообщения: 25.04.2005 01:22

Цитата:
InitGraph(grDriver, grMode,'');

Не правильно идет инициальзацтя графики. Причем если драфйевр графики лежит на сетевом диске, то работать графику вообще не удастя заставить (глюк какой то) даже если правильно прописать пути. Если же он лежит локально, то надо либдо драйвер графики бросить в ту же папку, что и сохраненная программа, либо правильно прописать пути к драйверу, я даже не знаю что посоветовать, если программа будет переносится, то там как то можно включить драйвер в саму программу (не помню только как это делается, давно на паскале не программил), либо просто бросить в папку с программой, тогда первый случай удобнее, второй случай (ну я всегда его юзал ) просто считаю так правильнее. И еще я бы не использлвал детект, обычно юзаю VGA и VGAHi как мод.
Автор: STEEL
Дата сообщения: 25.04.2005 10:07
Блин всё равно не догнал, как обойтись без Detect и путь к какому файлу в initgraph указать в моём случае?

Добавлено:
Да что такое,

Код:
program my1;
uses Crt;
const
text: string = 'Hello World!';

var
i: integer;

begin
for i:= 0 to length(text) do
begin
write(text[i]);
delay(1000);
end
end.
Автор: ShIvADeSt
Дата сообщения: 26.04.2005 02:21
STEEL
сделай вот так

Цитата:
program my1;
uses Crt;
const
text: string = 'Hello World!';

var
i: integer;

begin
for i:= 0 to length(text) do
begin
write(text[i]);
delay(1000);
end
readln; //это позволит тебе увидеть содержимое экрана или вот так
readkey; //это просто ожидание нажатия кнопки без курсора ввода
end.


Цитата:
Блин всё равно не догнал, как обойтись без Detect и путь к какому файлу в initgraph указать в моём случае?

Предположим что у тебя паскаль стоит в сл директории c:\Program Files\Tp\ внутри три папки (у меня такие так как у меня просто Турбо Паскаль) bgi, bin,units, тогда это будет выгядеть так

Цитата:
program MyGraph;
uses Graph;
var
grDriver: Integer;
grMode: Integer;
ErrCode: Integer;
begin
grDriver := VGA;
grMode:=VGAHi;
InitGraph(grDriver, grMode,'C:\Progra~1\TP\BGI');
ErrCode := GraphResult;
if ErrCode = grOk then
begin
OutTextXY(0,0,'Perfected!');
Readln; //не знаю будет ли это работать в гр режиме не помню, тестить не хотся
end
else
writeln('Graphics error: ', GraphErrorMsg(ErrCode));
end.

только что протестил все ок.
Автор: STEEL
Дата сообщения: 26.04.2005 09:09
ShIvADeSt
Супер. Графон заработал. А вот текст так и не выводиться. То есть я не вижу эффекта "печатающегося" текста. Вижу сражу же надпись ♀Hello World!
Автор: ShIvADeSt
Дата сообщения: 26.04.2005 09:31
STEEL

Цитата:
То есть я не вижу эффекта "печатающегося" текста. Вижу сражу же надпись ♀Hello World!

попробуй паузу сделать не 1000, а порядка 50000 (на досовских программах там привязано все к процессору и если он быстрый, то ты не увидишь паузы, сам помню на квик ваиске писал и по старинке делал маленькую паузу пришлось сильно увеличить ее по сравнению с первым пнем )

Цитата:
program my1;
uses Crt;
const
text: string = 'Hello World!';

var
i: integer;

begin
for i:= 0 to length(text) do
begin
write(text[i]);
delay(50000);
beep; //точно не знаю но вроде должно работать
end
readln; //это позволит тебе увидеть содержимое экрана или вот так
readkey; //это просто ожидание нажатия кнопки без курсора ввода
end.

Автор: MMaxiMM
Дата сообщения: 26.04.2005 10:23
Насколько я помню:

s: string;

s[0]==length(s)
Тебе цикл не от нуля, а от единицы гнать надо...
Автор: STEEL
Дата сообщения: 27.04.2005 21:29
Дело всё было в задержке. У меня на P4-2.8 пришлось выставлять 50000 и того мала.

Добавлено:

Код:
program summa_chisel;

var
a, b, c, i : integer;

begin
i:= 123;
a:= i div 100;
b:= (i div 10) mod 10;
c:= i mod 10;
writeln(a);
writeln(b);
writeln(c);
readln

end.
Автор: GrayElf
Дата сообщения: 28.04.2005 04:10
STEEL
div - целочисленное деление, mod - остаток от деления.
В твоем примере в а попадает 3-я от начала цифра (если число трехзначное), в b-вторая (123/10=12, 12/10=1, 2 в остатке), и в с - первая с начала (123/10=12, остаток 3)
Автор: kassadz
Дата сообщения: 24.06.2005 17:06
Проблема:
У меня стоит Win2k+sp4
ставлю Turbo Pascal 7.0
при работе в полноэкранном режиме (ALT+Enter), а иногда и в оконном начинаются следующие проблемы:
1) паскаль полностью не отвечает
2) при нажатии на "стрелки" (вверх-вниз, влево-вправо) вместо перемещения подставляются группы цифр 2222 66666 8888... или курсор перепрыгивает на несколько позиций (3-4) в соответствующую сторону.
3) если работаю в графическом режиме, то после запуска приложения не могу из него выйти.
Что делать?
Как заставить работать Паскаль?

Комппьютеры все одинаковы. На некоторых этих проблем практически нет. Все компьютеры имеют всроенную видюху, _ может быть в этом проблема?...
PS дома стоит эта же оперционка - все нормально.
Автор: daMIR
Дата сообщения: 25.06.2005 09:31
Как изменить директорию для открытия в ТР7.1? Т.е. при нажатии "Open" Паскаль открывает директорию ТР7, а мне надо допустим ТР7/prog. Тоже самое и для "save as".
Пробовал через "Change dir", работает только до перезапуска.
И еще вопрос: как в ТР7.1 делать нормально ЕХЕ-файлы? Сейчас я пишу прогу, сохраняю, закрываю TURBO.EXE, открываю TPX.EXE и там прогоняю. Очень неудобно! Работать через трх.ехе неудобно, так как он открывается на часть экрана. Как готовить ехе-ки через TURBO.EXE не выходя из него?
И еще проблема с русскими буквами. Есть ли способ вводить текст на русском НЕ через руссификатор? С руссификатором не работает версия 7.1, и если работать с руссификатором, то в прогах отображаются крякозябли на других машинах (где его нет). Наверняка это как-то можно сделать, ведь сама консоль отображает русские буквы. Надоело писать транслитом!
Автор: ShIvADeSt
Дата сообщения: 26.06.2005 11:41
daMIR

Цитата:
Т.е. при нажатии "Open" Паскаль открывает директорию ТР7, а мне надо допустим ТР7/prog. Тоже самое и для "save as".

В настройках самого паскаля есть директории попробуй там прописать нужную или в свойствах pif файла указать рабочую директорию.

Цитата:
Сейчас я пишу прогу, сохраняю, закрываю TURBO.EXE, открываю TPX.EXE и там прогоняю. Очень неудобно! Работать через трх.ехе неудобно, так как он открывается на часть экрана. Как готовить ехе-ки через TURBO.EXE не выходя из него?

Пункт меню Compile->Destination Memory один раз кликни появится Destination Disk теперь сразу будут создаваться екзешки.

Цитата:
И еще проблема с русскими буквами. Есть ли способ вводить текст на русском НЕ через руссификатор?

ИМХО единственный вариант для всех ДОСовских програм, это использовать русик, просто на другие машины его тоже ставь. И запускай батником вначале русик, потом сам модуль.
Автор: daMIR
Дата сообщения: 08.07.2005 22:23

Цитата:
В настройках самого паскаля есть директории попробуй там прописать нужную или в свойствах pif файла указать рабочую директорию.

Если я правильно понимаю, то это File->Shange dir.. Это все работат, но мой пост выше:
Цитата:
работает только до перезапуска.



Цитата:
ИМХО единственный вариант для всех ДОСовских програм, это использовать русик, просто на другие машины его тоже ставь.

Это не выход, так как я не везде могу ставить русик (друзьям по почте пересылаю, учителю прогу показываю). Жаль...
Автор: daMIR
Дата сообщения: 10.07.2005 15:09
Разъясните, пожалуйста, программу. Задача:
Во входном файле meteo.dat 365 срок, который содержат информацию о среднесуточной температуре всех дней 2003г. Формат каждой из строк следующий: сначала записана дата в виде dd.mm (на запись номера дня и номера месяца в числовом формате отводится строго два символа, день от месяца отделен точкой), затем через пробел записано значение температуры- число со значением плюс или минус, с точностью до 1 цифры после десятичной точки. Данная информация отсортирована по значению температуры, т.е. хронологический порядок нарушен. Требуется написать программу которая рассчитает и выведет на экран следующею информацию:
1) среднегодовую температуру (в отдельной строчке вывода);
2)информацию о месяцах, для которых абсолютная величена разности среднемесячной и среднегодовой температуры не превосходит 5 градусов. Значения для каждого из месяцев, удовлетворяющих этому условию, следует выводить в отдельной строке в виде: номер месяца, значение среднемесячной температуры.
Сама программа:


Цитата:

const
d:array[1..12] of integer = (31,28,31,30,31,30,31,31,30,31,30,31);
var
tm:array[1..12] of real;
i,x:integer;
data:string[5];
ty,t:real;
begin
assign(input,'meteo.dat');
reset(input);
for i:= 1 to 12 do
tm[i]:=0;
ty:=0;
for i:= 1 to 365 do
begin
readln(data,t);
x:=(ord(data[4]-ord('0'))*10+ord(data[5]-ord('0');
tm[x]:=tm[x]+t;
ty:=ty+t;
end;
for i:=1 to 12 do
tm[i]:=tm[i]/d[i];
ty:=ty/365;
writeLn(' ty= ',ty:4:2);
for i:=1 to 12 do
if abs(tm[i]-ty)<5 then
writeLn(i,tm[i]:5:2);
end.


Из моей книжки по Pascal: assign(ф.п,'имя файла'); где ф.п.-файловая переменная. Почему тут написано input (это вроде ввод с клавы). Что такое вообще файловая переменная? reset открывает файл для чтения, а читает дальше в цикле, правильно? Но я не понимаю откуда программа знает что readln(data,t); брать надо из файла, а не ввод с клавы. Что будет если я хочу организовать ввод из клавиатуры? Что за переменная х, для чего ord (если я правильно понял ord возвращает номер ASCI-кодов)?
Можете привести свою программу, но только с объяснениями. Это последнее задание из ЕГЭ по информатике, в этом году собираюсь сдавать, а решения толкового нету.
З.Ы. Тем по Паскалю много, решил не создавать еще, а писать тут.
Автор: YuraH
Дата сообщения: 10.07.2005 15:27
daMIR
Элементарно, Ватсон
Input - это переменная, которая содержит стандартный ввод. Здесь ты просто указываешь, что стандартный ввод будет происходить с файла. Немного нестандартный подход, смею заметить. Что-бы пользоватся вводом с клавы,
просто

var f_input: FILE;
...
Assign(f_input,'meteo.dat')
ReadLn(f_input,data,t)

Для чего ord? Это интересный подход для переконвертации из '23' в 23(строки аскии в число) - если посмотришь таблицу аскии-кодов, увидишь, что код числа совпадает с его значением минус код '0'(нуля). Надеюсь, объяснять почему ...*10+... не надо. х как раз и содержит числовой вариант символьного числа.

Добавлено:

Цитата:
const
DaysInMonth: ARRAY[1..12] OF BYTE= (31,28,31,30,31,30,31,31,30,31,30,31);

var
MonthTemperature, MonthAverageTemperature: ARRAY[1..12] OF REAL;
Date: STRING[5];
f_input: FILE;
YearTemperature, YearAverageTemperature: REAL;
i, Temperature: REAL;
CurrentMonth: BYTE;

FUNCTION GetMonthNumber():BYTE; {Формат массива Date - dd.mm Функция возвращает значение mm}
BEGIN
GetMonthNumber:=(Ord(Date[4]-Ord('0'))*10+Ord(Date[5]-Ord('0');
END;

BEGIN
Assign(f_input,'meteo.dat');
Reset(f_input);
FOR i:= 1 TO 12 DO
MonthTemperature[i]:=0;
YearTemperature:=0;

FOR i:= 1 TO 365 DO
BEGIN
ReadLn(f_input, Date, Temperature);
CurrentMonth:=GetMonthNumber;
MonthTemperature[CurrentMonth]:=MonthTemperature[CurrentMonth]+Temperature;
YearTemperature:=YearTemperature+Temperature;
END;

FOR i:=1 TO 12 DO
MonthAverageTemperature[i]:=MonthTemperature[i]/DaysInMonth[i];
YearAverageTemperature:=YearTemperature/365;

WriteLn(' Year Average Temperature= ',YearAverageTemperature:4:2);
FOR i:=1 TO 12 DO
IF Abs(MonthAverageTemperature[i]-YearAverageTemperature)<5 THEN
WriteLn(i,MonthAverageTemperature[i]:5:2);

END;
Думаю, названия переменных говорят сами за себя... Правда, как можете заметить, массив MonthTemperature и переменная YearTemperature лишние, я их ввел только для наглядности, их можно заменить на MonthAverageTemperature и YearAverageTemperature соответственно.
Автор: daMIR
Дата сообщения: 10.07.2005 16:17
YuraH
f_input это файловая переменная? Ей присвоен тип файловый? Или f это файловая переменная, с типом файл и связана с открытиием? Тогда f_output это закрытие? Почему она переменная и как может изменятся?
И разьясни зачем *10. Правильно ли я понял что х-это дата в числовом варианте? Зачем сначала data[4] а потом data[5]? У нас же дата пишется как: 23.10 не правильно ли брать первые два символа и последние два?
Объясни пожалуйста как прога преобразует например 23.10.
Автор: YuraH
Дата сообщения: 10.07.2005 16:46
daMIR
f_input - это файловая переменная. В принципе, файловая переменая - это число типа WORD, которое идентифицирует какой-то из открытых файлов. Название не имеет значение, просто я так привык. Так как файл у тебя не структурный, то хватит написать тип файла как FILE, ну или на крайняк FILE OF FILE.

Рассмотрим строку dd.mm (две первых буквы) - это значение дня(в даном случае мы считаем средние величины и это значение нам не нужно и мы его не используем). А вот четвертая и пятая буквы(mm) - это значение месяца и оно нам необходимо и как раз его и вычисляет функция GetMonthNumber. Например, строка '23.12' - 23 число, 12-й месяц. Четвертый и пятый символ - '12'. Аскии код символа '0' - 48, '1' - 49, '2' - 50. Получаем:

(49-48)*10+(50-48)=12.

Если бы у нас было 3-значное число, то формула бы имела вид:

(char1-'0')*100+(char2-'0')*10+(char3-'0'), то есть мы выделяем сотни, десятки, единицы и складиваем их.
Автор: daMIR
Дата сообщения: 11.07.2005 18:00
YuraH
Значит х здесь число месяца. Я думал что data[4] это первые 4 буквы
А файловая переменная не указывает что программа делает с файлом? Т.е она всего лишь "признак" файла? А чтение производится Reset-ом? Если бы я отел произволить не только чтение но и запись, я бы написал допустим Save(f_input) (Save это к примеру, точного названия под рукой нету).
И еще вопрос где должен лежать этот входной файл и не надо ли указывать путь к нему? Сейчас забил программу в Паскаль и создал файл meteo.dat и раскидал по всем папкам Паскаля, но программа выводит Error 106: Invalid numeric format на ReadLn.
А с алгоритмом разобрался, спасибо
Автор: YuraH
Дата сообщения: 11.07.2005 18:49
daMIR

Цитата:
где должен лежать этот входной файл
Там же, где и программа.

А насчет ReadLn, то попрабуй такую штуку:
Цитата:
TYPE
FileType = STRING[6];
VAR
f_input: FILE OF FileType;
Date: STRING[6];
i, Temperature: REAL;
TemperatureStr_Real: REAL ABSOLUTE Temperature;
...
ReadLn(f_input, Date, TempertureStr_Real);
А дальше используешь нормально вещественную переменную Temperature.
Проигрыш - один байт в Date(хотя если включено выравнивание по словам, не по текстовым, а по машинным, то никакой разницы). В чем прикол? Тут один и тот же адрес в памяти присваивается двум разным переменным с разными типами(REAL и STRING), что позволяет обойти проблему с несоответствием типов в ReadLn. Теперь компилятор рассматривает входной файл как структурный(STRING) и не подозревает, что сначала мы читаем строку, а потом число.

Есть три способа открыть файл:
1 - Reset: Открывается файл и указатель ставится на первый байт файла
2 - Rewrite: Это не только открытие, но и удаление всего, что в файле(кстати, если файл не существует, т он будет создан).
3 - Append: То же, что и Reset, но указатель ставится на последний байт файла(используется для добавления данных).

Для записи используется Write(f_input,var1,var2,...) или WriteLn(f_input,var1,var2,...)
Автор: daMIR
Дата сообщения: 25.07.2005 15:50
YuraH
Проблема была не в этом. Директория программ по умолчанию- ...ТР7/bin, а программы у меня лежат .../Prog. Как только перенес прогу и файл в ...ТР7/bin все заработало. Но там держать проги неохота, т.к. и так там лежат куча файлов. Как Паскалю указать директорию для программ чтобы он открывал нужный мне путь? Мне кажется это все взаимосвязано. То решение какое ты предложил, работает лишь до перезапуска.
Автор: YuraH
Дата сообщения: 25.07.2005 16:58
daMIR

Цитата:
Как Паскалю указать директорию для программ чтобы он открывал нужный мне путь?
Пиши путь в Assign или вводи с клавы. Например, Assign(f,'c:\досовский_формат_директорий_и_файлов\'+f_name);

Цитата:
работает лишь до перезапуска
А, только теперь увидел, что написал Должно быть
Код: TYPE
DataType = RECORD
Date_: STRING[7];
Tem_: REAL;
END;
VAR
f_input: FILE OF DataType;
Data: DataType;
Date: STRING[6] ABSOLUTE Data.Date_;
Temperature: REAL ABSOLUTE Data.Tem_;
....
Read(f_input, Data);
Автор: OdesitVadim
Дата сообщения: 25.07.2005 19:47
daMIR
В турбопаскаля есть возможность указать каталог, где искать файл. Изменить его можнл с помощью меню File -> Change dir. Но когда твоя прога не будет под отладчиком, то она по умолчанию начнёт искать файл в себя в каталоге.
Автор: GrayElf
Дата сообщения: 26.07.2005 04:09
daMIR

Цитата:
Как Паскалю указать директорию для программ чтобы он открывал нужный мне путь?

В свойствах ярлычка паскаля укажи в качестве рабочей папки нужную тебе - каталог по умолчанию для сохранения/открытия и для файла, который ты подключаешь assign`ом будет именно им
Автор: VictorNik
Дата сообщения: 01.08.2005 23:24
Джентльмены!

А не мелькала в темах библиотека чтения xls файлов от Excel.
Получаю дурные, по размеру, файлы, а надобно только три поля
для анализа статистики. Тачка-фуфло и лучше не будет.
Пока максимальная скорость работы: открыть в excel,
сохранить в *.txt, утилитой на pascal обрабатываю.
Хотелось бы избежать первых двух процессов.
Автор: ShIvADeSt
Дата сообщения: 02.08.2005 01:07
VictorNik
Паскаль вообще не может работать напрямую с Екселем. Так как когда он создавался никто не знал об оном, тебе нужно использовать консоль в Дельфи, если хочешь работать с екселем.
Автор: VictorNik
Дата сообщения: 02.08.2005 10:46
ShlvADeSt
Как бы в курсе. Но задачи мелкие, а библиотека Дельфи большая.
Мне не писать туда, не модифицировать. Только прочитать.
Все равно, потом, работать с командной строки.
Автор: DroN_S
Дата сообщения: 02.08.2005 11:18
VictorNik
Написали же что паскаль не работает с Excel'ем....

Страницы: 1234

Предыдущая тема: Оптимизация парсинга строк в C#


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.