Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ПЕРОВА САБАЕВА

.pdf
Скачиваний:
190
Добавлен:
11.03.2016
Размер:
1.4 Mб
Скачать

{

double* res = new double [m]; double k = 0;

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

{

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

{

k += arr[i][j];

}

res[j] = k / n; k = 0;

}

return res;

}

int _tmain()

{

setlocale(LC_ALL, "Russian"); int n, m;

cout << "Введите количество строк: "; cin >> n;

cout << "\n";

cout << "Введите количество столбцов: "; cin >> m;

cout << "\n"; int** arr;

arr = new int*[n];

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

{

arr[i] = new int[m];

}

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

{

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

{

arr[i][j] = rand() % 10;

}

}

cout<<"Матрица: \n"<<endl; for (int i = 0; i < n; i++)

{

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

{

cout << arr[i][j]; cout << " ";

83

}

cout << "\n";

}

cout<<endl;

double* sr_stroki = str(arr, n, m);

cout << "Среднее значение по строкам: \n"<<endl; for (int i = 0; i < n; i++)

{

cout << sr_stroki[i] << " ";

}

cout << '\n'; cout<<endl;

double* sr_stolb = stlb(arr, n, m);

cout << "Среднее значение по столбцам: \n"<<endl; for (int i = 0; i < m; i++)

{

cout << sr_stolb[i] << " ";

}

cout << '\n'; return 0;

}

На рис. 9.9 представлен результат выполнения программы листинга 9.5.

Рис. 9.9. Результат работы программы листинга 9.5

84

УПРАЖНЕНИЯ

1.В файле “input.txt” задана матрица А размером n × m. В первой строке файла указаны ее размеры (n и m), а в следующих строках файла – значе-

 

 

 

ния элементов матрицы по строкам. Построить вектор

b

размерности n,

 

причем bi определяется как максимальное значение в i-ой строке матрицы. Исходную матрицу и полученный вектор записать в файл.

2.В файле “input.txt” задана матрица А размером n × m. В первой строке файла указаны ее размеры (n и m), а в следующих строках файла – значе-

 

 

 

ния элементов матрицы по строкам. Построить вектор

b

размерности n,

 

причем bi определяется как сумма значений в i-ой строке матрицы. Исходную матрицу и полученный вектор записать в файл.

3.В файле “input.txt” задана квадратная матрица А размером n × n. В первой строке файла указан ее размер (n), а в следующих строках файла – значения элементов матрицы по строкам. Построить транспонированную матрицу. Исходную и транспонированную матрицы записать в файл.

4.В файле “input.txt” задана квадратная матрица А размером n × n и n-

 

 

 

мерный вектор

b

. В первой строке файла указан размер n, а в следую-

 

щих строках файла – значения элементов матрицы по строкам и значе-

ние элементов вектора

b

. Построить квадратичную форму

 

T

 

v b

Ab

.

5.В файле “input.txt” задана квадратная матрица А размером n × n. В первой строке файла указан размер n, а в следующих строках файла – значения элементов матрицы по строкам. Преобразовать матрицу таким образом, чтобы ее первый столбец был упорядочен по убыванию.

6.В файле “input.txt” задана квадратная матрица А размером n × n. В первой строке файла указан размер n, а в следующих строках файла – значе-

ния элементов матрицы по строкам. Построить n мерный вектор поненты которого определяются как максимальный элемент ствующей строки.

 

 

b

, ком-

 

соответ-

7.В файле “input.txt” задана квадратная матрица А размером n × n. В первой строке файла указан размер n, а в следующих строках файла – значения элементов матрицы по строкам. Построить матрицу B размером n ×

n, причем элементы определяются как bij

min akl . Вид области для

 

k ,l

построения матрицы В приведен на рис. 9.10 – 9.15 [26].

85

Рис. 9.10

Рис. 9.11

Рис. 9.12

Рис. 9.13

Рис. 9.14

Рис. 9.15

8.В файле “input.txt” задана квадратная матрица А размером n × n. В первой строке файла указан размер n, а в следующих строках файла – значения элементов матрицы по строкам. Построить матрицу B размером n × n, причем ее элементы определяются как среднее значение в области . Вид области для построения матрицы В приведен на рис. 1 – рис. 6.

9.В файле “input.txt” заданы квадратные матрицы А и В размером n × n. В первой строке файла указан размер n, а в следующих строках файла – значения элементов матриц по строкам. Написать функцию, которая строит матрицу С=А В. Полученную матрицу записать в конец файла “input.txt”.

86

10.В файле “input.txt” заданы квадратные матрицы А и В размером n × n. В первой строке файла указан размер n, а в следующих строках файла – значения элементов матриц по строкам. Написать функцию, которая строит матрицу С=А+В. Полученную матрицу записать в конец файла

“input.txt”.

11. Дан одномерный массив целых чисел Р размерностью 64. Получить квадратную матрицу А размером 8 × 8, элементы которой являются числами массива Р, расположенный согласно схемам, представленным на рис. 7 и рис. 8 [26].

Рис. 9.16

Рис. 9.17

87

ГЛАВА 10. СТРУКТУРЫ

Из базовых типов и типов, определенных программистом, можно формировать производные типы, к которым относятся указатели, массивы, структуры, объединения и функции. Базовые типы (int, float, …) считаются скалярными типами. Массивы и структуры являются агрегирующими типами, так как состоят из набора элементов. Массив состоит из однотипных элементов, а структуры могут содержать разнотипные элементы [24].

Структура – это объединение в единое целое множества поименованных элементов (компонентов) данных. В отличие от массива, в котором компоненты имеют один и тот же тип, компоненты структуры могут иметь различные типы.

Формат объявления структурного типа:

struct имя_структурного_типа { Определение_компонентов_структуры

};

Здесь struct – спецификатор структурного типа; имя_структурного_типа – произвольно выбираемый идентификатор;

Определение_компонентов_структуры – совокупность одного или более опи-

саний объектов, каждый из которых служит прототипом для элементов структур вводимого структурного типа.

Еще одну возможность введения структурного типа дает служебное слово typedef, позволяющее ввести собственное обозначение для любого определения типа. В случае структурного типа он может быть введен и поименован следующим образом:

typedef struct {

Определение_компонентов_структуры } имя_структурного_типа_1;

Структурный тип, которому назначается имя с помощью typedef, может иметь имя и введенное обычным образом:

typedef struct имя_структурного_типа { Определение_компонентов_структуры

}имя_структурного_типа_1;

Вэтом случае объекты можно вводить, используя как имя_структурного_типа, так и имя_структурного_типа_1.

Структура используется для определения типов вводимых объектов также как и int, double и так далее, то есть под описание структуры память не выделяется. Выделение памяти происходит при объявлении объектов типа структура. Введение объектов происходит следующим образом:

88

имя_структурного_типа список_имен_объектов;

В качестве примера иллюстрации выделения памяти рассмотрим структу-

ру вида [24]:

 

struct goods{

 

char* name;

//Название

long price;

//Цена

float percent;

//Процент скидки

char date[9];

//Дата в символьном формате

};

 

Введем объект типа struct goods:

struct goods coat;

В табл. 10.1 приведено распределение памяти, выделяемой под объект coat.

Таблица 10.1

Выделение памяти под объект coat

Название

name

price

percent

date

полей

 

 

 

 

Тип

char*

long

float

char[9]

Байты

4

4

4

9

Инициализация объектов типа структуры может быть осуществлена при объявлении объектов. Например,

struct goods cit={“Апельсины”, 56, 2.5, ”15.06.13”};

Сравнивая структуры с массивами, следует отметить одну особенность, связанную с операцией присваивания. Если заданы массивы одного и того же типа, то перенос значений из одного массива в другой возможен лишь с использованием оператора цикла. Например,

float x[5], y[5]={1.0, 5.7, 4.0, -6.2, 7.1}; for(int i=0; i<sizeof(x) / zizeof(x[0]); i++)

x[i]=y[i];

Стандарт языка Си разрешает присваивание структур. Например, если введен объект

goods frut;

89

то при выполнении операции присваивания

frut = cit;

полям объекта frut будут присвоены значения полей объекта cit.

Следует отметить, что поле name будет указывать на один и тот же адрес памяти. Доступ к полям структуры обеспечивается с помощью уточненных имен:

Имя_объекта.имя_поля

Листинг 10.1. В файле с именем "input.txt" задано количество студентов, список студентов с указанием фамилии и номера группы (рис. 10.1).

Содержимое файла "input.txt".

Рис. 10.1. Информация, находящаяся в файле «input.txt»

Необходимо упорядочить список студентов по возрастанию номера группы, а внутри группы упорядочить их в алфавитном порядке. Для описания студента используется структура:

struct spisok

 

{

 

char *fam;

//Фамилия студента

int group;

//Номер группы студента

};

 

Файл “stdafx.h”

#pragma once

#define WIN32_LEAN_AND_MEAN #include <stdio.h>

#include <tchar.h>

90

#include <string.h> #include <fstream> #include <iostream> using namespace std;

//L10_1.cpp

#include "stdafx.h"

struct spisok

//Структура для описания студентов

{

 

char *fam;

//Поле структуры

int group;

//Поле структуры

};

 

void sort(spisok*f, int n);

//Прототип функции sort()

int _tmain( )

{

ifstream fin("input.txt"); //Задание объекта для ввода и его идентификация ofstream fout("outout.txt") ;//Задание объекта для вывода и его идентификация

int n ,i; char st[30]; spisok *f;

fin>>n; //Чтение числа записей в списке f=new spisok[n];

//Формирование списка: for(i=0; i<n; i++)

{

fin>>st;

f[i].fam=strdup(st);

fin>>f[i].group;

}

sort(f,n); //Сортировка списка в заданном порядке //Вывод списка в файл "outout.txt":

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

{

fout.width(20);

fout<<f[i].fam;

fout.width(5);

fout<<f[i].group<<'\n';;

}

fout.close();

91

return 0;

}

void sort(spisok*f, int n)

{

spisok v;

int i, k=0, ff; do

{

ff=0;

for(i=0; i<n-1-k; i++)

{

l=f[i].group > f[i+1].group||(f[i].group == f[i+1].group && strcmp(f[i].fam, f[i+1].fam)>0);

if (l)

{

v=f[i];

f[i]=f[i+1];

f[i+1]=v;

ff=1;

}

}

k++;

}while(ff);

}

Результат выполнения программы листинга 10.2 представлен на рис. 10.2.

Содержимое файла "outout.txt"

Рис. 10.2. Результат работы программы листинга 10.2

В случае, когда значение некоторого поля должно быть одинаковым для всех записей структуры, его следует объявить статическим. Статические компоненты не «дублируются» при создании новых объектов, то есть каждый ста-

92