IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Занесение из файла в структуру
сообщение
Сообщение #1


Гость






Задание: Из файла занести в структуру данные о работниках и вывести данные о работниках с максимальной зарплатой.
Вот что я сделал:
Код

uses crt;
const
MaxSize=10;
Type
TDATA=record
name:string[80];
salary:real;
end;
var
  DATA:Array[1..maxsize] of TDATA;
  n,i,readresult:integer;
  maxsalary:real;
  f:text;
Function ReadData(var Rec:TDATA):integer;
Var
  s:string[80];
  p,q:integer;
  salaryS:string[10];
  errorcode:integer;
begin
readln(f,s);
if s='' then begin readdata:=-1; q:=-1; end;
p:=pos('',S);
if p=0 then begin Readdata:=1; q:=1; end
else begin
q:=0;
rec.Name:=copy(S,1,p-1);
salaryS:=copy(s,p+1,length(s)-p+1);
val(salaryS,Rec.Salary,Errorcode);
if errorcode<>0 then readdata:=1 else readdata:=0;
end;
end;



begin


clrscr;
assign(f,'LABA2.txt');
reset(f);
readln(f,n);
for i:=2 to n do begin
readresult:=ReadData(data[i]);
end;
maxsalary:=data[1].salary;
for i:=1 to n do begin
if data[i].salary>maxsalary then maxsalary:=data[i].salary;
end;
writeln('Max salary:',maxsalary,' rur.');
for i:=1 to n do begin
if data[i].salary=maxsalary then
writeln(i,') Familiya: ',data[i].name,'Oklad: ',data[i].salary);
end;
close(f);
readkey;
end.

Файл LABA2.txt вида:
8
Фамилия1 10000
Фамилия2 15000
Фамилия3 9000
Фамилия4 7000
Фамилия5 15000
Фамилия6 10000
Фамилия7 5000
Фамилия8 13000

Проблема в том что программа не может получить данные из файла. Используя режим просмотра стека я выяснил, что файл нормально открывается для чтения, но данные из этого файла не передаются в структуру.
Заранее благодарен за любую помощь или советы! unsure.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






У тебя в программе не хватает ОДНОГО пробела !!! smile.gif
Function ReadData(var Rec:TDATA):integer;
...
begin
  readln(f,s);
  if s='' then begin readdata:=-1; q:=-1; end;
  p:=pos(' ',S); { <--- Здесь ошибка !!! }
...
end;


Добавь его, и все будет работать... yes2.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Спасибо огромное за помощь =)
Можно я задам еще несколько вопросов чтобы не плодить топики?:
- Как сделать чтобы выводились например первые 5 знаков? (Например чтобы было не 15000...000Е+04, а 15000).
- На сколько мне известно аски коды заглавных и строчных русских сумволов с а по п различаются на 32(?), а с р по я на 87(?). Какими функциями переводить из аски кодов туда и обратно? Какой промежуток аски кодов русских букв и идут ли они подряд?
- Работают ли в Паскале относительные пути? Мне необходимо следующее:
1. Вводить имя файла без расширения.
2. Формировать путь к файлу.
Т.к. заранее сказано что файл текстовый, то сделать первое понятно как. А вот со вторым возникают некоторые сложности. Можно каким-нибудь способом получить имя текущей папки? Я хочу используя относительные пути( /../ и /./ ) через цикл получать имена папок до того как я наткнусь на корень. И дописывать их с конца в строчную переменную.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата(Гость @ 8.03.2006 17:42)
- Как сделать чтобы выводились например первые 5 знаков? (Например чтобы было не 15000...000Е+04, а 15000).
Ну, например, так:
writeln(i,') Familiya: ', data[i].name, ' Oklad: ', data[i].salary:0:0);


Цитата(Гость @ 8.03.2006 17:42)
Какими функциями переводить из аски кодов туда и обратно?

FAQ: Модуль для работы со строками
смотри реализацию
Function StrLower(s: String): String;
Function StrUpper(s: String): String;


Цитата(Гость @ 8.03.2006 17:42)
Какой промежуток аски кодов русских букв и идут ли они подряд?
Нет. Между 'п' и 'р' есть разрыв...

Цитата(Гость @ 8.03.2006 17:42)
Можно каким-нибудь способом получить имя текущей папки?
Легко:
Uses Dos;
var
  _Dir: dirstr;
  _Name: namestr;
  _Ext: extstr;
begin
  fsplit(paramstr(0), _Dir, _Name, _Ext);
  writeln(_dir);
end.


Цитата(Гость @ 8.03.2006 17:42)
Я хочу используя относительные пути( /../ и /./ ) через цикл получать имена папок до того как я наткнусь на корень. И дописывать их с конца в строчную переменную.
Ты расскажи, ДЛЯ ЧЕГО это тебе понадобилось? Вообще-то есть и ChDir тоже, в принципе должно работать, но может быть есть более красивый способ, для этого надо знать цель...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Спасибо за помощь. Для меня это имеет прямую практическую ценность. Меня из инста отчислят если я не сделаю все лабы yes2.gif Это будет не прикладная программа.
Программа должна выполнять следующие функции:
1. Вводить имя файла без расширения.
2. Формировать путь к файлу.
3. Проверять правильность открытия файла
4. Читать данные из текстового файла.
5. Проверять прочитанные данные и исправлять ошибки в них.
6. Записывать исправленные данные в новый файл.
7. Выводить на экран информацию:
• о разработчике программы;
• задание на лабораторную работу;
• запрос на ввод имени файла;
• исправленные данные.
Программа нужна для обучения основам работы со списками и файлами. =))
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.04.2025 15:03
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name