/*  Виталий Д митриевич Новичков.
    Студент МГТУ ГА, Группа ЭВМ-1-2,

    Декабрь 2010-го года

    Для лабораторной работы #3 по дисциплине:
    "Программирование на языке высокого уровня"
*/
#include <fstream.h>
#include <stdio.h>
#include <stdlib.h>
#include <iomanip.h>
#include <string.h>
#include <iostream.h>
#include <dos.h>
#include <conio.h>

const int m=5, n=6; // Определение внешних констант
ifstream fin;       // Определение выходного файлового потока
ofstream fout;      // Определение выходного файлового потока
char header[6][81];      /* Определение внешнего двухмерного символьного
		       массмва для хранения строк головы таблицы. */

//Определение Функции PRNERR(); для удобного вывода сообщений в рамке
void prnborder(char *errormsg="Привет мир!", int u=7)
{
textcolor(u);
int b;
/* Выравнивание сообщения по-центру экрана методом
Вычитания из количества выводимых слева от сообщения пробелов, равному
ширине экрана в символах, половины количества символов в строчке */
for(b=0; b < 37-strlen(errormsg)/2; b++){ cprintf(" ");}
cprintf("╔═");
for(b=0; b < strlen(errormsg); b++){ cprintf("═");}
cprintf("═╗\r\n"); textcolor(u); // Граница текста красного цвета
for(b=0; b < 37-strlen(errormsg)/2; b++){ cprintf(" ");}
cprintf("║"); textcolor(7);
cprintf(" %s ", errormsg); textcolor(u);//Печать вставленного сообщения в f()
cprintf("║\r\n");
for(b=0; b < 37-strlen(errormsg)/2; b++){ cprintf(" ");}
cprintf("╚═");
for(b=0; b < strlen(errormsg); b++){cprintf("═");}
cprintf("═╝\r\n");
textcolor(7);
printf("\r");
}

void main()
{
#include "nvds.c"
/*
Вывод вступления автора данной программы
<За пределами лабораторной> Если интересно, почитайте nvds.c отдельно или
раскоменируйте строку #include "nvds.c" и запустите программу.
*/

// ЛАБОРАТОРНАЯ РАБОТА
clrscr();


fin.open("function.dat"); // Открытия данных для чтения
if (!(fin))
 {
 prnborder("Ошибка при открытии файла данных function.dat", 4);
 sleep(3);
 exit(1);
 }
 fout.open("function.txt"); // Открытие нового файла результатов для записи
 if (!(fout))
 {
 prnborder("Ошибка при открытии файла результатов function.txt", 4);
 sleep(3);
 exit(1);
 }

 float a[m][n];  // определение локального числового массива функции main
// int i, j;

 void enter(float a[m][n]); /* прототип функции для ввода данных из файла
			       даннвх в ОП, выделенную массивам C и А
			       и вывода строк головы таблицы
			       в файл результатов*/

 void p(float a[m][n]); // прототип функции вывода числового массива
 enter(a); //Вызов функции
 p(a); //Вызов функции
 fout.close();
 printf("\n\n\n\n\n\n");
 prnborder("Вывод данных завершён! Ваши результаты в function.txt", 2);
 sleep(2);
}

//------------------Определение функции вызова данных-------------------
void enter(float a[m][n])
{
int i, j;
for(i=0; i<6; i++)
{
fin.getline(header[i], 82); //Считываются шесть строк "головы" таблицы в массив C
if (i < 4)
fout << header[i] << endl; //Первые 4 строкии выводятся в файл результатов
}
for(i=0;i<m;i++)
for(j=0;j<n;j++)
fin >> *(*(a+i)+j); /* Читаются числовые данные из файла данных
		       и заполняются элементы массива A*/

fin.close(); //Закрывается файл данных
}

//-------------Определение функции вывода числового массива---------------
void p(float a[m][n])
{
int i, j;
for(i=0;i<m;i++)/*Цикл по номерам строк массива A и для каждой строчки и
		 ддя каждой строчки повторяем действия*/
    { fout << '\272'; // Вывдо символа двойной палочки с восьмеричным кодом 272
    for(j=0; j<n; j++)
	switch(j)
	{
	case 0:case 1:case 3:case 4: //Для 0, 1, 3, 4 столбца
	// Устанавливаются форматы вывода данных
	fout.width(10);fout.setf(ios::left|ios::fixed);/*
	Поле вывода 10 позиций, левое выравнивание, вывод чисел в формате
	с фиксированной точкой*/
	fout.precision(5); // точность вывода - 5 знаков после запятой
	fout.setf(ios::scientific); // вывод чисел в формате с плав. точкой.
	fout.precision(4); // точность вывода - 4 знака после запятой
	fout <<a[i][j]<<'│';//вывод элемента, вывод символа │
	break;
	case 2: // Для второго столбца
	fout.width(10);   // поле вывода - 10 позиций
	fout.setf(ios::scientific); //вывод чисел в формате с плавающ. точкой
	fout.precision(4);   // точность вывода - четыре знака после запятой
	fout<<a[i][j]<<'│';//вывод элемента, вывод символа │
	break;
	case 5:
	fout.width(10); // поле вывода 10 позиций
	fout.precision(4);   // точность вывода - 4 знака после запятой.
	fout<<a[i][j]<<"║\n";/*вывод элемента, вывод символа ║
	с переводом на новую строку*/
	break;
	}
    // Выведены все столбцы данной строки и далее проводится проверка:
    if (i==m-1) // Если строка массива последняя, т.е. её номер равен
    fout << header[5] << endl; // выводится послежняя строка завершения таблицы.
    else                  // Если не последняя, выводится строка разделения.
    fout << header[4] << endl;
    }
}