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

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

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Списки, Считать с файла
Rom1k
сообщение 16.05.2007 14:59
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


Считать список с файла(.txt) и вывести его на экран.
в файле дано
Фамилию имя отчество 4 оценки и дополнительный балл(если он есть,тогда занести,если его нет,оставить пустым) и подсчитать средний балл.

Пример работы программы:

Цитата

Иванов Иван Иванович 3 4 3 3 3
Петров Петр Петрович 3 4 4 2
Юрьев Юрий Юрьевич 2 2 3 4


Вот что программа должна выводить на экран:
Цитата

ФИО оценка 1 оценка 2 оценка 3 доп. балл средний балл
Иванов Иван Иванович 3 4 3 3 3.2
Петров Петр Петрович 3 4 4 0 3.25
Юрьев Юрий Юрьевич 2 2 3 0 2.75


вот текст программы.Я думаю,что у меня даже с файла считывает неправильно:

program m1;
Uses CRT;
type
PData = ^TData;
TData = record
fam,imya,otch:string; {Фамилия, имя, отчество}
marks:array[1..3] of integer; {3 оценки}
bal:byte; {Дополнительный балл}
SB:real; {Средний балл}
next:PData;
end;
Var
Head,Tail,P:PData;
i:integer;
N:byte;
nn:byte;
{--------------------------------------------------------------------------}
procedure vvod(var Rec:TData;var n:byte);
var
s:real;{Сумма 3 оценок}
p:integer;{Позиция в строке ввода}
error:integer;{код ошибки при преобраз. строки в число}
f:text;
st:string;
bals:string;{Строки,содерж bal}
Smarks:array[1..3] of string;
Begin
Assign (f,'sot.txt');
reset(f);
s:=0;
p:=pos(' ',st); {Р присваивает позицию пробела}
while not eof (f) do {Пока не конец файла,делаем}
begin
readln(f,st);
rec.fam:=copy(st,1,p-1); {Вырезаем фамилию}
delete(st,1,p);
rec.imya:=copy(st,1,p-1); {Вырезаем имя}
delete(st,1,p);
rec.otch:=copy(st,1,p-1); {Вырезаем отчество}
delete(st,1,p);
for i:=1 to 3 do {От 1ой до 3ей оценки}
begin
Smarks[i]:=copy(st,1,p-1); {Вырезаем оценку}
val(Smarks[i],rec.marks[1],error); {Преобразовываем строку в число}
s:=s+rec.marks[i]; {Накапливаем сумму оценок}
delete(st,1,p); {Удаляем i оценку из строки}
end;
bals:=copy(st,1,p-1);
val(bals,rec.bal,error);
if rec.bal = 0 then {Если дополнительного балла нет}
rec.sb:=s/3
else
rec.sb:=s+rec.bal/4;
n:=n+1;
close(f);
end;{while}
end;{vvod}
{--------------------------------------------------------------------------}
procedure add(var nn:byte);
var
p:PData;
begin
Head:=nil;
Tail:=nil;
new(p);
vvod(p^,nn);
for i:=1 to nn do
begin
if Head=nil then head:=p
else tail^.next:=p;
Tail:=p;
p^.next:=nil;
end;{for}
end;{add}
{--------------------------------------------------------------------------}
procedure prosmotr(var nn:byte);
var
p:pdata;
i,v:byte;
begin
WriteLn('Результат: ');
P:=Head;
While P<>nil do
for v:=1 to nn do
begin
Write(n,') ',P^.fam:3,p^.imya:3,p^.otch:3);
for i:=1 to 3 do
write(p^.marks[i]:3);
writeln(p^.bal:3,' ',p^.SB:4:1);
P:=P^.next;
v:=v+1;
end;{while}
end;{prosm}
{--------------------------------------------------------------------------}
Begin{main}
clrscr;
add(n);
prosmotr(n);
readkey;
END.



 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.05.2007 17:09
Сообщение #2


Гость






Цитата
Я думаю,что у меня даже с файла считывает неправильно:
Парсит строку точно неправильно... Вот так можно поправить твой код, чтобы он нормально работал (это если без переделывания):

    p:=pos(' ',st);
rec.fam:=copy(st,1,p-1);
delete(st,1,p);

p:=pos(' ',st); { позиция пробела должна пересчитываться постоянно, иначе будет бред ... }
rec.imya:=copy(st,1,p-1);
delete(st,1,p);

p:=pos(' ',st);
rec.otch:=copy(st,1,p-1);
delete(st,1,p);
for i:=1 to 4 do { <--- у тебя ж 4 оценки, а не 3 !!! }
begin
p := pos(' ', st);
Smarks[i]:=copy(st,1,p-1);
val(Smarks[i],rec.marks[1],error);
s:=s+rec.marks[i];
delete(st,1,p);
end;
bals:=copy(st,1,p-1);
val(bals,rec.bal,error);
if rec.bal = 0 then
rec.sb:=s/3
else
rec.sb:=s+rec.bal/4;

Но можно и значительно упростить программу, заменив, например,
fam,imya,otch:string;  {Фамилия, имя, отчество}

на
names: array[1 .. 3] of string;

и обработку закинув в цикл...
 К началу страницы 
+ Ответить 
Rom1k
сообщение 16.05.2007 17:23
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


Что-то с файлом не то.Он его не читает.Что я там мог сделать не правильно?!
Да.Насчёт упрощения-хорошая идея,пожалуй так и сделаю.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.05.2007 17:29
Сообщение #4


Гость






Цитата
Что я там мог сделать не правильно?!
blink.gif А зачем ты Close(f) внутрь цикла While засунул?

Добавлено через 3 мин.
Да и вообще, я не понял чего ты хочешь добиться... Если в Vvod читаются ВСЕ данные сразу из файла, то у тебя ничего не выйдет, потому что rec - то может хранить только данные из одной строки... Все-таки придется тебе пересматривать структуру программы полностью...
 К началу страницы 
+ Ответить 
Rom1k
сообщение 16.05.2007 17:37
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


Убрал.А всё равно ничего не выводит.Я думаю не правильно считывает.помоги.Плиз.Оч надо blink.gif

Добавлено через 1 мин.
Цитата

Если в Vvod читаются ВСЕ данные сразу из файла, то у тебя ничего не выйдет, потому что rec - то может хранить только данные из одной строки.

а мне надо его по строкам брать и вырезать.Мне объясняла преподаватель,что надо цикл какой-то делать.Только я не пойму. nea.gif


Прикрепленные файлы
Прикрепленный файл  LLL33.PAS ( 3.9 килобайт ) Кол-во скачиваний: 173
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.05.2007 18:24
Сообщение #6


Гость






Погоди... У тебя задание на списки, так? Тогда набросок программы должен быть таким:

procedure vvod(var f: text; var Rec: TData);
begin
readln(f, st); { <--- читаешь из файла строку }

{ и парсишь ее, заполняешь структуру Rec }
end;

procedure add(var list: PData; var rec: TData);
begin
{ здесь к списку List добавляется еще она запись - Rec }
end;

procedure prosmotr(var list: PData);
begin
{ здесь - печатаешь список list }
end;

{ ну, и основная программа... }
var
f: text;
r: TData;
root: PData;
begin
root := nil; { <--- это - указатель на начало списка }
assign(f, 'имя файла'); reset(f);
while not eof(f) do begin
vvod(f, r); { <--- читаешь данные из файла в структуру ... }
add(list, r); { <--- и добавляешь структуру в список }
end;

prosmotr(list); { <--- распечатываешь содержимое списка }
end.

Попробуй сделать программу сам...
 К началу страницы 
+ Ответить 
Rom1k
сообщение 16.05.2007 18:44
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


щас.попробую.спасибо большое.если что не будет получатся,сюда напишу.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rom1k
сообщение 16.05.2007 19:14
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


Цитата
procedure add(var list: PData; var rec: TData);
begin
{ здесь к списку List добавляется еще она запись - Rec }
end;

что-то вот это я не понимаю blink.gif

Что сдесь list должно делать? или передать ему параметры list:=Rec(p^) или что?!

Сообщение отредактировано: Rom1k - 16.05.2007 19:30
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.05.2007 19:31
Сообщение #9


Гость






Ты же делал нечто подобное... Я, кстати, немного ошибся - надо описывать не только указатель на голову, но и указатель на хвост, и делать так:

procedure add(var list, tail: pdata; var rec: tdata);
var p: PData;
begin
new(p);

if list = nil then list := p
else tail^.next := p;

Tail := p;
p^ := rec;
p^.next := nil;
end; { add }
 К началу страницы 
+ Ответить 
Rom1k
сообщение 16.05.2007 20:11
Сообщение #10


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


а это я понял.тут мы заполняем список.я не понимал просто при чём там rec.это типа передает параметры с rec в list и tail для добавления в список?!

Добавлено через 14 мин.
вот я сделал всё,как Вы сказали.в ответе везде выводит ноль.что тут не правильно?
не пойму(((


Прикрепленные файлы
Прикрепленный файл  RRR.PAS ( 3.1 килобайт ) Кол-во скачиваний: 178
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.05.2007 21:47
Сообщение #11


Гость






Ну, допустим сделал ты ДАЛЕКО не все, что я сказал... Посмотри:
Прикрепленный файл  1_1.pas ( 2.97 килобайт ) Кол-во скачиваний: 346


И реши, кстати, уже наконец, сколько оценок надо обрабатывать у каждого... В условии пишешь одно, в решении - другое, потом начнется, это не так, то не эдак...
 К началу страницы 
+ Ответить 
Rom1k
сообщение 16.05.2007 21:50
Сообщение #12


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


вау...да.3 оценки вводить надо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rom1k
сообщение 16.05.2007 22:41
Сообщение #13


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


Смотрите,когда я ввожу так
Цитата
Петров Петр Петрович 4 5 4 3
Сидоров Василий Васильевич 4 5 4
Юрьев Алексей Юрьевич 4 3 4 2
Иванов Евгений Евгеньевич 5 4 3 2
Питеркин Вячеслав Михайлович 3 3 2


Он мне выводит :
Изображение
Туда он не заносит почему-то оценки.пробовал исправить,всё-равно тоже самое.ЧТо там не так?

Сообщение отредактировано: Rom1k - 16.05.2007 22:44
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.05.2007 23:03
Сообщение #14


Гость






Ты ориентируешься по пробелам, когда читаешь числа из строки, а когда в строке осталось одно число (доп. балла нет), то P становится равным 0, и последняя оценки не читается из строки... Исправляется очень просто:

{ в процедуре Vvod }
...
readln(f,st);
st := st + ' '; { добавляешь к прочитанной из файла строке пробел }
...
 К началу страницы 
+ Ответить 
Rom1k
сообщение 16.05.2007 23:22
Сообщение #15


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


ааа...точно.а я сразу не догадался,спасибо большое!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rom1k
сообщение 17.05.2007 0:22
Сообщение #16


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


аааа....мне ещё дали дополнительное условие.сформировать новый список из тех,чей средний балл больше,либо равен 4.5.

Это т.е надо просто написать

var
tail2,head2:Pdata;
r:TData;
...

if p^.bal >= 4.5 then
add(head2,tail2,r2);


или это делается как-то по-другому?!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.05.2007 0:27
Сообщение #17


Гость






Да, именно так...
 К началу страницы 
+ Ответить 
Rom1k
сообщение 17.05.2007 0:57
Сообщение #18


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


вроде бы всё правильно,но опять он ничего не выводит.снизу прога.потом файл,НА КОТОРОМ ТЕСТИЛ...что там не правильно?(


Прикрепленные файлы
Прикрепленный файл  1_1.PAS ( 3.16 килобайт ) Кол-во скачиваний: 183
Прикрепленный файл  SOT.TXT ( 166 байт ) Кол-во скачиваний: 193
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.05.2007 1:06
Сообщение #19


Гость






var head2, tail2, p: pdata;

...
head2 := nil;
p := head;
while p <> nil do begin
if p^.sb >= 4.5 then add(head2, tail2, p^);
p := p^.next;
end;
prosmotr(head2);
...
 К началу страницы 
+ Ответить 
Rom1k
сообщение 17.05.2007 8:19
Сообщение #20


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


volvo спасибо Вам большое.Вы не представляете,как Вы меня выручили good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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