Задача 5. Слова

В файле INPUT.TXT записан некоторый русский текст. Переписать все сло­ва текста, содержащие наиболее часто встречающуюся в тексте букву, в файл OUTPUT.TXT и найти самое длинное из них.

{ Решение задачи 5 на языке PASCAL } FUNCTION RusUpCase(c:Char):Char;

BEGIN

IF c IN ['а'..'п'] THEN RusUpCase:=Chr(Ord(c)-Ord('a')+Ord('A'))

ELSE

IF c IN ['р'..'я'] THEN RusUpCase:=Chr(Ord(c)-Ord('р')+Ord('Р')) ELSE RusUpCase:=c;

END;

VAR f1,f2  : Text; c,m    : Char; s,ss    : String; Flag   : Boolean;

L      : ArrayrA'./Я'] Of LongInt; CONST Letters=['a'..'п','р'..'я','A'..'Я']; BEGIN Assign(f1,'input.txt');

{$I-}

Reset(f1);

IF IOResult<>0 THEN BEGIN

WriteLn('Фaйл input.txt не найден'); Halt; END;

Assign(f2,'output.txt'); Rewrite(f2); FillChar(L,SizeOf(L),0); WHILE NOT EOF(f1) DO BEGIN Read(f1,c);

IF c IN Letters THEN Inc(L[RusUpCase(c)]);

m:='A'; FOR c:='B' TO 'Я' DO IF L[c]>L[m] THEN m:=c; WriteLn('нaибoлee часто встречается в тексте буква "',m,'"');

Reset(f1);

WHILE NOT EOF(f1) DO BEGIN Read(f1,c);

IF c IN Letters THEN BEGIN s:=''; Flag:=FALSE; WHILE c IN Letters DO BEGIN

IF RusUpCase(c)=m THEN Flag:=TRUE;

s:=s+c; Read(f1,c);

END;

IF Flag THEN WriteLn(f2,s);

END;

END; Close(f2);

Writeln('слoвa текста, сoдepжaщиe букву "',m,'", записаны в файл output.txt');

Reset(f2); ss:='';

WHILE NOT EOF(f2) DO BEGIN

ReadLn(f2,s);

IF Length(s)>Length(ss) THEN ss:=s;

END;

Writeln('сaмoe длинное из таких слов :"',ss,'"');

END.

/* Решение задачи 5 на языке C */ #include<stdio.h> #include<stdlib.h> #include<string.h>

char *LowRussian="aбвгдeжзийклмнoпpстуфхцчшщъыьэюя";

char *UpRussian ="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";

int RusUpCase(char c){char*p;

if(p=strchr(LowRussian,c))return *(UpRussian+(p-LowRussian)); return c;} int Letter(char c){return strchr(LowRussian,c)||strchr(UpRussian,c);} void main(void) {

FILE*f1,*f2; char c,m,flag,i;

long L[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

char*s=malloc(81),*ss=malloc(81); if((f1=fopen("input.txt","r"))==NULL){ printf("\nФaйл input.txt не нaйдeн\n"); exit(7);} f2=fopen("output.txt","w+");

do{c=fgetc(f1);if(Letter(c))L[RusUpCase(c)-'A']++;}while(c!=EOF); m=0;for(c=1;c<=31;c++)if(L[c]>L[m])m=c; m+='A';

printf("\nнaибoлее часто встречается в тексте буква %c",m);

fseek(f1,0,SEEK_SET);

while(!feof(f1)){c=fgetc(f1);

if(Letter(c)){i=-1;flag=0;

while(Letter(c)){if(RusUpCase(c)==m)flag=1;s[++i]=c;c=fgetc(f1);} s[++i]='\0';if(flag)fprintf(f2,"%s\n",s);}} printf("\nслoвa текста, содержащие букву \"%c\", записаны в файл output.txt",m);

fseek(f2,0,SEEK_SET); strcpy(ss,"");

do{i=fscanf(f2,"%s",s);if(strlen(s)>strlen(ss))strcpy(ss,s);}while(i!=EOF); printf("\nсaмoе длинное из таких слов :\"%s\"",ss); fclose(f1); fclose(f2);}

C Решение задачи 5 на языке FORTRAN

BLOCK DATA

CHARACTER*32 Low,Up

COMMON/Russian/Low,Up

DATA Low,Up/'aбвгдежзийклмнoпрстуфхцчшщъыьэюя', * 'AБВГДEЖЗИЙКЛMНOПРCTУФXЦЧШЩЪЫЬЭЮЯ'/

END

INTEGER FUNCTION Number(c) COMMON/Russian/Low,Up

CHARACTER c,Low*32,Up*32

i=INDEX(Low,c)

IF(i)2,2,1

1 Number=i

RETURN

2 Number=INDEX(Up,c) END

LOGICAL FUNCTION Letter(c) COMMON/Russian/Low,Up

CHARACTER c,Low*32,Up*32 Letter=INDEX(Low,c).GT.O.OR.INDEX(Up,c).GT.O

END

INTEGER FUNCTION Length(s)

CHARACTER*(*) s

L=LEN(s)

DO WHILE(L.GT.O.AND.(s(L:L).EQ.' '.OR.s(L:L).EQ.CHAR(0)))

L=L-1 ENDDO

Length=L

END

LOGICAL Flag,Letter

INTEGER*4 L(32)/32*0/ CHARACTER*79 s/' '/,ss,Low*32,Up*32

COMMON/Russian/Low,Up

OPEN(1,FILE='input.txt',MODE='READ',STATUS='OLD',ERR=101) GOTO 102

101 STOP'фaйл input.txt не найден'

102 OPEN(2,FILE='output.txt',MODE='READWRITE',STATUS='UNKNOWN')

103 READ(1,FMT='(A)',END=105)s

DO 104 i=1,Length(s)

IF(Letter(s(i:i))) THEN ip=Number(s(i:i)) L(ip)=L(ip)+1

ENDIF

104 CONTINUE GOTO 103

105 m=1

DO 10б i=2,32

IF(L(i).GT.L(m))m=i

106 CONTINUE

PRINT*,'нaибoлее часто встречается в тексте буква "',Up(m:m),'"'

REWIND 1

107 READ(1,FMT='(A)',END=108)s

i=1

DO WHILE(i.LE.Length(s))

IF(Letter(s(i:i))) THEN

Flag=.FALSE.

j=0

ss=' '

DO WHILE(i.LE.Length(s).AND.Letter(s(i:i))) IF(Number(s(i:i)).EQ.m)Flag=.TRUE.

j=j+1

ss(j:j)=s(i:i)

i=i+1

ENDDO

IF(Flag)WRITE(2,FMT='(79A1)')(ss(j:j),j=1,Length(ss)) ELSE

i=i+1

ENDIF ENDDO GOTO 107

108 PRINT*,'слoвa текста, содержащие букву "',Up(m:m),'", записаны в ф *айл output.txt'

REWIND 2

ss=' '

109 READ(2,FMT='(A)',END=110)s IF(Length(s).GT.Length(ss))ss=s GOTO 109

110 PRiNT*,'caMoe длинное из таких слов :"',(ss(i:i),i=1,Length(ss)),

CLOSE(1) CLOSE(2)

END