Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Программа для печати письма студентам, имеющим более трех задолженностей (http://www.tehnari.ru/f43/t37563/)

Тёмыч 02.07.2010 00:04

Программа для печати письма студентам, имеющим более трех задолженностей
 
Уважаемые знатоки :) помогите решить задачку.

Разработать программу для печати письма студентам, имеющим более трех задолженностей, с предупреждением об отчислении. если "хвосты" не будут сданы до срока X (рекомендуется указать предметы и циклы , по которым имеются задолженности).

вот что смог по памяти набросать, на самое главное можно сказать не смог сделать :(

Код:

program lab7;
type
    stud=record
              Familiya: string [13];
              um9: string [12];
              Ot4estvo: string [12];
              Pol : string [1];
              DataRojd: string [11];
              gruppa : string [5];
              Matemat : integer;
              fizika: integer;
              istoriya : integer;
              informatika : integer;
              end;
var
  studfile:file of stud;
  recstud: stud;
  i,rej,y:integer;

procedure org;
          begin
              assign (studfile, 'c:/USP.DAT');
              rewrite (studfile);
              with recstud do
              while true do
              begin
                    if y=2
                    then
                    begin
                        close (studfile);
                        exit;
                    end;
                    writeln ('vvedite familiio');
                    readln (familiya);
                    writeln ('vvedite im9');
                    readln (um9);
                    writeln ('vvedite ot4estvo');
                    readln (ot4estvo);
                    writeln ('vvedite pol');
                    readln (pol);
                    writeln ('vvedite daty rojdenia');
                    readln (DataRojd);
                    writeln ('vvedite gryppy');
                    readln (gruppa);
                    for i:=1 to 3 do
                    begin
                    writeln ('matematika');
                    readln (Matemat);
                    end;
                    for i:=1 to 3 do
                    begin
                    writeln ('fizika');
                    readln (fizika);
                    end;
                    for i:=1 to 3 do
                    begin
                    writeln ('istoriya');
                    readln (istoriya);
                    end;
                    for i:=1 to 3 do
                    begin
                    writeln ('informatika');
                    readln (informatika);
                    end;
                    writeln ('prodoljit vvod?  1-da , 2- net');
                    readln (y);
                    write (studfile,recstud);
              end;
          end; {org}

procedure obr;
begin {obr}
assign (studfile, 'c:/USP.DAT');
reset (studfile);
with recstud do
while not eof(studfile) do
begin
    read (studfile, recstud);

    { (matemat,fizika,istoriya,informatika);
    if matemat+fizika+istoriya+informatika<9 then}
    writeln ('|',familiya: 1,'|',um9:4,'|',ot4estvo:12,'|', pol: 2,'|', Datarojd:11,'|',gruppa: 5,'|');

end;
close (studfile);
end; {obr}

procedure korr;
begin {korr}
assign (studfile,'c:/USP.DAT');
reset (studfile);
seek (studfile, filesize(studfile));
with recstud do
while true do
begin
                if y=2
                    then
                    begin
                        close (studfile);
                        exit;
                    end;
                    writeln ('vvedite familiio');
                    readln (familiya);
                    writeln ('vvedite im9');
                    readln (um9);
                    writeln ('vvedite ot4estvo');
                    readln (ot4estvo);
                    writeln ('vvedite pol');
                    readln (pol);
                    writeln ('vvedite daty rojdenia');
                    readln (DataRojd);
                    writeln ('vvedite gryppy');
                    readln (gruppa);
                    for i:=1 to 3 do
                    begin
                    writeln ('matematika');
                    readln (Matemat);
                    end;
                    for i:=1 to 3 do
                    begin
                    writeln ('fizika');
                    readln (fizika);
                    end;
                    for i:=1 to 3 do
                    begin
                    writeln ('istoriya');
                    readln (istoriya);
                    end;
                    for i:=1 to 3 do
                    begin
                    writeln ('informatika');
                    readln (informatika);
                    end;
                    writeln ('prodoljit vvod?  1-da , 2- net');
                    readln (y);
                    write (studfile, recstud);
                    end;
end; {korr}


 begin {prog}
      while true do
      begin
            writeln ('rejimbl');
            writeln ('1: co3danie faila');
            writeln ('2: pokazat ot4isl9emblx');
            writeln ('3: do6avit studentov');
            writeln ('4: Bblxod');
      readln (rej);
      case rej of
      1: org;
      2: obr;
      3: korr;
      4: halt;
      else
      writeln ('error povtorite vvod');
      end;
      end;
 end.


Тёмыч 02.07.2010 00:12

Вложений: 1
аа вот еще, что касаемо задачи..
ps а, кстати на турбо паскале надо

Vladimir_S 02.07.2010 09:47

Темыч, а к какому сроку это надо? Если сегодня, то вряд ли успею, а вот на выходных могу поковыряться. Впрочем, может быть кто-нибудь еще успеет раньше меня.
Сходу одно замечание.
Я бы вместо бесконечного цикла с прерыванием
Код:

while true do
 begin
  if y=2 then
    begin
      close (studfile);
      exit;
    end;
  .................
  writeln ('prodoljit vvod?  1-da , 2- net');
  readln (y);
  .................
 end;

Организовал бы это так:
Код:

Repeat
  .................
  writeln ('prodoljit vvod?  1-da , 2- net');
  readln (y);
  .................
Until y=2;
close (studfile);


Тёмыч 02.07.2010 11:25

Да я даже не знаю, вроде бы сегодня надо желательно :D

еще момент, знаю что в этой процедуре точно бред я написал:
Код:

procedure obr;
begin {obr}
assign (studfile, 'c:/USP.DAT');
reset (studfile);
with recstud do
while not eof(studfile) do
begin
    read (studfile, recstud);

    { (matemat,fizika,istoriya,informatika);
    if matemat+fizika+istoriya+informatika<9 then}
    writeln ('|',familiya: 1,'|',um9:4,'|',ot4estvo:12,'|', pol: 2,'|', Datarojd:11,'|',gruppa: 5,'|');

end;
close (studfile);
end; {obr}

еще, вообще понять не могу, как в один предмет, записать 3 оценки, грубо говоря, это для меня непонятно так же, как в одну ячейку записать 3 значения :tehnari_ru_093:

Vladimir_S 02.07.2010 11:34

И еще вопрос - а что такое в данном случае "цикл"?

Тёмыч 02.07.2010 11:41

Не знаю если честно, наверно 3 оценки, как то записываются 3мя циклами.
А потом наверно еще и предлагается указать в каком цикле плохая оценка(но я думаю это необязательно даже делать)

Vladimir_S 02.07.2010 11:45

Ладно, попытаюсь сегодня.
Общее количество студентов известно?

Тёмыч 02.07.2010 12:07

Цитата:

Сообщение от Vladimir_S (Сообщение 355932)
Ладно, попытаюсь сегодня.
Общее количество студентов известно?

Общее количество студентов совершенно не важно, так как они предварительно вводятся вручную, т.е. сколько ввел столько и будет.

Vladimir_S 02.07.2010 15:49

Так, ну вот что у меня получилось. Я руководствовался сформулированным заданием, а, поскольку там никакие корректировки, упорядочения списка и прочее не значатся, так я это и выбросил. Если это всё-таки нужно, можно ввести такие процедуры.
Код:

program lab7;
const
 Nstud_max=100;
type
    stud=record
              Familiya: string;
              um9: string;
              Ot4estvo: string;
              Pol : Char;
              DataRojd: string;
              gruppa : string;
              Matemat : Array[1..3] of byte;
              fizika: Array[1..3] of byte;
              istoriya : Array[1..3] of byte;
              informatika : Array[1..3] of byte;
              end;
var
  studfile:Text;
  recstud: Array[1..Nstud_max] of stud;
  BadStud:Array[1..Nstud_max] of Word;
  i,j,y,Nstud,Nbadstud:integer;

procedure org;
 Var i:Integer;
 begin
  Append(studfile);
  Repeat
  Inc(Nstud);
  with recstud[Nstud] do
    begin
    Writeln('Student N ',Nstud:3,':');
    writeln ('vvedite familiio (max 10 letters)');
    readln (familiya);
    writeln ('vvedite im9 (max 10 letters)');
    readln (um9);
    writeln ('vvedite ot4estvo (max 10 letters)');
    readln (ot4estvo);
    writeln ('vvedite pol (M/J)');
    readln (pol);
    writeln ('vvedite daty rojdenia');
    readln (DataRojd);
    writeln ('vvedite gryppy (max 4 letters)');
    readln (gruppa);
    for i:=1 to 3 do
      begin
      writeln ('matematika, cycl ',i);
      readln (Matemat[i]);
      end;
    for i:=1 to 3 do
      begin
      writeln ('fizika, cycl ',i);
      readln (fizika[i]);
      end;
    for i:=1 to 3 do
      begin
      writeln ('istoriya, cycl ',i);
      readln (istoriya[i]);
      end;
    for i:=1 to 3 do
      begin
      writeln ('informatika, cycl ',i);
      readln (informatika[i]);
      end;
    write (studfile,familiya);
    for i:=Length(familiya)+1 to 11 do Write(studfile,' ');
    write (studfile,'|'+um9);
    for i:=Length(um9)+1 to 11 do Write(studfile,' ');
    write (studfile,'|'+ot4estvo);
    for i:=Length(ot4estvo)+1 to 11 do Write(studfile,' ');
    write (studfile,'|',pol,'|',DataRojd);
    for i:=Length(DataRojd)+1 to 10 do Write(studfile,' ');
    write (studfile,'|'+gruppa);
    for i:=Length(gruppa)+1 to 4 do Write(studfile,' ');
    Write(studfile,'|');
    for i:=1 to 2 do write(studfile,Matemat[i],' ');
    write(studfile,Matemat[3],'|');
    for i:=1 to 2 do write(studfile,fizika[i],' ');
    write(studfile,fizika[3],'|');
    for i:=1 to 2 do write(studfile,istoriya[i],' ');
    write(studfile,istoriya[3],'|');
    for i:=1 to 3 do write(studfile,informatika[i],' ');
    end;
  WriteLn(studfile);
  write('prodoljit vvod?  1-da , 2- net ');
  readln(y);
  Until y=2;
 end; {org}


begin {prog}
 Nstud:=0;
 assign (studfile, 'C:/USP.DAT');
 rewrite (studfile);
 writeln (studfile,
' familiya    um9      ot4estvo    p  Datarojd grup. Matem  fiz.  ist. inf.');
 Writeln(studfile);
 org;
 Close(studfile);
 assign (studfile, 'C:/NEW.DAT');
 rewrite (studfile);
 Nbadstud:=0;
 For i:=1 to Nstud do
  begin
  with recstud[i] do
    begin
    y:=0;
    for j:=1 to 3 do
      if (Matemat[j]=2) or (fizika[j]=2)
        or (istoriya[j]=2) or (informatika[j]=2) then y:=1;
    end;
  If y=1 then
    begin
    INC(Nbadstud);
    BadStud[Nbadstud]:=i;
    end;
  end;

 For i:=1 to NbadStud do
  with recstud[BadStud[i]] do
  begin
    If pol='M' then Write(studfile, 'Dorogoy student ') else
    Write(studfile, 'Dorogaya studentka ');
    WriteLn(studfile, 'gruppy '+gruppa+' '+Familiya+' '+um9+' '+Ot4estvo+'!');
    WriteLn(studfile,'Soobshchaem Vam, chto u Vas imejutsa zadoljennosti po sledujushchim');
    WriteLn(Studfile,'discyplinam i cyclam:');
    for j:=1 to 3 do
    if Matemat[j]=2 then
      Writeln(studfile,'Matematika, cycl N',j);
    for j:=1 to 3 do
      if fizika[j]=2 then
      Writeln(studfile,'Fizika, cycl N',j);
    for j:=1 to 3 do
      if istoriya[j]=2 then
      Writeln(studfile,'Istoria, cycl N',j);
    for j:=1 to 3 do
      if informatika[j]=2 then
      Writeln(studfile,'Informatika, cycl N',j);
    Writeln(studfile,'V sluchae, esli Vy ne perezdadite ukazannyje predmety');
    Writeln(studfile,'v techenije 10 dney, Vy budete OTCHISLENY.');
    Writeln(studfile);
  end;
  Close(studfile);
end.


Тёмыч 02.07.2010 16:50

чет выдает ошибку :(

....................
var
studfile:Text;
recstud: Array[1..Nstud_max] of stud;
BadStud:Array[1..Nstud_max] of Word;
i,j,y,Nstud,Nbadstud:integer;

........................перед красной ставит курсор и пишет: Error 22: Structure too large.


Часовой пояс GMT +4, время: 15:38.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.