.RU

Андрей Богатырев. Хрестоматия по программированию на Си в Unix © Copyright Андрей Богатырев. 1992-95 - страница 11



задан список слов; она проверяет - является ли введенное вами слово словом из списка.

Если нет - пытается найти наиболее похожее слово из списка, причем если есть нес-

колько похожих - выдает все варианты. Отлавливайте случаи:

- две соседние буквы переставлены местами: ножинцы=>ножницы;

- удвоенная буква (буквы): ккаррандаш=>карандаш;

- потеряна буква: бот=>болт;

- измененная буква: бинт=>бант;

- лишняя буква: морда=>мода;

- буквы не в том регистре - сравните с каждым словом из списка, приводя все буквы

к маленьким: сОВОк=>совок;


Надо проверять каждую букву слова. Возможно вам будет удобно использовать рекурсию.

Подсказка: для некоторых проверок вам может помочь функция match:


слово_таблицы = "дом";

if(strlen(входное_слово) <= strlen(слово_таблицы)+1 &&

match(входное_слово, "*д*о*м*") ... /* похоже */

*о*м* ?дом дом?

*д*м* д?ом

*д*о* до?м


Приведем вариант решения этой задачи:


А. Богатырев, 1992-95 - 322 - Си в UNIX


#include

#include

#include


typedef unsigned char uchar;

#define ANYCHAR '*'

/* символ, сопоставляющийся с одной любой буквой */


static uchar version[120]; /* буфер для генерации вариантов */

static uchar vv; /* буква, сопоставившаяся с ANYCHAR */


/* привести все буквы к одному регистру */

static uchar icase(uchar c){

return isupper(c) ? tolower(c) : c;

}


/* сравнение строк с игнорированием регистра */

static int eqi(uchar *s1, uchar *s2 )

{

while( *s1 && *s2 ){

if( icase( *s1 ) != icase( *s2 ))

break;

s1++; s2++;

}

return ( ! *s1 && ! *s2 ) ? 1 : 0 ;

/* OK : FAIL */

}


/* сравнение строк с игнорированием ANYCHAR */

static strok(register uchar *word, register uchar *pat)

{

while( *word && *pat ){

if( *word == ANYCHAR){

/* Неважно, что есть *pat, но запомним */

vv= *pat;

} else {

if( icase(*pat) != icase(*word) )

break;

}

word++; pat++;

}

/* если слова кончились одновременно ... */

return ( !*word && !*pat) ? 1 : 0;

/* OK : FAIL */

}


А. Богатырев, 1992-95 - 323 - Си в UNIX


/* ЛИШНЯЯ БУКВА */

static int superfluous( uchar *word /* слово для коррекции */

, uchar *s /* эталон */

){

register int i,j,k;

int reply;

register len = strlen(word);


for(i=0 ; i < len ; i++){

/* генерим слова , получающиеся удалением одной буквы */

k=0;

for(j=0 ; j < i ; j++)

version[k++]=word[j];

for(j=i+1 ; j < len ; j++)

version[k++]=word[j];

version[k]='\0';

if( eqi( version, s )) return 1; /* OK */

}

return 0; /* FAIL */

}


/* ПОТЕРЯНА БУКВА */

static int hole; /* место, где вставлена ANYCHAR */

static int lost(uchar *word, uchar *s)

{

register int i,j,k;

register len = strlen(word);


hole= (-1);

for(i=0 ; i < len+1 ; i++){

k=0;

for(j=0 ; j < i ; j++)

version[k++]=word[j];

version[k++]=ANYCHAR;

for(j=i ; j < len ; j++)

version[k++]=word[j];

version[k]='\0';

if( strok( version, s )){

hole=i;

return 1; /* OK */

}

}

return 0; /* FAIL */

}


А. Богатырев, 1992-95 - 324 - Си в UNIX


/* ИЗМЕНИЛАСЬ ОДНА БУКВА (включает случай ошибки регистра) */

static int changed(uchar *word, uchar *s)

{

register int i,j,k;

register len = strlen(word);


hole = (-1);

for(i=0 ; i < len ; i++){

k=0;

for( j=0 ; j < i ; j++)

version[k++]=word[j];

version[k++]=ANYCHAR;

for( j=i+1 ; j < len ; j++)

version[k++]=word[j];

version[k]='\0';

if( strok( version,s)){

hole=i;

return 1; /* OK */

}

}

return 0; /* FAIL */

}


/* УДВОЕННАЯ БУКВА */

static int duplicates(uchar *word, uchar *s, int leng)

{

register int i,j,k;

uchar tmp[80];


if( eqi( word, s )) return 1; /* OK */


for(i=0;i < leng - 1; i++)

/* ищем парные буквы */

if( word[i]==word[i+1]){

k=0;

for(j=0 ; j < i ; j++)

tmp[k++]=word[j];

for(j=i+1 ; j < leng ; j++)

tmp[k++]=word[j];

tmp[k]='\0';

if( duplicates( tmp, s, leng-1) == 1)

return 1; /* OK */

}

return 0; /* FAIL */

}


А. Богатырев, 1992-95 - 325 - Си в UNIX


/* ПЕРЕСТАВЛЕНЫ СОСЕДНИЕ БУКВЫ */

static int swapped(uchar *word, uchar *s)

{

register int i,j,k;

register len = strlen(word);


for(i=0;i < len-1;i++){

k=0;

for(j=0 ; j < i ; j++)

version[k++]=word[j];

version[k++]=word[i+1];

version[k++]=word[i];

for(j=i+2 ; j < len ; j++)

version[k++]=word[j];

version[k]='\0';

if( eqi( version, s))

return 1; /* OK */

}

return 0; /* FAIL */

}


uchar *words[] = {

(uchar *) "bag",

(uchar *) "bags",

(uchar *) "cook",

(uchar *) "cool",

(uchar *) "bug",

(uchar *) "buy",

(uchar *) "cock",

NULL

};


#define Bcase(x, operators) case x: { operators; } break;


char *cname[5] = {

"переставлены буквы",

"удвоены буквы ",

"потеряна буква ",

"ошибочная буква ",

"лишняя буква "

};


А. Богатырев, 1992-95 - 326 - Си в UNIX


static int spellmatch( uchar *word /* IN слово для коррекции */

, uchar *words[] /* IN таблица допустимых слов */

, uchar **indx /* OUT ответ */

){

int i, code, total = (-1);

uchar **ptr;


if(!*word) return -1;


for(ptr = words; *ptr; ++ptr)

if(eqi(word, *ptr)){

if(indx) *indx = *ptr;

return 0;

}

/* Нет в таблице, нужен подбор похожих */

for(ptr = words; *ptr; ++ptr){

uchar *s = *ptr;

int max = 5;

for(i=0; i < max; i++){

switch( i ){

Bcase(0,code = swapped(word, s) )

Bcase(1,code = duplicates(word, s, strlen(word)) )

Bcase(2,code = lost(word, s) )

Bcase(3,code = changed(word, s) )

Bcase(4,code = superfluous(word, s) )

}


if(code){

total++;

printf("?\t%s\t%s\n", cname[i], s);

if(indx) *indx = s;


/* В случае с дубликатами не рассматривать

* на наличие лишних букв

*/

if(i==1) max = 4;

}

}

}

return total;

}


А. Богатырев, 1992-95 - 327 - Си в UNIX


void main(){

uchar inpbuf[BUFSIZ];

int n;

uchar *reply, **ptr;


setlocale(LC_ALL, "");

for(ptr = words; *ptr; ptr++)

printf("#\t%s\n", *ptr);


do{

printf("> "); fflush(stdout);

if(gets((char *)inpbuf) == NULL) break;


switch(spellmatch(inpbuf, words, &reply)){

case -1:

printf("Нет такого слова\n"); break;

case 0:

printf("Слово '%s'\n", reply); break;

default:

printf("Неоднозначно\n");

}

} while(1);

}


7.53. Пока я сам писал эту программу, я сделал две ошибки, которые должны быть

весьма характерны для новичков. Про них надо бы говорить раньше, в главе про строки и

в самой первой главе, но тут они пришлись как раз к месту. Вопрос: что печатает сле-

дующая программа?


#include


char *strings[] = {

"Первая строка"

"Вторая строка"

"Третяя строка",

"Четвертая строка",

NULL

};


void main(){

char **p;

for(p=strings;*p;++p)

printf("%s\n", *p);

}


А печатает она вот что:


Первая строкаВторая строкаТретяя строка

Четвертая строка


Дело в том, что ANSI компилятор Си склеивает строки:


"начало строки" "и ее конец"


если они разделены пробелами в смысле isspace, в том числе и пустыми строками. А в

нашем объявлении массива строк strings мы потеряли несколько разделительных запятых!

Вторая ошибка касается того, что можно забыть поставить слово break в операторе

switch, и долго после этого гадать о непредсказуемом поведении любого поступающего на

вход значения. Дело просто: пробегаются все случаи, управление проваливается из case

в следующий case, и так много раз подряд! Это и есть причина того, что в предыдущем


А. Богатырев, 1992-95 - 328 - Си в UNIX


примере все case оформлены нетривиальным макросом Bcase.


7.54. Составьте программу кодировки и раскодировки файлов по заданному ключу (строке

символов).


7.55. Составьте программу, которая запрашивает анкетные данные типа фамилии, имени,

отчества, даты рождения и формирует файл. Программа должна отлавливать ошибки ввода

несимвольной и нецифровой информации, выхода составляющих даты рождения за допустимые

границы с выдачей сообщений об ошибках. Программа должна давать возможность корректи-

ровать вводимые данные. Все данные об одном человеке записываются в одну строку файла

через пробел. Вот возможный пример части диалога (ответы пользователя выделены

жирно):


Введите месяц рождения [1-12]: 14 <>

*** Неправильный номер месяца (14).

Введите месяц рождения [1-12]: март <>

*** Номер месяца содержит букву 'м'.

Введите месяц рождения [1-12]: <>

Вы хотите закончить ввод ? n

Введите месяц рождения [1-12]: 11 <>

Ноябрь

Введите дату рождения [1-30]: _


В таких программах обычно ответ пользователя вводится как строка:


printf("Введите месяц рождения [1-12]: ");

fflush(stdout); gets(input_string);


затем (если надо) отбрасываются лишние пробелы в начале и в конце строки, затем вве-

денный текст input_string анализируется на допустимость символов (нет ли в нем не

цифр?), затем строка преобразуется к нужному типу (например, при помощи функции atoi

переводится в целое) и проверяется допустимость полученного значения, и.т.д.

Вводимую информацию сначала заносите в структуру; затем записывайте содержимое

полей структуры в файл в текстовом виде (используйте функцию fprintf, а не fwrite).


7.56. Составьте программу, осуществляющую выборку информации из файла, сформирован-

ного в предыдущей задаче, и ее распечатку в табличном виде. Выборка должна осуществ-

ляться по значению любого заданного поля (т.е. вы выбираете поле, задаете его значе-

ние и получаете те строки, в которых значение указанного поля совпадает с заказанным

вами значением). Усложнение: используйте функцию сравнения строки с регулярным выра-

жением для выборки по шаблону поля (т.е. отбираются только те строки, в которых зна-

чение заданного поля удовлетворяет шаблону). Для чтения файла используйте fscanf,

либо fgets и затем sscanf. Второй способ лучше тем, что позволяет проверить по шаб-

лону значение любого поля - не только текстового, но и числового: так 1234 (строка -

изображение числа) удовлетворяет шаблону "12*".


7.57. Составьте вариант программы подсчета служебных слов языка Си, не учитывающий

появление этих слов, заключенных в кавычки.


7.58. Составьте программу удаления из программы на языке Си всех комментариев. Обра-

тите внимание на особые случаи со строками в кавычках и символьными константами; так

строка


char s[] = "/*";


не является началом комментария! Комментарии записывайте в отдельный файл.


7.59. Составьте программу выдачи перекрестных ссылок, т.е. программу, которая выво-

дит список всех идентификаторов переменных, используемых в программе, и для каждого

из идентификаторов выводит список номеров строк, в которые он входит.


А. Богатырев, 1992-95 - 329 - Си в UNIX


7.60. Разработайте простую версию препроцессора для обработки операторов #include.

В качестве прототипа такой программы можно рассматривать такую (она понимает дирек-

тивы вида #include имяфайла - без или "").


#include

#include

#include


char KEYWORD[] = "#include "; /* with a trailing space char */


void process(char *name, char *from){

FILE *fp;

char buf[4096];


if((fp = fopen(name, "r")) == NULL){

fprintf(stderr, "%s: cannot read \"%s\", %s\n",

from, name, strerror(errno));

return;

}

while(fgets(buf, sizeof buf, fp) != NULL){

if(!strncmp(buf, KEYWORD, sizeof KEYWORD - 1)){

char *s;


if((s = strchr(buf, '\n')) != NULL) *s = '\0';

fprintf(stderr, "%s: including %s\n",

name, s = buf + sizeof KEYWORD - 1);

process(s, name);

} else fputs(buf, stdout);

}

fclose(fp);

}

int main(int ac, char *av[]){

int i;


for(i=1; i < ac; i++)

process(av[i], "MAIN");

return 0;

}


7.61. Разработайте простую версию препроцессора для обработки операторов #define.

Сначала реализуйте макросы без аргументов. Напишите обработчик макросов вида


#macro имя(аргу,менты)

тело макроса - можно несколько строк

#endm


7.62. Напишите программу, обрабатывающую определения #ifdef, #else, #endif. Учтите,

что эти директивы могут быть вложенными:


#ifdef A

# ifdef B

... /* defined(A) && defined(B) */

# endif /*B*/

... /* defined(A) */

#else /*not A*/

... /* !defined(A) */

# ifdef C

... /* !defined(A) && defined(C) */

# endif /*C*/


А. Богатырев, 1992-95 - 330 - Си в UNIX


#endif /*A*/


7.63. Составьте программу моделирования простейшего калькулятора, который считывает

в каждой строчке по одному числу (возможно со знаком) или по одной операции сложения

или умножения, осуществляет операцию и выдает результат.


7.64. Составьте программу-калькулятор, которая производит операции сложения, вычита-

ния, умножения, деления; операнды и знак арифметической операции являются строковыми

аргументами функции main.


7.65. Составьте программу, вычисляющую значение командной строки, представляющей

собой обратную польскую запись арифметического выражения. Например, 20 10 5 + *

вычисляется как 20 * (10 + 5) .


7.66. Составьте функции работы со стеком:

- добавление в стек

- удаление вершины стека (с возвратом удаленного значения)

Используйте два варианта: стек-массив и стек-список.


7.67. Составьте программу, которая использует функции работы со стеком для перевода

арифметических выражений языка Си в обратную польскую запись.


/*#!/bin/cc $* -lm

* Калькулятор. Иллюстрация алгоритма превращения выражений

* в польскую запись по методу приоритетов.

*/


#include

#include /* extern double atof(); */

#include /* extern double sin(), ... */

#include /* isdigit(), isalpha(), ... */

#include /* jmp_buf */


jmp_buf AGAIN; /* контрольная точка */

err(n){ longjmp(AGAIN,n);} /* прыгнуть в контрольную точку */


А. Богатырев, 1992-95 - 331 - Си в UNIX


/* ВЫЧИСЛИТЕЛЬ --------------------------------------- */

/* Если вместо помещения операндов в стек stk[] просто

* печатать операнды, а вместо выполнения операций над

* стеком просто печатать операции, мы получим "польскую"

* запись выражения:

* a+b -> a b +

* (a+b)*c -> a b + c *

* a + b*c -> a b c * +

*/

/* стек вычислений */

#define MAXDEPTH 20 /* глубина стеков */

int sp; /* указатель стека (stack pointer) */

double stk[MAXDEPTH];


double dpush(d) double d; /* занести число в стек */

{

if( sp == MAXDEPTH ){ printf("Стек операндов полон\n");err(1);}

else return( stk[sp++] = d );

}


double dpop(){ /* взять вершину стека */

if( !sp ){ printf("Стек операндов пуст\n"); err(2); }

else return stk[--sp];

}


static double r,p; /* вспомогательные регистры */

void add() { dpush( dpop() + dpop()); }

void mult() { dpush( dpop() * dpop()); }

void sub() { r = dpop(); dpush( dpop() - r); }

void divide() { r = dpop();

if(r == 0.0){ printf("Деление на 0\n"); err(3); }

dpush( dpop() / r );

}

void pwr() { r = dpop(); dpush( pow( dpop(), r )); }

void dup() { dpush( dpush( dpop())); }

void xchg(){ r = dpop(); p = dpop(); dpush(r); dpush(p); }

void neg() { dpush( - dpop()); }

void dsin(){ dpush( sin( dpop())); }

void dcos(){ dpush( cos( dpop())); }

void dexp(){ dpush( exp( dpop())); }

void dlog(){ dpush( log( dpop())); }

void dsqrt(){ dpush( sqrt( dpop())); }

void dsqr(){ dup(); mult(); }

/* M_PI и M_E определены в */

void pi() { dpush( M_PI /* число пи */ ); }

void e() { dpush( M_E /* число e */ ); }

void prn() { printf("%g\n", dpush( dpop())); }

void printstk(){

if( !sp ){ printf("Стек операндов пуст\n"); err(4);}

while(sp) printf("%g ", dpop());

putchar('\n');

}


А. Богатырев, 1992-95 - 332 - Си в UNIX


/* КОМПИЛЯТОР ---------------------------------------- */

/* номера лексем */

#define END (-3) /* = */

#define NUMBER (-2) /* число */

#define BOTTOM 0 /* псевдолексема "дно стека" */


#define OPENBRACKET 1 /* ( */

#define FUNC 2 /* f( */

#define CLOSEBRACKET 3 /* ) */

#define COMMA 4 /* , */


#define PLUS 5 /* + */

#define MINUS 6 /* - */

#define MULT 7 /* * */

#define DIV 8 /* / */

#define POWER 9 /* ** */


/* Приоритеты */

#define NOTDEF 333 /* не определен */

#define INFINITY 3000 /* бесконечность */


/* Стек транслятора */

typedef struct _opstack {

int cop; /* код операции */

void (*f)(); /* "отложенное" действие */

} opstack;

int osp; /* operations stack pointer */

opstack ost[MAXDEPTH];


void push(n, func) void (*func)();

{

if(osp == MAXDEPTH){ printf("Стек операций полон\n");err(5);}

ost[osp].cop = n; ost[osp++].f = func;

}

int pop(){

if( !osp ){ printf("Стек операций пуст\n"); err(6); }

return ost[--osp].cop;

}

int top(){

if( !osp ){ printf("Стек операций пуст\n"); err(7); }

return ost[osp-1].cop;

}

void (*topf())(){

return ost[osp-1].f;

}

#define drop() (void)pop()


void nop(){ printf( "???\n" ); } /* no operation */

void obr_err(){ printf( "Не хватает )\n" ); err(8); }


А. Богатырев, 1992-95 - 333 - Си в UNIX


/* Таблица приоритетов */

struct synt{

int inp_prt; /* входной приоритет */

int stk_prt; /* стековый приоритет */

void (*op)(); /* действие над стеком вычислений */

} ops[] = {

/* BOTTOM */ {NOTDEF, -1, nop },

/* OPENBRACKET */ {INFINITY, 0, obr_err},

/* FUNC */ {INFINITY, 0, obr_err},

/* CLOSEBRACKET */ {1, NOTDEF, nop }, /* NOPUSH */

/* COMMA */ {1, NOTDEF, nop }, /* NOPUSH */

/* PLUS */ {1, 1, add },

/* MINUS */ {1, 1, sub },

/* MULT */ {2, 2, mult },

/* DIV */ {2, 2, divide },

/* POWER */ {3, 3, pwr }

};


#define stkprt(i) ops[i].stk_prt

#define inpprt(i) ops[i].inp_prt

#define perform(i) (*ops[i].op)()


/* значения, заполняемые лексическим анализатором */

double value; void (*fvalue)();

int tprev; /* предыдущая лексема */


А. Богатырев, 1992-95 - 334 - Си в UNIX


/* Транслятор в польскую запись + интерпретатор */

void reset(){ sp = osp = 0; push(BOTTOM, NULL); tprev = END;}

void calc(){

int t;

do{

if( setjmp(AGAIN))

printf( "Стеки после ошибки сброшены\n" );

reset();

while((t = token()) != EOF && t != END){

if(t == NUMBER){

if(tprev == NUMBER){

printf("%g:Два числа подряд\n",value);

err(9);

}

/* любое число просто заносится в стек */

tprev = t; dpush(value); continue;

}

/* иначе - оператор */

tprev = t;

/* Выталкивание и выполнение операций со стека */

while(inpprt(t) <= stkprt( top()) )

perform( pop());

/* Сокращение или подмена скобок */

if(t == CLOSEBRACKET){


administraciya-andreevskogo-selskogo-poseleniya-okoneshnikovskogo-municipalnogo-rajona-omskoj-oblasti-izveshaet-o-provedenii-otkritogo-konkursa-po-razmesheniyu-muni.html
administraciya-arharinskogo-rajona-amurskoj-oblasti-postanovleni-e.html
administraciya-blagoveshenskogo-rajona-altajskogo-kraya-upravlenie-administracii-po-obrazovaniyu-i-delam-molodezhi-prika-z.html
administraciya-borovichskogo-municipalnogo-rajona.html
administraciya-cherepoveckogo-municipalnogo-rajona-obyavlyaet-konkurs-na-zameshenie-vakantnoj-dolzhnosti-nachalnika-finansovogo-upravleniya-administracii-cherepovec.html
administraciya-dubenskogo-municipalnogo-rajona-respubliki-mordoviya-postanovlenie.html
  • zanyatie.bystrickaya.ru/ob-ispolzovanii-yuvenalnih-tehnologij-v-deyatelnosti-mirovogo-sudi-po-otpravleniyu-pravosudiya-v-gryazinskom-sudebnom-uchastke-1-lipeckoj-oblasti.html
  • knigi.bystrickaya.ru/rukovodstvo-po-oformleniyu-tezisov-dokladov.html
  • student.bystrickaya.ru/38-nazarbaev-na-klyuchi-ot-krizisa-rossijskaya-gazeta-2009-2-fevr.html
  • institut.bystrickaya.ru/telefonnij-razgovor-kak-sposob-poiska-raboti-agashkina-galina-gennadevna.html
  • notebook.bystrickaya.ru/kliniko-morfologicheskaya-harakteristika-izmenenij-eutopicheskogo-i-ektopicheskogo-endometriya-pri-rasprostranennih-formah-genitalnogo-endometrioza-14-01-01-akusherstvo-i-ginekologiya.html
  • urok.bystrickaya.ru/proekt-departament-nedropolzovaniya-i-ekologii-tyumenskoj-oblasti-perechen-predpriyatij-podlezhashih-planovim-proverkam-na-2010-god-stranica-22.html
  • bukva.bystrickaya.ru/sostaviteli-gosudarstvennij-obrazovatelnij-standart-visshego-professionalnogo-obrazovaniya-napravlenie-551800.html
  • ekzamen.bystrickaya.ru/referativno-issledovatelskaya-rabota-tema-stanovlenie-opernogo-zhanra.html
  • bukva.bystrickaya.ru/restrukturizaciya-obyazatelnih-platezhej.html
  • shkola.bystrickaya.ru/roman-ob-istorii-filosofii-stranica-3.html
  • uchenik.bystrickaya.ru/i-kratkoe-soderzhanie-4-ii-rekomendacii-7-stranica-19.html
  • vospitanie.bystrickaya.ru/vremya-i-mesto-sozdaniya-gomerovskih-poem.html
  • knigi.bystrickaya.ru/sabati-tairibi-aparatti-anitamali-zhattar-tobi-anitama.html
  • student.bystrickaya.ru/2-usloviya-osushestvleniya-obrazovatelnogo-processa-1-obshaya-harakteristika-obrazovatelnogo-uchrezhdeniya.html
  • shkola.bystrickaya.ru/molodezhnij-sleng-i-ego-otrazhenie-v-sovremennih-smi.html
  • letter.bystrickaya.ru/o-realizacii-gosudarstvennoj-politiki-v-oblasti-ohrani-truda-v-respublike-bashkortostan.html
  • gramota.bystrickaya.ru/yazikoznanie-v-sisteme-nauk.html
  • school.bystrickaya.ru/immunologicheskij-sendvich-ili-kak-ishut-virusi.html
  • control.bystrickaya.ru/bushkov-aleksandr-rossiya-kotoroj-ne-bilo-tom-4-stranica-6.html
  • knowledge.bystrickaya.ru/metodicheskie-ukazaniya-po-ohrane-truda-dlya-organizacij-goroda-moskvi-obshie-polozheniya-stranica-3.html
  • ekzamen.bystrickaya.ru/spb-izd-respeks-2000-stranica-8.html
  • literatura.bystrickaya.ru/shestaya-mezhdunarodnaya-nauchno-prakticheskaya-konferenciya-modelirovanie-teoriya-metodi-i-sredstva-informacionnoe-soobshenie.html
  • predmet.bystrickaya.ru/socialnij-proekt-shkola-v-licah30-letiyu-shkoli-posvyashaetsya.html
  • holiday.bystrickaya.ru/obrazovatelnaya-programma-gosudarstvennoe-obrazovatelnoe-uchrezhdenie.html
  • universitet.bystrickaya.ru/t-a-yumasheva-prevenciya-ekstremizma-sredi-molodezhi-v-usloviyah-izmenyayushejsya-rossii.html
  • tasks.bystrickaya.ru/14-operacii-so-svyazannimi-storonami-ezhekvartalnij-otchet-otkritoe-akcionernoe-obshestvo-magnitogorskij-metallurgicheskij.html
  • crib.bystrickaya.ru/ispolzovanie-informacionnih-tehnologij-v-rabote-kraevedcheskogo-muzeya-perspektivi-razvitiya-osobennosti-i-problemi.html
  • school.bystrickaya.ru/agropromishlennij-kompleks-doklad-glavi-municipalnogo-obrazovaniya-kurmanaevskij-rajon-orenburgskoj-oblasti-o-dostignutih.html
  • paragraph.bystrickaya.ru/lekciya-1-3-stranica-3.html
  • spur.bystrickaya.ru/kurs-kontrolnaya-rabota-1-uprazhnenie-1-vmesto-tochek-upotrebite-glagoli-nuzhnogo-vida-v-proshedshem-vremeni-osenyu-anita-ochen-skuchala-i-pochti-kazhdij-vecher-pisma-chitatprochitat.html
  • portfolio.bystrickaya.ru/osvidetelstvovanie-grazhdan-prebivayushih-v-zapase-vooruzhennih-sil-prikaz-ministra-oboroni-rf-ot-22-sentyabrya-1995.html
  • znanie.bystrickaya.ru/4-obshie-polozheniya-t-ivnih-dokumentov-v-stroitelstve.html
  • lesson.bystrickaya.ru/organizaciya-razrabotki-novogo-tovara-detskaya-odezhda.html
  • predmet.bystrickaya.ru/rinok-prac-ta-jogo-regulyuvannya.html
  • obrazovanie.bystrickaya.ru/poyasnitelnaya-zapiska-rabochaya-programma-po-literature-dlya-5-9-klassov-razrabotana-na-osnove-sleduyushih-dokumentov-federalnij-uroven.html
  • © bystrickaya.ru
    Мобильный рефератник - для мобильных людей.