Разработка программного обеспечения для обучающей и тестирующей системы "Лексика английского языка"

Методы работы с файлами на языке Си. Принципы модульного программирования. Реализация программы с дружелюбным интерфейсом для комфорта пользователя и организацией высокоэффективной работы по изучению лексики английского языка. Подпрограммы, их функции.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 27.02.2015
Размер файла 1,6 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Пояснительная записка к курсовой работе

по дисциплине «Основы программирования»

Разработка программного обеспечения для обучающей и тестирующей системы «Лексика английского языка»

Введение

В современном обществе для продуктивного обучения и успешной карьеры просто необходимо знание иностранных языков, в первую очередь - английского. Но мало кто владеет им в совершенстве, поэтому каждому из нас рано или поздно приходит в голову идея более детального изучения языка. И в чем же состоит его изучение?.. Конечно, нужно читать книги на английском, разговаривать на нем, учить грамматику, но и самое главное - учить новые слова. Для многих этот пункт вырастает в настоящую проблему. Несомненно придумано множество путей ее решения - и всевозможные карточки, и электронные словари, и метод графического изображения слов... Но, согласитесь, когда нас кто-то или что-то контролирует, мы относимся к себе более строже. Предложенная мною обучающе-тестирующая система поможет Вам решить эту проблему. Программа предлагает широкий спектр возможностей. Работа в двух режимах - администратора и пользователя; возможность работы со словарем: его просмотр целиком или по темам, поиск перевода определенного слова, причем как в направлении английский - русский, так и обратное; режимы тестирования: обучающий, который указывает правильные ответы, и режим самоконтроля. В режиме администратора - возможность редактирование словаря.

Цель работы: написание программного продукта, позволяющего деловому человеку более продуктивно улучшать свой английский

Задача: реализация программы с дружелюбным интерфейсом для комфорта пользователя и организацией высокоэффективной работы по изучению лексики английского языка

1. Постановка задачи

Разработать программное обеспечение для обучающей и тестирующей системы «Лексика английского языка»

В режиме "Администратора" идет работа с набором файлов, каждый и которых представляет собой обособленную тему. Таким образом каждый файл содержит список строк вида: слово на английском языке - его перевод на русском.

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

Функции системы:

- создание и корректировка файла выбранной темы:

- создание новой темы

- корректировка уже существующей темы (запись новой строки, корректировка строки, удаление строки)

- удаление темы

- просмотр списка слов по темам либо в едином режиме

- поиск определенного слова

- тестирование (с сообщением итоговой информации о тесте)

- тренажер (с сообщением итоговой и промежуточной информации)

2. Решение задачи

2.1 Алгоритм решения

Для реализации задачи использована модульная система программирования. Вся задача разбита на семнадцать отдельных модулей (функций), шесть из которых используются для реализации диалога с пользователем, путем выбора определенного пункта меню, семь из них отвечают за выполнение конкретной задачи программы, остальные используются для реализации вспомогательных вычисления и промежуточных действий. Каждый модуль самостоятелен и выполняет конкретную задачу. В зависимости от действий пользователя происходит смена меню или передается управление подпрограммам печати списков, поиска строк, их редактирования или удаления.

2.2 Структура данных

Для работы с файлами данных предусмотрены двенадцать подпрограмм. При каждом обращении тем или иным способом происходит построчное считывание из файла во временный массив символов, который либо видоизменяется при необходимости, любо удаляется (в зависимости от действий пользователя) и помещается в вспомогательный файл. По окончанию работы файл перезаписывается, а вспомогательный файл удаляется. В пользовательском же режиме выполняется построчное считывание и выборка строки на основе соответствия введенной строки или введенного индекса этой строки. Файл состоит из двух записей: слово на английском языке - соответствующее слово на русском языке.

3. Описание программного обеспечения

3.1 Общий подход к программной реализации

Программа написана на языке Си. Этот язык выбран по причине своей гибкости, понятности и удобства.

Данная программа работает в консольном текстовом режиме. Программа имеет модульную структуру (всего 18 подпрограмм). Набор подпрограмм для режима администратора используется совокупность файлов-тем, для режима пользователя - 1 общий файл, в которой уже записаны все темы. Большая часть данных объявлена через локальные переменные, через глобальные объявлены переменная, отвечающая за количество используемых тем, и вторая - константа, отвечающая за приращение аргумента.

3.1.1 Данный программный продукт предусматривает наличие следующих файлов: VocabularyOfEnglish.exe, eng-rus.txt, rus-eng.txt (при отсутствии создается автоматически) и набор файлов тем вида: t0.txt.

3.1.2 Объем разработанного программного обеспечения: VocabularyOfEnglish.exe - 763 Кб, eng-rus.txt, rus-eng.txt по 3 Кб, и 4 стартовые темы, в сумме 3 Кб. Всего - 772 Кб

3.1.3 Общие требования к компьютеру и системному программному обеспечению:

Microsoft Windows 2000/XP/Vista

Процессор Pentium II 266MHz или выше

RAM 10 Мб

Жесткий диск 2 Мб свободного пространства

3.2 Укрупненный алгоритм программы

На рисунке 1 представлен укрупненный алгоритм программы. Причем каждый из этапов (модулей) программы подразумевает помимо основных функций еще защиту от некорректного ввода.

3.3 Модульная структура программы

В программном продукте реализована следующая иерархия модулей (Рисунок 2).

3.4 Состав программы

main() - главная подпрограмма, реализующая связь и взаимодействие остальных подпрограмм.

В программном продукте использованы следующие подпрограммы:

1. Подпрограммы, реализующие диалог с пользователем (выбор пунктов меню):

o int menu(); - подпрограмма выбора главного меню работы;

o int vibor_polz_rezima (); - подпрограмма выбора пользовательского режима;

o int administrator(); - подпрограмма управления режимом администратора;

o int vibor_adm(); - подпрограмма выбора режима работы администратора;

o int rabota_slovar(); - подпрограмма выбора режима работы со словарем;

2. Подпрограммы, отвечающие за реализацию основных модулей раздела "Администратор":

o int korr_temi(); - подпрограмма для корректировки заданной темы;

o int ud_temi(); - подпрограмма для удаления темы;

o int sozd_temi(); - подпрограмма для создания новой темы;

3. Подпрограммы, отвечающие за реализацию основных модулей раздела "Пользователь":

o int prosmotr (); - подпрограмма для печати словаря на экран;

o int poisk(); - подпрограмма для поиск перевода определенного слова;

o int trenazer(int flk); - подпрограмма для осуществления тестирования(параметр - 1 передается при режиме тренажер, 2 - при режиме теста);

4. Подпрограммы, реализующие вспомогательные функции:

o void Rus (char *str); - подпрограмма печати русскоязычного текста (параметр - строка для печати);

o void zagolovok(); - подпрограмма печати заголовка на экран;

o int kolvo_strok(char name[]); - подпрограмма подсчета количества строк в файле (параметр - имя файла);

o int kolvo_tem(); - подпрограмма подсчета количества тем;

o void generator_input(); - подпрограмма генерирования из тем монолитного файла;

o void generator_rus(); - подпрограмма для генерирования русско-английского словаря;

o int parol(); - подпрограмма ввода пароля для доступа к режиму администратора;

o int naxodka_stroki (int nomer,char str[100]); - подпрограмма нахождения строки с заданным номером(параметры - номер строки, и, собственно, сама возвращаемая строка с заданным номером);

Заключение

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

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

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

файл модульный лексика английский

Список использованных источников

1 Егорова Е.В. Программирование на языке высокого уровня: Учебное пособие / Алт. госуд. технич. ун-т им. И.И. Ползунова Барнаул: 2009. - 166 с.

2 Шилдт Г. Полный справочник по С. - М.: Вильямс, 2012. - 704 с.

3 Поляков К. Программирование на языке Си, 2008.

Приложение А

Текст программы

#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);

}

Приложение Б

План тестирования

Для тестирования программы нужно запустить файл VocabularyOfEnglish.exe, зайти в режим администратора, проверить каждый из модулей на корректную работоспособность (ввод новой темы, корректировка темы, удаление темы). В режиме пользователя проверить корректность открытия файла словаря и корректность поиска заданной строки по словарю. Проверить всевозможный ввод некорректных данных в каждом из модулей программы. При работе в пунктах вложенного меню рекомендуется выйти и зайти в них снова для проверки правильности сохранения данных.

Программный продукт имеет следующий вид: (Рисунок 3 - 9).

Рисунок 3 - Главное меню программы

Рисунок 4 - Ввод пароля для доступа к режиму администратора

Рисунок 5 - Меню администратора

Рисунок 6 - Пример работы в режиме корректировки темы

Рисунок 7 - Режим работы пользователя

Рисунок 8 - Режим пользовательского меню работы со словарем

Рисунок 9 - Пример работы "Тренажера"

Приложение В

Руководство системного программиста

Для установки программы: скопировать папку VocabularyOfEnglish с набором файлов вида: t0.txt. (в стартовом наборе их 4: t0.txt, t1.txt, t2.txt, t3.txt) на жесткий диск компьютера. Также в папке могут содержаться файлы eng-rus.txt, rus-eng.txt. При их отсутствии они автоматически создадутся при запуске программы.

Системные требования: Microsoft Windows 2000/XP/Vista, процессор Pentium II 266MHz или выше, 10 Мб оперативной памяти, 2 Мб свободного пространства на жестком диске.

Приложение Г

Руководство пользователя

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

Данный программный продукт может быть использован человеком, не имеющим большого опыта работы с компьютером. Для этого достаточно знать следующие правила работы с программой. Меню реализовано таким образом, что для выполнения действия необходимо нажать цифру на клавиатуре, соответствующую выбранному пункту меню. Ввод некорректных данных будь то несуществующие пункты меню, буквенные комбинации, выход за границы файла блокируются программой, и об этом беспокоиться не следует. При каждом выходе из режима администратора общий словарь слов обновляется автоматически, и поэтому вы можете тут же использовать уже модифицированный вариант. Русско-английский словарь создается только в режиме поиска слова для перевода; из других режимов он недоступен.

Размещено на Allbest.ur


Подобные документы

  • Разработка программы автоматизации процесса проверки знаний учащихся. Использование языка программирования Borland Delphi 7.0, его свойства, компоненты для работы со строками. Создание обучающих тестов на знание лексики и грамматики английского языка.

    курсовая работа [521,0 K], добавлен 06.03.2016

  • Аналоги текстовых редакторов с русскоязычным интерфейсом. Разработка и тестирование программного продукта, позволяющего работать с текстом и файлами в редакторе на языке программирования, основанным на русском языке. Алгоритм функционала программы.

    дипломная работа [2,8 M], добавлен 21.07.2013

  • Создание Windows-приложения для проведения обучения и тестирования студентов по информационной безопасности. Алгоритм решения задачи, блок-схема работы программы, выбор языка программирования Delphi. Охрана труда программиста, обязанности пользователя.

    дипломная работа [4,8 M], добавлен 04.06.2013

  • Выбор языка программирования. Требования к информационному и техническому обеспечению. Реализация базы данных. Разработка алгоритма работы программного обеспечения. Форма идентификации пользователя. Руководство пользователя. Типы элементов диалога.

    дипломная работа [1,3 M], добавлен 05.07.2013

  • Разработка программы для осуществления работы с файлами и их последующего помехоустойчивого кодирования-декодирования по методу Хемминга 15-11 в интерактивном режиме. Обзор языка С и его особенностей. Взаимодействие пользователя с программным интерфейсом.

    курсовая работа [145,5 K], добавлен 12.05.2013

  • Методика разработки и частичная реализация транслятора для языка "С" с использованием языка "С++", производящего разбиение на минимальные неделимые конструкции языка исходной цепочки символов основываясь на лексике языка. Анализ работы программы.

    курсовая работа [841,3 K], добавлен 19.03.2012

  • Цели и задачи дисциплины "Технология программирования". Программные средства ПК. Состав системы программирования и элементы языка. Введение в систему программирования и операторы языка Си. Организация работы с файлами. Особенности программирования на С++.

    методичка [126,3 K], добавлен 07.12.2011

  • Характеристика объектно-ориентированного, процедурного, функционального программирования. Выбор языка программирования для создания программного обеспечения для управления справочником "Спортсмены". Алгоритм работы приложения, пользовательский интерфейс.

    курсовая работа [1,6 M], добавлен 23.02.2016

  • Разработка экспертной системы по выбору языка программирования для данного программного обеспечения. Выбор и обоснование механизма вывода решения. Дерево базы знаний экспертной системы. Программа формирования основного меню, руководство пользователя.

    курсовая работа [1,9 M], добавлен 15.08.2012

  • Принципы и порядок работы с файлами на языке Delphi, получение навыков программирования с использованием файлов. Создание каталога продуктов. Страница палитры компонентов, настраиваемые компоненты и их значения. Текст программы и ее тестирование.

    лабораторная работа [243,9 K], добавлен 09.01.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.