Как мне сделать чтобы то что считывалось в s4ituvanie() можно было отсортировать в Vibor() и piramid() ?
Код:
#include "stdafx.h"
#include "iostream"
#include <stdio.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[100] = arr[p];
//ввод элементов
for (i = 0; i < p; i++){
printf("Введите %d элемент: ", i);
//cout << "Введите " << i << " элемент: \n";
scanf_s("%f", arr + i);
}
return 1;
}
template<class T> void SiftDown(T* const heap, int i, int const n)
{
int nMax(i);
T const value(heap[i]);
while (true)
{
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(" %g ", arr[i]);
//cout << arr[i] << " ";
printf("]");
//cout << "]" << endl;
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(" %g ", arr[i]);
//cout << a[i] << " ";
}
printf("]");
printf("\n");
system("pause");
return 1;
}
void s4ituvanie(){
FILE *fp;
fp=fopen("in.txt", "r");
if (fp != NULL)
{
fscanf(fp, "%d", p);
for (i = 0; i < p; ++i){
fscanf(fp, "%f", arr[i]);
}
fclose(fp);
}
else{
printf("невозможно открыть файл");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
menu:
setlocale(LC_ALL, "Russian");
system("cls");
printf("-----Сделайте выбор-----\a\n");
printf("1. Ввод массива с клавиатуры\n");
printf("2. Считывание массива с файла(input.txt)\n");
printf("3. Сортировка массива пирамидальным методом\n");
printf("4. Сортировка массива методом выбора\n");
printf("5. Записать результат в файл (output.txt)\n");
printf("6. Выход из программы\n");
printf("Ваш выбор: ");
int input;
scanf_s("%d", &input);
switch (input) {
case 1:
system("cls");
printf("Ввод массива с клавиатуры\n\a");
vvod();
goto menu;
break;
case 2:
{
system("cls");
printf("2. Считывание массива с файла(input.txt)\n\a");
s4ituvanie();
goto menu;
}
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");
}
*/
case 6: {
printf("До свидания");
break;
}
default:
printf("Неправильный ввод.\n");
}
return 0;
}