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

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

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Списки, Считать с файла
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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;

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


Пионер
**

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

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


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


Гость






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

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


Пионер
**

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

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


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

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

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

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


Прикрепленные файлы
Прикрепленный файл  LLL33.PAS ( 3.9 килобайт ) Кол-во скачиваний: 140
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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.

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


Пионер
**

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

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


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


Пионер
**

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

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


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

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

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

Сообщение отредактировано: Rom1k -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 }
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Пионер
**

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

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


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

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


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


Гость






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


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


Пионер
**

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

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


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


Пионер
**

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

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


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


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

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


Гость






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

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


Пионер
**

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

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


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


Пионер
**

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

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


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

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

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

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


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


Гость






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


Пионер
**

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

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


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


Прикрепленные файлы
Прикрепленный файл  1_1.PAS ( 3.16 килобайт ) Кол-во скачиваний: 138
Прикрепленный файл  SOT.TXT ( 166 байт ) Кол-во скачиваний: 138
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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);
...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Пионер
**

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

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


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

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

 





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