Создать графическое меню в консоли к готовой программе - C (СИ)
Формулировка задачи:
как сделать графическое меню для этой программы:
#include "stdafx.h"
#include "iostream"
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
int p; //количество элементов
int i;
int j;
float temp;
float arr[100];
int vvod(){
printf("Сколько элементов будет в массиве? ");
//cout << "Введите размер массива" << endl;
scanf_s("%d", &p);
//cin >> p;
arr[30] = arr[p];
//ввод элементов
for (i = 0; i < p; i++){
printf("Введите %d элемент: ", i);
//cout << "Введите " << i << " элемент: \n";
scanf_s("%f", arr + i);
}
return 0;
}
template<class T> void SiftDown(T* const heap, int i, int const n)
{ //Просеивает элемент номер i вниз в пирамиде heap.
//n -- размер пирамиды
//Идея в том, что вычисляется максимальный элемент из трёх:
// 1) текущий элемент
// 2) левый потомок
// 3) правый потомок
//Если индекс текущего элемента не равен индексу максималь-
// ного, то меняю их местами, и перехожу к максимальному
//Индекс максимального элемента в текущей тройке элементов:
int nMax(i);
//Значение текущего элемента (не меняется):
T const value(heap[i]);
while (true)
{ //Рассматривается элемент i и его потомки i*2+1 и i*2+2
//В начале каждой итерации nMax == i и value == heap[i]
int childN(i * 2 + 1); //Индекс левого потомка
//Если есть левый потомок и он больше текущего элемента,
if ((childN < n) && (heap[childN] > value))
nMax = childN; // то он считается максимальным
++childN; //Индекс правого потомка
//Если есть правый потомок и он больше максимального,
if ((childN < n) && (heap[childN] > heap[nMax]))
nMax = childN; // то он считается максимальным
//Если текущий элемент является максимальным из трёх
// (т.е. если он больше своих детей), то конец:
if (nMax == i) break;
//Меняю местами текущий элемент с максимальным:
heap[i] = heap[nMax]; heap[nMax] = value;
// при этом значение value будет в ячейке nMax,
// поэтому в начале следующей итерации значение value
// правильно, т.к. мы переходим именно к этой ячейке
//Переходим к изменившемуся потомку
i = nMax;
};
}
template<class T> void HeapSort(T* const heap, int n)
{ //Пирамидальная сортировка массива heap.
// n -- размер массива
//Этап 1: построение пирамиды из массива
for (int i(n / 2 - 1); i >= 0; --i) SiftDown(heap, i, n);
//Этап 2: сортировка с помощью пирамиды.
// Здесь под «n» понимается размер пирамиды
while (n > 1) //Пока в пирамиде больше одного элемента
{
--n; //Отделяю последний элемент
//Меняю местами корневой элемент и отделённый:
T const firstElem(heap[0]);
heap[0] = heap[n];
heap[n] = firstElem;
//Просеиваю новый корневой элемент:
SiftDown(heap, 0, n);
}
}
void piramid() {
HeapSort(arr, p);
printf("[");
//cout << "[ ";
for (int i = 0; i < p; ++i)
printf(" %f ", arr[i]);
//cout << arr[i] << " ";
printf("]");
//cout << "]" << endl;
printf("\n");
system("pause");
}
int Vibor(){
for (i = 0; i < p; i++)
{
for (j = p - 1; j >= i; j--)
if (arr[j - 1] > arr[j])
{
temp = arr[j - 1];
arr[j - 1] = arr[j];
arr[j] = temp;
}
}
printf("[");
for (i = 0; i < p; i++)
{
printf(" %f ", arr[i]);
//cout << a[i] << " ";
}
printf("]");
printf("\n");
system("pause");
return 1;
}
void zapis(){
FILE * fo;
fopen_s(&fo, "out.txt", "wt");
for (i = 0; i<p; i++) {
fprintf(fo, "|%5.2f|", arr[i]);
}
fclose(fo);
}
int z4ituvanie(){
FILE *file;
file = fopen("in.txt", "r");
if (file == NULL){
printf("error");
system("pause\n");
}
fscanf(file, "%d", &p);
printf("n=%d\n", p);
for (i = 0; i<p; i++){
fscanf(file, "%f", &arr[i]);
printf("%f\n", arr[i]);
}
fclose(file);
system("pause");
return 0;
}
void main()
{
menu:
setlocale(LC_ALL, "Russian");
system("cls");
printf("-----Сделайте выбор-----\a\n");
printf("1. Ввод массива с клавиатуры\n");
printf("2.считывание массива\n");
printf("3. Сортировка массива пирамидальным методом\n");
printf("4. Сортировка массива методом выбора\n");
printf("5. Записать результат в файл (out.txt)\n");
printf("6. Выход из программы\n");
printf("Ваш выбор: ");
int input;
scanf_s("%d", &input);
switch (input) {
case 1:
system("cls");
printf("1. Ввод массива с клавиатуры\n\a");
vvod();
goto menu;
break;
case 2:
system("cls");
printf("2. Считывание массива\n\a");
z4ituvanie();
goto menu;
break;
case 3:
system("cls");
printf("3. Сортировка массива пирамидальным методом\n\a");
piramid();
goto menu;
break;
case 4:
system("cls");
printf("4. Сортировка массива методом выбора\n\a");
Vibor();
goto menu;
break;
case 5:system("cls");
printf("5. Записать результат в файл (output.txt)\n\a");
zapis();
goto menu;
break;
case 6:
printf("До свидания");
break;
default:
printf("Неправильный ввод.\n");
}
}Решение задачи: «Создать графическое меню в консоли к готовой программе»
textual
Листинг программы
void ShowMenu(int iItem)
{
system("cls");
printf("\t***MENU***\n");
printf("%s1 - Ввод массива с клавиатуры\n", iItem == 1 ? ">" : " ");
printf("%s2 - Считывание массива\n", iItem == 2 ? ">" : " ");
printf("%s3 - Сортировка массива пирамидальным методом\n", iItem == 3 ? ">" : " ");
printf("%s4 - Сортировка массива методом выбора\n", iItem == 4 ? ">" : " ");
printf("%s5 - Записать результат в файл (output.txt)\n", iItem == 5 ? ">" : " ");
printf("%s - EXIT\n", "ESC");
}
int main()
{
setlocale(LC_ALL, "");
int iItem = 1;//Отвечает какой пункт меню активен в данный момент
int nLast = 5;//Отвечает какой индекс у последнего пункта меню
BOOL bRUN = TRUE;
ShowMenu(iItem);
while (bRUN)
{
if (GetAsyncKeyState(VK_UP))
if (GetAsyncKeyState(VK_UP))
{
if (0 < iItem - 1)
iItem = iItem - 1;
else
iItem = nLast;
ShowMenu(iItem);
}
if (GetAsyncKeyState(VK_DOWN))
if (GetAsyncKeyState(VK_DOWN))
{
if (iItem < nLast)
iItem = iItem + 1;
else
iItem = 1;
ShowMenu(iItem);
}
if (GetAsyncKeyState(VK_RETURN))
if (GetAsyncKeyState(VK_RETURN))
{
ShowMenu(iItem);
switch (iItem)
{
case 1:
printf("1. Ввод массива с клавиатуры\n\a");
vvod();
break;
case 2:
printf("2. Считывание массива\n\a");
z4ituvanie();
break;
case 3:
printf("3. Сортировка массива пирамидальным методом\n\a");
piramid();
break;
case 4:
printf("4. Сортировка массива методом выбора\n\a");
Vibor();
break;
case 5:
printf("5. Записать результат в файл (output.txt)\n\a");
zapis();
break;
}
}
if (GetAsyncKeyState(VK_ESCAPE))
bRUN = FALSE;
Sleep(100);
}
return 0;
}
Объяснение кода листинга программы
- Ввод массива с клавиатуры
- Считывание массива
- Сортировка массива пирамидальным методом
- Сортировка массива методом выбора
- Записать результат в файл (output.txt)