۲۷-خرداد-۱۳۸۷, ۰۰:۲۸:۵۶
دوستان من توضیح خط به خط این پروژه های زیرو میخوام برای استادم هیچی زبان سی بلد نیستم مرسی که درکم میکنید بچه ها 20 نمره داره...
این برنامه ی منو
اینم دفتر چه ی تلفن
بچه ها توضیح شو استاد از من خط به خط میخواد...از همتون ممنونم
این برنامه ی منو
کد:
/*
dynamic menu with C++ version 1.01 ,updated on July - 9 -2002
This program must be run under BC v3.0 or higher version
*/
#include<conio.h>
#include<dos.h>
#include<stdio.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define FAIL 0
#define ENT 0x000d
#define ESC 0x001b
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
/*
This menu system designed for CGA/EGA/VGA adapter,monochrom is not
supported
*/
class base{
public:
int StrLen(char*);
void StrCopy(char*,char*);
int StrCmp(char*,char*);
};
//----------------------------------------------------------------------
int base::StrLen(char *s)
{
int i;
i=0;
while(*s++)i++;
return i;
}
//---------------------------------------------------------------------
void base::StrCopy(char *dest,char *src)
{
while(*src)*dest++=*src++;
*dest=*src;
}
//---------------------------------------------------------------------
int base::StrCmp(char *dest,char *src)
{
do{
if(*src++!=*dest++)return TRUE;
}while(*src&&*dest);
return FALSE;
}
//*********************************************************************
class screen:public base{
private:
unsigned char TextAttribute,current_x,current_y;
public:
unsigned int last_pressed_key;
screen(void);
unsigned int GetKey(void);
void SetColor(char,char);
void SetTColor(char);
void SetBColor(char);
void SetVideoMode(char);
void CLS(void);
int ReadChar(int,int);
void PutChar(int,int,char);
void PutString(int,int,char*);
void Locate(char,char);
void SetCursor(char,char);
void HideCursor(void);
void ShowCursor(void);
void Fill(char,char,char,char,char);
void Box(int,int,int,int,char*);
void SaveScreen(int,int,int,int,int*);
void LoadScreen(int,int,int,int,int*);
};
//--------------------------------------------------------------
screen::screen(void)
{
TextAttribute=14;
current_x=0;
current_y=0;
}
//--------------------------------------------------------------
unsigned int screen::GetKey(void)
{
unsigned int key;
if(!(key=getch()))key=getch()<<8;
last_pressed_key=key;
return key;
}
//--------------------------------------------------------------
void screen::SetColor(char tcolor,char bcolor)
{
TextAttribute=bcolor<<4|tcolor;
}
//--------------------------------------------------------------
void screen::SetTColor(char text)
{
TextAttribute=(TextAttribute&0xf0)|text;
}
//--------------------------------------------------------------
void screen::SetBColor(char text)
{
TextAttribute=(TextAttribute&0x0f)|text<<4;
}
//--------------------------------------------------------------
void screen::SetVideoMode(char mode)
{
asm{
mov ah,0
mov al,mode
int 0x10
}
}
//--------------------------------------------------------------
void screen::CLS(void)
{
SetVideoMode(3);
}
//--------------------------------------------------------------
int screen::ReadChar(int x, int y)
{
int attrib;
asm{
mov ax,0xb800
mov es,ax
mov ax,y
mov bl,160
mul bl
mov bx,x
shl bx,1
add bx,ax
mov ax,es:[bx]
mov attrib,ax
}
return attrib;
}
//--------------------------------------------------------------
void WriteChar(int x,int y ,int char_attrib)
{
asm{
mov ax,0xb800
mov es,ax
mov ax,y
mov bl,160
mul bl
mov bx,x
shl bx,1
add bx,ax
mov cx,char_attrib
mov es:[bx],cx
}
}
//--------------------------------------------------------------
void screen::Locate(char x,char y)
{
char xx,yy;
asm{
mov ah,2
mov bh,0
mov dl,x
mov dh,y
int 0x10
mov xx,dl
mov yy,dh
}
current_x=xx;
current_y=yy;
}
//--------------------------------------------------------------
void screen::PutChar(int x,int y,char chr)
{
WriteChar(x,y,(unsigned char)chr|(TextAttribute<<8));
}
//--------------------------------------------------------------
void screen::PutString(int x,int y,char *s)
{
while(*s)PutChar(x++,y,*s++);
Locate(x,y);
}
//--------------------------------------------------------------
void screen::SetCursor(char start,char end)
{
asm{
mov ah,1
mov ch,start
mov cl,end
int 0x10
}
}
//--------------------------------------------------------------
void screen::HideCursor(void)
{
SetCursor(1,0);
}
//--------------------------------------------------------------
void screen::ShowCursor(void)
{
SetCursor(4,5);
}
//--------------------------------------------------------------
void screen::Fill(char x1,char y1,char width,char height,char chr)
{
char i,j,x2,y2;
x2=x1+width-1;
y2=y1+height-1;
for(j=y1;j<=y2;j++)
for(i=x1;i<=x2;i++)
PutChar(i,j,chr);
}
//--------------------------------------------------------------
void screen::Box(int x1,int y1,int width,int height,char *pattern)
{
int i,j,x2,y2;
x2=x1+width-1;
y2=y1+height-1;
for(i=x1;i<x2;i++)
{
PutChar(i,y1,pattern[1]);
PutChar(i,y2,pattern[5]);
}
for(j=y1;j<y2;j++)
{
PutChar(x1,j,pattern[7]);
PutChar(x2,j,pattern[3]);
}
PutChar(x1,y1,pattern[0]);
PutChar(x2,y1,pattern[2]);
PutChar(x2,y2,pattern[4]);
PutChar(x1,y2,pattern[6]);
}
//--------------------------------------------------------------
void screen::SaveScreen(int x1,int y1,int width,int height,int *buff)
{
int i,j,x2,y2;
x2=x1+width-1;
y2=y1+height-1;
for(j=y1;j<=y2;j++)
for(i=x1;i<=x2;i++)
*buff++=ReadChar(i,j);
}
//--------------------------------------------------------------
void screen::LoadScreen(int x1,int y1,int width,int height,int *buff)
{
int i,j,x2,y2;
x2=x1+width-1;
y2=y1+height-1;
for(j=y1;j<=y2;j++)
for(i=x1;i<=x2;i++)
WriteChar(i,j,*buff++);
}
//**********************************************************************
struct bar_pad{
char *prompt;
char *popup_name;
struct bar_pad *next;
};
struct popup_pad{
char *prompt;
struct popup_pad *next;
};
struct bar_menu{
char *name;
int x,y,count,act;
struct bar_pad *pad;
struct bar_menu *next;
};
struct popup_menu{
char *name;
int x,y,count,act,max;
struct popup_pad *pad;
struct popup_menu *next;
};
class menu:public screen{
protected:
struct{
char text,background,
a_text,a_background,
b_text,b_background,
s_text,s_background;
}menu_color;
struct bar_menu *bar;
struct popup_menu *popup;
char default_border[8];
char *current_popup_name;
char *current_bar_name;
void AddBarPad(struct bar_menu*,char*,char*);
struct bar_pad* GotoBarPad(struct bar_menu*,int);
void DeleteBarPads(struct bar_menu*);
struct bar_menu* GotoBar(char*);
void AddPopupPad(struct popup_menu*,char*);
struct popup_pad *GotoPopupPad(struct popup_menu*,int);
void DeletePopupPads(struct popup_menu*);
struct popup_menu *GotoPopup(char*);
public:
menu(void);
~menu(void);
void DefineBar(char*,int,int);
void DefineBarPad(char*,char*,char*);
void DeleteBars(void);
void DefinePopup(char*,int,int);
void DefinePopupPad(char*,char*);
void DeletePopups(void);
char ActivateBar(char*);
char ActivatePopup(char*);
virtual void OnPopupPad(char*,int){};
virtual void OnBarPad(char*,int){};
virtual void OnSelectBar(char*,int){};
virtual void OnSelectPopup(char*,int){};
};
menu::menu(void)
{
bar=NULL;
popup=NULL;
current_bar_name=NULL;
current_popup_name=NULL;
menu_color.text=BLACK;
menu_color.background=LIGHTGRAY;
menu_color.a_text=WHITE;
menu_color.a_background=RED;
menu_color.b_text=BLACK;
menu_color.b_background=LIGHTGRAY;
menu_color.s_text=BLACK;
menu_color.s_background=BLACK;
default_border[0]='ع';
default_border[1]='ؤ';
default_border[2]='·';
default_border[3]='؛';
default_border[4]='¼';
default_border[5]='ح';
default_border[6]='ش';
default_border[7]='³';
}
menu::~menu(void)
{
DeleteBars();
DeletePopups();
}
void menu::AddBarPad(struct bar_menu *bm,char *prompt,char
*popup_name){
struct bar_pad *p,*tmp;
p=new bar_pad;
p->prompt=new char[StrLen(prompt)+1];
p->popup_name=new char[StrLen(popup_name)+1];
StrCopy(p->prompt,prompt);
StrCopy(p->popup_name,popup_name);
p->next=NULL;
if(bm->pad==NULL){
bm->pad=p;
bm->count=1;
}else{
tmp=bm->pad;
while(tmp->next)tmp=tmp->next;
tmp->next=p;
bm->count++;
}
}
struct bar_pad* menu::GotoBarPad(struct bar_menu *bm,int n){
struct bar_pad *p;
int i;
p=bm->pad;
for(i=1;i<n;i++)p=p->next;
return p;
}
void menu::DeleteBarPads(struct bar_menu *bm){
struct bar_pad *tmp;
while(bm->pad){
tmp=bm->pad;
bm->pad=tmp->next;
delete[] tmp->prompt;
delete[] tmp->popup_name;
delete tmp;
}
bm->count=0;
}
void menu::DefineBar(char *name,int x,int y){
struct bar_menu *p,*tmp;
p=new bar_menu;
p->name=new char[StrLen(name)+1];
StrCopy(p->name,name);
p->x=x;
p->y=y;
p->count=p->act=0;
p->pad=NULL;
p->next=NULL;
if(bar==NULL)bar=p;
else{
tmp=bar;
while(tmp->next)tmp=tmp->next;
tmp->next=p;
}
}
struct bar_menu* menu::GotoBar(char *name){
struct bar_menu *p;
p=bar;
while(p){
if(!StrCmp(p->name,name))return p;
p=p->next;
}
return NULL;
}
void menu::DefineBarPad(char *name,char *prompt,char *popup_name){
struct bar_menu *p;
p=GotoBar(name);
if(p)AddBarPad(p,prompt,popup_name);
}
void menu::DeleteBars(void){
struct bar_menu *tmp;
while(bar){
tmp=bar;
bar=tmp->next;
DeleteBarPads(tmp);
delete tmp;
}
}
void menu::AddPopupPad(struct popup_menu *pm,char *prompt){
struct popup_pad *p,*tmp;
p=new popup_pad;
p->prompt=new char[StrLen(prompt)+1];
StrCopy(p->prompt,prompt);
p->next=NULL;
if(pm->pad==NULL){
pm->pad=p;
pm->count=1;
}else{
tmp=pm->pad;
while(tmp->next)tmp=tmp->next;
tmp->next=p;
pm->count++;
}
}
void menu::DeletePopupPads(struct popup_menu *pm){
struct popup_pad *tmp;
while(pm->pad){
tmp=pm->pad;
pm->pad=tmp->next;
delete[] tmp->prompt;
delete tmp;
}
pm->count=0;
if(current_bar_name){
delete[] current_bar_name;
current_bar_name=NULL;
}
}
struct popup_pad* menu::GotoPopupPad(struct popup_menu *pm,int n){
struct popup_pad *p;
int i;
p=pm->pad;
for(i=1;i<n;i++)p=p->next;
return p;
}
void menu::DefinePopup(char *name,int x,int y){
struct popup_menu *p,*tmp;
p=new popup_menu;
p->name=new char[StrLen(name)+1];
StrCopy(p->name,name);
p->x=x;
p->y=y;
p->count=0;
p->act=1;
p->max=5;
p->pad=NULL;
p->next=NULL;
if(popup==NULL)popup=p;
else{
tmp=popup;
while(tmp->next)tmp=tmp->next;
tmp->next=p;
}
}
struct popup_menu* menu::GotoPopup(char *name){
struct popup_menu *p;
p=popup;
while(p){
if(!StrCmp(p->name,name))return p;
p=p->next;
}
return NULL;
}
void menu::DefinePopupPad(char *name,char *prompt){
struct popup_menu *p;
p=GotoPopup(name);
if(p) AddPopupPad(p,prompt);
}
void menu::DeletePopups(void){
struct popup_menu *tmp;
while(popup){
tmp=popup;
popup=tmp->next;
DeletePopupPads(tmp);
delete tmp;
}
if(current_popup_name){
delete[] current_popup_name;
current_popup_name=NULL;
}
}
char menu::ActivateBar(char *name)
{
struct bar_menu *bmenu;
struct bar_pad *bpad;
int i,l,act;
unsigned int key;
bmenu=GotoBar(name);
if(bmenu&&bmenu->count){
if(current_bar_name)delete[] current_bar_name;
current_bar_name=new char[StrLen(name+1)];
StrCopy(current_bar_name,name);
key=0;
bmenu->act=1;
SetColor(menu_color.text,menu_color.background);
Fill(0,bmenu->y,80,1,' ');
while(key!=ESC&&bmenu->count){
l=0;
for(i=1;i<=bmenu->count;i++){
bpad=GotoBarPad(bmenu,i);
SetColor(menu_color.text,menu_color.background);
PutString(bmenu->x+l,bmenu->y,bpad->prompt);
l+=StrLen(bpad->prompt);
}
l=0;
for(i=1;i<=bmenu->act;i++){
bpad=GotoBarPad(bmenu,i);
if(i<bmenu->act)l+=StrLen(bpad->prompt);
}
SetColor(menu_color.a_text,menu_color.a_background);
PutString(bmenu->x+l,bmenu->y,bpad->prompt);
OnBarPad(bmenu->name,bmenu->act);
if(ActivatePopup(bpad->popup_name)) key=last_pressed_key;
else key=GetKey();
switch(key){
case LEFT:bmenu->act--;break;
case RIGHT:bmenu->act++;break;
}
if(bmenu->act<1)bmenu->act=bmenu->count;
if(bmenu->act>bmenu->count)bmenu->act=1;
}
}else return FAIL;
return OK;
}
char menu::ActivatePopup(char *name){
struct popup_menu *pmenu;
struct popup_pad *ppad;
int i,len,act;
char rotate_flag,loop_flag;
int
i_start,i_end,border_x,border_y,border_width,border_mid_x,border_height;
int pad_x,pad_y;
int buff[80*25];
unsigned int key;
pmenu=GotoPopup(name);
if(pmenu&&pmenu->count){
if(current_popup_name)delete[] current_popup_name;
current_popup_name=new char[StrLen(name+1)];
StrCopy(current_popup_name,name);
if(pmenu->max>pmenu->count)pmenu->max=pmenu->count;
i_start=1;
i_end=pmenu->count-pmenu->max+1;
if(pmenu->act>pmenu->max){
act=pmenu->max;
i_start=pmenu->act-pmenu->max+1;
}else act=pmenu->act;
border_width=0;
for(i=1;i<=pmenu->count;i++){
ppad=GotoPopupPad(pmenu,i);
len=StrLen(ppad->prompt);
if(len>border_width)border_width=len;//detect max width
}
border_x=pmenu->x;
border_y=pmenu->y;
border_width+=2;
border_height=pmenu->max+2;
pad_x=border_x+1;
pad_y=border_y+1;
key=0;
SaveScreen(border_x,border_y,border_width+2,border_height+1,buff);
SetColor(menu_color.b_text,menu_color.b_background);
Fill(border_x,border_y,border_width,border_height,32);
Box(border_x,border_y,border_width,border_height,default_border);
SetColor(menu_color.s_text,menu_color.s_background);
SetColor(menu_color.s_text,menu_color.s_background);
Fill(border_x+border_width,border_y+1,2,border_height,32);
Fill(border_x+1,border_y+border_height,border_width,1,32);
loop_flag=TRUE;
while(loop_flag){
SetColor(menu_color.b_text,menu_color.b_background);
for(i=0;i<pmenu->max;i++){
ppad=GotoPopupPad(pmenu,i+i_start);
SetColor(menu_color.text,menu_color.background);
PutString(pad_x,pad_y+i,ppad->prompt);
len=StrLen(ppad->prompt);
Fill(pad_x+len,pad_y+i,border_width-len-2,1,' ');
}
SetColor(menu_color.b_text,menu_color.b_background);
border_mid_x=border_width/2+border_x;
PutChar(border_mid_x,border_y,default_border[1]);
PutChar(border_mid_x,border_y+border_height-1,default_border[5]);
if(i_start>1) PutChar(border_mid_x,border_y,30);
if(i_start<i_end) PutChar(border_mid_x,border_y+border_height-1,31);
SetColor(menu_color.a_text,menu_color.a_background);
ppad=GotoPopupPad(pmenu,act+i_start-1);
PutString(pmenu->x+1,pmenu->y+act,ppad->prompt);
pmenu->act=act+i_start-1;
OnPopupPad(pmenu->name,pmenu->act);
key=GetKey();
switch(key){
case UP :act--;break;
case DOWN:act++;break;
case LEFT:loop_flag=FALSE;break;
case RIGHT:loop_flag=FALSE;break;
case ESC:loop_flag=FALSE;break;
case ENT:loop_flag=FALSE;break;
}
if(act<1){
act=1;i_start--;
}
if(act>pmenu->max){
act=pmenu->max;i_start++;
}
if(i_start<1){
i_start=i_end;
act=pmenu->max;
}
if(i_start>i_end){
i_start=1;
act=1;
}
}
LoadScreen(border_x,border_y,border_width+2,border_height+1,buff);
if(key==ENT)OnSelectPopup(pmenu->name,pmenu->act);
}else return FALSE;
return OK;
}
//**************************************************************************
class menu_test:public menu{
public:
void OnPopupPad(char *popup_name,int act){
gotoxy(35,25);
printf("%15s %d",popup_name,act);
}
void OnBarPad(char *bar_name,int act){
gotoxy(20,25);
printf("%10s %d",bar_name,act);
}
void OnSelectBar(char *bar_name,int act){
gotoxy(10,19);
printf("%10s %d",bar_name, act);
}
void OnSelectPopup(char *popup_name,int act){
gotoxy(10,19);
printf("%10s %d",popup_name, act);
GetKey();
}
void run(void)
{
SetColor(1,7);
Fill(0,0,80,25,'±');
Fill(0,24,80,25,' ');
HideCursor();
DefineBar("main",2,0);
DefineBarPad("main"," File ","file");
DefineBarPad("main"," Edit ","edit");
DefineBarPad("main"," Search ","search");
DefineBarPad("main"," Run ","run");
DefineBarPad("main"," Compile ","compile");
DefineBarPad("main"," Help ","help");
DefinePopup("file",1,1);
DefinePopupPad("file"," New ");
DefinePopupPad("file"," Open ");
DefinePopupPad("file"," Save ");
DefinePopupPad("file"," Save As ");
DefinePopupPad("file"," Change Dir ");
DefinePopupPad("file"," Print ");
DefinePopupPad("file"," OS Shell ");
DefinePopupPad("file"," Exit ");
DefinePopup("edit",8,1);
DefinePopupPad("edit"," Cut ");
DefinePopupPad("edit"," Copy ");
DefinePopupPad("edit"," Past ");
DefinePopupPad("edit"," Clear ");
DefinePopup("search",15,1);
DefinePopupPad("search"," Find ");
DefinePopupPad("search"," Replace ");
DefinePopupPad("search"," Search ");
DefinePopupPad("search"," Go to Line Number ");
DefinePopup("run",24,1);
DefinePopupPad("run"," Run ");
DefinePopupPad("run"," Trace Into ");
DefinePopupPad("run"," Step Over ");
DefinePopupPad("run"," Argoments ... ");
DefinePopup("compile",30,1);
DefinePopupPad("compile"," Compile ");
DefinePopupPad("compile"," Make ");
DefinePopupPad("compile"," Link ");
DefinePopupPad("compile"," Build All ");
DefinePopup("help",39,1);
DefinePopupPad("help"," Contents ");
DefinePopupPad("help"," Index ");
DefinePopupPad("help"," About ");
ActivateBar("main");
ShowCursor();
CLS();
}
};
void main()
{
menu_test test;
test.run();
}
کد:
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <conio.h>
#include <fstream>
using namespace std;
struct Phone
{
char name[15];
char family[15];
char tel[12];
Phone *next;
};
Phone* Start_ptr = NULL;
Phone* current = NULL;
void Select ( int ); // which choice user selected;
void Add_new();
void Print_all();
void Menu1();
void Menu2();
void Edit_current();
void Uninstall();
void Delete_current ();
void Delete_all();
void Tel_or_name( int );
void Read_from_file();
void Write_to_file();
void Save_as_csv();
void Sort_name( int );
void Add_tail_from_file( Phone* );
Phone* Search( char* , int);
enum MENU{ ADD=1, SEARCH_NAME, SEARCH_NO, SORT_NAME, SORT_FAMIL, SHOW_ALL, SAVE, EXPORT_CSV, EXIT, UNINSTALL };
int main()
{
Read_from_file();
int choice;
do
{
Menu1();
cin >> choice;
system("cls");
Select ( choice );
}while ( choice != EXIT );
Write_to_file();
cout <<"Thank you\nSend your comment to arashmidos2006@gmail.com" << endl;
Delete_all();
return 0;
}
/*===================Select=======================*/
void Select( int choose )
{
switch ( choose )
{
case ADD :
Add_new(); break;
case SEARCH_NAME :
Tel_or_name(1); break;
case SEARCH_NO :
Tel_or_name(2); break;
case SORT_NAME :
Sort_name(1); break;
case SORT_FAMIL :
Sort_name(2); break;
case SHOW_ALL :
Print_all(); break;
case SAVE :
Write_to_file();
cout <<"We will save your data automatically when your work finished" << endl;
system("pause");
break;
case EXPORT_CSV :
Save_as_csv(); break;
case EXIT :
return;
case UNINSTALL :
Uninstall(); break;
default :
cout <<"Select again :" << endl;
}
return;
}
/*=================Add_new=====================*/
void Add_new()
{
Phone* temp = new Phone;
Phone* temp2 = Start_ptr;
system("cls");
cout << "Enter the name : ";
cin >> temp->name;
cout << "Family : ";
cin >> temp->family;
cout << "Phone number : ";
cin >> temp->tel;
temp->next = NULL;
if ( Start_ptr == NULL )
{
Start_ptr = temp;
}
else
{
while( temp2->next != NULL )
{
temp2 = temp2->next;
}
temp2->next = temp;
}
return;
}
/*==============Print_all=======================*/
void Print_all()
{
Phone* temp = Start_ptr;
char show[35];
if ( Start_ptr == NULL )
{
cout <<"The list is empty!" << endl;
system("pause");
return;
}
else
{
cout<<"\nName Phone "
<<"\n----------------------------------- ------------" << endl;
do
{
strcpy(show, "");
strcat(show, temp->family);
strcat(show, ", ");
strcat(show, temp->name);
show[0] = toupper(show[0]);
cout << setiosflags( ios::left )
<< setw(36) << show << setw(12) <<temp->tel <<endl;
temp = temp->next;
}while(temp != NULL);
}
cout << endl;
system("pause");
return;
}
/*=================Search=======================*/
Phone* Search( char* temp_search , int choice )
{
/* If list is empty */
if ( Start_ptr == NULL )
{
cout <<"List is empty!" << endl;
return NULL;
}
/* Search by name */
if ( choice == 1 )
{
while( current != NULL && strcmp( current->name, temp_search ) != 0 )
{
current = current->next;
}
}
/* Search by tel */
if ( choice == 2 )
{
while( current != NULL && strcmp( current->tel, temp_search ) != 0 )
{
current = current->next;
}
}
/* If record found */
if ( current != NULL )
{
cout << "Record found" << endl
<< current->name << " " << current->family << " : " << current->tel << endl;
return current;
}
/* If record !found */
else
{
cout <<"Record NOT found" << endl;
current = Start_ptr; //move back the current pointer to fisrt node
return NULL;
}
}
/*====================Delete_current====================*/
void Delete_current()
{
Phone* temp = NULL;
Phone* prev = NULL;
/* If it`s the fisrt node */
if ( current == Start_ptr )
{
temp = Start_ptr;
Start_ptr = Start_ptr->next; //If we have only 1 node, start_ptr will point to NULL
delete temp;
temp = NULL;
}
/* If it`s in the middle of list or the last node */
else
{
prev = Start_ptr;
while( prev->next != current )
{
prev = prev->next;
}
prev->next = current->next;// If it`s the last node prev will point to NULL
delete current;
current = Start_ptr;
}
}
/*=================Delete_all=================*/
void Delete_all()
{
if ( Start_ptr == NULL )
{
return; // we have no memory allocated
}
Phone* temp = Start_ptr;
while( Start_ptr != NULL )
{
temp = Start_ptr;
Start_ptr = Start_ptr->next;
delete temp;
}
}
/*=================Tel_or_name================*/
void Tel_or_name(int choose)
{
Phone* temp_del = NULL;
char temp_search[15];
int choice;
current = Start_ptr;
cout <<"Enter the "<<(choose == 1 ? "name" : "tel") <<" to search : ";
cin >> temp_search;
temp_del = Search( temp_search, choose );
while ( temp_del != NULL )
{
Menu2();
cin >> choice;
switch( choice )
{
case 1: current = current->next; temp_del = Search( temp_search, choose ); break;
case 2: Delete_current(); break;
case 3: Edit_current(); break;
case 4: return;
}
}
system("pause");
}
/*==============Write_to_file=============================*/
void Write_to_file()
{
Phone* temp = Start_ptr;
ofstream outFile("Data.dat" , ios::out );
if( !outFile )
{
cerr << "Some error ocured during writing to file." << endl;
system("pause");
return;
}
while( temp != NULL )
{
outFile << temp->name << " " << temp->family << " " << temp->tel;
if( temp->next != NULL )
{
outFile << endl;
}
temp = temp->next;
}
outFile.close();
cout <<"Data saved successfully." << endl;
}
/*===============Read_from_file=============================*/
void Read_from_file()
{
ifstream inputFile("Data.dat" , ios::in );
if ( !inputFile )
{
cout << "Data couldn`t be loaded." << endl;
system("pause");
return;
}
do
{
Phone* temp = new Phone;
inputFile >> temp->name;
inputFile >> temp->family;
inputFile >> temp->tel;
temp->next = NULL;
Add_tail_from_file( temp );
//Where should I place delete temp?????
}while( !inputFile.eof() );
cout <<"Data loaded successfully" << endl;
}
/*================Save_as_csv===========================*/
void Save_as_csv()
{
ofstream outputFile;
cout << "Enter the path you want to save your file.\nExample : c:\\\\program\\\\yourfile.csv" << endl;
char path[100]="";
cin>>path;
outputFile.open( path, ios::out );
if( !outputFile )
{
cerr << "Some error ocured during writing to file." << endl;
exit(1);
}
outputFile << "Name" << ';' << "Family" << ';' <<"Tel" <<endl;
Phone* temp = Start_ptr;
while( temp != NULL )
{
outputFile << temp->name << ';' << temp->family << ';' << temp->tel << endl;
temp = temp->next;
}
outputFile.close();
cout << "Data saved successfully at " << path << endl;
system("pause");
}
/*==============Add_tail_from_file=================*/
void Add_tail_from_file( Phone* temp )
{
if ( Start_ptr == NULL )
{
Start_ptr = temp;
}
else
{
Phone* temp2 = Start_ptr;
while ( temp2->next != NULL )
{
temp2 = temp2->next;
}
temp2->next = temp;
}
}
/*================Sort_name=================================*/
void Sort_name(int choice)
{
/* If list is empty */
if ( Start_ptr == NULL )
{
cout <<"The list is empty!" << endl;
system("pause");
return;
}
/* Determine the size of list */
int counter = 1;
Phone* temp = Start_ptr;
while( temp->next != NULL )
{
temp = temp->next;
counter++;
}
/* an Array of pointers to struct Phone. I couldn`t do this part by dynamic memory
allocation i.e Phone* sort = new Phone[counter]
or some thing like that. if you could help, please send me your suggestion .*/
Phone* sort[1000];
sort[0] = Start_ptr;
for ( int cnt = 1; cnt < counter; cnt++ )
{
sort[cnt] = sort[cnt-1]->next;
}
sort[counter] = NULL;
/* bubble sort */
/* This part could be better too.for example if user enter capital 'F' it comes
before 'a'. I had to change all letter to lower case but has no time. */
for ( int i = 0; i < counter; i++ )
{
for ( int j = 0; j < counter - i - 1; j++)
{
/* Sort by name */
if ( choice == 1 )
{
if ( strcmp(sort[j]->name, sort[j+1]->name) > 0 )
{
Phone* temp2 = sort[j];
sort[j] = sort[j+1];
sort[j+1] = temp2;
}
}
/* Sort by family */
else
{
if ( strcmp(sort[j]->family, sort[j+1]->family) > 0 )
{
Phone* temp2 = sort[j];
sort[j] = sort[j+1];
sort[j+1] = temp2;
}
}
}
}
/* Showing sorted list */
char show[35];
int index= 0;
cout<<"\nName Phone "
<<"\n----------------------------------- ------------" << endl;
do
{
strcpy(show, "");
strcat(show, sort[index]->family);
strcat(show, ", ");
strcat(show, sort[index]->name);
show[0] = toupper(show[0]);
cout << setiosflags( ios::left )
<< setw(36) << show << setw(12) <<sort[index]->tel <<endl;
}while(sort[++index] != NULL);
cout << endl;
system("pause");
return;
}
/*====================Menu1=======================*/
void Menu1()
{
system("cls");
cout << "1. Add new phone"
<<"\n2. Search for name"
<<"\n3. Search for number"
<<"\n4. Sort by name"
<<"\n5. Sort by family"
<<"\n6. Show all list"
<<"\n7. Save data"
<<"\n8. Export as CSV ( Comma Separated Values )"
<<"\n9. Exit"
<<"\n10. Uninstall"
<<"\n\nYour choice : ";
}
/*====================Menu2=======================*/
void Menu2()
{
cout << "\n1. Find next"
<<"\n2. Delete current person"
<<"\n3. Edit current person"
<<"\n4. continue" << endl
<<"\nYour choice : ";
}
/*====================Uninstall===================*/
void Uninstall()
{
char answer = 'n';
cout <<"Are you sure you want to delete all files include your saved data ? ( y or n)" << endl;
cin >> answer;
if ( toupper( answer ) == 'Y' )
{
system("cls");
cout << "Uninstalling...\n";
remove("Phonebook.cpp");
remove("Phonebook.plg");
remove("Phonebook.dsp");
remove("Phonebook.ncb");
remove("Phonebook.exe");
remove("Data.dat");
cout <<"Some files couldn`t be deleted. remove them manually." << endl;
system("pause");
Delete_all();
exit(1);
}
}
/*====================Edit_current================*/
void Edit_current()
{
strcpy(current->name,"");
strcpy(current->family,"");
cout << "Enter the name : ";
cin >> current->name;
cout << "Family : ";
cin >> current->family;
cout << "Phone number : ";
cin >> current->tel;
system("cls");
}
/*====================End=========================*/