• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Программа для печати письма студентам, имеющим более трех задолженностей

Тёмыч

WrighT
Почётный участник
Регистрация
21 Ноя 2006
Сообщения
1,881
Реакции
25
Баллы
0
Программа для печати письма студентам, имеющим более трех задолженностей

Уважаемые знатоки :) помогите решить задачку.

Разработать программу для печати письма студентам, имеющим более трех задолженностей, с предупреждением об отчислении. если "хвосты" не будут сданы до срока 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.
 
аа вот еще, что касаемо задачи..
ps а, кстати на турбо паскале надо
 

Вложения

  • ABCD0007.webp
    ABCD0007.webp
    48.8 KB · Просмотры: 220
Темыч, а к какому сроку это надо? Если сегодня, то вряд ли успею, а вот на выходных могу поковыряться. Впрочем, может быть кто-нибудь еще успеет раньше меня.
Сходу одно замечание.
Я бы вместо бесконечного цикла с прерыванием
Код:
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);
 
Да я даже не знаю, вроде бы сегодня надо желательно :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:
 
И еще вопрос - а что такое в данном случае "цикл"?
 
Не знаю если честно, наверно 3 оценки, как то записываются 3мя циклами.
А потом наверно еще и предлагается указать в каком цикле плохая оценка(но я думаю это необязательно даже делать)
 
Ладно, попытаюсь сегодня.
Общее количество студентов известно?
 
Ладно, попытаюсь сегодня.
Общее количество студентов известно?

Общее количество студентов совершенно не важно, так как они предварительно вводятся вручную, т.е. сколько ввел столько и будет.
 
Так, ну вот что у меня получилось. Я руководствовался сформулированным заданием, а, поскольку там никакие корректировки, упорядочения списка и прочее не значатся, так я это и выбросил. Если это всё-таки нужно, можно ввести такие процедуры.
Код:
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.
 
чет выдает ошибку :(

....................
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.
 
чет выдает ошибку :(

....................
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.
Даже и не знаю. Естественно, прежде чем выложить, я ее гонял "в хвост и в гриву". Попробуйте уменьшить константу Nstud_max, например до 10.

Вдогон: да, сейчас нарыл в Сети:
№22 - это "размер пользовательского типа превышает 65520 байт"
Мой Паскаль это умеет преодолевать, другие реализации, видимо, нет. Уменьшение константы должно помочь.
 
Уменьшил до 10 заработало, огромное спасибо, буду в долгу :)
 
Уменьшил до 10 заработало, огромное спасибо, буду в долгу :)
OFF! Вообще-то такая ситуация для меня - неприятный сюрприз. Мне-то казалось, что это пресловутое ограничение Паскаля в 64 килобайта на блок - кошмар далекого прошлого, в современных (да и не слишком) реализациях давно снятое, ан вот поди ж ты! Сам я сижу на DOS Free Pascal какой-то ископаемой версии, так и то про эти проблемы забыл. Да, когда-то, в начале 90-х, в эпоху TP-5.0 приходилось извращаться с динамическими переменными, искусственными процедурами и модулями, чтобы это дело обойти, но чтобы сейчас... ЧуднО!
 
Назад
Сверху