Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ График успеваемости + средний балл

Автор: Drughi 14.03.2011 4:04

Не знал, как объяснить задание, поэтому прилагаю рисунок.
Изображение
т.е. от пользователя требуется ввести лишь оценки по предметам, а компьютер должен вычислить средний балл и нарисовать график, как на рисунке.

Если такое задание уже было, дайте, пожалуйста, ссылку. Я не нашёл.

Спасибо заранее! smile.gif

Автор: sheka 14.03.2011 5:36

Тебе нужно готовое решение или сам че-нить хочешь сделать? Если готовое - в инете должны быть кучи-кучи похожих решений, если нет, то:
1. сначала вводишь данные в массив а из 5ти элементов
2. заходишь в граф. режим.
3. рисуешь оси линиями
4. GotoXY(1*kx,a[1]*ky]), где kx, kу - масштабы по осям
5. в цикле LineTo(i*kx,a[i]*ky]), где i - переменная цикла.
6. гуглишь как искать среднее.
7. гуглишь как выводить текст на экран.
8. end. smile.gif

Автор: Drughi 15.03.2011 3:52

В том-то и загвоздка, что среднее арифм я то знаю, как посчитать. а вот как такой график построить на Pascal ABC - не знаю.
Хотелось бы конечно готовое решение wink.gif

Автор: volvo 15.03.2011 15:48

Как-то вот так:

uses GraphABC;

const
Fresh = 5;
GradeLen = 20;

inData = 'Входные данные';
outData = 'Выходные данные';
nScore = 5;
Colors : array[1 .. nScore] of Color = (
clRed, clBrown, clGreen, clBlue, clNavy
);
Subj : array[1 .. 2, 1 .. nScore] of String = (
('Математика', 'Английский', 'Химия', 'Информатика', 'Биология'),
('мат', 'анг', 'хим', 'инф', 'био')
);

const
RightPart = 2 * Window.Width div 3;

procedure StrInBox(X, Y : Integer; s : String);
begin
SetPenColor (clBrown);
DrawRectangle (X, Y, X + TextWidth(s) + 2*Fresh, Y + TextHeight(s) +2*Fresh);
SetPenColor (clBlack);
TextOut (X + Fresh, Y + Fresh, s);
end;

var
Scores : array[1 .. nScore] of Integer; // = (10, 10, 8, 8, 9);

XAxis : Integer;
Average: Real;
s : string;

begin
StrInBox (RightPart, 10, InData);
for i : Integer := 1 to nScore do
begin
var CurrStr := Subj[1, i] + ': ';
TextOut (RightPart, 30 + i * 20, CurrStr);
ReadLn (Scores[ i ]);
TextOut (RightPart + TextWidth(CurrStr), 30 + i * 20, IntToStr (Scores[ i ]));
end;

StrInBox (RightPart, 50 + Succ (nScore) * 20, OutData);

// Рисуем Оси координат
MoveTo (20, 50);
LineTo (20, 50 + 10 * GradeLen);
LineTo (RightPart - 20, 50 + 10 * GradeLen);

s := '';
for i:integer := 1 to 11 do
begin
var YPos := 50 + Pred (i)*GradeLen;
if i > 1 then s := ' ';
TextOut (2, YPos, s + IntToStr (11 - i)); // Нумерация оси OY
Line (20, YPos, 22, YPos); // Засечки на оси OY
end;

XAxis := (RightPart - 40) div nScore;
for i : integer := 1 to nScore do
begin
var StartInterval := 20 + Pred(i)*XAxis + (XAxis div 2);
var Coord_Y := 50 + Pred (11 - Scores[i])*GradeLen;

SetPenColor (clBlack);
Line (StartInterval, 48 +10*GradeLen, StartInterval, 52 +10*GradeLen); // Засечки на OX
SetFontColor (Colors[ i ]);

if i = 1 then MoveTo (StartInterval, Coord_Y)
else
begin
SetPenColor (clGray);
LineTo (StartInterval, Coord_Y);
end;
SetPenColor (Colors[ i ]);
Circle(StartInterval, Coord_Y, 2);
TextOut (StartInterval - (TextWidth (Subj[2, i]) div 2), 75 +10*GradeLen, UpperCase (Subj[2, i]));
Average := Average + Scores[i];
end;
Average := Average / nScore;
TextOut (RightPart+Fresh, 90 + Succ (nScore)*20, 'Средний балл: ' + FloatToStr (Average));
end.


Вот чего получается, на фоне твоей же картинки:
Прикрепленное изображение

(с обычным, не .NET-овским PascalABC я не связываюсь. Во-первых, он устарел, и уже не поддерживается разработчиками, а во-вторых у меня его просто нет, и ставить я его не буду...)

Автор: Drughi 15.03.2011 20:22

volvo, Большущее спасибо! good.gif