Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2-y_semestr_Primery_voprosov_pismennogo_ekza.doc
Скачиваний:
13
Добавлен:
13.08.2019
Размер:
120 Кб
Скачать
☆
  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);}

  1. Методы разработки алгоритмов.

  • МЕТОД СТРУКТУРНЫХ ДИАГРАММ. Проверить входной текст на правильность в нижеописанном смысле. Синтаксис правильного текста описывается диаграммой:

При решении такого типа задач вполне допустимо предполагать обязательное наличие «упорчика» в конце файла – символа $. Это означает, что входной файл гарантированно не пустой, и позволяет избавиться от типовых технических «заморочек» в таких задачах. Использование массивов (и строковых переменных) для хранения входного текста снижает ценность решения.

Ответ – 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-й – «задача на алгоритмизацию и аккуратную реализацию алгоритма». Но вопросы некоторых видов могут быть совмещены в одной задаче.