1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
вот процедура. Но тут одна проблема, что при удеалении элемента отображения диаграммы, получается "дырка", подскажите решение!!!
procedure ShowTable(tabl : table); var i : Integer; begin {вывод таблицы} writeln('Данные'); for i :=1 to MAX do if tabl[i].busy then writeln('ФИО = ',tabl[i].fio,' Соток = ',tabl[i].sot,' Годовой взнос = ',tabl[i].year, ' Итого = ',tabl[i].sot*tabl[i].year); end; {вывод таблицы}
procedure CreateDia(tabl : table); var i,dr,md : Integer; x,y : Integer; angle : Integer; sum : Integer; proc : array[1..MAX] of LongInt; {для расчета углов диаграммы} last : Integer; have : Integer; A : real; xn,yn : Integer; prs : string; begin {вывод диаграммы} dr := DETECT; {инициализация графики} md := 0; InitGraph(dr,md,''); if GraphResult <> grOk then begin writeln('Не найден файл EGAVGA.BGI'); end else begin {рисовать график} SetColor(GREEN); Rectangle(0,0,GetMaxX,GetMaxY); SetFillSTyle(SOLIDFILL,LIGHTGRAY); FloodFill(1,1,GREEN);
SetColor(BLUE); OutTextXY(10,10,'Диаграмма');
sum := 0; last := 1; for i:=1 to MAX do if tabl[i].busy then sum := sum + tabl[i].sot; have := 0; for i:=1 to MAX do if tabl[i].busy then begin proc[last] := tabl[i].sot; proc[last] := proc[i]*360; proc[last] := proc[i] div sum; have := have + proc[last]; last := last + 1; end;
have := 360-have;
proc[last-1] := proc[last-1]+have; x := GetMaxX div 2; y := GetMaxY div 2; Angle := 0;
for i:=1 to MAX do begin if tabl[i].busy then begin if(i<>LIGHTGRAY)then SetFillStyle(SOLIDFILL,i) else SetFillStyle(SOLIDFILL,BLACK); PieSlice(x,y,angle,angle+proc[i],100);
A:=(angle+angle+proc[i])/2; XN:=x+Round(110*Cos(A*Pi/180)); YN:=y-Round(110*Sin(A*Pi/180)); if (A>90) and (A<270) then Settextjustify(Righttext,0) else Settextjustify(lefttext,0); SetColor(WHITE); str(tabl[i].sot,prs); Outtextxy(XN,YN,prs); angle := angle + proc[i]; end; end; ReadKey; end; {рисовать график} CloseGraph; end; {вывод диаграммы}
-Андрей-, можешь привести программу, показывающую возникновение "дырки"? Потому, что не вполне понятно, при каких именно условиях она возникает, какие именно действия ты ДО этого производил?
И, желательно, описание типов, потому что твой код даже откомпилировать сразу не получится...
Вот полный код. Ввод - удачный, график 0- все ОК!! Удаление - в графике получается ДЫРКА!!! Сроки поджимают!!!
Код
program Kursovik; uses Graph,Crt; const MAX = 10; {максимальное количество мест} type item = record fio : string[100]; sot : integer; year : byte; busy : boolean; end; table = array[1..MAX] of item; {массив из MAX записей}
function FindFree(tabl : table) : Integer; var i : Integer; begin {ищет первую свободную ячейку} FindFree := -1; {нет свободных} for i := 1 to MAX do if (tabl[i].busy=FALSE) then begin {нашли свободную ячейку} FindFree := i; break; {конец цикла} end; {нашли свободную ячейку} end; {ищет первую свободную ячейку}
procedure DelSad(var tabl : table); var no,i : Integer; found : boolean; mar : string; begin writeln('Vvedite F.I.O. dlya udaleniya: '); readln(mar); found :=False; {не найден} for i := 1 to MAX do if(tabl[i].busy=TRUE)and(tabl[i].fio = mar)then begin tabl[i].busy:=FALSE; found:=TRUE; {нашли} break; end; if(found)then writeln('Yacheika teper svobodna') else writeln('Ukazanniy F.I,O. ne neyden!.'); end;
procedure SaveFile(tabl : table); var f : file of table; name : string; begin write('Vvedite imya faila (naprimer, my.txt): '); readln(name); assign(f,name); {$i-} rewrite(f); {$i+} if IOResult=0 then begin {если нет ошибки} write(f,tabl); close(f); writeln('Dannie zapisani.');
end {если нет ошибки} else writeln('OSHIBKA vvoda\vivoda!'); end;
procedure LoadFile(var tabl : table); var f : file of table; name : string; begin write('Vvedite imya faila (naprimer, my.txt): '); readln(name); assign(f,name); {$i-} reset(f); {$i+} if IOResult=0 then begin {если файл найден} read(f,tabl); close(f); writeln('Vse v poryadke. Dannie uspeshno prochitani.'); end {если файл найден} else writeln('Fail ne nayden.'); end;
procedure Help; begin textcolor(LIGHTRED); writeln('Help dlya programmy'); textcolor(LIGHTGRAY); writeln('Programma pozvolyaet vesti bazu sadovodov,'); writeln('sortirovat ih,sohranyat v fail, a tak zhe'); writeln('vivodit grafik'); end;
procedure Sort(var tabl : table); var i,j : Integer; temp : item; tabl2 : table; mx : Integer; begin mx:=FindFree(tabl)-1; for i:= 1 to mx do begin temp := tabl[i]; j:=i-1; while((j >= 1)and(tabl[j].sot> temp.sot))do begin tabl[j+1] := tabl[j]; j:=j-1; end; tabl[j+1]:= temp; end; writeln('Sortirovka zavershena.'); end;
procedure Tablica(tabl : table); var i : Integer; begin {вывод таблицы} writeln('Dannie'); for i :=1 to MAX do if tabl[i].busy then writeln('F.I.O. = ',tabl[i].fio,' Sotka = ',tabl[i].sot,' Godovoy vznos = ',tabl[i].year, ' Itogo = ',(tabl[i].sot)*(tabl[i].year)); end; {вывод таблицы}
procedure Diagramma(tabl : table); var i,dr,md : Integer; x,y : Integer; angle : Integer; sum : Integer; proc : array[1..MAX] of LongInt; {для расчета углов диаграммы} last : Integer; have : Integer; A : real; xn,yn : Integer; prs : string; begin {вывод диаграммы} dr := DETECT; {инициализация графики} md := 0; InitGraph(dr,md,''); if GraphResult <> grOk then begin writeln('Ne naiden fail EGAVGA.BGI'); end else begin {рисовать график} SetColor(GREEN); Rectangle(0,0,GetMaxX,GetMaxY); SetFillSTyle(SOLIDFILL,LIGHTGRAY); FloodFill(1,1,GREEN);
SetColor(BLUE); OutTextXY(10,10,'Diagramma');
sum := 0; last := 1; for i:=1 to MAX do if tabl[i].busy then sum := sum + tabl[i].sot; have := 0; for i:=1 to MAX do if tabl[i].busy then begin proc[last] := tabl[i].sot; proc[last] := proc[i]*360; proc[last] := proc[i] div sum; have := have + proc[last]; last := last + 1; end;
have := 360-have;
proc[last-1] := proc[last-1]+have; x := GetMaxX div 2; y := GetMaxY div 2; Angle := 0;
for i:=1 to MAX do begin if tabl[i].busy then begin if(i<>LIGHTGRAY)then SetFillStyle(SOLIDFILL,i) else SetFillStyle(SOLIDFILL,BLACK); PieSlice(x,y,angle,angle+proc[i],100);
A:=(angle+angle+proc[i])/2; XN:=x+Round(110*Cos(A*Pi/180)); YN:=y-Round(110*Sin(A*Pi/180)); if (A>90) and (A<270) then Settextjustify(Righttext,0) else Settextjustify(lefttext,0); SetColor(WHITE); str(tabl[i].sot,prs); Outtextxy(XN,YN,prs); angle := angle + proc[i]; end; end; ReadKey; end; {рисовать график} CloseGraph; end; {вывод диаграммы}
procedure Find(tabl : table); var i : Integer; s : String; begin {поиск} write('Vvedit F.I.O. dlya poiska: '); readln(s); writeln('Rezultat'); for i :=1 to MAX do if(tabl[i].busy)and(tabl[i].fio=s)then writeln('F.I.O. = ',tabl[i].fio,' Sotka = ',tabl[i].sot, ' Godovoy vznos = ',tabl[i].year, ' Itogo = ',tabl[i].sot*tabl[i].year); end; {поиск}