- •Примеры вопросов письменного экзамена по курсу «Информатика» 2-й семестр.
- •Обработка файлов - типизированных и текстовых.
- •Данные типа указатель.
- •Методы разработки алгоритмов.
- •Вопрос 2.
- •Вопрос 3б. Метод конечных состояний.
- •Вопрос 1 «Обработка файлов», совмещенный с ««задачей на алгоритмизацию».
Данные типа указатель.
Элементы некоей динамической структуры данных могут указывать друг на друга, но каждый элемент может указывать не более чем на два. Имеется 5 элементов такой структуры данных, на рисунке обозначенные (1)-(5) и связанные, как показано на этом рисунке. Дана переменная «p» с заданным значением типа указатель на элемент, обозначенный (1).
Обменять значениями информации элементы, обозначенные (1) и (4).
Добавить 2 новых элемента со значением информации 123 и 234, связать их с имеющимися, как показано на рисунке пунктирными линиями.
Исключить элемент, обозначенный (5), и указатели на него.
Запрещено использовать операцию «Взятие адреса».
Ответ – Pascal:
PROGRAM pp; TYPE tt= RECORD d:INTEGER; r,l:^tt END; VAR p,r5:^tt; dd:INTEGER;
BEGIN dd:=p^.d; p^.d:=p^.l^.d; p^.l^.d:=dd;
r5:=p^.r; new(p^.r); p^.r^.d:=123; p^.r^.l:=nil;
new(p^.r^.r); p^.r^.r^.d:=234; p^.r^.r^.l:=nil; p^.r^.r^.r:=r5^.l;
r5^.l^.r:=nil; dispose(r5) END.
Ответ – C/C++:
main(){ struct tt{ int d; tt *r,*l;}; tt *p,*r5; int dd;
dd=p->d; p->d=p->l->d; p->l->d=dd;
r5=p->r; p->r=new(tt); p->r->d=123; p->r->l=NULL;
p->r->r=new(tt); p->r->r->d=234; p->r->r->l=NULL; p->r->r->r=r5->l;
r5->l->r=NULL; delete(r5);}
Методы разработки алгоритмов.
МЕТОД СТРУКТУРНЫХ ДИАГРАММ. Проверить входной текст на правильность в нижеописанном смысле. Синтаксис правильного текста описывается диаграммой:
При решении такого типа задач вполне допустимо предполагать обязательное наличие «упорчика» в конце файла – символа $. Это означает, что входной файл гарантированно не пустой, и позволяет избавиться от типовых технических «заморочек» в таких задачах. Использование массивов (и строковых переменных) для хранения входного текста снижает ценность решения.
Ответ – Pascal:
PROGRAM pp; VAR Vh: FILE OF CHAR; x: CHAR; LABEL 1,2;
BEGIN RESET(Vh); READ(Vh,x);
IF x='g' THEN BEGIN READ(Vh,x); IF x<>'d' THEN GOTO 1; READ(Vh,x) END
ELSE IF x='h' THEN BEGIN READ(Vh,x); IF x<>'g' THEN GOTO 1; READ(Vh,x) END ELSE GOTO 1;
IF x<>'f' THEN GOTO 1; READ(Vh,x);
WHILE x<>'g' DO
IF x='a' THEN BEGIN READ(Vh,x);
WHILE x<>'f' DO
IF x='x' THEN BEGIN READ(Vh,x);
IF x<>'u' THEN GOTO 1; READ(Vh,x) END
ELSE IF x='z' THEN BEGIN READ(Vh,x);
IF x<>'x' THEN GOTO 1; READ(Vh,x) END
ELSE GOTO 1;
READ(Vh,x);
IF x<>'g' THEN GOTO 1; READ(Vh,x)
END ELSE
IF (x='b')OR(x='c') THEN BEGIN
IF x='b' THEN BEGIN READ(Vh,x);
IF x<>'c' THEN GOTO 1; READ(Vh,x) END
ELSE BEGIN READ(Vh,x);
IF x<>'y' THEN GOTO 1; READ(Vh,x) END;
IF x<>'y' THEN GOTO 1; READ(Vh,x)
END ELSE GOTO 1;
READ(Vh,x);
IF x='$' THEN WRITELN('Текст правильный'); GOTO 2;
1: WRITELN('Текст неправильный'); 2: END.
Ответ – C/C++:
main(){ifstream Vh; char x; Vh.open(”Vh5.TXT”); Vh.get(x);
if(x=='g'){ Vh.get(x); if(x!='d') goto m1; Vh.get(x);}
else if(x=='h'){ Vh.get(x); if(x!='g') goto m1; Vh.get(x);}
else goto m1;
if(x!='f') goto m1; Vh.get(x);
while(x!='g')
if(x=='a'){ Vh.get(x);
while(x!='f')
if(x=='x'){ Vh.get(x);
if(x!='u') goto m1; Vh.get(x);}
else if(x=='z'){ Vh.get(x);
if(x!='x') goto m1; Vh.get(x);}
else goto m1;
Vh.get(x);
if(x!='g') goto m1; Vh.get(x);
} else
if((x=='b')||(x=='c')){
if(x=='b'){ Vh.get(x);
if(x!='c') goto m1; Vh.get(x);}
else { Vh.get(x);
if(x!='y') goto m1; Vh.get(x);}
if(x!='y') goto m1; Vh.get(x);
} else goto m1;
Vh.get(x);
if(x=='$') cout<<”Текст правильный”; goto m2;
m1: cout<<”Текст неправильный”; m2:; }
МЕТОД «СТЕКОВЫЕ АЛГОРИТМЫ». Проверить входной текст на правильность в нижеописанном смысле. Синтаксис правильного текста описывается рекурсивной диаграммой:
Пример правильного текста: a[b,c[d[e],f],g[h[i[k]]]]
|
текущий символ |
||||
a..z |
[ |
, |
] |
||
в вершине стека |
стек пустой |
I |
|
|
|
I |
|
[ |
[I [ |
I[I V |
|
V |
|
|
[V [ |
I[V V |
|
[ |
I |
|
|
|
|
В стеке: символ I соответствует обнаружению «простой переменной» (’a’..’z’) во входном тексте, символ V - «переменной с индексами»;
Пустая клетка означает ситуацию обнаружения ошибки; символ в клетке означает выполнение действия: положить в стек этот символ; слово1 слово2 означает действие: вытолкнуть из стека слово1 и положить слово2, причем слово должно лежать в стеке левой буквой вниз и, если в верхней части стека находится не слово1, то имеем ситуацию обнаружения ошибки.
Начинаем с пустого стека, текст правильный - если он сворачивается в символ стека I или V.
Ответ – Pascal:
PROGRAM pp; VAR vh:FILE OF CHAR; x:CHAR; s:ARRAY[1..100] OF CHAR; js:INTEGER;
LABEL 1,2; BEGIN RESET(vh); js:=0; WHILE NOT EOF(vh) DO BEGIN READ(vh,x);
IF (js=0)OR(s[js]= ’[’) THEN
IF (’a’<=x)AND(x<=’z’) THEN BEGIN js:=js+1; s[js]:=’I’ END ELSE GOTO 1
ELSE IF s[js]=’I’ THEN
IF x=’[’ THEN BEGIN js:=js+1; s[js]:=’[’ END ELSE
IF x=’,’ THEN IF (js>1)AND(s[js-1]=’[’) THEN js:=js-1 ELSE GOTO 1 ELSE
IF x=’]’ THEN IF (js>2)AND(s[js-1]=’[’)AND(s[js-2]=’I’)
THEN BEGIN js:=js-2; s[js]:=’V’ END ELSE GOTO 1 ELSE
GOTO 1
ELSE IF s[js]=’V’ THEN
IF x=’,’ THEN IF (js>1)AND(s[js-1]=’[’) THEN js:=js-1 ELSE GOTO 1 ELSE
IF x=’]’ THEN IF (js>2)AND(s[js-1]=’[’)AND(s[js-2]=’I’)
THEN BEGIN js:=js-2; s[js]:=’V’ END ELSE GOTO 1 ELSE
GOTO 1
END; IF (js=1)AND((s[js]=’I’)OR(s[js]=’V’)) THEN WRITELN(’Да’)
ELSE WRITELN(’Нет’); GOTO 2; 1:WRITELN(’Нет’); 2: END.
Ответ – C/C++:
main(){ifstream vh; char x,s[100]; int js; vh.open("vh.TXT"); js=-1;
while(vh.peek()!=EOF){ vh.get(x);
if((js==-1)||(s[js]=='['))
if(('a'<=x)&&(x<='z')){ js=js+1; s[js]='I';} else goto m1;
else if(s[js]=='I')
if(x=='['){ js=js+1; s[js]='[';} else
if(x==',') if((js>0)&&(s[js-1]=='[')) js=js-1; else goto m1; else
if(x==']') if((js>1)&&(s[js-1]=='[')&&(s[js-2]=='I'))
{ js=js-2; s[js]='V';} else goto m1; else
goto m1;
else if(s[js]=='V')
if(x==',') if((js>0)&&(s[js-1]=='[')) js=js-1; else goto m1; else
if(x==']') if((js>1)&&(s[js-1]=='[')&&(s[js-2]=='I'))
{ js=js-2; s[js]='V';} else goto m1; else
goto m1;
} if((js==0)&&((s[js]=='I')||(s[js]=='V'))) cout<<"YES-Да";
else cout<<"NO-Нет"; goto m2; m1:cout<<"NO-Нет"; m2:;}
ДРУГИЕ ПРИМЕРЫ ВОПРОСОВ.
Типовой вариант содержит 4 основных вопроса и 5-й – «задача на алгоритмизацию и аккуратную реализацию алгоритма». Но вопросы некоторых видов могут быть совмещены в одной задаче.
