Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Создание меню на Си++ (консольное) есть наработки


Автор: Vadik4722 14.7.2019, 00:55
Нужно создать меню, допустим: 1. Выбрать действие: 1.1 ввести число или строку, потом результат ввода строки или числа записать в файл. Примерно так надо сделать. Задание ниже:

Я сделал заготовки, но не пойму, как реализовать само меню и самое сложное это записать потом результат в файл. Я искал в интернете примеры и не мог найти. И еще, очень желательно вместо массива использовать векторы, которые мы еще не проходили.

Разработать классы: "Пункт меню", "Меню". Меню содержит массив указателей на пункты меню (агрегация).
Необходимо создать несколько пунктов меню, разместить их в меню.
Вывести меню (позволяет выбрать пункт и выполнить).
Реализовать сохранение всей структуры объектов на диск и чтение всей структуры объектов с диска. При запуске программы считывать с диска - и создавать все объекты, и отображать получившееся меню.

Код

#include "pch.h"
#include <iostream>
#include <string>
#include <Windows.h>
#include <typeinfo>
#include <vector>
using namespace std;
const char n = '\n';
 
class menu_item;
class menu;
class user_int;
 
void act()
{
    cout << n << "hi" << n;
}
 
class user_int
{
public:
    user_int();
    ~user_int();
    void add(menu_item item);
    void addMenu1(menu_item item); 
    void showMenu1();
 
private:
    vector<menu_item> items;
    menu *m1, *m2;
 
};
 
class menu_item
{
public:
    menu_item(string title, void(*actoin)())
        :title(title), action(action) {}
    void print()
    {
        cout << title << n;
    }
 
    void execute()
    {
        action();
    }
 
private:
    string title;
    void(*action)();
};
 
class menu
{
public:
    menu(string titile)
        :title(title) {}
    void add(menu_item* item_ptr)
    {
        items.push_back(item_ptr); // чтобы добавить 
    }
 
    void show() // она не реализована
    {
        for (size_t i = 0; i < items.size(); i++)
        {
            cout << items[i] << n;
        }
    }
private:
    string title;
    vector<menu_item*> items;
};
 
user_int::user_int()
{
    // todo
 
}
 
user_int::~user_int()
{
    // todo
}
 
void user_int::add(menu_item item)
{
    items.push_back(item);
    
}
 
void user_int::showMenu1()
{
    // todo
}
 
int main()
{
    setlocale(0, "");
 
    user_int ui;
    ui.add(menu_item("item 1", act));
}

Автор: vol4ek 15.7.2019, 19:46
меню в консольном приложении 
Код

#include <stdio.h> // для printf() и scanf()
#include <conio.h> // для _getch()
#include <windows.h>
HANDLE hConsole, hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

void add()
{return;}// объявляем нужные
void dif()
{return;}// нам функции

int m_pos = 0;            // позиция меню
int max_pos = 3;        // максимальная позиция меню
char s1[101];

enum ConsoleColor
{
    Black         = 0,
    Blue          = 1,
    Green         = 2,
    Cyan          = 3,
    Red           = 4,
    Magenta       = 5,
    Brown         = 6,
    LightGray     = 7,
    DarkGray      = 8,
    LightBlue     = 9,
    LightGreen    = 10,
    LightCyan     = 11,
    LightRed      = 12,
    LightMagenta  = 13,
    Yellow        = 14,
    White         = 15
};

char* ru(char* s) { AnsiToOem(s, s1);    return s1; } // вывод русским языком

void SetColor(int text, int background) // устанавливаем цвет
{
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
}

void GotoXY(int X, int Y) // позиция курсора
{
    COORD coord = { X, Y };
    SetConsoleCursorPosition(hStdOut, coord);
}

void go(int x) // Если нажали Enter
{
    if(x==0) add();
    if(x==1) dif();
    printf(ru("\n   Нажмите любую\n      клавишу"));
    SetColor(0,0); 
    GotoXY(35,24);
    exit(0);
}

void choice();

void menu()
{
    system("cls"); // очистить экран
    if(m_pos==0) 
    { 
        SetColor(6,0); printf(ru(" + Прибавить матрицы\n")); SetColor(15,0);
        printf(ru("   Отнять матрицы\n"));
        printf(ru("   Выход\n")); 
        choice();
    }
    if(m_pos==1) 
    { 
        printf(ru("   Прибавить матрицы\n")); 
        SetColor(6,0); printf(ru(" + Отнять матрицы\n")); SetColor(15,0);
        printf(ru("   Выход\n")); 
        choice(); 
    }
    if(m_pos==2)
    { 
        printf(ru("   Прибавить матрицы\n"));
        printf(ru("   Отнять матрицы\n"));
        SetColor(6,0); printf(ru(" + Выход\n")); SetColor(15,0);
        choice();
    }
}

void choice() // функция выбора
{
l:
    int ch=_getch(); // считываем значение нажатой клавиши
    if(ch==224) // 224 - это стрелочки
    {
        switch(ch)
        {
        case 80: // вниз
            if(m_pos+1<max_pos) ++m_pos;
            menu();
            break;
        case 72: // вверх
            if(m_pos-1>=0) --m_pos;
            menu();
            break;
        case 13: // Enter
            go(m_pos);
            break;
        default:
            goto l;
        }
    }
    switch(ch)
    {
    case 80: // вниз
        if(m_pos+1<max_pos) ++m_pos;
        menu();
        break;
    case 72: // вверх
        if(m_pos-1>=0) --m_pos;
        menu();
        break;
    case 13: // Enter
        go(m_pos);
        break;
    default:
        goto l;
    }
}

void main()
{
    menu();
}

пишите что не получается

Автор: Vadik4722 18.7.2019, 02:32
Цитата(vol4ek @ 15.7.2019,  19:46)
меню в консольном приложении 
Код

#include <stdio.h> // для printf() и scanf()
#include <conio.h> // для _getch()
#include <windows.h>
HANDLE hConsole, hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

void add()
{return;}// объявляем нужные
void dif()
{return;}// нам функции

int m_pos = 0;            // позиция меню
int max_pos = 3;        // максимальная позиция меню
char s1[101];

enum ConsoleColor
{
    Black         = 0,
    Blue          = 1,
    Green         = 2,
    Cyan          = 3,
    Red           = 4,
    Magenta       = 5,
    Brown         = 6,
    LightGray     = 7,
    DarkGray      = 8,
    LightBlue     = 9,
    LightGreen    = 10,
    LightCyan     = 11,
    LightRed      = 12,
    LightMagenta  = 13,
    Yellow        = 14,
    White         = 15
};

char* ru(char* s) { AnsiToOem(s, s1);    return s1; } // вывод русским языком

void SetColor(int text, int background) // устанавливаем цвет
{
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
}

void GotoXY(int X, int Y) // позиция курсора
{
    COORD coord = { X, Y };
    SetConsoleCursorPosition(hStdOut, coord);
}

void go(int x) // Если нажали Enter
{
    if(x==0) add();
    if(x==1) dif();
    printf(ru("\n   Нажмите любую\n      клавишу"));
    SetColor(0,0); 
    GotoXY(35,24);
    exit(0);
}

void choice();

void menu()
{
    system("cls"); // очистить экран
    if(m_pos==0) 
    { 
        SetColor(6,0); printf(ru(" + Прибавить матрицы\n")); SetColor(15,0);
        printf(ru("   Отнять матрицы\n"));
        printf(ru("   Выход\n")); 
        choice();
    }
    if(m_pos==1) 
    { 
        printf(ru("   Прибавить матрицы\n")); 
        SetColor(6,0); printf(ru(" + Отнять матрицы\n")); SetColor(15,0);
        printf(ru("   Выход\n")); 
        choice(); 
    }
    if(m_pos==2)
    { 
        printf(ru("   Прибавить матрицы\n"));
        printf(ru("   Отнять матрицы\n"));
        SetColor(6,0); printf(ru(" + Выход\n")); SetColor(15,0);
        choice();
    }
}

void choice() // функция выбора
{
l:
    int ch=_getch(); // считываем значение нажатой клавиши
    if(ch==224) // 224 - это стрелочки
    {
        switch(ch)
        {
        case 80: // вниз
            if(m_pos+1<max_pos) ++m_pos;
            menu();
            break;
        case 72: // вверх
            if(m_pos-1>=0) --m_pos;
            menu();
            break;
        case 13: // Enter
            go(m_pos);
            break;
        default:
            goto l;
        }
    }
    switch(ch)
    {
    case 80: // вниз
        if(m_pos+1<max_pos) ++m_pos;
        menu();
        break;
    case 72: // вверх
        if(m_pos-1>=0) --m_pos;
        menu();
        break;
    case 13: // Enter
        go(m_pos);
        break;
    default:
        goto l;
    }
}

void main()
{
    menu();
}

пишите что не получается

//Разработать классы : "Пункт меню", "Меню".Меню содержит массив указателей на пункты меню(агрегация).
//Необходимо создать несколько пунктов меню, разместить их в меню.
//Вывести меню(позволяет выбрать пункт и выполнить).
//Реализовать сохранение всей структуры объектов на диск и чтение всей структуры объектов с диска.
//При запуске программы считывать с диска - и создавать все объекты, и отображать получившееся меню.

Вот это не получается сделать. Только смог сделать заготовку.

Добавлено через 12 минут и 40 секунд
vol4ek, 
и язык не СИ а СИ++

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)