Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2 / 2 / 1
Регистрация: 04.01.2013
Сообщений: 48
1

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

22.01.2013, 10:03. Просмотров 1868. Ответов 2
Метки нет (Все метки)

Приложение под Windows должно подсчитывать средний балл каждого студента, общий средний балл по каждому предмету. Исходной информацией является: Фамилия и имя,оценки каждого студента по математике, вводному курсу информатики, программированию, компьютерным сетям. Фамилия и имя, оценки вводятся непосредственно в таблицу. Расчет производится непосредственно после каждого изменения в таблице.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2013, 10:03
Ответы с готовыми решениями:

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

Средний балл каждого студента по каждому предмету
Пользователь последовательно вводит оценки студентов по предметам. Кол-во студентов и предметов...

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

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

2
313 / 272 / 272
Регистрация: 25.09.2011
Сообщений: 477
23.01.2013, 23:10 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Инструкция к работе:
чтобы ввести фамилию или имя нужно вывести курсор на левое поле и нажать Enter
после ввода тоже нажать Enter. Можно корректировать - вывести на левое поле Del
Новое значение нельзя ввести , пока не будет заполнено имя и фамилия (можно пустыми оставить, но нажать дважды Enter) в предыдущем значении. Реализована прокрутка. Палочки в табличке сами .
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
uses TpCrt,TpWindow;
type
  Str18 = String[18]; Str13=String[13];
const
  bgColor = $07; stColor = $78; prColor = $2f;
  MaxP = 5;       { количество полей отображения в таблице }
  MaxPr = maxP-1; { количество предметов }
  MaxOc = 100;    { количество оценок по одному предмету }
  XTabl : array [0..MaxP] of byte = (1,20,35,50,65,80);
  NamePr : array [0..MaxPr] of str13 = (' фамилия имя ',' математика  ',
                           ' информатика ',' программир. ',' комп. сети  ');
type
  tOcArr = array[1..maxOc] of byte;
 
  tOcenki = object
    NPredm,Num,Line  : byte;
    Oc : tOcArr;
    SumOc : word;
    procedure Init(predmet : byte);
    procedure ViewOc(YUp : byte);
    function  AddOc(newOc : byte) : byte;
    procedure CalcSr(var Sum : word; var N : byte);
  end;
 
  tStudent = object
    fam,nam : str18;
    inp : byte;  { определитель для ввода фамилии и имени }
    Pr : array [1..MaxPr] of tOcenki;
    procedure Init;
    procedure ViewFio(YUp : byte);
    procedure SetChFio(NewCh : char);
    function  GetAllSr : real;
    procedure ViewStudent(YUp : byte);
    function  Createitem : boolean;
  end;
 
  pDyn = ^tDyn;
  tDyn = record
    pred,next : pDyn;
    St        : tStudent;
  end;
 
  Procedure Message(St : String);
  var MessWin : WindowPtr; L : Byte; W : Word;
  begin L := Length(St) div 2;
    if not MakeWindow(MessWin,39-L,13,41+L,15,True,True,False,$4e,$4f,$4f,'')
    then Writeln('ErrMake');
    if not DisplayWindow(MessWin) then Writeln('ErrDisp');
    HiddenCursor; FastWrite(St,14,40-L,$75); W:=ReadKeyWord;
    KillWindow(MessWin);
  end;
 
  {-------------- tOcenki ----------------}
 
  procedure tOcenki.Init(predmet : byte);
  var i : byte; begin for i:=1 to MaxOc do Oc[i]:=0;
    Num:=0; NPredm:=predmet; SumOc:=0; Line:=0; end;
 
  procedure tOcenki.ViewOc(YUp : byte); var i,k : byte; s : word;
  begin
    gotoXY(XTabl[NPredm],YUp); k:=0; s:=0;
    for i:=1 to Num do begin
      if whereX+2 > XTabl[NPredm+1] then begin
        inc(k); gotoXY(XTabl[NPredm],YUp+k);
        write('             '); gotoXY(XTabl[NPredm],YUp+k);
      end;
      write(Oc[i]:2); s:=s+Oc[i];
    end;
    if Num<>0 then begin
      gotoXY(XTabl[NPredm],YUp+k+1); write(' средняя ',s/num:0:2); end;
  end;
 
  function tOcenki.AddOc(newOc : byte): byte;
  begin inc(Num); Oc[Num]:=newOc;
    AddOc:=(Num-1) div ((XTabl[NPredm+1]-XTabl[NPredm]) div 2) +1;
  end;
 
  procedure tOcenki.CalcSr(var Sum : word; var N : byte); var i : byte;
  begin for i:=1 to Num do Sum:=Sum+Oc[i]; n:=n+num; end;
 
  {-------------- tStudent ----------------}
 
  procedure tStudent.Init; var i : byte;
  begin fam:=''; nam:=''; Inp:=0; for i:=1 to maxPr do Pr[i].Init(i); end;
 
  function tStudent.GetAllSr : real; var i,n : byte; s : word;
  begin n:=0; s:=0; for i:=1 to MaxPr do Pr[i].CalcSr(s,n);
    if n=0 then GetAllSr:=0 else GetAllSr:=s/n; end;
 
  procedure tStudent.ViewFio(YUp : byte);
  begin
    case inp of
      0: begin gotoXY(XTabl[0],YUp); write('            ');
               gotoXY(XTabl[0],YUp+1); write('              '); end;
      1: begin gotoXY(XTabl[0],YUp); write(fam); end;
      2: begin gotoXY(XTabl[0],YUp+1); write(nam); end;
      3: begin gotoXY(XTabl[0],YUp+2); write('Ср. балл: ',GetAllSr:0:2);
  gotoXY(XTabl[0],YUp); write(fam); gotoXY(XTabl[0],YUp+1); write(nam); end;
    end;
  end;
 
  procedure tStudent.ViewStudent(YUp : byte); var i : byte;
  begin ViewFio(YUp); for i:=1 to MaxPr do Pr[i].ViewOc(YUp); end;
 
  procedure tStudent.SetChFio(NewCh : char);
  begin
    if (Newch=#13) and (inp<3) then inc(inp);
    case inp of 0,3:; 1: fam:=fam+newch; 2: nam:=nam+newch; end;
    if NewCh=#8 then begin fam:=''; nam:=''; inp:=1; end;
  end;
 
  function  tStudent.Createitem : boolean; begin CreateItem:=inp=3; end;
 
  procedure ReWriteTable(start : pDyn; delta: byte; var NewY : byte);
  var i : byte; begin
    textattr:=bgColor; clrscr;
    for i:=0 to maxPr do begin gotoXY(XTabl[i],1); write(NamePr[i]); end;
    i:=2;
    while (Start<>nil) and (i<=25-delta) do begin
      Start^.St.ViewStudent(i); inc(i,delta); Start:=Start^.next; end;
    NewY:=2;
  end;
 
 
var
  Stud,Cur,CurUp : pDyn;
  Ch : char;
  Quit : boolean;
  Y,ml,SelPole,i : byte;
Begin
  textattr:=bgColor; clrscr;
  new(Stud); cur:=Stud; cur^.next:=nil; cur^.pred:=nil; Cur^.St.init;
  CurUp:=Cur;
  for i:=0 to maxPr do begin gotoXY(XTabl[i],1); write(NamePr[i]); end;
  quit:=false; SelPole:=0; ml:=3; y:=2; HiddenCursor;
  repeat
    for i:=1 to ml do begin
      ChangeAttribute(79,Y+i-1,1,stColor);
      ChangeAttribute(Xtabl[SelPole+1]-Xtabl[SelPole],Y+i-1,Xtabl[SelPole],prColor);
    end;
    ch:=ReadKey;
    for i:=1 to ml do ChangeAttribute(79,Y+i-1,1,bgColor);
    if ch=#0 then begin HiddenCursor;
      case ReadKey of
      { Left } #75 : if selPole=0 then SelPole:=maxPr else Dec(SelPole);
      { Right} #77 : if selPole=MaxPr then SelPole:=0 else Inc(SelPole);
      { Up}    #72 : if Cur^.pred<>nil then begin { если есть предыдущий }
                        Cur:=Cur^.pred;    {он становится текущим}
 { можно ли отобразить} if y < 2+ml then begin
                            ScrollWindowDown(1,2,80,25,ml);
                            Cur^.St.ViewStudent(y);
                         end
 { елси нет места-подвинуть экран, иначе сдвинуть курсор } else dec(y,ml);
                     end else message('  начало списка  ');
      { Down } #80 : if Cur^.St.CreateItem then begin { если данные введены }
                        if Cur^.next<>nil then begin    { если есть следуещее}
                          Cur:=Cur^.next;               { оно будет текущим }
                        end else begin { данные введены, нужен еще }
   { создаем новый }      New(Cur^.next); Cur^.Next^.pred:=cur;
   { и инниц. его }       cur:=cur^.next; cur^.next:=nil; cur^.St.Init;
                        end;
 { можно ли отобразить} if (y+ml)>(25-ml) then ScrollWindowUp(1,2,80,25,ml)
 { елси нет места-подвинуть экран, иначе сдвинуть курсор } else inc(y,ml);
                     end else message(' сначала что есть заполни ');
      { del  } #83 : if selPole=0 then begin
                        Cur^.St.SetChFio(ch);
                        Cur^.St.ViewFIO(y);
                      end;
      end;
    end else begin case Ch of
          '1'..'5' : if selPole<>0 then begin { если поле - предмет }
                        HiddenCursor;
  {добавляем оценку }   i:=Cur^.St.Pr[SelPole].AddOc(ord(ch)-48);
  { сменилас размерность}if i+1>ml then begin
  { перерисовываем все }  ml:=i+1; ReWriteTable(Cur,ml,y);
                        end;
                        Cur^.St.Pr[SelPole].ViewOc(y); Cur^.St.ViewFio(y);
                     end;
       #8,#13,' ','А'..'п','р'..'я' : if selPole=0 then begin { Del,Enter }
                        NormalCursor;
                        Cur^.St.SetChFio(ch); Cur^.St.ViewFio(y);
                     end;
      { Esc }  #27 : Quit:=true;
      end;
    end;
  until Quit;
  while Stud<>nil do begin cur:=Stud^.next;  dispose(Stud); Stud:=cur; end;
  NormalCursor; textattr:=bgColor; clrscr;
End.
Добавлено через 4 минуты
написано в TP7 под DosBox
1
2 / 2 / 1
Регистрация: 04.01.2013
Сообщений: 48
25.01.2013, 10:27  [ТС] 3
Спасибо дружище))) Я тоже написал только в Delphi)

Добавлено через 2 минуты
Delphi
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
unit Un_TABLE;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, ExtCtrls, StdCtrls, Buttons;
 
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Edit1: TEdit;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Label1: TLabel;
    StringGrid1: TStringGrid;
    BitBtn3: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
      const Value: String);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  n:byte;
 
implementation
 
{$R *.dfm}
 
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  n:=0;
  with stringGrid1 do
  begin
    cells[0,0]:= 'Имя и фамилия';
    cells[1,0]:= 'Математический анализ';
    cells[2,0]:= 'Информатика';
    cells[3,0]:= 'Программирование';
    cells[4,0]:= 'Физика';
    cells[5,0]:= 'Средний балл';
    cells[0,1]:= 'Средний балл по предмету';
  end;
end;
 
procedure TForm1.BitBtn1Click(Sender: TObject);
var j:byte;
begin
  if edit1.text=''
   then showMessage('Введите фамилию и имя!')
   else
     begin
       stringGrid1.Enabled:=true;
       n:=n+1;
       with StringGrid1 do
       begin
         RowCount:= RowCount+1;
         for j:=0 to 5 do
           begin
             cells[j,RowCount-1]:=cells[j,RowCount-2];
             cells[j,RowCount-2]:='';
           end;
         cells[0,RowCount-2]:=Edit1.Text;
       end;
       edit1.Clear;
       if Form1.Height<400
        then Form1.Height:=Form1.Height+25;
     end;
   edit1.SetFocus;
end;
 
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: String);
var b, c:integer;
    j, k:byte;
    SumRow, SumCol: real;
begin
  with stringGrid1 do
    if (ARow<>RowCount-1) and (ACol<>ColCount-1) then
    begin
      if Value<>'' then
      begin
        val(value,b,c);
        if (c<>0) or (not (b in [1..5])) then
         cells[Acol,Arow]:='';
      end;
      SumRow:=0;
      k:=0;
      for j:=1 to 4 do
        if cells[j,Arow]<>'' then
         begin
           SumRow:=SumRow + StrToInt(cells[j,Arow]);
           inc(k);
         end;
      if k<>0 then SumRow:=SUmRow/k;
      cells[5,Arow]:=FormatFloat('##.##',SumRow);
      SumCol:=0;
      k:=0;
      for j:=1 to n do
        if cells[Acol,j]<>'' then
         begin
           SumCol:=SumCol + StrToInt(cells[Acol,j]);
           inc(k);
         end;
      if k<>0 then SumCol:=SumCol/k;
      cells[Acol,n+1]:=FormatFloat('##.##',SumCol);
    end;
 
end;
 
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  if (Acol=StringGrid1.ColCount-1) or (Arow=StringGrid1.RowCount-1)
   then canselect:=false;
end;
 
end.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.01.2013, 10:27

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Определите средний балл студентов группы по каждому предмету
Помогите пожалуйста написать программу с помощью процедуры или функции!!! Дана матрица А,...

Вывести на экран матрицу ведомости, результаты подсчета и средний балл по каждому предмету
1. В классе 7 учащихся. Известны результаты экзаменов по 2 предметам. Составить программу...

Подсчитать средний балл студента Х
Сформировать массив записей - успеваемость группы. Поля записи: фамилия студента, оценки по трем...

Вывести на экран исходную матрицу-ведомость, результаты подсчета и средний балл по каждому предмету
В классе 7 учеников, известны результаты сдачи экзаменов по двум предметам. Составьте программу...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.