Консультация № 172422
21.09.2009, 19:00
0.00 руб.
0 1 1
Здравствуйте уважаемые эксперты!
Нужна ваща помощь:
Дана матрица А(N,M) из целых чисел. Элементы первого столбца упорядочить по убыванию. Включить массив В(М) в качестве новой строки в матрицу А с сохранением упорядоченности по элементам первого столбца

Обсуждение

Неизвестный
22.09.2009, 12:11
общий
это ответ
Здравствуйте, Savter.

Вот решение вашего задания.

Приложение:
// Дана матрица А (N, M) из целых чисел.
// Элементы первого столбца упорядочить по убыванию.
// Включить массив В (М) в качестве новой строки в матрицу А
// с сохранением упорядоченности по элементам первого столбца

#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>

// функция выделения памяти для матрицы
// параметры:
// n - кол-во строк
// m - кол-во столбцов
// результат:
// указатель на выделенную область
int ** allocateMatrix (int n, int m) {
int ** p;

if ((p = (int **)malloc (n * sizeof (int *))) == NULL) {
printf ("\n\nНе могу выделить область памяти!\n");
exit (-1);
}

for (int i = 0; i < n; i++)
if ((p [i] = (int *)malloc (m * sizeof (int))) == NULL) {
printf ("\n\nНе могу выделить область памяти!\n");
exit (-1);
}

return p;
}

// функция сохранения матрицы в файл
// параметры:
// a - матрица
// n - кол-во строк
// m - кол-во столбцов
// fname - имя файла
void SaveMatrix (int **a, int n, int m, char *fname) {
FILE *f;
char c;

if ((f = fopen (fname, "w")) == NULL) {
printf ("\n\nНевозможно создать указанный файл!\n");
printf ("Продолжить без сохранения (Y/N)? ");
scanf (&c);

if (c == 'N' || c == 'n') exit (-1); else return;
}

fprintf (f, "%d %d\n", n, m);

for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
fprintf (f, " %5d", a [i] [j]);
fprintf (f, "\n");
}

fclose (f);
}

// функция считывания матрицы из файла
// параметры:
// n - кол-во строк (возвращаемое значение)
// m - кол-во столбцов (возвращаемое значение)
// fname - имя файла
// результат:
// матрица
int ** LoadMatrix (int *n, int *m, char *fname) {
FILE *f;
int **a;

if ((f = fopen (fname, "r")) == NULL) {
printf ("\n\nНевозможно открыть указанный файл!\n");
exit (-1);
}

fscanf (f, "%d %d", n, m);

a = allocateMatrix (*n + 1, *m); // Резервируем одну строку для вставки

for (int i = 0; i < *n; i++)
for (int j = 0; j < *m; j++)
fscanf (f, "%d", &(a [i] [j]));

fclose (f);

return a;
}

// функция заполнения матрицы с помощью ручного ввода
// параметры:
// n - кол-во строк (возвращаемое значение)
// m - кол-во столбцов (возвращаемое значение)
// результат:
// матрица
int ** InputMatrix (int *n, int *m) {
int ** a;
char s [100];

printf ("Введите количество строк матрицы: "); scanf ("%d", n);
printf ("Введите количество столбцов матрицы: "); scanf ("%d", m);

a = allocateMatrix (*n + 1, *m); // Резервируем одну строку для вставки

printf ("Введите элементы матрицы:\n");
for (int i = 0; i < *n; i++)
for (int j = 0; j < *m; j++) {
printf ("Элемент a [%d] [%d] --> ", i, j);
scanf ("%d", &(a [i] [j]));
}

printf ("Ввод закончен.\nВведите имя файла для сохранения матрицы или '-' для продолжения без сохранения: ");
scanf ("%s", s);
if (s [0] != '-') SaveMatrix (a, *n, *m, s);

return a;
}

// функция заполнения матрицы
// параметры:
// n - кол-во строк (возвращаемое значение)
// m - кол-во столбцов (возвращаемое значение)
// результат:
// матрица
int ** GetMatrix (int *n, int *m) {
char s [100];

printf ("\nВведите имя файла для считывания матрицы из файла или '-' для ручного ввода: ");
scanf ("%s", s);
if (s [0] == '-') return InputMatrix (n, m); else return LoadMatrix (n, m, s);
}

// функция печати матрицы
// параметры:
// a - матрица
// n - кол-во строк
// m - кол-во столбцов
// msg - описание вывода
void PrintMatrix (int **a, int n, int m, char * msg) {
printf ("\n%s:\n", msg);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
printf (" %5d", a [i] [j]);
printf ("\n");
}
}

// функция выделения памяти для массива
// параметры:
// m - кол-во элементов
// результат:
// указатель на выделенную область
int * allocateArray (int m) {
int * p;

if ((p = (int *)malloc (m * sizeof (int))) == NULL) {
printf ("\n\nНе могу выделить область памяти!\n");
exit (-1);
}

return p;
}

// функция сохранения массива в файл
// параметры:
// a - массив
// m - кол-во элементов
// fname - имя файла
void SaveArray (int *a, int m, char *fname) {
FILE *f;
char c;

if ((f = fopen (fname, "w")) == NULL) {
printf ("\n\nНевозможно создать указанный файл!\n");
printf ("Продолжить без сохранения (Y/N)? ");
scanf (&c);

if (c == 'N' || c == 'n') exit (-1); else return;
}

fprintf (f, "%d\n", m);

for (int i = 0; i < m; i++)
fprintf (f, " %5d", a [i]);

fclose (f);
}

// функция считывания массива из файла
// параметры:
// m - кол-во элементов
// fname - имя файла
// результат:
// массив
int * LoadArray (int m, char *fname) {
FILE *f;
int *a;
int m1;

if ((f = fopen (fname, "r")) == NULL) {
printf ("\n\nНевозможно открыть указанный файл!\n");
exit (-1);
}

fscanf (f, "%d", &m1);
if (m1 < m) {
printf ("\n\nНедостаточно элементов для заполнения массива!\n");
exit (-1);
}

a = allocateArray (m);

for (int i = 0; i < m; i++)
fscanf (f, "%d", &(a [i]));

fclose (f);

return a;
}

// функция заполнения массива с помощью ручного ввода
// параметры:
// m - кол-во элементов
// результат:
// матрица
int * InputArray (int m) {
int * a;
char s [100];

a = allocateArray (m);

printf ("Введите элементы массива:\n");
for (int i = 0; i < m; i++) {
printf ("Элемент a [%d] --> ", i);
scanf ("%d", &(a [i]));
}

printf ("Ввод закончен.\nВведите имя файла для сохранения массива или '-' для продолжения без сохранения: ");
scanf ("%s", s);
if (s [0] != '-') SaveArray (a, m, s);

return a;
}

// функция заполнения массива
// параметры:
// m - кол-во элементов
// результат:
// массив
int * GetArray (int m) {
char s [100];

printf ("\nВведите имя файла для считывания матрицы из файла или '-' для ручного ввода: ");
scanf ("%s", s);
if (s [0] == '-') return InputArray (m); else return LoadArray (m, s);
}

// функция печати массива
// параметры:
// a - матрица
// m - кол-во элементов
// msg - описание вывода
void PrintArray (int *a, int m, char * msg) {
printf ("\n%s:\n", msg);
for (int i = 0; i < m; i++)
printf (" %5d", a [i]);

printf ("\n");
}

// функция упорядочивания элементов столбца
// параметры:
// a - матрица
// col - упорядочиваемый столбец матрицы
// n - кол-во строк
void SortCol (int **a, int col, int n) {
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if (a [i] [col] > a [j] [col]) {
int t = a [i] [col];
a [i] [col] = a [j] [col];
a [j] [col] = t;
}
}

// функция поиска места для вставки строки
// параметры:
// a - матрица
// b - массив
// col - упорядочиваемый столбец матрицы
// n - кол-во строк
int Search (int **a, int *b, int col, int n) {
int e = b [col];
int i = 0;

while (i < n)
if (a [i] [col] >= e) return i; else i++;

return n;
}

// функция добавления строки в матрицу
// параметры:
// a - матрица
// b - добавляемая строка
// p - номер строки матрицы
// n - кол-во строк (изменяемое значение)
int InsertLine (int **a, int *b, int p, int *n) {
for (int i = *n; i > p; i--) a [i] = a [i - 1];
a [p] = b;
(*n)++;
}

void main () {
int **a;
int *b;
int n, m;
int p;

a = GetMatrix (&n, &m);
PrintMatrix (a, n, m, "Обрабатываемая матрица");
SortCol (a, 0, n);
PrintMatrix (a, n, m, "Матрица после сортировки первой колонки");

b = GetArray (m);
PrintArray (b, m, "Добавляемый массив");

p = Search (a, b, 0, n);
printf ("\nПозиция строки для добавления: %d", p);
InsertLine (a, b, p, &n);
PrintMatrix (a, n, m, "Матрица после добавления строки");
}
5
Форма ответа