В следующей задаче для каждой из целочисленных матриц a[3][3], b[4][4] требуется определить наибольшие элементы в строках и поменять их местами с элементами побочной диагонали (пример 23).
В программе используются три вспомогательные функции: ввод матрицы с клавиатуры (vvod), вывод изменённой матрицы на экран (vivod), нахождение максимума в строке и его перестановка (maxswop). В каждую из названных функций передаются следующие параметры: указатель x, количество строк n и столбцов m матрицы. Указатель также позволяет вернуть в основную функцию изменённые матрицы.
Пример 23.
#include "stdafx.h"
#include <iostream>
using namespace std;
// описание вспомогательной функции vvod
void vvod(int *x, int n, int m) {
// ввод матрицы x с клавиатуры
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> *(x + i*m + j);
}// конец функции vvod
// описание вспомогательной функции vivod
void vivod(int* x, int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cout << *(x + i*m + j) << ' ';
cout << "\n";
}// вывод матрицы x после перестановок
}// конец функции vivod
// описание вспомогательной функции maxswop
void maxswop(int* x, int n, int m) {
int max, imax, t;
for (int i = 0; i < n; i++) {// внешний цикл
max = *(x + i*m);
imax = i*m;
for (int j = 0; j < m; j++) // внутренний цикл
if (*(x + i*m + j) > max) {
max = *(x + i*m + j);
imax = i*m + j;
}// конец внутреннего цикла
t = *(x + imax);
*(x + imax) = *(x + i*m + m - 1 - i);
*(x + i*m + m - 1 - i) = t;
}// конец внешнего цикла
}// конец функции maxswop
// основная функция main
void main() {
int a[3][3], b[4][4];
cout << "*****a*****";
cout << "\n";
vvod(&a[0][0], 3, 3);
cout << "\n";
maxswop(&a[0][0], 3, 3);
Vivod(&a[0][0], 3, 3);
cout << "*****b*****";
cout << "\n";
vvod(&b[0][0], 4, 4);
cout << "\n";
maxswop(&b[0][0], 4, 4);
Vivod(&b[0][0], 4, 4);
}// конец функции main
При нахождении максимального элемента в строке сохраняется его номер (imax). Это необходимо для корректной перестановки максимального элемента *(x + imax) с элементом побочной диагонали *(x + i*m + m - 1 - i).
#include "stdafx.h"
#include <iostream>
using namespace std;
// описание глобальной переменной x
int x[4][4];
// описание вспомогательной функции vvod
void vvod(int n, int m) {
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
cout << "x[" << i << "][" << j << "]=";
cin >> x[i][j];
}// ввод матрицы x с клавиатуры
}// конец функции vvod
// описание вспомогательной функции vivod
void vivod(int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cout << x[i][j] << ' ';
cout << "\n";
}// вывод матрицы x после перестановок
}// конец функции vivod
// описание вспомогательной функции maxswop
void maxswop(int n, int m) {
Int max, imax, t;
for (int i = 0; i < n; i++) {// внешний цикл
max = x[i][0];
imax = 0;
for (int j = 1; j < m; j++) // внутренний цикл
if (x[i][j] > max) {
max = x[i][j];
imax = j;
}// конец внутреннего цикла
t = x[i][imax];
x[i][imax] = x[i][m - 1 - i];
x[i][m - 1 - i] = t;
}// конец внешнего цикла
}// конец функции maxswop
// основная функция main
Void main() {
int n, m;
cout << "*****a*****";
cout << "\n";
cout << "n, m"<<endl;
cin >> n >> m;
vvod(n,m);
cout << "\n";
maxswop(n, m);
vivod(n, m);
cout << "*****b*****";
cout << "\n";
cout << "n, m"<<endl;
cin >> n >> m;
vvod(n, m);
cout << "\n";
maxswop(n, m);
vivod(n, m);
}// конец функции main
Задача № 14.
Даны целочисленные матрицы A(4,4), B(3,3). Составить программу для нахождения наибольшего элемента среди нечётных элементов побочной диагонали. Использовать функцию.
…
void max1(int* x, int n, int m)
{
max = *(x + m - 1);
for (int i = 0;i < n;i++)
if (*(x + i*m + m - 1 - i) % 2 != 0 && *(x + i*m + m - 1 - i) > max) max = *(x + i*m + m - 1 - i);
}// конец функции max1
…
i=0 5 2 6 1
i=1 1 10 3 2
i=2 7 3 2 5
i=3 1 2 3 4
7. Структуры
Позволяют объединить данные различных типов. Для объявления структуры используется ключевое слово struct.
struct student {
int number; // номер
char name[10]; // имя
double mark;}; // оценка
student s1, s2, s[10];
student ‒ имя созданного структурного типа;
number, name, mark ‒ элементы структуры.
Перечень элементов структуры заключается в фигурные скобки. Объявление структуры заканчивается знаком ;
s1, s2, s[10] ‒ объекты структурного типа (s1, s2 ‒ отдельные структурные объекты; s[10] ‒ массив объектов типа student).
Доступ к отдельным элементам конкретного структурного объекта осуществляется операцией • (точка):
s1.number=5; int i=s1.number;
Инициализация элементов при объявлении структуры запрещена, так как выделение памяти происходит только при объявлении объекта.
Возможна инициализация при объявлении объекта:
student s2={7,"fedorov",5.};
Область действия структуры и её объектов определяется так же, как и для переменных базовых типов.
Структура и объекты могут быть объявлены как на глобальном, так и на локальном уровне.
Структурные объекты могут быть аргументами функций, а также возвращаемыми значениями.
Пример 24.
Создать ведомость в виде массива структур с элементами:
фамилия;
оценка.
Принять количество структур в массиве – 3.
В массиве структур выполнить поиск отличников. Далее найти студента по фамилии Petrov.
#include "stdafx.h"
#include <iostream>
#include <cstring>// функции обработки строк
using namespace std;
# define N 3
typedef char STRING;// замена char на STRING
struct student {
STRING name[25]; // строка
double mark;
};
int main() {
int i,k=0;
student group[N];// массив структурных объектов
cout << "\n";
// присваивание значений элементам массива
group[0] = { "petrov",4.};
group[1] = { "sidorova",5.};
group[2] = { "ivanov",3.};
// ввод значений элементов массива с клавиатуры
/* for (i = 0;i < N;i++) {
cout << "\ngroup[" << i << "].name="; cin >> group[i].name;
cout << "\ngroup[" << i << "].mark="; cin >> group[i].mark;
} */
// поиск отличников
for (i = 0;i < N;i++)
if (group[i].mark > 4.) {
cout<<"\n"<<group[i].name; k += 1;
}
if (k == 0) cout << "\nthe excellent student isn't found";
// поиск студента по фамилии
k = -1;
for (i = 0;i < N;i++)
if (strcmp(group[i].name, "petrov") == 0) { k = i; break; }
if (k >=0) cout<<"\n" << group[k].name; else cout<<"\nthe student isn't found"; return 0;
}
Для поиска студента по фамилии использовалась функция сравнения строк: strcmp(group[i].name, "petrov")
Данная функция возвращает:
0, если аргумент-строки равны;
1, если первый аргумент больше второго;
-1, если второй аргумент больше первого.
Задача № 15.
Создать ведомость в виде массива структур с элементами:
фамилия;
оценка по математике;
оценка по химии;
оценка по физике.
Принять количество структур в массиве – 3.
Построить новую ведомость в виде массива структур с элементами:
фамилия;
средний балл.
Значения элементов (фамилия, средний балл) получить из исходной ведомости.
struct student {
STRING fam[10];
float math, chem, fiz;
}; // исходная структура
struct student1 {
STRING fam[10];
float srball;
};// новая структура
student group[n];
student1 group1[n];
group[n] – исходная ведомость (массив структур);
group1[n] – новая ведомость (массив структур).
Для копирования фамилии из исходной ведомости в новую можно использовать функцию strcpy_s(group1[i].fam,group[i].fam);
которая полностью копирует свой второй аргумент-строку в первый.
Значение среднего балла определяем также из исходной ведомости
group1[i].srball = (group[i].math + group[i].chem + group[i].fiz) / 3;
…