- •Содержание
- •Введение
- •Теоретический вопрос
- •Наиболее известные двупанельные файловые менеджеры
- •Навигационные файловые менеджеры
- •ViewFd – очень легкий и компактный файловый менеджер.
- •Проводник Windows
- •Постановка задачи
- •Описание программы
- •Руководство пользователя
- •Тестирование
- •Литература
- •Приложение а
Руководство пользователя
При выборе пользователем в любого из пунктов меню, при вводе некорректной строки учитывается только первый введённый символ, при вводе имени файла первые сто символов, при вводе полей дерева – первые десять.
Тестирование
На рисунках 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(); }