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

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

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

 
 Ответить  Открыть новую тему 
> Занесение из файла в структуру
-ZoLToN-
сообщение 8.03.2006 18:20
Сообщение #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
 К началу страницы 
+ Ответить 
volvo
сообщение 8.03.2006 18:26
Сообщение #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
 К началу страницы 
+ Ответить 
Гость
сообщение 8.03.2006 18:42
Сообщение #3


Гость






Спасибо огромное за помощь =)
Можно я задам еще несколько вопросов чтобы не плодить топики?:
- Как сделать чтобы выводились например первые 5 знаков? (Например чтобы было не 15000...000Е+04, а 15000).
- На сколько мне известно аски коды заглавных и строчных русских сумволов с а по п различаются на 32(?), а с р по я на 87(?). Какими функциями переводить из аски кодов туда и обратно? Какой промежуток аски кодов русских букв и идут ли они подряд?
- Работают ли в Паскале относительные пути? Мне необходимо следующее:
1. Вводить имя файла без расширения.
2. Формировать путь к файлу.
Т.к. заранее сказано что файл текстовый, то сделать первое понятно как. А вот со вторым возникают некоторые сложности. Можно каким-нибудь способом получить имя текущей папки? Я хочу используя относительные пути( /../ и /./ ) через цикл получать имена папок до того как я наткнусь на корень. И дописывать их с конца в строчную переменную.
 К началу страницы 
+ Ответить 
volvo
сообщение 8.03.2006 18:59
Сообщение #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 тоже, в принципе должно работать, но может быть есть более красивый способ, для этого надо знать цель...
 К началу страницы 
+ Ответить 
Гость
сообщение 8.03.2006 19:49
Сообщение #5


Гость






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

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

 



- Текстовая версия 21.06.2025 3:38
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"