Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции 2021 / OIT_lek_sem_27_10_2021.docx
Скачиваний:
1
Добавлен:
14.12.2023
Размер:
29.29 Кб
Скачать

В следующей задаче для каждой из целочисленных матриц 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;

Соседние файлы в папке Лекции 2021