#10 17.04.07 09:53
#11 17.04.07 16:07
#12 17.04.07 18:29
#13 17.04.07 18:32
#14 17.04.07 19:32
#15 17.04.07 23:48
#16 19.04.07 19:44
Re: [c++]меню.
Была программа по работе со списками (студенты у нее делали, чтобы защиту курсовой автоматом получить), где было такое меню. его и рекомендовала.
Код::
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define LEFT 75
#define EXIT 27
#define RIGHT 77
int MENU (char **m)
{
int n, x=3, y;
for (y=0; strcmp(m[y],NULL)!=0; y++);
textbackground(1);
textcolor(14);
clrscr();
for (n=0;n<y;n++)
{
gotoxy(x+n*10,1);
cprintf("%s",m[n]);
}
n=0;
while(1)
{
char c;
gotoxy(x+n*10,1);
textbackground(0);
cprintf("%s",m[n]);
textbackground(1);
c=getch();
gotoxy(x+n*10,1);
cprintf("%s", m[n]);
switch(c)
{
case'\r': window(1,1,80,45);clrscr(); return(n);
case EXIT: window(1,1,80,45);return(-1);
case LEFT: if (n != 0) n--;else n = y-1;break;
case RIGHT: n++; if (n == y)n = 0; break;
}
}
}
void main()
{
int menu, num, menu2;
FILE *fstream;
char f_name[15];
char *ss[]={"Write","Delete","Print_f","Print_l","Statis","Obnovlen","EXIT",NULL};
clrscr();
puts("Enter file name");
gets(f_name);
if((fstream=fopen(f_name,"rb+"))==NULL)
{
if((fstream=fopen(f_name,"wb+"))==NULL)
{
fprintf(stderr,"Cannot open input file.\n");
return;
}
}
for(;;)
{
menu=MENU(ss) + 1;
switch(menu)
{
case 1:
fclose(fstream); fstream=fopen(f_name,"wb+");
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
fclose(fstream);
exit(1);
}
}
}Offline
#17 19.04.07 22:56
#18 20.04.07 20:16
Re: [c++]меню.
В ftp://bobik.hostel.nstu.ru/upload menu.h и menu.cpp
Можешь посмотреть написано с классами и исключениями, не оч сложно вроде.
Offline
#19 21.04.07 14:08
#20 22.04.07 10:23
Re: [c++]меню.
Код::
// menu.h
#ifndef MENU_H
#define MENU_H
#include <string> // Класс строк
#include <iomanip> // манипуляторы
#include <iostream> // Потоки ввода/вывода
#include <vector> // STL Класс вектор
using namespace std;
//#include "except.h" // Классы Исключений
class Menu{ // Класс Меню
char*name; // Имя меню
vector<char*> vc; // Пункты
public:
Menu(char*nm=" Menu"/*Имя меню*/, char**pp_=NULL/*массив пунктов-строк*/) throw(MemExcept&);
int operator()()/* const throw(OverFlowExcept&,IExcept&)*/; // Меню
int add(const char*pc)/* throw(MemExcept&)*/; // Добавление пункта
~Menu();
};
#endifКод::
// menu.cpp
// Консольное меню
#include "menu.h"
// Конструтор Меню
Menu::Menu(char*nm, char**pp_)// throw(MemExcept&)
{
// try{
name=new char[strlen(nm)+1];
strcpy(name,nm);
vc.reserve(10);
if(!pp_)return;
for(int k=0;pp_[k]!=NULL;k++)
vc.push_back(strcpy(new char[strlen(pp_[k])+1], pp_[k]));
// }catch(bad_alloc&) {throw MemExcept("Error: vid. pamyati Menu");}
}
// Деструктор
Menu::~Menu()
{
delete name;
vector<char*>::iterator it=vc.begin();
// while(it!=vc.end()) {delete *it; *it=0;}
// vector сам удаляет своё содержимо почему-то
}
// Вывод меню и запрос действий у пользователя
int Menu::operator()()// const throw(OverFlowExcept&,IExcept&) // Меню
{
int act, n;
cout<<name<<'('<<vc.size()<<')'<<endl;
vector<char*>::const_iterator it=vc.begin();
for(n=0;it!=vc.end();it++,n++)
cout<<setw(2)<<n<<": "<<*it<<endl;
cout<<"Input act, please>";
cin>>act;
if(act<0||act>=n)return(-1);// throw(OverFlowExcept("Incorrect choise"));
return act; // Возвращает номер выбранного действия
}
// Добавление пункта в конец меню
int Menu::add(const char*pc)// throw(MemExcept&)
{
try{
vc.push_back(strcpy(new char[strlen(pc)+1], pc));
return vc.size()-1;
}catch(bad_alloc&){ return (-1); /*throw MemExcept("Error: vid. pamyati Menu");*/}
}Я там убрал выбрасывание исключений, а то ещё надо было бы подключать мою иерархию классов Исключений, которая не нужна. Если что подправь ещё, я не тестил.
Исправлено Jeka (22.04.07 10:28)
Offline

