Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!!курсач (MoRDa).doc
Скачиваний:
4
Добавлен:
18.09.2019
Размер:
1.33 Mб
Скачать

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

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

Тестирование

На рисунках 12 – 14 представлена обработка, при вводе ошибочных данных.

Рисунок 12

Рисунок 13

Рисунок 14

На рисунке 15 показан вывод дерева на экран “боком”. На рисунке 16 – ввод элементов из файла и удаление с сохранением в файл, а также отбражение количества элементов. На рисунке 17 – функция поиска и удаление элемента с выводом на экран.

Рисунок 15

Рисунок 16

Рисунок 17

ВЫВОДЫ

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

Литература

1. Уолтер Сэвитч. С++ в примерах. Москва: Эком, 1997.

2. В.А. Скляров. Язык С++ и объектно-ориентированное программирование. –Мн.: Выш. шк.,1997.

3. Язык программирования Си. Москва: Производственно-внедренческий кооператив "И Н Т Е Р Ф Е Й С", 1988.

4. Б.В. Керниган,Д.М. Ричи. ЯЗЫК С.

5. В.А. Скляров. Программирование на языках Си и Си++. Мн.: Выш. шк.,1997.

6. Страуструп Бьерн. Язык программирования Си++. М.: Софт,1999. (10 шт.).

7. Шилд Герберт. - Самоучитель C++ / Герберт Шилдт . - СПб : BHV - Санкт-Петербург, 1997. - 511 с.

8. Как программировать на С++ . Дж. Дейтел. Пер. В. Кузьменко . - М. : ЗАО "Издательство БИНОМ", 1998. - 1021 с. : ил.

9. Visual C++ 6 Новые возможности для программистов. Ю. Тихомиров.- СПб.:БХВ-Санкт-Петербург,1998.-496 с.

10. Основы алгоритмизации и программирования. Язык СИ. Е.М.Демидович.Мн.: “Бестпринт” 2003 г.

11.Использование Visual C++ 6. Специальное издание. Грегори К.: Пер. с англ.-М.;СПб.;К.: Издательский дом “Вильямс”, 2001.-864 с.

Приложение а

#include<stdio.h>

#include<math.h>

#include<ctype.h>

#include<string.h>

#include<stdlib.h>

#include <windows.h>

char buf[256];

char *rus(char *s) {CharToOem(s,buf); return buf;}

struct tree //структура : содержание полей

{

int info; //код факультета (ключ)

int kaf; //количество кафедр

int pre; // количество преподавателей

char name[10]; //название факультета

char fam[10]; // фамилия декана

tree *left; // указатель на левого потомка

tree *right; // указатель на правого потомка

};

//глобальные переменныые:

tree *rt=NULL; //указатель на корень дерева

int count=0; //счётчик элементов

char ss[100]; //строка имени файла вывода для функций

char sss[10]; //строка для функции “mist” (проверки корректности ввода)

int zn; //переменная для функции “mist”

char nam[10],fa[10]; //переменные для передачи данных в функцию “add”

int ka,pr; //

tree *add(tree *root,tree *r, int c) //функция "add" – добавление

//элемента

{ if(!r)

{ r=new tree;

if(!r){printf(rus("Нет памяти\n")); exit(100);}

r->left=NULL;

r->right=NULL;

r->info=c;

strcpy(r->name,nam);

strcpy(r->fam,fa);

r->kaf=ka;

r->pre=pr;

if(!root) return r;

if(c<root->info) root->left=r;

else root->right=r;

return r;

}

if(c<r->info) add(r,r->left,c);

else add(r,r->right,c);

return root;

}

tree *find(tree *root,int key) //функция "find" - поиск элемента по ключу

{ if(root==NULL) return root;

while(root->info!=key)

{ if(key<root->info) root=root->left;

else root=root->right;

if (root==NULL) break;

}

return root;

}

void view(tree *r,bool b) //функция "view" - вывод на экран

//содержимого узла дерева

{ if(b)

{ printf(rus("номер факультета : %d\n"),r->info);

printf(rus("название факультета : %s\n"),r->name);

printf(rus("фамилия декана : %s\n"),r->fam);

printf(rus("количество кафедр : %d\n"),r->kaf);

printf(rus("количество преподавателей: %d\n"),r->pre);

}

}

tree *del(tree *root,int key,bool b) //функция "del" - удаление узла дерева,

// может использовать функцию "view"

{ tree *p,*p2;

if(!root) return root;

if(root->info==key)

{ if(root->left==root->right)

{ printf(rus("Этот элемент удалён\n"));

view(root,b);

count--;

delete root;

return NULL;

}

if(root->left==NULL)

{ p=root->right;

printf(rus("Этот элемент удалён\n"));

view(root,b);

count--;

delete root;

return p;

}

if(root->right==NULL)

{ p=root->left;

printf(rus("Этот элемент удалён\n"));

view(root,b);

count--;

delete root;

return p;

}

//else

{ p2=root->right;

p=p2;

while(p->left) p=p->left;

p->left=root->left;

printf(rus("Этот элемент удалён\n"));

view(root,b);

count--;

delete root;

return p2;

}

}

if(root->info<key) root->right=del(root->right,key,b);

else root->left=del(root->left,key,b);

return root;

}

int mist(bool b) //функция "mist" - проверка ввода на корректность

{ zn=0;

int le=strlen(sss);

int k=0;

if(b)

{ for(int i=0;i<le;i++)

{

if(!isdigit(sss[i])) k++;

else zn+=(sss[i]-48)*pow(10,le-i-1);

}

return k;

}

else

for(int i=0;i<le;i++)

{

if(!isalpha(sss[i])) k++;

}

return k;

}

void a() //функция "a" - предназначена для заполнения дерева, может

// использовать функции "add", "find" и "mist"

{ int inf;

int c;

int z;

int v=1;

do

{ z=2;

printf(rus("Ввод\n1 - с клавиатуры\n0 - из файла\n"));

scanf("%s",&sss);

sss[1]='\0';

v=mist(1);

if(v) printf(rus("Ошибка ввода\n"));

else z=zn;

}while((v)&&((z<0)||(z>1)));

if(z)

{ while(1)

{

int v=1;

do

{ c=2;

printf(rus("Выбери\n1 - ввод\n0 - стоп\n"));

scanf("%s",&sss);

sss[1]='\0';

v=mist(1);

if(v) printf(rus("Ошибка ввода\n"));

else c=zn;

}while((v)&&((c<0)||(c>1)));

if(c)

{

int v;

tree *r=NULL;

do

{ do

{ v=1;

printf(rus("Введите \nномер

факультета \n"));

scanf("%s",&sss);

sss[9]='\0';

v=mist(1);

if(v) printf(rus("Ошибка

ввода\n"));

else inf=zn;

}while(v);

r=find(rt,inf);

if(r) printf(rus("Такой элемент уже

есть\n"));

else break;

}while(1);

do

{ v=1;

printf(rus("название факультета \n"));

scanf(rus("%s"),&sss);

sss[9]='\0';

v=mist(0);

if(v) printf(rus("Ошибка ввода\n"));

else strcpy(nam,sss);

}while(v);

do

{ v=1;

printf(rus("фамилия декана \n"));

scanf(rus("%s"),&sss);

sss[9]='\0';

v=mist(0);

if(v) printf(rus("Ошибка ввода\n"));

else strcpy(fa,sss);

}while(v);

do

{ v=1;

printf(rus("количество кафедр \n"));

scanf("%s",&sss);

sss[9]='\0';

v=mist(1);

if(v) printf(rus("Ошибка ввода\n"));

else ka=zn;

}while(v);

do

{ v=1;

printf(rus("количество

преподавателей \n"));

scanf("%s",&sss);

sss[9]='\0';

v=mist(1);

if(v) printf(rus("Ошибка ввода\n"));

else pr=zn;

}while(v);

rt=add(rt,rt,inf);

if(rt) count++; return;

}

else return;

}

}

else

{

FILE*f;

while(true)

{ char s[100];

printf(rus("Введите имя файла\n"));

scanf("%s",&s);

s[99]=’\0’;

f=fopen(s,"r");

if(!f) {printf(rus("Ошибка чтения файла,

введите другое имя\n"));return;}

else break;

}

do

{ fscanf(f,"%d",&inf);

fscanf(f,rus("%s"),&nam);

fscanf(f,rus("%s"),&fa);

fscanf(f,"%d",&ka);

fscanf(f,"%d",&pr);

rt=add(rt,rt,inf);

if(rt) count++;

}while(!feof(f));

fclose(f);

}

}

void f() //функция "f" - предназначена для поиска узла дерева, может

// использовать функции "find", "view" и "mist"

{ if(!rt){printf(rus("Пусто\n")); return;}

tree *r;

int key;

int v=1;

do

{ printf(rus("Введите число (номер факультета)\n"));

scanf("%s",&sss);

sss[9]='\0';

v=mist(1);

if(v) printf(rus("Ошибка ввода\n"));

else key=zn;

}while(v);

r=find(rt,key);

if(r)

{

view(r,1);

}

else printf(rus("Элемент не найден\n"));

}

void inorder(tree *root) //функция "inorder" - предназначена для вывода

//дерева в симметричном порядке (на экран),

//использует функцию "view"

{ if(!root)return;

inorder(root->left);

if(root->info)

{

view(root,1);

printf(rus("\n"));

}

inorder(root->right);

}

void preorder(tree *root) //функция "preorder" - предназначена для вывода

//дерева в прямом порядке (на экран), //использует функцию "view"

{ if(!root)return;

if(root->info)

{

view(root,1);

printf(rus("\n"));

}

preorder(root->left);

preorder(root->right);

}

void postorder(tree *root) //функция "postorder" - предназначена для вывода //дерева в обратном порядке (на экран),

//использует функцию "view"

{ if(!root)return;

postorder(root->left);

postorder(root->right);

if(root->info)

{

view(root,1);

printf(rus("\n"));

}

}

void print(tree *root,int level) //функция "print" - предназначена для

//вывода дерева боком(на экран)

{

if(root->right!=NULL) print(root->right,level+1);

for(int i=0;i<level;i++) printf(rus(" "));

printf(rus("%d\n"),root->info);

if(root->left!=NULL) print(root->left,level+1);

}

void finorder(tree *root) //функция "finorder" - предназначена для записи // в файл всего дерева либо его узла

{ if(!root)return;

FILE*e;

e=fopen(ss,"a");

finorder(root->left);

if(root->info)

{ fprintf(e,rus("%d\n"),root->info);

fprintf(e,rus("%s\n"),root->name);

fprintf(e,rus("%s\n"),root->fam);

fprintf(e,rus("%d\n"),root->kaf);

fprintf(e,rus("%d\n"),root->pre);

}

finorder(root->right);

fclose(e);

}

void l() //функция "l" - предназначена для вывода дерева, может использовать

// функции "print", "inorder", "preorder", "postorder" и "finorder"

{ char s[2];

if(!rt){printf(rus("Пусто\n")); return;}

while(true)

{ printf(rus("Введите \nВывод на экран\nB - боком,\nS - симметрично,\nW - сверху,\nH - снизу\nF - Вывод в файл\n"));

fscanf(stdin,"%s",&s);

s[1]='\0';

*s=toupper(*s);

switch(*s)

{ case 'B':{printf(rus("\n")); print(rt,0);

printf(rus("\n")); return;}

case 'S':{inorder(rt); printf(rus("\n")); return;}

case 'W':{preorder(rt); printf(rus("\n"));return;}

case 'H':{postorder(rt);printf(rus("\n"));return;}

case 'F':

{ printf(rus("Введите имя файла\n"));

scanf("%s",&ss);

ss[99]='\0';

finorder(rt);

return;

}

default : printf(rus("Ошибка ввода\n"));

}

}

}

void d() //функция "d" - предназначена для удаления, может

//использовать функции "find", "del", "finorder" и "mist"

{ if(!rt){printf(rus("Пусто\n")); return;}

tree *r=NULL;

int z;

int v=1;

do

{ z=2;

printf(rus("Вывод\n1 - на экран\n0 - в файл\n"));

scanf("%s",&sss);

sss[1]='\0';

v=mist(1);

if(v) printf(rus("Ошибка ввода\n"));

else z=zn;

}while((v)&&((z<0)||(z>1)));

if(z)

{ int key;

int v=1;

do

{ printf(rus("Введите число (номер факультета)\n"));

scanf("%s",&sss);

sss[9]='\0';

v=mist(1);

if(v) printf(rus("Ошибка ввода\n"));

else key=zn;

}while(v);

r=find(rt,key);

if(!r) {printf(rus("Элемент не найден\n"));return;}

if(rt->info==key) { rt=NULL; count=0;

printf(rus("Все элементы удалены\n")); }

else rt=del(rt,key,1);

}

else

{

tree *r=NULL;

int key;

printf(rus("Введите имя файла\n"));

scanf("%s",&ss);

ss[99]=’\0’;

int v=1;

do

{ printf(rus("Введите число (номер факультета)\n"));

scanf("%s",&sss);

sss[9]='\0';

v=mist(1);

if(v) printf(rus("Ошибка ввода\n"));

else key=zn;

}while(v);

r=find(rt,key);

if(!r) {printf(rus("Элемент не найден\n"));return;}

if(rt->info==key)

{

finorder(rt);

rt=NULL; count=0;

printf(rus("Все элементы удалены\n"));

}

else

{

FILE*e;

e=fopen(ss,"a");

fprintf(e,rus("%d\n"),r->info);

fprintf(e,rus("%s\n"),r->name);

fprintf(e,rus("%s\n"),r->fam);

fprintf(e,rus("%d\n"),r->kaf);

fprintf(e,rus("%d\n"),r->pre);

rt=del(rt,key,0);

fclose(e);

}

}

}

void k() //функция "k" - вывод колличества элементов дерева

{ if(!count) printf(rus("Пусто\n"));

else printf(rus("Количество элементов = %d\n"),count);

}

void menu() //функция "menu"

{

while(true)

{

char s[2];

printf(rus("Введите \nA - добавить,\nF - найти,\nD - удалить,\nL - вывод дерева,\nK - количество элементов, \nQ - выход\n"));

fscanf(stdin,"%s",&s);

s[1]='\0';

*s=toupper(*s);

switch(*s)

{ case'A': a();break;

case'F': f();break;

case'L': l();break;

case'D': d();break;

case'K': k();break;

case'Q': exit(100);

default: printf(rus("Ошибка ввода\n"));break;

}

}

}

void main() //функция "main" : вызывает функцию "menu"

{ menu(); }

35