_13th_Dragon napisał(a)
A co będzie jak w pliku będą trzy wiersze (dosłownie): walec; radius; wysokość ? Mam taką generalną radę, jak nie chce ci się obsługiwać wszystkich przypadków to dawaj odpowiedzi fragmentaryczne - fragment kodu.
Jak to nie chce? Wystarczy chyba, że przedstawiłem sposób zabezpieczenia wczytywania przed mniejszą ilością linii niż jest to wymagane do obliczeń; Z Twojego komentarza można śmiało wywnioskować, że miałem podać gotowe rozwiązanie (tzw. gotowca); Dlaczego to ja mam myśleć o wszystkich zabezpieczeniach? Czy to mój program? Dla mnie on jest? Ja rozumiem, że jak już podawać jakieś rozwiązanie to opisać jego wszystkie aspekty, jednak robiąc to odbieram autorowi wątku całą przyjemność główkowania i kodzenia; Może tak by wypadało...? Nie mam zdania; Jednak jeśli autorowi programu zależy na jego ukończeniu to myślę, że łaski nie zrobi jak coś sam doda do mojego programu, lub napisze swój podpatrując sposoby z mojego kodu;
Co prawda mój algorytm nie jest idealny i na pewno można go zrobić prościej i szybciej, ale nie miałem zbyt wiele czasu i podałem tylko częściowe rozwiązanie (o które de facto @_13th_Dragon poprosiłeś w komentarzu); Jak by na to nie popatrzyć - fragment zabezpieczeń jest - resztę banalnie doinstalować do kodu;
Rozumiem, że nie zostało wykonane sprawdzenie istnienia pliku z danymi, ale chyba nie problem dodać jeden warunek; To samo tyczy się konwersji danych wejściowych (prawdopodobnych danych liczbowych);
No nic, nie czas się kłócić; Jeśli komukolwiek na tym zależy - podam pełne rozwiązanie; Dodam jeszcze informację, że wykorzystując przedstawiony przeze mnie kod i nieznacznie go modyfikując można śmiało obsłużyć wiele figur; Wystarczy zmienić trochę warunek sprawdzający nazwę figury i dodać kolejne warunki dla innych figur; Reszta pozostaje bez zmian; Oczywiście można dodać dodatkowe stałe (dla walca ROLLER_RADIUS oraz ROLLER_HEIGHT) określające indeks elementu w macierzy dla innych figur, ale można to zrobić ręcznie bez ich użycia; Kwestia gustu i oszczędności pamięci; Jeśli ktoś będzie chciał - z chęcią pokażę w jaki sposób dokonać takowych zmian;
Na prośbę @_13th_Dragon (No to przedstawiaj fragmenty, odpowiedzialne za to lub tamto. Jak już podajesz całość to podaj CAŁOŚĆ.) przedstawiam całość - komplet różnych zabezpieczeń (pewnie nie wszystkich, ale co tam...); Obsługę pliku umieściłbym w bloku try .. finally .. end, ale mam z nim problem pod FPC 2.6.0; Zamieniłem także słowa Figure na Block - to bryły, nie figury... Oto kod:
Kopiuj
program Blocks;
uses
Crt,
SysUtils;
const
PI = 3.14;
const
ROLLER_RADIUS = 0;
ROLLER_HEIGHT = 1;
const
CUBOID_BASE_WIDTH = 0;
CUBOID_BASE_LENGTH = 1;
CUBOID_HEIGHT = 2;
const
CONE_RADIUS = 0;
CONE_HEIGHT = 1;
var
fBlockData: Text;
sInputFileName, sBlockName, sNumber: String;
aBlockProps: array of Integer;
iNumber: LongInt;
var
rBase, rSurface, rVolume, rForming: Real;
begin
ClrScr;
sInputFileName := 'C:\Dane.txt';
if not FileExists(sInputFileName) then
begin
Write('Plik "', sInputFileName, '" nie istnieje!');
ReadLn;
Halt;
end;
Assign(fBlockData, sInputFileName);
Reset(fBlockData);
SetLength(aBlockProps, 0);
if not EoF(fBlockData) then
begin
ReadLn(fBlockData, sBlockName);
sBlockName := UpperCase(sBlockName);
while not EoF(fBlockData) do
begin
ReadLn(fBlockData, sNumber);
SetLength(aBlockProps, Length(aBlockProps) + 1);
if TryStrToInt(sNumber, iNumber) and (iNumber > 0) then
aBlockProps[High(aBlockProps)] := iNumber
else
begin
Write('Wczytano niewlasciwa wartosc!');
ReadLn;
Halt;
end;
end;
if sBlockName = 'WALEC' then
begin
if Length(aBlockProps) >= 2 then
begin
rBase := PI * Sqr(aBlockProps[ROLLER_RADIUS]);
rSurface := rBase * 2 + 2 * PI * Sqr(aBlockProps[ROLLER_HEIGHT]);
rVolume := rBase * aBlockProps[ROLLER_HEIGHT];
WriteLn('Walec - obliczenia'#10);
WriteLn('Promien podstawy: ', aBlockProps[ROLLER_RADIUS]);
WriteLn('Wysokosc: ', aBlockProps[ROLLER_HEIGHT]);
WriteLn('Pole powierzchni: ', rSurface:5:2);
Write('Objetosc: ', rVolume:5:2);
end
else
Write('Zbyt malo danych do obliczen dla walca!');
end
else
if sBlockName = 'PROSTOPADLOSCIAN' then
begin
if Length(aBlockProps) >= 3 then
begin
rBase := aBlockProps[CUBOID_BASE_WIDTH] *
aBlockProps[CUBOID_BASE_LENGTH];
rSurface := rBase * 2 + 2 * aBlockProps[CUBOID_BASE_WIDTH] *
aBlockProps[CUBOID_HEIGHT] + 2 *
aBlockProps[CUBOID_BASE_LENGTH] *
aBlockProps[CUBOID_HEIGHT];
rVolume := rBase * aBlockProps[CUBOID_HEIGHT];
WriteLn('Prostopadloscian - obliczenia'#10);
WriteLn('Szerokosc podstawy: ', aBlockProps[CUBOID_BASE_WIDTH]);
WriteLn('Dlugosc podstawy: ', aBlockProps[CUBOID_BASE_LENGTH]);
WriteLn('Wysokosc bryly: ', aBlockProps[CUBOID_HEIGHT]);
WriteLn('Pole powierzchni: ', rSurface:5:2);
Write('Objetosc: ', rVolume:5:2);
end
else
Write('Zbyt malo danych do obliczen dla prostopadloscianu!');
end
else
if sBlockName = 'STOZEK' then
begin
if Length(aBlockProps) >= 2 then
begin
rBase := PI * Sqr(aBlockProps[CONE_RADIUS]);
rForming := Sqrt(Sqr(aBlockProps[CONE_RADIUS]) +
Sqr(aBlockProps[CONE_HEIGHT]));
rSurface := rBase + PI * aBlockProps[CONE_RADIUS] * rForming;
rVolume := rBase * aBlockProps[CONE_HEIGHT] / 3;
WriteLn('Stozek - obliczenia'#10);
WriteLn('Promien podstawy: ', aBlockProps[CONE_RADIUS]);
WriteLn('Wysokosc: ', aBlockProps[CONE_HEIGHT]);
WriteLn('Tworzaca: ', rForming:5:2);
WriteLn('Pole powierzchni: ', rSurface:5:2);
Write('Objetosc: ', rVolume:5:2);
end
else
Write('Zbyt malo danych do obliczen dla stozka!');
end
else
Write('Brak obslugi bryly o nazwie "', sBlockName, '" !');
end
else
Write('Plik jest pusty!');
Close(fBlockData);
ReadLn;
end.
Nie jest doskonały, ale cóż... Działa bez zarzutu, zabezpieczenia spełniają swoje zadanie bardzo dobrze; Można przerobić ten kod na bardziej proceduralny - jeśli trzeba, autor wątku będzie miał zajęcie;
@buczuch - obejrzyj kod - mam nadzieję, że Ci się przyda;