PROGRAM SUM; {projde soubor s knihovnou programu a postara se o poradova cisla} CONST MXL=48; VAR I,CIS, PROGRAMU, CELKEMPROGRAMU, SOUBORU, SOUBORUVKAPITOLE, CELKEMSOUBORU, RADEK, STARYRADEK, STARECIS : INTEGER; CTVRTY : CHAR; NUM : ARRAY [0..2] OF CHAR; L,S : ARRAY [0..MXL] OF CHAR; F : FILE OF TEXT; ZACATEK, NOVAKAPITOLA, BYLKOTROLNISOUCET, DALSIVERZE, NOVADALSIVERZE, BYLATECKA, BYLZNAK : BOOLEAN; PROCEDURE KONTROLA; PROCEDURE SUMCHECKERROR; BEGIN WRITELN('?SUM-W-Chyba v cislovani na radku ',RADEK:1,'.'); WRITELN('Radek cislo ',STARYRADEK:1,':',S); WRITELN('Radek cislo ',RADEK:1,':',L); END; BEGIN IF NOVAKAPITOLA THEN BEGIN IF BYLZNAK AND BYLATECKA THEN BEGIN BYLZNAK:=FALSE; BYLATECKA:=FALSE; DALSIVERZE:=FALSE; END; IF (NOT(STARECIS+1=CIS)) OR DALSIVERZE THEN IF NOT(DALSIVERZE) AND (CIS>0) THEN SUMCHECKERROR ELSE IF STARECIS<>CIS THEN IF NOT(NOVADALSIVERZE) THEN SUMCHECKERROR; STARECIS:=CIS; END; END; PROCEDURE PREVEDNACISLO; VAR I : INTEGER; UZNENICISLO : BOOLEAN; BEGIN NUM:=' '; CIS:=0; UZNENICISLO:=FALSE; FOR I:=0 TO 2 DO IF (L[I]>='0') AND (L[I]<='9') AND NOT(UZNENICISLO) THEN NUM[I]:=L[I] ELSE UZNENICISLO:=TRUE; IF NUM[1]=CHR(32) THEN BEGIN NUM[2]:=NUM[0]; NUM[1]:=CHR(32); NUM[0]:=CHR(32); END ELSE IF NUM[2]=CHR(32) THEN BEGIN NUM[2]:=NUM[1]; NUM[1]:=NUM[0]; NUM[0]:=CHR(32); END; IF NUM[0]='1' THEN CIS:=100; IF NUM[0]='2' THEN CIS:=200; IF NUM[0]='3' THEN CIS:=300; IF NUM[0]='4' THEN CIS:=400; IF NUM[0]='5' THEN CIS:=500; IF NUM[0]='6' THEN CIS:=600; IF NUM[0]='7' THEN CIS:=700; IF NUM[0]='8' THEN CIS:=800; IF NUM[0]='9' THEN CIS:=900; IF NUM[1]='1' THEN CIS:=CIS+10; IF NUM[1]='2' THEN CIS:=CIS+20; IF NUM[1]='3' THEN CIS:=CIS+30; IF NUM[1]='4' THEN CIS:=CIS+40; IF NUM[1]='5' THEN CIS:=CIS+50; IF NUM[1]='6' THEN CIS:=CIS+60; IF NUM[1]='7' THEN CIS:=CIS+70; IF NUM[1]='8' THEN CIS:=CIS+80; IF NUM[1]='9' THEN CIS:=CIS+90; IF NUM[2]='1' THEN CIS:=CIS+1; IF NUM[2]='2' THEN CIS:=CIS+2; IF NUM[2]='3' THEN CIS:=CIS+3; IF NUM[2]='4' THEN CIS:=CIS+4; IF NUM[2]='5' THEN CIS:=CIS+5; IF NUM[2]='6' THEN CIS:=CIS+6; IF NUM[2]='7' THEN CIS:=CIS+7; IF NUM[2]='8' THEN CIS:=CIS+8; IF NUM[2]='9' THEN CIS:=CIS+9; IF ZACATEK THEN BEGIN IF CTVRTY='1' THEN CIS:=CIS+1000; IF CTVRTY='2' THEN CIS:=CIS+2000; END; END; PROCEDURE SOUBORUJE; BEGIN WRITE('Soubor'); IF SOUBORUVKAPITOLE=1 THEN WRITE(' je') ELSE IF (SOUBORUVKAPITOLE>1) AND (SOUBORUVKAPITOLE<5) THEN WRITE('y jsou') ELSE WRITE('u je'); WRITELN(' v kapitole ',SOUBORUVKAPITOLE:1,'.'); END; PROCEDURE JEDENRADEK; VAR J,K,M : INTEGER; CISLO : BOOLEAN; PROCEDURE JECISLO; VAR X : INTEGER; UZNENICISLO : BOOLEAN; BEGIN CISLO:=FALSE; UZNENICISLO:=FALSE; FOR X:=M TO MXL DO BEGIN IF (L[X]>='0') AND (L[X]<='9') AND (NOT(UZNENICISLO)) THEN BEGIN CISLO:=TRUE; M:=X; (* M UKAZUJE NA POSLEDNI CISLO *) END ELSE UZNENICISLO:=TRUE; END; END; PROCEDURE SSOUB; VAR I : INTEGER; BEGIN IF ZACATEK THEN BEGIN FOR I:=0 TO MXL DO IF L[I]<>CHR(9) THEN BEGIN M:=I; I:=MXL+1; END; IF (L[M]='S') AND (L[M+1]='t') THEN BEGIN WRITE('?SUM-I-'); FOR I:=0 TO MXL DO IF L[I]<>CHR(9) THEN WRITE(L[I]); WRITELN; END; IF (L[M]='C') AND (L[M+1]='e') THEN BEGIN FOR I:=M TO MXL DO IF L[I]=' ' THEN BEGIN M:=I; I:=MXL+1; END; CTVRTY:=L[M+1]; L[0]:=L[M+2]; L[1]:=L[M+3]; L[2]:=L[M+4]; L[3]:=CHR(9); PREVEDNACISLO; IF CIS>0 THEN BEGIN CELKEMPROGRAMU:=CIS; CTVRTY:=L[M+25]; L[0]:=L[M+26]; L[1]:=L[M+27]; L[2]:=L[M+28]; L[3]:=CHR(9); PREVEDNACISLO; CELKEMSOUBORU:=CIS; ZACATEK:=FALSE; END; BEGIN END; END; END ELSE IF STARECIS>0 THEN BEGIN SOUBORU:=SOUBORU+1; SOUBORUVKAPITOLE:=SOUBORUVKAPITOLE+1; END; (* WRITELN(SOUBORU,STARECIS); *) END; BEGIN IF L[0]=CHR(9) THEN (* JE TO URCITE O.K. *) BEGIN SSOUB; (* WRITE(''); *) END ELSE (* MUZE TO BYT O.K. *) BEGIN M:=0; JECISLO; IF CISLO THEN BEGIN K:=M+1; (* K UKAZUJE ZA CISLO *) IF (L[K]=CHR(9)) THEN (* TYP: *) BEGIN (* WRITE(''); *) DALSIVERZE:=FALSE; NOVADALSIVERZE:=FALSE; BYLATECKA:=FALSE; BYLZNAK:=FALSE; PREVEDNACISLO; KONTROLA; SSOUB; END ELSE IF (L[K]='.') THEN (* TYP: <.> *) BEGIN M:=K+1; JECISLO; IF (CISLO) AND (L[M+1]=CHR(9)) THEN (* TYP: <.> *) BEGIN SSOUB; (* WRITE('<.>'); *) BYLATECKA:=TRUE; IF L[M]='1' THEN NOVADALSIVERZE:=TRUE ELSE NOVADALSIVERZE:=FALSE; PREVEDNACISLO; KONTROLA; DALSIVERZE:=TRUE; END ELSE (* TYP: <.><...> *) BEGIN NOVAKAPITOLA:=TRUE; DALSIVERZE:=FALSE; BYLATECKA:=FALSE; BYLZNAK:=FALSE; (* WRITE('<.><...>'); *) IF (NOT(BYLKOTROLNISOUCET)) AND (SOUBORUVKAPITOLE>0) THEN BEGIN WRITELN('?SUM-W-Chybi kontrolni soucet pred kapitolou na radku ', RADEK:1,'.'); WRITELN(L); SOUBORUJE; END; BYLKOTROLNISOUCET:=FALSE; (* IF (STARECIS>0) OR (SOUBORUVKAPITOLE>0) THEN WRITELN('V kapitole je ', STARECIS:3,' programu a ',SOUBORUVKAPITOLE:3,' souboru.'); *) PROGRAMU:=PROGRAMU+STARECIS; STARECIS:=0; SOUBORUVKAPITOLE:=0; END; END ELSE IF (L[K]='a') OR (L[K]='b') OR (L[K]='c') OR (L[K]='d') OR (L[K]='e') OR (L[K]='f') THEN (* TYP: *) BEGIN SSOUB; (* WRITE(''); *) BYLZNAK:=TRUE; IF L[K]='a' THEN NOVADALSIVERZE:=TRUE ELSE NOVADALSIVERZE:=FALSE; PREVEDNACISLO; KONTROLA; DALSIVERZE:=TRUE; END ELSE BEGIN IF L[K]='?' THEN (* TYP: *) BEGIN SSOUB; L[K]:=CHR(9); PREVEDNACISLO; KONTROLA; END ELSE (* TYP: *) BEGIN WRITELN('?SUM-W-Nejaky nesvar typu na radku ', RADEK:1,'!'); WRITELN(L); END; END; END ELSE (* NENI CISLO *); BEGIN IF (L[0]='(') AND (L[1]='*') THEN (* KONTROLNI SOUCET *) BEGIN BYLKOTROLNISOUCET:=TRUE; L[0]:=L[2]; L[1]:=L[3]; L[2]:=L[4]; L[3]:=CHR(9); PREVEDNACISLO; IF SOUBORUVKAPITOLE<>CIS THEN BEGIN WRITELN('?SUM-W-Chyba kontrolniho souctu na radku ',RADEK:1,'.'); WRITELN('Souboru je ',SOUBORUVKAPITOLE:1,'/',CIS:1,' (skutecne/uvedeno).'); SOUBORUVKAPITOLE:=0; END; END; END END; (* WRITELN; *) END; PROCEDURE CTISOUBOR; PROCEDURE CTIRADEK; VAR I:INTEGER; BEGIN IF L[0]<>CHR(9) THEN (* USCHOVA NAPOSLEDY OCISLOVANEHO RADKU *) BEGIN S:=L; STARYRADEK:=RADEK; END; FOR I:=0 TO MXL DO L[I]:=' '; I:=0; READLN(F); WHILE (NOT(EOLN(F))) AND (NOT(EOF(F))) AND (I<=MXL) DO BEGIN READ(F,L[I]); I:=I+1; END; END; BEGIN WHILE NOT(EOF(F)) DO BEGIN CTIRADEK; RADEK:=RADEK+1; JEDENRADEK; END; CLOSE(F); (* IF (STARECIS>0) OR (SOUBORUVKAPITOLE>0) THEN WRITELN('V kapitole je ', STARECIS:3,' programu a ',SOUBORUVKAPITOLE:3,' souboru.'); *) PROGRAMU:=PROGRAMU+STARECIS; IF NOT(BYLKOTROLNISOUCET) THEN BEGIN WRITELN('?SUM-W-Chybi kontrolni soucet v posledni kapitole.'); SOUBORUJE; END; END; (* MAIN *) BEGIN SOUBORU:=0; SOUBORUVKAPITOLE:=0; PROGRAMU:=0; STARECIS:=0; RADEK:=0; CELKEMPROGRAMU:=0; CELKEMSOUBORU:=0; CTVRTY:=' '; ZACATEK:=TRUE; NOVAKAPITOLA:=FALSE; DALSIVERZE:=FALSE; NOVADALSIVERZE:=FALSE; BYLATECKA:=FALSE; BYLZNAK:=FALSE; WRITELN; WRITELN('?SUM-I-Scitam programy a soubory v LIB1.SM5 ...'); RESET(F,'LIB1','SM5',I); IF I<1 THEN BEGIN WRITELN('?SUM-F-File not found DK:LIB1.SM5') END ELSE (* MAIN VETEV OF PROGRAM *) BEGIN CTISOUBOR; WRITELN; IF CELKEMPROGRAMU<>PROGRAMU THEN WRITE('Nes') ELSE WRITE('S'); WRITELN( 'ouhlasi uvedeny pocet programu:',CHR(9),CELKEMPROGRAMU:4); IF CELKEMPROGRAMU<>PROGRAMU THEN WRITELN('Spravny pocet programu ma byt: ',CHR(9),PROGRAMU:4); IF CELKEMSOUBORU<>SOUBORU THEN WRITE('Nes') ELSE WRITE('S'); WRITELN( 'ouhlasi uvedeny pocet souboru: ',CHR(9),CELKEMSOUBORU:4); IF CELKEMSOUBORU<>SOUBORU THEN WRITELN('Spravny pocet souboru ma byt: ',CHR(9),SOUBORU:4); WRITELN; WRITELN('(C) ROS, Kladno'); WRITELN; END; END.