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

!!!Ашарина_И_В_,_Крупская_Ж_Ф_Язык_С_++_и_объектно_ориентиро

.pdf
Скачиваний:
106
Добавлен:
26.03.2023
Размер:
8.63 Mб
Скачать

50

 

Язык С++ и объектно-ориентированное программирование в С++

for (i=0; i<ROW;

i++) // заполнение и вывод матрицы

{ for

(j=0;

j<COL; j++)

// на экран

{

matr[i][j]=rand()%100;

}

cout

<< setw (6)

<< matr[i][j];

endl;

 

 

 

cout <<

 

 

 

}

 

i++)

// формирование вектора-столбца

for (i=0; i<ROW;

{ min[i]=matr[i][0]; // из минимальных элементов // строк

for (j=0; j< COL; j++)

if (matr[i][j]<min[i]) min[i]=matr[i][j]; cout << "min= " << min[i];

}

cout <<endl ;

for (i=0; i< ROW; i++) cout << setw (6) << min[i]; _getch();

}

При работе с диагональными элементами учитывают, что индексы элементов, стоящих на главной диагонали, удовлетворяют условию i = j.

Элементы, стоящие на побочной диагонали, имеют индексы, удовлетворяющие условию i=n j – 1, если n – порядок матрицы (предполагается, что матрица – квадратная).

Пример 6.8. Найти количество четных элементов целочисленной квадратной матрицы порядка 9, стоящих ниже побочной диагонали.

#include <iostream> #include <stdlib.h> #include <conio.h> #include <math.h> #include <time.h> #include <iomanip> using namespace std;

void main()

{const int RANG=9;

int matr[RANG][RANG]; int i,j,kol=0;

time_t t;

srand (time (&t));

setlocale (LC_ALL, "Russian"); for (i=0;i<RANG;i++)

{for (j=0;j<RANG;j++)

{matr[i][j]=rand()%10;

cout << setw (4) << matr[i][j];

}

cout <<endl;

}

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

{ for (j=0; j<RANG; j++)

if ( (i>RANG-j-1) && (matr[i][j]%2==0)) kol++; }

6. Составление программ с использованием двумерных массивов

51

}

cout << "Количество четных элементов

<<под главной диагональю равно "

<<kol;

_getch();

}

КОНТРОЛЬНЫЕ ВОПРОСЫ

1.Позволяет ли язык С++ изменять размер массива?

2.Как расположены в памяти элементы многомерных массивов?

3.Необходимо ли использовать для массивов только предопределенные типы?

4.Как объявить двумерный массивы?

ЗАДАНИЯ

Таблица 6.1. Простые варианты

Вари-

Задание

ант

 

1Дана целочисленная матрица размером 6×9, содержащая как положительные, так и отрицательные элементы. Найти минимальный элемент матрицы и среднее арифметическое значение положительных элементов матрицы

2Дана целочисленная матрица 7×10. Поменять местами максимальное и минимальное значения матрицы

3Дана целочисленная матрица 5×8. Определить, что больше: сумма четных элементов правой половины матрицы или сумма нечетных элементов левой половины матрицы

4Дана целочисленная матрица 7×7. Найти сумму положительных элементов, стоящих над главной диагональю и количество нечетных элементов, стоящих под побочной диагональю

5Дана целочисленная матрица mxk. Найти минимальное значение для верхней половины матрицы и максимальное значение для нижней половины

6Дана целочисленная матрица mxm. Найти максимальное значение для ее первой четверти и минимальное – для третьей четверти

7Дана матрица 6×7, элементами которой являются значения символьного типа. Подсчитать количество буквенных символов в матрице и количество цифровых символов в ее верхней половине

8Дана целочисленная матрица 9×9. Определить количество нулевых элементов над побочной диагональю и сумму четных элементов под главной диагональю

52

Язык С++ и объектно-ориентированное программирование в С++

 

 

 

 

Вари-

Задание

 

ант

 

 

9Дана целочисленная матрица 5×7. Найти минимальное значение среди четных элементов матрицы и сумму положительных элементов матрицы

10Дана матрица 5×7, элементами которой являются значения символьного типа. Найти максимальное значение среди буквенных символов и минимальное среди цифровых значений

11Дана действительная матрица 7×7. Найти сумму элементов, попадающих в заданный с клавиатуры интервал. Найти количество элементов, не попадающий в этот интервал

12Дана матрица 4×5, элементами которой являются значения символьного типа. Заменить на символ, введенный с клавиатуры, значения символов, больших, чем это значение, и подсчитать количество таких замен

13Дана целочисленная матрица 4×7. Определить минимальное значение матрицы. Найти среднее арифметическое значение модулей отрицательных элементов в матрице

14Дана целочисленная матрица размером 4×6. Получить новую матрицу путем умножения всех элементов на наименьший по модулю элемент

Таблица 6.2. Варианты повышенной сложности

Вари-

Задание

ант

 

1Дана целочисленная матрица размера 6×9, содержащая как положительные, так и отрицательные элементы. Сформировать одномерные массивы, состоящие из средних арифметических значений положительных элементов каждого столбца матрицы и средних арифметических значений нечетных элементов каждой строки матрицы

2Дана целочисленная матрица 7×10. Поменять местами максимальное и минимальное значения матрицы. Найти суммы элементов тех столбцов, где находятся эти значения

3Дана целочисленная матрица 5×8. Найти сумму четных элементов каждого столбца правой половины матрицы и среднее арифметическое значение нечетных элементов каждого столбца левой половины матрицы. Сформировать соответствующие одномерные массивы

 

6. Составление программ с использованием двумерных массивов

53

 

 

 

 

 

 

Вари-

Задание

 

 

 

ант

 

 

 

 

 

 

4Дана целочисленная матрица 4×7. Определить минимальное и максимальное значения матрицы и их местоположение. Найти среднее арифметическое значение положительных элементов и модулей отрицательных элементов в каждом столбце матрицы. Результаты вычислений записать в одномерные массивы

5Дана целочисленная матрица mxk. Найти минимальное значение для правой половины матрицы и максимальное значение для левой половины. Сформировать новую матрицу путем прибавления к каждому элементу верхней половины исходной матрицы определенного минимального значения и к каждому элементу ее нижней половины определенного максимального значения

6Дана целочисленная матрица mxm. Найти максимальное значение для каждого столбца матрицы и минимальное – для каждой строки матрицы. Заменить каждый элемент матрицы на значение его квадрата

7Дана матрица 5×7, элементами которой являются значения символьного типа. Составить одномерный массив, содержащий количество буквенных символов в каждом из ее столбцов. Подсчитать количество цифровых символов над третьей строкой матрицы и общее количество символов, не являющихся ни цифрой, ни буквой

8Дана целочисленная матрица 9×9. Определить количество нулевых элементов под главной диагональю матрицы и под ее побочной диагональю. Сформировать одномерный массив, содержащий количество отрицательных элементов каждого столбца матрицы

9Дана действительная матрица 7×7. Найти минимальное значение среди элементов, стоящих над главной диагональю, и максимальное среди элементов, находящихся ниже главной диагонали, а также их местоположение. Сформировать одномерный массив, содержащий сумму элементов четных строк и произведение элементов нечетных строк

10Дана целочисленная матрица размером 5×5. Получить новую матрицу путем умножения всех элементов на наименьший по модулю элемент. Сформировать одномерный массив из максимальных элементов каждой строки полученной матрицы

54

Язык С++ и объектно-ориентированное программирование в С++

 

 

 

 

 

Вари-

Задание

 

ант

 

 

 

11Дана действительная матрица 7×7. Найти сумму элементов в заштрихованной области. Сформировать новую матрицу путем прибавления полученного значения к каждому элементу из незаштрихованной области исходной матрицы.

столбце полученной матрицы. Сформировать одномермерный массив, содержащий количество четных элементов в каждом

12Дана целочисленная матрица 7×7. Найти сумму положительных элементов, стоящих над главной диагональю и количество нечетных элементов, стоящих под побочной диагональю. Заменить полученными значениями соответственно элементы четных и нечетных столбцов

13Дана действительная матрица 6×8. Найти сумму элементов каждой строки верхней половины матрицы и произведение элементов каждой строки ее нижней половины. Определить значение и местоположение максимального элемента верхней половины матрицы и минимального элемента ее нижней половины

14Дана вещественная квадратная матрица 5×5. Получить новую матрицу путем прибавления к элементам каждой строки матрицы наименьшего значения элементов этой строки. Сформировать одномерный массив, содержащий количество четных элементов в четных столбцах полученной матрицы и одномерный массив, содержащий количество нечетных элементов в нечетных столбцах

Лабораторная работа 7. Программирование задач с использованием строк

Символьная строка (далее просто строка) является массивом типа char, который заканчивается нуль-символом (‘\0’).

ОПИСАНИЕ ПЕРЕМЕННЫХ СТРОКОВОГО ТИПА

Переменную строкового типа можно описать несколькими способами. 1. Описать как массив символов:

а) char имя_массива[n];

где n – количество символов в строке, включая завершающий нуль-

символ. Например, char stroka[10];

б) char имя_массива[ ];

Например, char s[ ];

Вописании а для переменной stroka будет выделено 10 байт памяти ЭВМ. В описании б память выделена не будет. Это описание означает, что переменная s – это переменная строкового типа, длина которой не определена.

2. Описать с использованием указателя на тип char, например, char *stroka;

Вданном описании память для переменной stroka не выделяется. Такое описание означает, что переменная stroka может содержать адрес ячейки памяти первого символа строки. Выделить память для переменной stroka можно с помощью функции new:

char *stroka=new char[20];

где 20 – объем памяти, выделенной для строки.

ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ СТРОКОВОГО ТИПА

Задать значение переменным строкового типа можно с помощью строковых констант:

а) char stroka [10]="строка"; б) char stroka [ ]="строка".

В первом случае под переменную stroka отводится 10 байт, но используются только первые 7 байт (включая завершающий нуль-символ ‘\0’). Во втором случае переменная stroka занимает 7 байт, т. е. для этой переменной память выделяется автоматически и ее размер определяется количеством символов строковой константы плюс завершающий нульсимвол.

56

Язык С++ и объектно-ориентированное программирование в С++

 

ИНИЦИАЛИЗАЦИЯ МАССИВА СТРОК

Общий вид:

char имя_массива[n][m]={ строковая константа1, строковая константа2,

. . .

строковая константаn};

где n – количество элементов массива, т. е. количество строк; m – длина строки.

Пример 7.1

сhar mas_words [10][80];

сhar mas_words [3][10] ={ "первое", "второе", "третье"};

ВВОД СТРОКИ

Операция >> вводит строку из (MAX_LEN-1)-символов, не содержащую пробелов. Значащих символов в строке может быть не более, чем (MAX_LEN-1), так как строка обязательно содержит завершающий нулевой байт ‘\0’, который служит признаком завершения строки. Особенность операции >> состоит в том, что пробел она воспринимает как нулевой символ, т. е. как признак конца строки.

Если строка содержит пробелы, то для ее считывания используется метод класса istream cin.get(). Мы пока не будем останавливаться на подробностях использования методов классов – речь об этом пойдет в лабораторной работе 13, связанной с объектно-ориентированным программированием. Для работы со строками достаточно знать, что оператор

cin.get (str,MAX_LEN);

позволяет ввести с клавиатуры строку str, не превышающую (MAX_LEN- 1) символов.

Пример 7.2. Ввод строки, содержащей пробелы.

#include "stdafx.h" #include <iostream> #include <conio.h> using namespace std;

int _tmain (int argc, _TCHAR* argv[])

{const int MAX_LEN = 80; // максимальная длина строки char str[MAX_LEN];

cout << "Input string : "; cin.get (str,MAX_LEN);

cout << "Inputed string :" << str << endl; _getch();

return 0;

}

7. Программирование задач с использованием строк

57

Для ввода строки можно также воспользоваться методом getline. Пример 7.3. Ввод строки, содержащей пробелы.

#include "stdafx.h" #include <iostream> #include <conio.h> using namespace std;

int _tmain (int argc, _TCHAR* argv[])

{const int MAX_LEN = 80; // максимальная длина строки char str[MAX_LEN];

cout << "Input string : "; cin.getline (str,MAX_LEN);

cout << "Inputed string : " << str << endl; _getch();

return 0;

}

Методы работают почти одинаково. Различие состоит в том, что метод getline считывает из входного потока не более (MAX_LEN-1)-симво- лов и записывает их в указанную строковую переменную, заменяя символ перевода строки \n нулевым байтом. Символ перевода строки при этом из потока удаляется.

Метод get оставляет символ перевода строки в потоке. Поэтому при попытке ввода нескольких строк, как показано в примере 7.4, будет введена лишь первая строка. Вместо всех остальных окажутся пустые строки, так как символ \n, оставленный в потоке методом get при вводе первой строки, будет обнаружен следующим методом get и интерпретируется как ввод пустой строки. При этом сам символ \n так и остается в потоке.

Пример 7.4. Попытка ввода нескольких строк.

#include "stdafx.h" #include <iostream> #include <conio.h> using namespace std;

int _tmain (int argc, _TCHAR* argv[])

{const int MAX_LEN = 80; // максимальная длина строки char str[MAX_LEN];

cout << "Input string : ";

cin.get (str,MAX_LEN); // или так: cin.get(); // cin.getline (str,MAX_LEN); cout << "Inputed string : " << str << endl; cout << "Input string : ";

cin.get (str,MAX_LEN); cin.get();

cout << "Inputed string : " << str << endl; cout << "Input string : ";

cin.get (str,MAX_LEN); cin.get();

58 Язык С++ и объектно-ориентированное программирование в С++

cout << "Inputed string : " << str << endl; _getch();

return 0;

}

Удаление символа \n из потока может быть осуществлено вызовом метода get() без параметров.

В примере 7.4 можно воспользоваться методом getline вместо метода get. Тогда эффект потери строк не возникает, и нет необходимости специально удалять символ \n из потока.

Современные версии языка С++ позволяют вводить несколько строк, пользуясь методом get с тремя аргументами: имя строковой переменной, длина строки и символ завершения ввода. В этом случае символ перевода строки не будет служить признаком завершения ввода строки. Теперь строки можно вводить до тех пор, пока не будет введен символ, объявленный признаком завершения ввода, или пока не будет превышен максимальный размер строки.

Пример 7.5. Ввод нескольких строк.

#include "stdafx.h" #include <iostream> #include <conio.h> using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{// подключение русификатора: setlocale(LC_ALL, "Russian"); // максимальная длина строки: const int MAX_LEN = 180;

char str[MAX_LEN];

cout << "Введите строку: ";

cin.get (str,MAX_LEN,'*'); cout << "Введенная строка:\n"

<< str << endl; _getch();

return 0;

}

В результате получится:

Введите строку: Якорь выбран чугунный И в открытых лагунах Наши старые шхуны Снова лижет прибой.

*

Введенная строка: Якорь выбран чугунный И в открытых лагунах Наши старые шхуны Снова лижет прибой.

Ввод строки можно осуществить также с помощью функции gets (char *). Эта функция читает строку со стандартного устройства ввода (клавиатуры) до тех пор, пока не встретится символ новой строки ('\n').

7. Программирование задач с использованием строк

59

Функция считывает все символы до символа новой строки и присоединяет нуль-символ в конец строки.

Пример 7.6

char str [80]; gets (str);

char * stroka = new char [20]; gets (stroka);

Ввести строку можно и c помощью функции scanf с использованием формата «%s», но эта функция считывает символы до символа разделителя (пробел, табуляция, переход на новую строку) или по количеству символов в спецификации формата (%10s). Это очень неудобно, так как практически всегда требуется вводить строку с символами-раздели- телями. Поэтому функция scanf менее предпочтительна.

ВЫВОД СТРОКИ

Для вывода строк мы уже использовали операцию <<. Никаких особенностей при выводе этого типа данных она не имеет.

Вывод строки может осуществляться также с помощью функции puts (char *). Символы записываются в стандартный выводной поток, в конец строки добавляется символ конца строки ('\n'). Нуль-символ не выводится.

Пример 7.7

puts (str); puts (stroka);

Вывести строку можно с помощью функции printf. В этом случае нульсимвол не выводится, но и символ '\n' в конец строки не добавляется.

Пример 7.8

printf ("%s", str);

printf ("%s %s\n", str, stroka); printf ("%s\n%s\n", str, stroka);

ДОСТУП К КОМПОНЕНТАМ СТРОКИ

При работе со строками можно обращаться и к отдельным символам в строке: str [3], str[0]. При этом следует помнить, что нумерация символов в строке начинается с 0, как и в массивах любого другого типа (int, float).

Библиотека языка С++ содержит ряд функций, работающих со строками. Прототипы этих функций находятся в файле string.h, поэтому в начале программы необходимо подключить данный файл:

#include <string.h>