Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 62
1

Создание и корректировка файла, содержащего сведения об абитуриентах

07.10.2016, 22:41. Показов 3255. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Цитата Сообщение от rossetta Посмотреть сообщение
Постановка задачи
Разработать программу создания и корректировки файла, содержащего сведения об абитуриентах, сдавших вступительные экзамены в институт. Каждый элемент этого файла должен содержать следующие данные: фамилию и инициалы абитуриента, специальность, на которую он поступает, полученные оценки по физике, математике и литературе. Предусмотреть создание текстового файла, содержащего информацию об абитуриентах, поступающих на указанную специальность.
Код 322 что означает, кто знает?

Добавлено через 21 минуту
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Program Prog;
Uses
 Classes, SysUtils;
type Zap=record
  fio: string[25];
  spec: string[25];
  ocfiz: string[1];
  ocmatem: string[1];
  ocliter: string[1];
end;
var f: file of string;
fio1: string; 
reg: integer;
q: Zap;
begin
assign(f,'d:\Proga\abitura.dat');
reset(f);
writeln ('Режим ввода – 1; режим корректировки - 2');
read(reg);
if reg=1 then 
begin
{Режим ввода}
Writeln(‘Режим ввода’);
Rewrite(f);
repeat
  writeln ('Фамилия и инициалы ');
  read(q.fio);
  writeln ('Специальность ');
  read (q.spec);
  writeln ('Оценка по физике ');
  read (q.ocfiz);
  writeln ('Оценка по математике ');
  read (q.ocmatem);
  writeln ('Оценка по литературе ');
  read (q.ocliter);
write(f);
until (q.fio<>’***);
end;
{Конец режима ввода}
if reg=2 then do
begin
 {Режим корректировки}
 Writeln(‘Режим корректировки’);
  writeln ('Фамилия и инициалы ');
  read(fio1);
 while ((fio1<>’***) and (not Eof(f))) do
  begin
    read(f);
     if q.fio=fio1 then do
     begin
       writeln(‘Fam ’q.fio,’Spec ’, q.spec,’Fiz ’,q.ocfiz,’Matem ’,q.ocmatem,’Liter ’, q.ocliter);
       write(f);
     end;
   end; {пока не конец файла f & фамилия #***}
end; {Конец режима 2-корректировки}
 
close(f); 
end.
При запуске на выполнение выдает код 322. Что означает, кто знает?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2016, 22:41
Ответы с готовыми решениями:

Создание и корректировка файла, содержащего сведения о студентах.
еще 1 задача: Разработать программу создания и корректировки файла, содержащего сведения о...

Создание и корректировка файла, содержащего сведения о книгах, находящихся в библиотеке
Разработать программу создания и корректировки файла, содержащего сведения о книгах, находящихся в...

Создание текстового файла, содержащего информацию об абитуриентах, поступающих на указанную специальность
Добрый вечер. Помогите пожалуйста написать программу, с файлами не работала никогда. Разработать...

Создание файла, содержащего сведения о машинах на складе, и работа с ним
Задачка 2. Создать файл содержащий сведения о машинах на складе. Каждая запись файла должна...

27
621 / 941 / 150
Регистрация: 10.08.2015
Сообщений: 5,018
09.10.2016, 23:57 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от bormant Посмотреть сообщение
bBase, FoxBase, FoxPro вы, пожалуй, не застали...
застал, они кстати до сих пор кое где работают, артефакты из эпохи дос, там может это было и оправдано...
Цитата Сообщение от rossetta Посмотреть сообщение
не получился только ввод в режиме добавления записей
Тело процедуры должно обрамляться парой begin end; А у вас код посыпался... begin улетел вверх и как это вообще может работать непонятно

по корректировке... суть корректировки в последовательном чтении файла и поиске нужной фамилии:
- если фамилия найдена, то спрашиваем у пользователя новые данные,
- возвращаемся в начало записи и пишем в файл измененный вариант

Добавлено через 20 минут
Цитата Сообщение от bormant Посмотреть сообщение
объясните, как связан ReadLn и слипшиеся пельмени.
Вы давно общались с женщинами? Женщины не воспринимают вопросы типа: "привет, как дела, как настроение, чем занимаешься?" Однако по отдельности заданные те же вопросы не вызовут проблем в разговоре. У программистов все еще хуже... Поэтому запросы в командной строке должны быть понятны, лаконичны, предлагать варианты ответа по умолчанию, если это возможно. В этом плане раздельное чтение данных гораздо более гибкое, чем если слепить ввод в один оператор. А то что оно равноценно с точки зрения программы абсолютно не важно.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,077
Записей в блоге: 1
10.10.2016, 00:03 22
Про алгоритм открытия файла -- слишком сложно.
Прежде всего, в многозадачной среде что-то проверять перед действием бессмысленно -- на момент проверки все могло быть в порядке, но на момент совершения действия уже возникло препятствие и действие все равно завершится ошибкой. Поэтому более предпочтительной стратегией является не проверить предварительно, а выполнить действие и проверить его результат.
Перечень кодов возврата известен: http://www.freepascal.org/docs... esult.html
Безопасно пересоздавать файл по коду 2 -- файл не найден.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Reset(f);
case IOResult of
0: ;
2:
  begin
    Rewrite(f);
    if IOResult<>0 then begin
      WriteLn('Ошибка: не удалось создать файл'); Halt;
    end;
  end;
else
  begin
    WriteLn('Ошибка: не удалось открыть файл'); Halt;
  end;
end;
Но, вероятно, в учебной задаче этого не требуется.

Добавлено через 5 минут
Про пельмени и женщин -- вкусовщина.
Но ваш вариант с раздельным вводом ещё и неэргономичен -- оператору намного проще вбить 3 оценки через пробел и нажать ввод, чем вводить по одной оценке. Тем не менее, ReadLn(a,b,c); где переменные не строковые позволяет вводить хоть по одному, хоть по вводу после каждого.
Признайтесь уже себе самому, вы просто не знаете как работает стандартный паскалевский ввод, в чем только что расписались. Отнеситесь к вопросу с любовью и восполните пробелы.
0
621 / 941 / 150
Регистрация: 10.08.2015
Сообщений: 5,018
10.10.2016, 00:51 23
Цитата Сообщение от bormant Посмотреть сообщение
Тем не менее, ReadLn(a,b,c); где переменные не строковые позволяет вводить хоть по одному, хоть по вводу после каждого.
вот и приехали... а кто вам сказал что нужно вводить не строки? это здесь нужно ввести три числа и все хорошо...
так что не оператору, а это ваши личные предпочтения... когда понадобится вводить несколько десятков значений в строчку, вспомните мои слова, когда запутаетесь и свои про эргономику...
насчет открытия файла, если не забывать подавлять реакции на ошибки и восстанавливать ее, то вариант с постпроверкой конечно предпочтительнее... предпочтительнее было бы организовать файловый ввод/вывод по человечески в самом ядре паскаля... я более чем уверен, что это всего лишь чей-то каприз с этими assign reset rewrite... для сравнения в С все намного проще и именно так как вы написали, но без танцев с бубном.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,077
Записей в блоге: 1
10.10.2016, 08:57 24
vlisp,
Про не-строки в отношении оценок сказано в ответе #6 Создание и корректировка файла, содержащего сведения об абитуриентах
Pascal
1
2
3
4
5
6
type
Zap=record
 fio: string[25];
 spec: string[25];
 ocfiz, ocmatem, ocliter: 1..5;
end;
Когда будет несколько десятков значений, тогда будет решение для нескольких десятков значений, а не для 3-х.
А про разницу Read и ReadLn все же перечитайте и разберитесь, не упустите, что ReadLn игнорирует часть вводимых данных.
В С хватает своих заморочек, но здесь мы их обсуждать не будем, для этого на форуме есть специальные тематические разделы. Как в С интерфейс с FILE не единственный, так и в FPC есть другие средства для файлового ввода/вывода. Но поскольку ТС их не использует, обсуждать их в этой теме было бы офтопиком.

К сожалению, предмет обсуждения по теме далеко не исчерпан, у ТС пока не получилось написать то, что можно сдать с удовлетворительной оценкой (имеют место грубые логические ошибки). Обсуждать стоит именно это.
0
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 62
10.10.2016, 11:04  [ТС] 25
Кстати, вставила fileMode:=2; и все пошло без выкручиваний, и перезапись возможна, выложу конечный результат, когда все будет готово.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,077
Записей в блоге: 1
10.10.2016, 11:50 26
FileMode по умолчанию и так 2, если его не трогать:
http://www.freepascal.org/docs... emode.html
Pascal
1
2
3
begin
  WriteLn(FileMode);
end.
0
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 62
10.10.2016, 12:41  [ТС] 27
Оказалось, нет, я его не трогала, но дозапись и перезапись не шла, а поставила FileMode:=2; и все пошло. У меня Borland Pascal, если это имеет значение. И похоже у многих ошибки вывода записи связаны с этим.
Вот конечный результат:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
Program Prog;
type 
Zap=record
  fio: string[25];
  spec: string[25];
  ocfiz, ocmatem, ocliter: 1..5;
end;
var f,f1: file of Zap;
f2: text;
fio1,spec1: string[25]; 
q2: string;
reg, vv: integer;
q: Zap;
usl: boolean;
begin
 
procedure Vvod;
begin
{Режим ввода}
Writeln(‘Режим ввода’);
Writeln(‘Ввод с нуля – 0 или добавление - 1);
readln(regv);
if regv=0 then rewrite(f)
              else if regv = 1 then begin reset(f); seek(f,fileSize(f)); end
                                     else begin writeln(‘Неверный режим’); exit; end;
Usl:=true;
While usl do
  begin
  readln;  
  writeln (‘Фамилия и инициалы ‘);
  readln(q.fio);
  if q.fio<>’***then 
  begin
   writeln (‘Специальность ‘);
   readln (q.spec);
   writeln (‘Оценка по физике ‘);
   readln (q.ocfiz);
   writeln (‘Оценка по математике ‘);
   readln (q.ocmatem);
   writeln (‘Оценка по литературе ‘');
   readln (q.ocliter);
   writeln(q.fio,q.spec,q.ocfiz,q.ocmatem,q.ocliter);
   write(f,q);
   vv:=vv+1;  {подсчет числа записанных записей}
 end else usl:=false;
end;
writeln(‘число записей-’,vv);
end; {Конец процедуры Vvod режима ввода 1}
 
procedure Korr; {Режим корректировки}
begin
 Writeln(‘Режим корректировки 2’);
 Usl:=true;
 Reset(f);
 While usl do
  Begin
   Readln;
   writeln (‘Фамилия и инициалы ‘);
   readln(fio1);
   if fio1=’***’ then usl:=false;
   while ((fio1<>’***’) and (not Eof(f))) do
     begin
       read(f,q);
        if q.fio=fio1 then 
        begin
             writeln(‘Фамилия ИО ’,q.fio);
             readln(q.fio);
             writeln(’Spec ’, q.spec);
             readln(q.spec);
             writeln(’Spec ’, q. ocfiz);
             readln(q.ocfiz);
             writeln(’Spec ’, q.ocmatem);
             readln(q.matem);
             writeln(’Spec ’, q.ocliter);
             readln(q.ocliter);
             vv:=vv+1; 
             writeln(‘korr ’,q.fio,q.spec,q.ocfiz,q.ocmatem,q.ocliter);
            seek(f,filePos(f)-1);
            write(f,q);
            vv:=vv+1;
            writeln(‘vv-’,vv);
            break;
          end else;
         writeln(q.fio,q.spec,q.ocfiz,q.ocmatem,q.ocliter);
        end; {пока не конец файла f & фамилия #***} 
   if eof(f)=true then begin usl:=false; writeln(‘Конец файла’); end;
 end; {цикл while usl}
end; {Конец режима 2-корректировки proc Korr}
 
procedure Vivod; {Режим 3 – вывод абитуриентов по спец-ти}
begin
 reset(f);
seek(f,0);
 assign(f2,’d:\Proga\abitura2.txt’);
 rewrite(f2); 
 readln;
 writeln(‘Режим вывода абитуриентов по спец-ти’);
 writeln(‘Введите специальность ’);
 readln(spec1);
 while not eof(f) do begin
   read(f,q);
     if q.spec=spec1 then begin
      writeln(f2,q.fio,q.spec,q.ocfiz,q.ocmatem,q.ocliter); {вывод в файл}
      writeln(q.fio,q.spec,q.ocfiz,q.ocmatem,q.ocliter);      {вывод на печать}
      vv:=vv+1; end; 
 end;
close(f2); 
end; {regim 3 proc Vivod}
 
begin
fileMode:=2;
us:=true;
assign(f,’d:\Proga\abitura.dat’);
while us do 
begin
  writeln (‘Режим ввода – 1; режим корректировки – 2, Вывод ФИО по спец-ти - 3’);
  vv:=0;
  read(reg); 
  if reg=1 then begin Vvod; us:=false; end else
  if reg=2 then begin Korr; us:=false; end else 
  if reg=3 then begin Vivod; us:=false; end else
  writeln(‘Неверный режим’); 
end;
close(f);
writeln(‘Конец программы, число записей -’,vv);
end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,077
Записей в блоге: 1
10.10.2016, 16:24 28
Чтобы не перепечатывать программу руками на форум, возьмите какой-либо редактор, который умеет открывать/сохранять текст в различных кодировках, например, AkelPad, или EmEditor, или еще какой-нибудь.
Откройте свою программу в нем, указав кодировку "OEM 866" или "Кириллица DOS" или что-то наподобие. Теперь можете свободно скопировать текст программы как есть. Можете даже править программу в этом редакторе, если это покажется удобнее.

То, что сейчас помещено на форум, содержит синтаксические ошибки, препятствующие компиляции:
1 - ‘ и ’ вместо апострофов,
2 - begin перед function Vvod,
3 - использование неописанных переменных (regv, us),
4 - использование неописанного поля (q.matem).

Это спишем на опечатки, все равно подобное компилятор просто не пропустит.

Форматирование, конечно, штука необязательная (машина железная ей все равно), но сильно облегчающая чтение кода человеку. Хорошо бы взять за правило писать код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете :-) А вот это уже не только про форматирование.

Основная программа
1. Использование глобальных переменных должно быть осмысленным, иначе это может быть дополнительно причиной ошибок. Желательно не описывать переменные раньше, чем они должны быть видны в последующем коде.

2. Для
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
usl:=true;
while usl do 
begin
  writeln ('Режим ввода – 1; режим корректировки – 2, Вывод ФИО по спец-ти - 3');
  vv:=0;
  read(reg); 
  if reg=1 then begin
    Vvod; usl:=false; 
  end else if reg=2 then begin
    Korr; usl:=false;
  end else if reg=3 then begin
    Vivod; usl:=false;
  end else
    writeln('Неверный режим'); 
end;

есть более удобное решение. Достаточно заметить, что usl используется только чтобы отклонить выбор кроме 1, 2, 3, и ни для чего больше. Почему бы просто не проконтролировать ввод, получив отдельно ввод, отдельно логику исполнения:
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  repeat
    WriteLn('1 - ввод,  2 - корректировка,  3 - список по специальности,  0 - выход');
    {$I-}
    ReadLn(reg);
    {$I+}
    if (IOResult=0) and (reg in [0..3]) then Break
    else WriteLn('*** Ошибка: неверный режим');
  until False;
  vv:=0;
  case reg of
  1: Vvod;
  2: Korr;
  3: Vivod;
  end;


Процедура Vivod
1. Reset(f) -- в том числе устанавливает указатель файла на начало, после него не нужен Seek(f,0).
В программе закрытие файла присутствует только в самом конце, поэтому на самом деле нужды в Reset(f) нет, достаточно просто переместить указатель в начало по Seek(f,0).

2. Нет нужды делать f2 глобальной, она не используется нигде, кроме этой процедуры. Единственным оправданием глобальности могло быть использование в начале основной программы
Pascal
1
  Assign(f2,'d:\Proga\abitura2.txt');
3. Отдельный ReadLn мог потребоваться из-за того, что где-то раньше при вводе был Read без завершающего ReadLn; вот туда его и надо переместить.

4. Присутствуют 2 дублирующие строки WriteLn: экран/файл.
Неплохо бы привести вывод в порядок, выше уже приводил пример форматного вывода табличкой:
Pascal
1
2
3
4
  with q do begin
    WriteLn(    fio,'':25-Length(fio), spec,'':25-Length(spec), ocFiz:6, ocMatem:6, ocLiter:6);
    WriteLn(f2, fio,'':25-Length(fio), spec,'':25-Length(spec), ocFiz:6, ocMatem:6, ocLiter:6);
  end;
Можно было cделать что-то вроде:
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure Vivod;
  procedure Print(var o: Text; const z: Zap);
  begin
    with z do
      WriteLn(o, fio,'':25-Length(fio), spec,'':25-Length(spec), 
        ocFiz:5, ocMatem:5, ocLiter:5);
  end;
begin
  WriteLn('Режим вывода абитуриентов по спец-ти');
  Write('Специальность: ');
  ReadLn(spec1);
  if s='' then Exit;
  Seek(f,0);
  Rewrite(f2);
  while not EoF(f) do begin
    Read(f,q);
    if s=q.spec then begin
      Print(output,q);
      Print(f2,q)
    end;
  end;
  Close(f2);
end;
или
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure Vivod;
  procedure Report(var o: Text; const s: String);
  begin
    Seek(f,0);
    while not EoF(f) do with q do begin
      Read(f,q);
      if s=spec then
        WriteLn(o, fio,'':25-Length(fio), spec,'':25-Length(spec), ocFiz:5, ocMatem:5, ocLiter:5);
    end;
  end;
begin
  WriteLn('Режим вывода абитуриентов по спец-ти');
  Write('Специальность: ');
  ReadLn(spec1);
  if s<>'' then begin
    Report(output,spec1); { на стандартный вывод }
    Rewrite(f2); Report(f2,spec1); Close(f2); { в файл }
  end;
end;


Процедура Vvod
1. Писать в файл запись с fio='***' -- не очень хорошая идея, размер файла в записях можно получить по FileSize(f), состояние конца файла -- по EoF(f).

2. Программа без файла все равно не работает, почему бы не открыть его на старте по Reset. Это не помешает в Vvod сделать при необходимости Rewrite(f).

Процедура Korr
1. eof(f)=true -- масло масляное, EoF(f) уже имеет одно из значений False/True:
Pascal
1
  if EoF(f) then ...
2. при корректировке неплохо позволить нажимать Enter, чтобы оставить прежнее значение:
Pascal
1
2
3
4
5
6
7
8
9
10
11
var t: String;
...
  with q do begin
    Write('Фамилия И.О. [',fio,']: '); ReadLn(t);
    if t<>'' then fio:=t;
    Write('Специальность [',spec,']: '); ReadLn(t);
    if t<>'' then spec:=t;
    Write('Оценка по физике: '); Read(ocFiz);
    Write('Оценка по математике: '); Read(ocMatem);
    Write('Оценка по литературе: '); ReadLn(ocLiter);
  end;
Можно чуть сложнее и для оценок. Без контроля:
Pascal
1
2
3
4
5
6
7
8
9
var
  e: Integer;
...
    Write('Оценка по физике [',ocFiz,']: '); ReadLn(t);
    if t<>'' then Val(t,ocFiz,e);
    Write('Оценка по математике [',ocMatem,']: '); ReadLn(t);
    if t<>'' then Val(t,ocMatem,e);
    Write('Оценка по литературе [',ocLiter,']: '); ReadLn(t);
    if t<>'' then Val(t,ocLiter,e);
Но лучше вынести подобное редактирование в отдельные функции/процедуры как в ранее помянутом Поиск данных по Ф. И. О. работника
0
10.10.2016, 16:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.10.2016, 16:24
Помогаю со студенческими работами здесь

Создание и обработка типизированного файла, содержащего сведения о месте жительства студента
Разработать программу решение задачи, в которой реализовать создание и обработку типизированного...

Редактирование текстового файла, содержащего сведения о студентах
Привет. Нужна помощь с решением задачи. Знаю как решить логически но по программному коду че-то...

Обработка текстового файла, содержащего сведения о студентах
Дан текстовый файл, содержащий сведения о студентах. Need help , может кто может помочь? Как это...

Разработать программу формирования файла, содержащего сведения о школьниках
помогите пожалуйста решить задачи в делфи очень надо 3.Разработать программу формирования файла,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru