Материал: 3625

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

11

//

//Пример программы, демонстрирующей работу с двумерным массивом

//(матрицей), выполнение сортировки элементов строк массива, запись

//элементов массива в двоичный файл, чтение данных из файла и вывод их

//на экран монитора.

//

#include "stdafx.h" #include "stdio.h" #include "conio.h" #include "stdlib.h" #include "locale.h"

#define M 5 // количество строк матрицы #define N 5 // количество столбцов матрицы

void inp_matrix(void); void out_matrix(void); void sort_1(void); void sort_2(void); int write_file(void); int read_file(void);

int A[M][N];

int main(void)

{

int it_num; char *menu[10]=

{{"===================================="},

{"=== ВОЗМОЖНЫЕ ДЕЙСТВИЯ ПРОГРАММЫ ==="},

{"===================================="},

{"1. ВВОД ЭЛЕМЕНТОВ МАТРИЦЫ"}, {"2. ВЫВОД МАТРИЦЫ НА ЭКРАН"},

{"3. СОРТИРОВКА ЭЛЕМЕНТОВ СТРОК МАТРИЦЫ ПО ВОЗРАСТАНИЮ"}, {"4. СОРТИРОВКА ЭЛЕМЕНТОВ СТРОК МАТРИЦЫ ПО УБЫВАНИЮ"}, {"5. ЗАПИСЬ ЭЛЕМЕНТОВ МАТРИЦЫ В ФАЙЛ"}, {"6. ЧТЕНИЕ ЧИСЕЛ ИЗ ФАЙЛА В МАТРИЦУ"}, {"7. ВЫХОД ИЗ ПРОГРАММЫ"}};

setlocale(LC_ALL, "Russian");

while (1)

 

{

 

system("cls");

// очистить экран

for (int i=0; i<10; ++i)

{

printf("\n");

printf(menu[i]);

}

printf("\n\nНомер пункта меню: "); it_num = getchar();

switch ((char)it_num)

{

case '1':

12

printf("\nВведите элементы матрицы:\n"); inp_matrix();

break; case '2':

printf("\nЭлементы матрицы:\n"); out_matrix();

break; case '3':

sort_1();

printf("\nВыполнена сортировка элементов строк по \ возрастанию.");

break; case '4':

sort_2();

printf("\nВыполнена сортировка элементов строк по \

убыванию.");

break; case '5':

if (!write_file())

printf("\nВыполнена запись элементов матрицы в файл."); break;

case '6':

if (!read_file())

printf("\nВыполнено чтение данных из файла в матрицу."); break;

case '7': return 0;

default:

printf("\nОшибка: указан неверный номер!");

}

flushall();

printf("\nДля продолжения нажмите любую клавишу...");

_getch();

}

}

void inp_matrix(void) // ввод элементов матрицы

{

for (int i = 0; i < M; ++i) for (int j=0; j < N; ++j)

{

printf("A[%d,%d]=", i, j); scanf("%d", &A[i][j]);

}

}

void out_matrix(void) // вывод матрицы на экран

{

for (int i = 0; i < M; ++i)

{

printf("\n");

for (int j=0; j<N; ++j)

{

printf("%d\t", A[i][j]);

}

}

printf("\n");

}

13

void sort_1(void) // сортировка по возрастанию

{

int i, j, k, tmp;

for (i = 0; i < M; ++i)

{

for (j =0; j<(N-1); ++j)

{

tmp=A[i][j];

for (k = j+1; k < N; ++k)

{

if (A[i][k] < tmp)

{

 

tmp=A[i][k];

 

A[i][k]=A[i][j];

 

A[i][j]=tmp;

 

}

}

 

}

 

}

 

}

 

void sort_2(void)

// сортировка по убыванию

{

int i, j, k, tmp;

for (i = 0; i < M; ++i)

{

for (j =0; j<(N-1); ++j)

{

tmp=A[i][j];

for (k = j+1; k < N; ++k)

{

if (A[i][k] > tmp)

{

tmp=A[i][k];

A[i][k]=A[i][j];

A[i][j]=tmp;

}

}

}

}

}

int write_file(void) // запись из матрицы в файл

{

FILE *fp;

if ((fp = fopen("c:\\tmp\\matrix.dat", "wb"))== NULL)

{

printf("\nОшибка открытия файла c:\\tmp\\matrix.dat\n"); return 1;

}

else

{

for (int i=0; i < M; ++i)

for (int j=0; j < N; ++j)

14

 

fprintf(fp, "%5d", A[i][j]);

fclose(fp);

return 0;

 

}

 

}

 

int read_file(void)

// чтение из файла в матрицу

{

 

FILE *fp;

 

if ((fp = fopen("c:\\tmp\\matrix.dat", "rb"))== NULL)

{

printf("\nОшибка открытия файла c:\\tmp\\matrix.dat\n"); return 1;

}

else

{

for (int i=0; i < M; ++i)

{

for (int j=0; j < N; ++j)

{

if (fscanf(fp, "%5d", &A[i][j])== EOF)

{

fclose(fp);

}

}

}

return 0;

}

}

Работа программы осуществляется в консольном режиме. Для реализации возможностей, реализованных в программе, пользователь использует простое текстовое меню. Выбор требуемого пункта меню осуществляется вводом соответствующего номера. Например, для ввода значений элементов массива используется номер пункта меню 1, который обеспечивает вызов функции inp_matrix (рисунок 2). Ввод значения для каждого элемента матрицы завершается нажатием клавиши Enter.

Рисунок 2 Ввод элементов матрицы

15

Для вывода введенных значений массива используется пункт меню с номером 2, который обеспечивает вызов функции out_matrix (рисунок 3).

Рисунок 3 Вывод элементов матрицы на экран

Для сортировки введенных значений в строках массива используются пункты меню с номерами 3 (по возрастанию значений) и 4 (по убыванию значений), которые обеспечивают вызовы функций sort_1 и sort_2 соответственно. После выполнения сортировки выбирается пункт меню с номером 2 для просмотра результатов сортировки (рисунки 4 и 5).

Рисунок 4 Вывод результатов сортировки элементов строк матрицы по возрастанию значений