Премини към съдържанието
boccko

малко помощ за програма на Паскал

Препоръчан отговор


Та мъчи ме задачка на паскал от курсовата ми работа.Ето го и условието:

 

За група студенти са зададени име, ЕГН, факултетен № ,
оценки по 10 дисциплини , среден успех. Да се създаде
програма , използваща подпрограми за:
 

Създаване на файл с информация за групата студенти, без да се въвежда ср. успех;

• изчисляване на средния успех на всеки един от студентите;
• извеждане на фак. № и средния успех на всеки студент (мъж).

 

program kurs_file;
 
Type tipstudent=record
name: String[30];
egn: String[9];
fnum: String[6];
ocenka:Array[1..10] of byte;
end;
var FS:File of tipstudent;
m:Integer;
imefail:string[20];
C:integer;
 
{vavejdane na danni za studenta}
Procedure addstud(var st:tipstudent);
 
var i:integer;
Begin
With st do begin
write('Vyvedi ime:'); readln(name);
if(name='exit')then exit;
write('Vyvedi EGN:'); readln(egn);
write('Vyvedi F.N.:'); readln(fnum);
writeln('Vyvedi 10 ocenki:');
for i:=1 to 10 do read(ocenka);
end;
readln;
end;
 
{izchislqvane na sredniq uspeh}
Function srus(st:tipstudent):real;
 
var i,s:integer;
Begin
s:=0;
for i:=1 to 10 do s:=s+st.ocenka;
srus:=s/10;
end;
 
{otpe4atvane na edin student}
Procedure wrtst(st:tipstudent);
 
var i:integer;
b:string[1];
begin
with st do begin
writeln('Ime:',name);
writeln('EGN:',egn);
writeln('F.N.:',fnum);
writeln('Ocenki:');
for i:=1 to 10 do write(ocenka,' '); writeln;
writeln('Izchislqvane na sreden uspeh? y/n');
readln(B);
if(b='y')then writeln('Sreden uspeh:',srus(st):4:2);
writeln;
end;
end;
 
{otpe4atvane na celiq fail}
Procedure prall;
 
var st:tipstudent;
 
Begin
Reset(fs);
While not EOF(fs) do
begin
Read(fs,st);
wrtst(st);
end;
close(fs);
end;
 
{syzdavane na prazen fail}
Procedure newfile;
 
var i:integer;
 
Begin
Rewrite(fs);
Close(fs);
Writeln('Failyt e syzdaden!');
end;
 
{dobavqne na studenti kym faila}
 
Procedure addstudetofile;
 
var st:tipstudent;
 
Begin
Writeln('Vavedi ime ili exit za krai');
reset(fs); seek(fs,filesize(fs));
Repeat
addstud(st);
if st.name<>'exit' then write(fs,st);
until st.name= 'exit';
close(fs);
end;
 
Begin
Write('zadaite imeto na faila:');
Readln(ImeFail);
Assign(fs,ImeFail);
Repeat
Writeln(' ':20,'Meniu na izpalnqvanite operaii:');
Writeln(' ':20,'1- suzdavane na nov fail');
Writeln(' ':20,'2- informaciq za grupa studenti bez da se vavejda sr. uspeh');
Writeln(' ':20,'3- izchislqvane na sredniq uspeh na vseki edin ot studentite');
Readln©;
Case C of
1:newfile;
2:addstudetofile;
3:prall;
end;
until C=0
End.
 
 
Това е кода без последната подточка.Моля някой ако е възможно да ми оформи последната процедура, а именно извеждане на фак. номер и среден успех на мъжете като има предвид, че пола трябва да се разбере от предпоследната цифра в ЕГН-то(четна цифра- мъж, нечетна цифра- жена).Благодаря предварително!!!
Редактирано от boccko (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Поне някой би ли ми казал дали може да се промени следния код, така че да не се използва библиотеката CRT и в частност командата ReadKey, защото аз пробвах само да я изтрия от кода, но програмата ме изхвърля след като въведа данните за необходимия брой студенти?

 

program EB_file;
 
uses
  crt;
 
type
  scr = array[1..10] of 2..6;
 
  stud = record
    Name: string;
    personal_id: string[10];
    fac_num: string[6];
    scores: scr;
    avr: real;
  end;
 
var
  fp: file of stud;
  student: stud;
  j, i, gender, scs: integer;
  ch: char;
  gender_digit: string[1];
  filename: string;
 
  procedure ReadStudent;
  begin
    Write('Name of student: ');
    readln(student.Name);
    if length(student.Name) > 0 then
    begin
      Write('Faculty number: ');
      readln(student.fac_num);
      Write('Personal ID: ');
      readln(student.personal_id);
      for j := 1 to 10 do
      begin
        Write('Discipline ', j, ' score: ');
        readln(student.scores[j]);
      end;
    end;
  end;
 
  procedure CreateFile;
  begin
    Write('Enter filename: ');
    readln(filename);
    Assign(fp, filename);
    rewrite(fp);
    repeat
      ReadStudent;
      if length(student.Name) > 0 then
        Write(fp, student);
    until length(student.Name) = 0;
    Close(fp);
  end;
 
  function Average(var scores: scr): real;
  var
    s: real;
  begin
    s := 0;
    for j := 1 to 10 do
      s := s + scores[j];
    Average := s / 10;
  end;
 
  procedure AverageScore;
  begin
    reset(fp);
    for i := 0 to FileSize(fp) - 1 do
    begin
      seek(fp, i);
      Read(fp, student);
      student.avr := Average(student.scores);
      seek(fp, i);
      Write(fp, student);
    end;
    Close(fp);
  end;
 
  procedure WriteStudent;
  begin
    Writeln('Faculty number: ', student.fac_num, ', average score: ', student.avr: 4: 2);
  end;
 
  procedure Report;
  begin
    reset(fp);
    Writeln('Male only students reported:');
    Writeln('----------------------------');
    while not EOF(fp) do
    begin
      Read(fp, student);
      gender_digit := Copy(student.personal_id, 9, 1);
      Val(gender_digit, gender, scs);
      if ((scs = 0) and (gender mod 2 = 0)) then
        WriteStudent;
    end;
    Close(fp);
  end;
 
begin
  CreateFile;
  AverageScore;
  Report;
  ch := ReadKey;
end.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

От опитите ми по първия код стигнах до тук:

program kurs_file;Type tipstudent=recordname: String[30];egn: String[9];fnum: String[6];ocenka:Array[1..10] of byte;end;var FS:File of tipstudent;m,scs,gender:Integer;imefail:string[20];C:integer;gender_digit:string[1];{vavejdane na danni za studenta}Procedure addstud(var st:tipstudent);var i:integer;BeginWith st do beginwrite('Vyvedi ime:'); readln(name);if(name='exit')then exit;write('Vyvedi EGN:'); readln(egn);write('Vyvedi F.N.:'); readln(fnum);writeln('Vyvedi 10 ocenki:');for i:=1 to 10 do read(ocenka[i]);end;readln;end;{izchislqvane na sredniq uspeh}Function srus(st:tipstudent):real;var i,s:integer;Begins:=0;for i:=1 to 10 do s:=s+st.ocenka[i];srus:=s/10;end;{otpe4atvane na edin student}Procedure wrtst(st:tipstudent);var i:integer;b:string[1];beginwith st do beginwriteln('Ime:',name);writeln('EGN:',egn);writeln('F.N.:',fnum);writeln('Ocenki:');for i:=1 to 10 do write(ocenka[i],' '); writeln;writeln('Izchislqvane na sreden uspeh? y/n');readln(B);if(b='y')then writeln('Sreden uspeh:',srus(st):4:2);writeln;end;end;{otpe4atvane na celiq fail}Procedure prall;var st:tipstudent;BeginReset(fs);While not EOF(fs) dobeginRead(fs,st);wrtst(st);end;close(fs);end;{syzdavane na prazen fail}Procedure newfile;var i:integer;BeginRewrite(fs);Close(fs);Writeln('Failyt e syzdaden!');end;{dobavqne na studenti kym faila}Procedure addstudetofile;var st:tipstudent;BeginWriteln('Vavedi ime ili exit za krai');reset(fs); seek(fs,filesize(fs));Repeataddstud(st);if st.name<>'exit' then write(fs,st);until st.name= 'exit';close(fs);end;{Izvejda sr. uspeh i fak. nom. samo na mujete}procedure report(var st:tipstudent);beginreset(fs);writeln('samo muje:');writeln('------------------');while not EOF (fs) dobeginRead(fs,st);gender_digit:=copy(st.egn, 9, 1);val(gender_digit, gender, scs);if ((scs=0) and (gender mod 2 = 0)) thenwrtst(st);end;close(fs);end;BeginWrite('zadaite imeto na faila:');Readln(ImeFail);Assign(fs,ImeFail);RepeatWriteln(' ':20,'Meniu na izpalnqvanite operaii:');Writeln(' ':20,'1- suzdavane na nov fail');Writeln(' ':20,'2- informaciq za grupa studenti bez da se vavejda sr. uspeh');Writeln(' ':20,'3- izchislqvane na sredniq uspeh na vseki edin ot studentite');writeln(' ':20,'4- razpechatka za mujete');Readln(C);Case C of1:newfile;2:addstudetofile;3:prall;4:report;end;until C=0End.

Но не иска да ми го компилира и ми изкарва грешка:Error: Wrong number of parameters specified for call to "report"

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Но не иска да ми го компилира и ми изкарва грешка:Error: Wrong number of parameters specified for call to "report"

В описанието горе функцията репорт приема един параметър от тип tipstudent. В case който е в главното тяло я извиквате без параметри. Като гледам кода на report, изобщо не е необходим такъв параметър - вие го използвате като локална променлива. Махнете параметъра и го преместете като локална променлива в тялото на функцията (която вече ще е процедура - бррр, това винаги ме е дразнело в Pascal, к'во значение има, дали има или няма параметър, че чак нова ключова дума да слагат...)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

В описанието горе функцията репорт приема един параметър от тип tipstudent. В case който е в главното тяло я извиквате без параметри. Като гледам кода на report, изобщо не е необходим такъв параметър - вие го използвате като локална променлива. Махнете параметъра и го преместете като локална променлива в тялото на функцията (която вече ще е процедура - бррр, това винаги ме е дразнело в Pascal, к'во значение има, дали има или няма параметър, че чак нова ключова дума да слагат...)

 

Благодаря ти много, всичко заспа! :)


Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Някой да помага имам курсова на паскал :

за група студенти са зададени име егн  фак номер оценките по 10 дисциплини среден успех  да се създаде програма  използвуваща подпрограми за: 

Създаване на фаил  с информация за  групата  студенти без  да се вавежда  средния успех 

Изчисляване на средния успех  на всеки един  от студентите

Намиране броя на антоновците  които не са родени  на антонов ден  

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.