Слайд 1Основы программирования
ФИСТ 1 курс
Власенко
Олег
Федосович
Лекция 11.2
Подпрограммы = функции Си.
Использование
функций для упрощения работы с 2D массивами.
Слайд 2Используем функции для упрощения программы
Слайд 3Пример экзаменационной задачи
Ввести из файла массив из N строк по
M элементов каждая (1
файла.
Переставить столбцы, содержащие минимальный и максимальный элементы.
Получившийся массив вывести в консоль и в файл “out.txt”.
Использовать разделение на функции.
Пример входа:
4 3
0 2 3
1 3 4
2 -1 5
3 4 6
Пример выхода:
4 3
0 3 2
1 4 3
2 5 -1
3 6 4
Слайд 5Решение без функций (1)
#define _CRT_SECURE_NO_WARNINGS
#include
void main()
{
int a[10][10];
int n, m;
//
Чтение из входного файла
FILE *fin = fopen("d:\\Temp\\in.txt", "rt");
if (fin ==
NULL) {
printf("File in3.txt is not found");
return;
}
fscanf(fin, "%d", &n);
fscanf(fin, "%d", &m);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
fscanf(fin, "%d", &a[i][j]);
fclose(fin);
Слайд 6Решение без функций (2)
// вывод массива в консоль
for (int i
= 0; i < n; i++) {
for (int j =
0; j < m; j++) {
printf("%5d ", a[i][j]);
}
printf("\n");
}
printf("\n");
// поиск минимального
int min = a[0][0];
int iMin = 0;
int jMin = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] < min) {
min = a[i][j];
iMin = i;
jMin = j;
}
}
}
Слайд 7Решение без функций (3)
// поиск максимального
int max = a[0][0];
int iMax
= 0;
int jMax = 0;
for (int i = 0; i
< n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] > max) {
max = a[i][j];
iMax = i;
jMax = j;
}
}
}
// перестановка столбцов с минимальным и максимальным элементами
for (int i = 0; i < n; i++) {
int tmp = a[i][jMin];
a[i][jMin] = a[i][jMax];
a[i][jMax] = tmp;
}
Слайд 8Решение без функций (4)
// вывод массива в консоль
for (int i
= 0; i < n; i++) {
for (int j =
0; j < m; j++) {
printf("%5d ", a[i][j]);
}
printf("\n");
}
printf("\n");
// Запись в выходной файл
FILE *fout = fopen("d:\\Temp\\out.txt", "wt");
if (fout == NULL) {
printf("File out.txt cannot be created");
return;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
fprintf(fout, "%5d ", a[i][j]);
fprintf(fout, "\n");
}
fclose(fout);
Слайд 9Решение без функций (5)
{
int x;
scanf("%d", &x);
}
}
Слайд 10Решение с глобальными переменными и функциями без параметров (общая идея)
int
a[10][10];
int n, m;
int jMin, jMax;
…
void main()
{
readArray();
printArray();
findMin();
findMax();
replaceColumns();
printArray();
writeArray();
{
int x;
scanf("%d",
&x);
}
}
Слайд 11Решение с глобальными переменными (1)
#define _CRT_SECURE_NO_WARNINGS
#include
int a[10][10];
int n, m;
int
jMin, jMax;
// Чтение массива из входного файла
void readArray() {
FILE *fin
= fopen("d:\\Temp\\in.txt", "rt");
// !!!! Нет проверки на некорректное открытие файла!!!
fscanf(fin, "%d", &n);
fscanf(fin, "%d", &m);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
fscanf(fin, "%d", &a[i][j]);
fclose(fin);
}
Слайд 12Решение с глобальными переменными (2)
// вывод массива в консоль
void printArray()
{
for (int i = 0; i < n; i++) {
for
(int j = 0; j < m; j++) {
printf("%5d ", a[i][j]);
}
printf("\n");
}
printf("\n");
}
Слайд 13Решение с глобальными переменными (3)
// поиск минимального
void findMin() {
int min
= a[0][0];
jMin = 0;
for (int i = 0; i
n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] < min) {
min = a[i][j];
jMin = j;
}
}
}
}
Слайд 14Решение с глобальными переменными (4)
// поиск максимального
void findMax() {
int max
= a[0][0];
jMax = 0;
for (int i = 0; i
n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] > max) {
max = a[i][j];
jMax = j;
}
}
}
}
// перестановка столбцов с минимальным и максимальным элементами
void replaceColumns() {
for (int i = 0; i < n; i++) {
int tmp = a[i][jMin];
a[i][jMin] = a[i][jMax];
a[i][jMax] = tmp;
}
}
Слайд 15Решение с глобальными переменными (5)
// Запись в выходной файл
void writeArray()
{
FILE *fout = fopen("d:\\Temp\\out.txt", "wt");
// !!!! Нет проверки на некорректное
открытие файла!!!
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
fprintf(fout, "%5d ", a[i][j]);
fprintf(fout, "\n");
}
fclose(fout);
}
Слайд 16Решение с глобальными переменными (6)
void main()
{
readArray();
printArray();
findMin();
findMax();
replaceColumns();
printArray();
writeArray();
{
int x;
scanf("%d",
&x);
}
}
Слайд 17Решение без глобальных переменных и с полноценными функциями (общая идея)
void
main()
{
int a[10][10];
int n, m;
int jMin, jMax;
readArray(a, &n, &m);
printArray(a, n, m);
jMin
= findJMin(a, n, m);
jMax = findJMax(a, n, m);
replaceColumns(a, n, m, jMin, jMax);
printArray(a, n, m);
writeArray(a, n, m);
{
int x;
scanf("%d", &x);
}
}
Слайд 18Решение без глобальных переменных (1)
#define _CRT_SECURE_NO_WARNINGS
#include
// Чтение массива из
входного файла
void readArray(int a[10][10], int * pn, int * pm)
{
FILE *fin = fopen("d:\\Temp\\in.txt", "rt");
// !!!! Нет проверки на некорректное открытие файла!!!
fscanf(fin, "%d", pn);
fscanf(fin, "%d", pm);
for (int i = 0; i < *pn; i++)
for (int j = 0; j < *pm; j++)
fscanf(fin, "%d", &a[i][j]);
fclose(fin);
}
Слайд 19Решение без глобальных переменных (2)
// вывод массива в консоль
void printArray(int
a[10][10], int n, int m) {
for (int i = 0;
i < n; i++) {
for (int j = 0; j < m; j++) {
printf("%5d ", a[i][j]);
}
printf("\n");
}
printf("\n");
}
Слайд 20Решение без глобальных переменных (3)
// поиск столбца минимального элемента
int findJMin(int
a[10][10], int n, int m) {
int min = a[0][0];
int jMin
= 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] < min) {
min = a[i][j];
jMin = j;
}
}
}
return jMin;
}
Слайд 21Решение без глобальных переменных (4)
// поиск столбца максимального элемента
int
findJMax(int a[10][10], int n, int m) {
int max = a[0][0];
int
jMax = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] > max) {
max = a[i][j];
jMax = j;
}
}
}
return jMax;
}
Слайд 22Решение без глобальных переменных (5)
// перестановка столбцов с минимальным и
максимальным элементами
void replaceColumns(int a[10][10], int n, int m, int col1,
int col2) {
for (int i = 0; i < n; i++) {
int tmp = a[i][col1];
a[i][col1] = a[i][col2];
a[i][col2] = tmp;
}
}
// Запись в выходной файл
void writeArray(int a[10][10], int n, int m) {
FILE *fout = fopen("d:\\Temp\\out.txt", "wt");
// !!!! Нет проверки на некорректное открытие файла!!!
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
fprintf(fout, "%5d ", a[i][j]);
fprintf(fout, "\n");
}
fclose(fout);
}
Слайд 23Решение без глобальных переменных (6)
void main()
{
int a[10][10];
int n, m;
int jMin,
jMax;
readArray(a, &n, &m);
printArray(a, n, m);
jMin = findJMin(a, n, m);
jMax =
findJMax(a, n, m);
replaceColumns(a, n, m, jMin, jMax);
printArray(a, n, m);
writeArray(a, n, m);
{
int x;
scanf("%d", &x);
}
}
Слайд 24На пути к ООП: Решение через структуры (общая идея)
void main()
{
//int a[10][10];
//int n, m;
ARRAY ar;
int jMin, jMax;
readArray(&ar);
printArray(&ar);
jMin = findJMin(&ar);
jMax =
findJMax(&ar);
replaceColumns(&ar, jMin, jMax);
printArray(&ar);
writeArray(&ar);
{
int x;
scanf("%d", &x);
}
}
Слайд 25На пути к ООП: Решение через структуры (1)
#define _CRT_SECURE_NO_WARNINGS
#include
struct
Array {
int a[10][10];
int n;
int m;
};
typedef struct Array ARRAY;
Слайд 26На пути к ООП: Решение через структуры (2)
// Чтение массива
из входного файла
void readArray(ARRAY * arr) {
FILE *fin = fopen("d:\\Temp\\in.txt",
"rt");
// !!!! Нет проверки на некорректное открытие файла!!!
fscanf(fin, "%d", &(*arr).n);
fscanf(fin, "%d", &(*arr).m);
for (int i = 0; i < (*arr).n; i++)
for (int j = 0; j < (*arr).m; j++)
fscanf(fin, "%d", &(*arr).a[i][j]);
fclose(fin);
}
Слайд 27На пути к ООП: Решение через структуры (3)
// вывод массива
в консоль
void printArray(ARRAY * arr) {
for (int i = 0;
i < arr->n; i++) {
for (int j = 0; j < arr->m; j++) {
printf("%5d ", arr->a[i][j]);
}
printf("\n");
}
printf("\n");
}
Слайд 28На пути к ООП: Решение через структуры (4)
// поиск столбца
минимального элемента
int findJMin(ARRAY * arr) {
int min = arr->a[0][0];
int jMin
= 0;
for (int i = 0; i < arr->n; i++) {
for (int j = 0; j < arr->m; j++) {
if (arr->a[i][j] < min) {
min = arr->a[i][j];
jMin = j;
}
}
}
return jMin;
}
Слайд 29На пути к ООП: Решение через структуры (5)
// поиск столбца
максимального элемента
int findJMax(ARRAY * arr) {
int max = arr->a[0][0];
int
jMax = 0;
for (int i = 0; i < arr->n; i++) {
for (int j = 0; j < arr->m; j++) {
if (arr->a[i][j] > max) {
max = arr->a[i][j];
jMax = j;
}
}
}
return jMax;
}
Слайд 30На пути к ООП: Решение через структуры (6)
// перестановка столбцов
с минимальным и максимальным элементами
void replaceColumns(ARRAY * arr, int col1,
int col2) {
for (int i = 0; i < arr->n; i++) {
int tmp = arr->a[i][col1];
arr->a[i][col1] = arr->a[i][col2];
arr->a[i][col2] = tmp;
}
}
Слайд 31На пути к ООП: Решение через структуры (7)
// Запись в
выходной файл
void writeArray(ARRAY * arr) {
FILE *fout = fopen("d:\\Temp\\out.txt", "wt");
//
!!!! Нет проверки на некорректное открытие файла!!!
for (int i = 0; i < arr->n; i++) {
for (int j = 0; j < arr->m; j++)
fprintf(fout, "%5d ", arr->a[i][j]);
fprintf(fout, "\n");
}
fclose(fout);
}
Слайд 32На пути к ООП: Решение через структуры (8)
void main() {
//int
a[10][10];
//int n, m;
ARRAY ar;
int jMin, jMax;
readArray(&ar);
printArray(&ar);
jMin = findJMin(&ar);
jMax = findJMax(&ar);
replaceColumns(&ar,
jMin, jMax);
printArray(&ar);
writeArray(&ar);
{
int x;
scanf("%d", &x);
}
}
Слайд 33Домашнее задание
** Проверь себя – сможешь ли ты сделать задание
экзаменационное на «5»?
Общее задание
Ввести двумерный массив из файла. Количество элементов
не более 10x10.
Каждый элемент – целое число в интервале значений -1000..+1000.
Количество строк (N) и столбцов (M) задано первой строке входного файла. Далее в N строках записаны по M числе.
Обработать массив согласно варианту.
Сохранить результат в формате, аналогичном входному.
Имейте в виду - во время выполнения программы количество используемых строк и столбцов может изменится. Предусмотрите в массиве столько строк и столбцов, чтобы программа корректно работала на любых корректных входных данных.
Нельзя использовать дополнительные массивы – в программе используется ровно один массив.