
- •Разработка программного обеспечения для обучающей и тестирующей системы «Лексика английского языка»
- •Содержание
- •Введение
- •1 Постановка задачи
- •2 Решение задачи
- •2.1 Алгоритм решения
- •2.2 Структура данных
- •3 Описание программного обеспечения
- •3.1 Общий подход к программной реализации
- •3.2 Укрупненный алгоритм программы
- •3.3 Модульная структура программы
- •3.4 Состав программы
- •Заключение
- •Список использованных источников
- •Приложение а Текст программы
- •Приложение б План тестирования
- •Приложение в Руководство системного программиста
- •Приложение г Руководство пользователя
Заключение
Таким образом, был построен программный продукт, который может стать надежным помощником в изучении английского языка. Данные словаря представлены в удобном для пользователя виде.
В процессе выполнения задания были подробно изучены методы работы с файлами на языке Си и принципы модульного программирования.
При дальнейшем усовершенствовании программного продукта возможны перспективы в работе – увеличение количества режимов работы пользователя со словарем, введение установки параметров работы тестирующей системы, возможно также использование в программе механизмов упорядочивания записей в словаре, усовершенствование интерфейса.
Список использованных источников
1 Егорова Е.В. Программирование на языке высокого уровня: Учебное пособие / Алт. госуд. технич. ун-т им. И.И. Ползунова. – Барнаул: 2009. – 166 с.
2 Шилдт Г. Полный справочник по С. - М.: Вильямс, 2002. - 704 с.
3 Поляков К. Программирование на языке Си [Электронный ресурс] / - Режим доступа http://kpolyakov.narod.ru, свободный.
Приложение а Текст программы
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
void Rus (char *str) // пп для пчати русского текста на экран
{
char message[200];
CharToOem(str,message);
printf ("%s",message);
}
void zagolovok(); //пп печати заголовка на экран
int menu(); //пп выбора меню работы
int prosmotr (); //подпрограмма для печати словаря на экран
int poisk(); // поиск перевода определенного слова
int rabota_slovar(); // пп выбора режима работы со словарем
int kolvo_strok(char name[]); // пп подсчета количества строк в файле
int trenazer(int flk); // пп режима тренажер пользовательского меню
int korr_temi(); // пп для корректировки заданной темы
int kolvo_tem(); // пп подсчета количества тем
void generator_input(); // пп генерирования из тем монолитного файла
int ud_temi(); // пп удаления темы
int kolic_tem; //глобальная переменная, отвечает за количество тем
const int dobav = 5; // константа - добавления
void generator_rus(); // пп для генерирования русско-английского словаря
int vibor_polz_rezima (); //пп выбора пользовательского режима
int parol(); //пп ввода пароля для доступа к режиму администратора
int vibor_adm(); //пп выбора режима работы администратора
int sozd_temi(); // пп создания новой темы
int administrator(); // пп режима администратора
int naxodka_stroki (int nomer,char str[100]); // находит строку с № nomer, считает, что "!\n" не является строкой
void zagolovok() //пп печати заголовка на экран
{
printf ("***********************************************************************");
printf ("\n");
Rus ("* Обучающая и тестирующая система <Лексика английского языка> *");
printf ("\n");
printf ("***********************************************************************");
printf ("\n\n");
}
int menu()//пп выбора меню работы
{
system("cls");
zagolovok();
Rus ("Выберете режим работы:\n");
Rus ("1 <- Режим <Администратор>\n2 <- Режим <Пользователь>\n3 <- Выход из системы\n");
int vibor;
int pro;
do {
Rus ("Ваш выбор - ");
fflush(stdin);
pro = scanf ("%d",&vibor);
if (!pro || vibor<1 || vibor>3) Rus ("Неверный ввод. Повторите...\n");
} while (!pro || vibor<1 || vibor>3);
return vibor;
}
int vibor_polz_rezima () //пп выбора пользовательского режима
{
int rezim1;
int f;
printf ("\n\n");
Rus ("Выберете режим работы:\n1 <- Работа со словарем\n2 <- Тренажер\n3 <- Тест\n4 <- Возврат в главное меню\n");
do {
Rus ("Ваш выбор - ");
f = scanf ("%d",&rezim1);
fflush(stdin);
if (!f || rezim1 < 1 || rezim1 > 4) Rus ("Неверный ввод. Повторите\n");
} while (!f || rezim1 < 1 || rezim1 > 4);
return rezim1;
}
int parol() //пп ввода пароля для доступа к режиму администратора
{
char *key;
key="golovneva";
Rus ("\nДля доступа к режиму введите пароль: ");
char vvod[10];
int i, j=0;
int tem[3];
do{
i=0;
do {
ex: fflush(stdin);
vvod[i]=getch();
if (vvod[i] == 13) {vvod[i] = '\0'; break;} //если ввели Enter
if (vvod[i] == 8) // если ввели backspace
{
if (i == 0) goto ex;
system("cls");
zagolovok();
Rus ("\nДля доступа к режиму введите пароль: ");
int jk;
if (j == 1)
{ for (jk = 0 ; jk<tem[0] ; jk++)
printf ("*");
Rus ("\nВы ввели неверный пароль! Повторите... ");
}
if (j == 2)
{
for (jk = 0 ; jk<tem[0] ; jk++)
printf ("*");
Rus ("\nВы ввели неверный пароль! Повторите... ");
for (jk = 0 ; jk<tem[1] ; jk++)
printf ("*");
Rus ("\nВы ввели неверный пароль! Повторите... ");
}
i--;
for (jk=0 ; jk<i ; jk++)
printf ("*");
}
else {
i++;
printf ("*");
}
} while (1);
tem[j]=i;
if (stricmp(key,vvod) != NULL)
{
if (j == 2) return 0;
Rus ("\nВы ввели неверный пароль! Повторите... ");
j++;
}
else return 1;
} while (j>0 && j<3);
}
int vibor_adm() //пп выбора режима работы администратора
{
system("cls");
zagolovok();
int rezim1;
int f;
Rus ("Выберете режим работы:\n1 <- Создание новой темы\n2 <- Корректировка уже сущесвующей темы\n3 <- Удаление темы\n4 <- Возврат в главное меню\n");
do {
Rus ("Ваш выбор - ");
f = scanf ("%d",&rezim1);
fflush(stdin);
if (!f || rezim1 < 1 || rezim1 > 4) Rus ("Неверный ввод. Повторите\n");
} while (!f || rezim1 < 1 || rezim1 > 4);
return rezim1;
}
int sozd_temi() // пп создания новой темы
{
Rus ("Если желаете вернуться в предыдущее меню, нажмите 'Esc', иначе любую клавишу...\n\n");
if (getch() == 27) return 5;
FILE *ved;
char name[10]; // имя темы в формате t_.txt
name[0]='t';
name[2]='.';
name[3] = 't';
name[4] = 'x';
name[5] = 't';
name[6] = '\0';
char zn;
int i,fl=0;
for (i=0 ; i<kolic_tem ; i++)
{
zn = i;
zn=zn + '0';
name[1] = zn;
ved = fopen(name,"r");
if (ved == NULL) {fl = 1; break;}
}
fclose(ved);
if (fl) name[1] = zn;
else {
zn = kolic_tem++;
zn=zn + '0';
name[1] = zn;
}
ved = fopen(name,"w");
Rus ("Введите название темы для файла "); printf ("%s",name);
Rus (" в формате: \nСлово на английском языке - соответствующее слово на русском языке\n");
int prov;
char new_tem[100];
char *s;
do{
fflush(stdin);
gets(new_tem);
s = strchr(new_tem,'-');
if (s == NULL) Rus("При вводе Вы пропустили символ '-'; повторите ввод...\n");
} while (s == NULL);
prov = fputs(new_tem,ved);
int f;
do {
f=0;
Rus("\nЕсли желаете ввести новое слово нажмите 'ENTER'");
if (getch() == 13)
{
Rus ("\nВведите строку в формате: \nСлово на английском языке - соответствующее слово на русском языке\n");
do{
fflush(stdin);
gets(new_tem);
s = strchr(new_tem,'-');
if (s == NULL) Rus("При вводе Вы пропустили символ '-'; повторите ввод...\n");
} while (s == NULL);
fputc('\n',ved);
prov = fputs(new_tem,ved);
f=1;
}
} while (f);
if (prov != EOF) Rus ("\n\n * Файл успешно создан\n");
fclose(ved);
return 0;
}
int administrator() // пп режима администратора
{
do{
int rezim;
rezim = vibor_adm();
int y;
switch(rezim)
{
case 1:
{
system("cls");
zagolovok();
Rus (" Вы работаете в режиме Администратора\n");
Rus (" Создание новой темы\n\n");
y = sozd_temi();
break;
}
case 2:
{
system("cls");
zagolovok();
Rus (" Вы работаете в режиме Администратора\n");
Rus(" Корректировка уже сущесвующей темы\n\n");
y = korr_temi();
break;
}
case 3:
{
system("cls");
zagolovok();
Rus (" Вы работаете в режиме Администратора\n");
Rus(" Удаление темы\n\n");
y = ud_temi();
break;
}
case 4:
{
generator_input();
return 0;
}
}
if (rezim != 4 && y != 5) {Rus("Нажмите любую клавишу для возврата в главное меню администратора..."); getch();}
generator_input();
} while (1);
}
int ud_temi() // пп удаления темы
{
Rus ("Если желаете вернуться в предыдущее меню, нажмите 'Esc', иначе любую клавишу...\n\n");
if (getch() == 27) return 5;
FILE *ved;
char name[7];
name[0]='t';
name[2]='.';
name[3] = 't';
name[4] = 'x';
name[5] = 't';
name[6] = '\0';
char stroka[100];
int i;
int j=0;
char mas_str[kolic_tem+dobav];
for (i=0 ; i<kolic_tem+dobav ; i++)
{
char zn=i;
zn=zn + '0';
name[1] = zn;
ved = fopen(name,"r");
if (ved != NULL)
{
fgets (stroka,100,ved);
printf ("%c <- ",zn+1);
printf("%s",stroka);
int len = strlen(stroka);
if (stroka[len-1] != '\n')
printf("\n");
mas_str[j] = zn+1; j++; // в массиве mas_str номера тем, которые печатаются
}
fclose(ved);
}
int f,asd=0;
int nom_temi;
do {
Rus("\nВведите номер темы для удаления: ");
f = scanf ("%d",&nom_temi);
fflush(stdin);
for (int gh = 0; gh<j ; gh++)
if (nom_temi+'0' == mas_str[gh]) asd=1;
if (!f || !asd) Rus ("Неверный ввод. Повторите");
} while (!f || !asd);
nom_temi--;
char zn = nom_temi;
zn = zn+'0';
name[1] = zn;
remove(name);
Rus ("\n * Тема успешно удалена\n");
kolic_tem--;
return 0;
}
int kolvo_tem() // пп подсчета количества тем
{
FILE *ved;
char name[10];
name[0]='t';
name[2]='.';
name[3] = 't';
name[4] = 'x';
name[5] = 't';
name[6] = '\0';
int flag = 0;
int i;
for (i=0 ; i<10 ; i++)
{
char zn = i;
zn=zn + '0';
name[1] = zn;
ved = fopen(name,"r");
if (ved != NULL) flag++;
fclose(ved);
}
return flag;
}
int korr_temi() // пп для корректировки заданной темы
{
Rus ("Если желаете вернуться в предыдущее меню, нажмите 'Esc', иначе любую клавишу...\n\n");
if (getch() == 27) return 5;
FILE *ved;
char name[10];
name[0]='t';
name[2]='.';
name[3] = 't';
name[4] = 'x';
name[5] = 't';
name[6] = '\0';
char stroka[100];
char *s;
int i;
int j=0;
char mas_str[kolic_tem+dobav];
for (i=0 ; i<kolic_tem+dobav ; i++)
{
char zn=i;
zn=zn + '0';
name[1] = zn;
ved = fopen(name,"r+");
if (ved != NULL)
{
fgets (stroka,100,ved);
printf ("%c <- ",zn+1);
printf("%s",stroka);
int len = strlen(stroka);
if (stroka[len-1] != '\n')
printf("\n");
mas_str[j] = zn+1; j++; // в массиве mas_str номера тем, которые печатаются
}
fclose(ved);
}
int f,asd=0;
int nom_temi;
do {
Rus("\nВведите номер темы для корректировки: ");
f = scanf ("%d",&nom_temi);
fflush(stdin);
for (int gh = 0; gh<j ; gh++)
if (nom_temi+'0' == mas_str[gh]) {asd=1; break;}
if (!f || !asd) Rus ("Неверный ввод. Повторите");
} while (!f || !asd);
nom_temi--;
char zn = nom_temi;
zn = zn+'0';
name[1] = zn;
ved = fopen(name,"r");
Rus("\n\nСодержимое файла "); printf ("%s",name); //печать файла на экран
printf ("\n");
i=1;
while (!feof(ved))
{
fgets (stroka,100,ved);
printf ("%d) %s",i,stroka);
i++;
}
fclose(ved);
printf ("\n\n");
Rus ("1 <- Запись новой строки\n2 <- Корректировка отдельной строки\n3 <- Удаление отдельной строки\n4 <- Возврат в меню\n");
int rezim22;
do {
Rus("Ваш выбор: ");
f = scanf ("%d",&rezim22);
fflush(stdin);
if (!f || rezim22 < 1 || rezim22 > 4) Rus ("Неверный ввод. Повторите\n");
} while (!f || rezim22 < 1 || rezim22 > 4);
switch(rezim22)
{
case 1: // запись строки в конец файла
{
Rus ("\nВведите строку в формате: \nСлово на английском языке - соответствующее слово на русском языке\n");
char nov_str[100];
do{
fflush(stdin);
gets(nov_str);
s = strchr(nov_str,'-');
if (s == NULL) Rus("При вводе Вы пропустили символ '-'; повторите ввод...\n");
} while (s == NULL);
ved = fopen(name,"a+");
fprintf(ved,"\n%s",nov_str);
fclose(ved);
Rus ("\n * Строка успешно добавлена\n");
break;
}
case 2: // корректировка отдельного поля
{
Rus ("\n\nВведите номер строки для корректировки: ");
int nom_dl_kor;
int lll;
do {
f = scanf ("%d",&nom_dl_kor);
fflush(stdin);
lll = kolvo_strok(name);
if (!f || nom_dl_kor < 1 || nom_dl_kor > lll) Rus ("Неверный ввод. Повторите\n");
} while (!f || nom_dl_kor < 1 || nom_dl_kor > lll);
nom_dl_kor--;
char new_str[100];
Rus ("\nВведите строку в формате: \nСлово на английском языке - соответствующее слово на русском языке\n");
do{
fflush(stdin);
gets(new_str);
s = strchr(new_str,'-');
if (s == NULL) Rus("При вводе Вы пропустили символ '-'; повторите ввод...\n");
} while (s == NULL);
FILE *ved1;
ved1 = fopen("temp.txt","w");
ved = fopen (name,"r");
int ii=0;
int f1;
char str12[100];
while (fgets(str12,100,ved) != NULL)
{
if (ii != nom_dl_kor) fputs(str12,ved1);
else { f1 = fputs(new_str,ved1);
if (ii != lll-1) fputs("\n",ved1);}
ii++;
}
fclose(ved);
fclose(ved1);
ved = fopen(name,"w");
ved1 = fopen("temp.txt","r");
while (fgets(str12,100,ved1) != NULL)
fputs(str12,ved);
fclose(ved);
fclose(ved1);
remove("temp.txt");
if (f1 != EOF)Rus ("\n * Строка успешно заменена\n");
else Rus ("\n * Ошибка!\n");
break;
}
case 3:
{ //удаление отдельной строки списка
Rus ("\n\nВведите номер строки для удаления: ");
int nom_dl_udal;
int lll;
do {
f = scanf ("%d",&nom_dl_udal);
fflush(stdin);
lll = kolvo_strok(name);
if (!f || nom_dl_udal < 1 || nom_dl_udal > lll) Rus ("Неверный ввод. Повторите\n");
} while (!f || nom_dl_udal < 1 || nom_dl_udal > lll);
nom_dl_udal--;
FILE *ved1;
ved = fopen(name,"r");
ved1 = fopen("temp.txt","w");
int iii=0;
int f11;
char str45[100];
fflush(stdin);
while (fgets(str45,100,ved) != NULL)
{
if (iii!=nom_dl_udal)
{
int kk=0;
int len;
len = strlen(str45);
if (iii == lll-2 && nom_dl_udal == lll-1)
{while (kk != len-1)
{fflush(stdin); fputc(str45[kk],ved1); kk++;}
fputs("\0",ved1);
}
if (nom_dl_udal < lll-1 && iii == lll-1)
{while (kk != len-1)
{fflush(stdin); fputc(str45[kk],ved1); kk++;}
fputs("\0",ved1);
}
fflush(stdin);
if (kk == 0) f11 = fputs(str45,ved1);
}
iii++;
}
if (f11 != EOF) Rus("\n * Строка успешно удалена\n");
fclose(ved);
fclose(ved1);
ved = fopen(name,"w");
ved1 = fopen("temp.txt","r");
fflush(stdin);
while (fgets(str45,100,ved1) != NULL)
fputs(str45,ved);
fclose(ved);
fclose(ved1);
remove("temp.txt");
break;
}
default: {return 5; break;}
}
ved = fopen(name,"r");
long poz,poz2;
int del=0;
poz = ftell(ved);
fseek(ved,0L,2);
poz2 = ftell(ved);
if (poz2-poz == 0) del = 1;
fclose (ved);
if (del) remove(name);
printf ("\n");
return 0;
}
void generator_input() // пп генерирования из тем монолитного файла
{
FILE *ved;
FILE *ved1;
char name[10];
name[0]='t';
name[2]='.';
name[3] = 't';
name[4] = 'x';
name[5] = 't';
name[6] = '\0';
char stroka[100];
ved1 = fopen("eng-rus.txt","w+");
int i;
int f[2];
for (i=0 ; i<kolic_tem+dobav ; i++)
{
char zn = i;
zn=zn + '0';
name[1] = zn;
ved = fopen(name,"r");
if (ved != NULL)
{
while (f[0] = fgets(stroka,100,ved) != NULL)
f[1] = fputs(stroka,ved1);
fputs("\n!\n",ved1);
}
fclose(ved);
}
fclose(ved1);
}
int main()
{
//вызов главного меню
kolic_tem = kolvo_tem();
generator_input();
int rezim;
int rezim_polz;
do {
rezim = menu();
switch (rezim)
{
case 1: { //режим администратора
system("cls");
zagolovok();
int key;
key = parol();
if (key == 1) administrator();
else { Rus ("\n\nУвы, у Вас нет доступа для работы в данном режиме\n");
system("pause"); }
break;
}
case 2: { //режим пользователя
do {
system("cls");
zagolovok();
Rus ("Вы работаете в режиме Пользователя");
rezim_polz = vibor_polz_rezima();
switch (rezim_polz)
{
case 1: {
rabota_slovar();
break;
}
case 2: {
trenazer(1);
break;
}
case 3: {
trenazer(2);
break;
}
}
} while (rezim_polz != 4);
break;
}
case 3: { //выход из системы
system("cls");
zagolovok();
Rus ("Вы действительно хотите выйти? Нажмите ENTER для подтверждения...");
if (getch() == 13)
{
system("cls");
zagolovok();
Rus ("Спасибо за внимание!");
return 0;
}
break;
}
}
if (rezim_polz == 2) {Rus ("\n\nНажмите любую клавишу для возрата в главное меню..."); getch();}
} while (1);
}
int kolvo_strok(char name[]) // пп подсчета количества строк в файле
{
FILE *slovar;
slovar = fopen(name,"r");
if (slovar == NULL) {Rus ("К сожалению файл не найден"); return 0;}
char stroka[100];
char *uk;
int flag=0;
fgets(stroka,100,slovar);
do {
uk = strchr (stroka, '-');
if (uk != NULL) flag++;
} while (fgets(stroka,100,slovar));
fclose(slovar);
return flag;
}
int trenazer(int flk) // пп режима тренажер пользовательского меню
{
clock_t a,b; //для подсчета времени тетирования
a = clock();
system("cls");
zagolovok();
if (flk == 1) Rus ("Вы работаете в режиме <Тренажер>");
else Rus ("Вы работаете в режиме <Тест>");
Rus ("\nПожалуйста, введите количество проверяемых слов: ");
int pro;
int kolvo_slov;
int kolvo1 = kolvo_strok("eng-rus.txt"); //kolvo1 = количество строк в текстовике
do {
fflush(stdin);
pro = scanf("%d",&kolvo_slov);
if (!pro || kolvo_slov < 0 ) Rus ("Неверный ввод. Повторите\n");
else if (kolvo_slov > kolvo1) Rus("Вы ввели слишком много. Повторите\n");
} while(!pro || kolvo_slov < 0 || kolvo_slov > kolvo1);
//ввели количество слов для тестирования
int bnm;
int pravilno=0; //правильных ответов
int neverno=0; //неправильных ответов
printf("________________________________________________________________");
for (bnm=0 ; bnm<kolvo_slov ; bnm++ ) //повтор kolvo_slov раз
{
int dl_perevoda;
dl_perevoda = rand()%kolvo1; //случайное слово для проверки от 0 до kolvo1
char str[100];
char str1[100];
naxodka_stroki (dl_perevoda,str1);
// в итоге у нас в str нужная строка
int i;
int ff=1;
Rus("\n\nСлово для перевода: ");
for (i=0 ; ff ; i++ )
{
if (str1[i] != '-') printf("%c",str1[i]);//печать исходника для перевода
else ff=0;
}
int ii,jj=0;
char str2[100]; //здесь конец str
for (ii=i+1 ; str1[ii]!='\n'; ii++)
{str2[jj] = str1[ii]; jj++;}
str2[jj]='\0';
Rus ("\n\nВарианты ответов:\n");
const int kolvo_var_otv = 6; //константа - количество вариантов ответов
int mesto = rand()%kolvo_var_otv; // место правильного ответа в списке
int mmest[kolvo_var_otv]; //массив содержит номера печатаемых строчек
mmest[0] = dl_perevoda;
i=1;
char strr[100];
for (int j=0 ; j<kolvo_var_otv ; j++) //печать вариантов ответов
{
printf ("%d <- ",j+1);
int k;
if (j == mesto) printf("%s",str2);
else {
int flagok;
int neww; // номер печатаемой строчки
do {
flagok=1;
neww = rand()%kolvo1;
for (k=0; k<i ; k++)
if (mmest[k] == neww) {flagok=0; break;}
} while (!flagok);
naxodka_stroki(neww,str);
for (k=0 ; str[k] != '-' ; k++);
k=k+2;
int chr=0;
for (int jk=k ; str[jk] != '\n' ; jk++)
{strr[chr] = str[jk];chr++;}
strr[chr] = '\0'; //в этом массиве печатаемый вариант
mmest[i]=neww;
i++;
printf ("%s",strr);
}
printf ("\n");
}
//напечатан список ответов
int flag=0;
do {
Rus ("\n * По вашему мнению, правильный ответ - ");
int otv;
int prov;
do{
prov = scanf ("%d",&otv);
fflush(stdin);
if (!prov || otv<0 || otv>kolvo_var_otv) Rus ("Такого варианта ответа не существует. Повторите ввод...\n");
} while (!prov || otv<0 || otv>kolvo_var_otv);
if (otv-1 == mesto) {
if (flk == 1)Rus ("Правильно");
pravilno++;
flag=0;
}
else {
if (flk == 1)
{if (flag == 2 ) Rus ("Неверно...");
else Rus ("Неверно, попробуйте еще раз!...");
flag++;
}
else neverno++;
}
} while (flag>0 && flag<3 && flk == 1);
if (flag == 3) {neverno++; Rus(" * Правильный ответ - "); printf ("%d",mesto+1);}
if (flk == 1) printf ("\n\n *** *** ***");
}
printf("\n_____________________________________________________________________________");
Rus ("\nРезультаты тестирования:\nБыло дано слов - ");
printf ("%d",kolvo_slov);
Rus ("\nСреди них правильных - ");printf ("%d",pravilno);
Rus (", и неправильных - ");printf ("%d",neverno);
printf ("\n");
b = clock();
int t;
t = (b-a)/CLOCKS_PER_SEC;
int sec,min;
sec = t%60;
min = t/60;
Rus ("Тест был пройден за ");printf ("%d",min); Rus(" минут(ы) и "); printf ("%d",sec); Rus(" секунд(ы)");
printf ("\n\n");
system("pause");
}
int naxodka_stroki (int nomer,char str[100]) // находит строку с № nomer, считает, что "!\n" не является строкой
{
FILE *slovar;
slovar = fopen("eng-rus.txt","r");
char *s;
int f1=0;
do {
fgets(str,100,slovar);
s = strchr(str,'-');
if (s != NULL) f1++;
} while (f1-1 < nomer);
}
int rabota_slovar() // пп выбора режима работы со словарем
{
int rezim11;
do {
system("cls");
zagolovok();
Rus ("Вы работаете в режиме пользователя. Работа со славарем\n\n");
int f=1;
Rus("Выберете режим работы: \n1 <- Просмотр словаря\n2 <- Поиск перевода для определенного слова\n3 <- Возврат в пользовательское меню\n");
do {
Rus ("Ваш выбор - ");
f = scanf ("%d",&rezim11);
fflush(stdin);
if (!f || rezim11 < 1 || rezim11 > 3) Rus ("Неверный ввод. Повторите\n");
} while (!f || rezim11 < 1 || rezim11 > 3);
printf ("\n\n");
switch (rezim11)
{
case 1: {
prosmotr ();
break;
}
case 2: {
poisk();
break;
}
}
if (rezim11 != 3) {Rus ("\n\nНажмите любую клавишу для возврата в подменю ..."); getch();}
} while (rezim11 != 3);
}
int poisk() // поиск перевода определенного слова
{
generator_rus();
do{
system("cls");
zagolovok();
FILE *slovar;
const int n=100;
char vvod[n];
Rus ("Работа со словарем \n1 <- англо-русский\n2 <- русско-английский\n");
int vvib;
int f;
do {
Rus ("Ваш выбор - ");
f = scanf ("%d",&vvib);
fflush(stdin);
if (!f || vvib < 1 || vvib > 2) Rus ("Неверный ввод. Повторите\n");
} while (!f || vvib < 1 || vvib > 2);
if (vvib == 1)
{
slovar = fopen("eng-rus.txt","r");
if (slovar == NULL) {Rus ("К сожалению файл не найден"); return 0;}
do {
Rus ("\nВведите слово для перевода(на английском): ");
fflush (stdin);
gets(vvod);
if (vvod[0]<'a' && vvod[0]>'z') Rus ("Неверный ввод. Повторите\n");
} while (vvod[0]<'a' && vvod[0]>'z');
}
else
{
slovar = fopen("rus-eng.txt","r");
if (slovar == NULL) {Rus ("К сожалению файл не найден"); return 0;}
do {
Rus ("\nВведите слово для перевода(на русском): ");
fflush (stdin);
gets(vvod);
if (vvod[0]<'а' && vvod[0]>'я') Rus ("Неверный ввод. Повторите\n");
} while (vvod[0]<'а' && vvod[0]>'я');
}
int fq=1;
char s1[n];
char s[n];
printf ("\n");
printf("%s",vvod);
printf (" - ");
while (fgets(s,n,slovar) != NULL && fq)
{
int i=0;
while (s[i] != '-')
{s1[i] = s[i];
i++;}
i--;
s1[i] = '\0';
if ( strcmp(vvod,s1) == NULL )
{
int j;
char s2[n];
int k=0;
for (j=i+3 ; s[j] != '\n' ; j++)
{s2[k] = s[j]; k++;}
s2[k] = '\0';
fq=0;
printf("%s",s2);
}
}
if (fq) Rus("К сожалению, такого слова не найдено\n");
Rus ("\nЕсли желаете перевести еще одно слово, нажмите 'ENTER'\n\n");
fclose(slovar);
} while (getch() == 13);
}
int prosmotr () //подпрограмма для печати словаря на экран
{
system ("cls");
zagolovok();
Rus("Организуем просмотр словаря");
printf ("\n\n");
Rus ("Просмотр словаря 1 <- целиком, или 2 <- по темам\n");
int vvib;
int f;
do {
Rus ("Ваш выбор - ");
f = scanf ("%d",&vvib);
fflush(stdin);
if (!f || vvib < 1 || vvib > 2) Rus ("Неверный ввод. Повторите\n");
} while (!f || vvib < 1 || vvib > 2);
FILE *slovar;
slovar = fopen("eng-rus.txt","r");
if (slovar == NULL) {Rus ("К сожалению файл не найден"); return 0;}
const int n=100;
char s[n];
char *fl;
switch (vvib)
{
case 1: // целиком
{
printf ("\n*** *** ***\n\n");
fl = fgets(s,n,slovar);//ссчитали 1 строку в s
do
{
int fq=1;
while (fl != NULL && strcmp(s,"!\n") != NULL)
{
if (fq) {Rus ("Тема: "); printf ("%s\n",s); fq=0;}
else printf ("%s",s);
fl = fgets(s,n,slovar);
}
printf ("\n\n");
} while ( (fl = fgets(s,n,slovar)) != NULL);
break;
}
case 2: //по темам
{
Rus ("Темы на выбор:\n\n");
int uk_tem[15];
int j=0;
uk_tem[0] = 0;
int chch=1; // просто счетчик
char *s;
char str[100];
int kolstr = kolvo_strok("eng-rus.txt");
do {
fgets(str,100,slovar);
s = strchr(str,'!');
if (s == NULL) j++; //если строка не содержит "!", то считываем следующую, если есть "!", то j++ и сей номер - номер строки темы
else { j++;uk_tem[chch] = j-chch; chch++;}
} while (j < kolstr+chch-1);
// в итоге в массиве uk_tem хранятся номера строк, содержащие темы, распечатаем их
for (j=0 ; j<chch ; j++)
{
printf ("%d <- ",j+1);
naxodka_stroki (uk_tem[j],str);
printf ("%s",str);
}
do {
Rus ("\nВаш выбор - ");
f = scanf ("%d",&vvib);
fflush(stdin);
if (!f || vvib < 1 || vvib > chch) Rus ("Неверный ввод. Повторите\n");
} while (!f || vvib < 1 || vvib > chch);
Rus ("\n*** *** ***\nПечать выбранной темы: ");
rewind(slovar);
int fj=0;
do {
fgets(str,100,slovar);
s = strchr(str,'-');
if (s != NULL) fj++;
} while (fj-1 < uk_tem[vvib-1]);
printf ("%s",str);
printf ("\n");
fl = fgets(str,n,slovar);
s = strchr(str,'!');
do {
printf ("%s",str);
fl = fgets(str,n,slovar);
s = strchr(str,'!');
}
while (fl != NULL && s == NULL);
break;
}
} // закрыли switch
fclose(slovar);
}
void generator_rus() // пп для генерирования русско-английского словаря
{
FILE *ved;
FILE *ved1;
ved = fopen("eng-rus.txt","r");
ved1 = fopen("rus-eng.txt","w");
char stroka[100];
int i,j;
while (!feof(ved))
{
fgets(stroka,100,ved);
if (!feof(ved))
{
if (strcmp(stroka,"!\n") == NULL) fputs(stroka,ved1);
else
{
for (i=0 ; stroka[i] != '-' ; i++);
for (j = i+2 ; stroka[j]!='\0'; j++)
if (stroka[j]!= '\n') fputc(stroka[j],ved1);
fputs(" - ",ved1);
for (i=0 ; stroka[i+1]!= '-'; i++)
fputc(stroka[i],ved1);
if (!feof(ved)) fputc('\n',ved1);
}
}
}
fclose(ved);
fclose(ved1);
}