Проект 4-1 Упорядочение массива
Лекция6- программирование -«Массивы, строки»
СОДЕРЖАНИЕ
Массивы.. 2
Одномерные массивы.. 2
Двумерные массивы.. 3
Многомерные массивы.. 4
Строки.. 5
Основы техники строк. 6
Ввод строки с клавиатуры.. 6
Функции обработки строк. 7
Использование завершающего нуля. 8
Инициализация массивов. 8
Инициализация массивов неопределённой длины.. 10
Массивы строк. 10
Вопросы для самоконтроля. 12
Массивы
Массивом называется коллекция переменных одного типа, обращение к которым осуществляется по общему имени. Массивы могут быть одномерными и многомерными.
Достаточно часто приходиться работать с символьными массивами. Язык С++ не имеет встроенного типа строковых данных и поэтому строки реализуются как массивы символов. Такой подход к строкам обеспечивает большие возможности и гибкость, чем это доступно в языках, использующих строковый тип данных.
Одномерные массивы
Одномерный массив, являющийся списком взаимосвязанных переменных, широко используется в программировании. Общая форма объявления одномерного массива выглядит так:
тип имя [размер];
Здесь:
тип задаёт базовый тип массива, который определяет тип данных каждого элемента массива;
размер - число элементов, содержащихся в массиве.
Примером объявления массива целых чисел под именем sample, состоящего из 10 элементов, служит следующее предложение:
int sample [10];
Обращение к индивидуальным элементам массива осуществляется с помощью индексов. Индекс определяет позицию элемента внутри массива. В С++ все массивы используют 0 в качестве индекса своего первого элемента. Объявленный выше массив sample содержит 10 элементов с индексными значениями от 0 до 9. Доступ к элементу массива достигается путём индексации массива с помощью номера элемента. В качестве примера создадим программу.
|
|
Задание 6-1
Программа заполнит массив sample числами от 0 до 9.
// 6_1 SAMPLE.cpp: главный файл проекта.
// Заполняет массив sample числами от 0 до 1
// Выводит на печать содержимое массива sample
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
setlocale (LC_ALL,"Russian");
int sample [10]; // резервирование памяти под 10 эл-тов типа int
int i;
//заполнение массива
for (i = 0; i <10; i++) sample[i] = i;
// Вывод содержимого массива на печать
for (i = 0; i <=9; i++)
cout << " sample [" << i << "] = "<< sample [i] << "\n";
_getch();
}
Задание 6-2
Программа вычисляет среднее из шести введённых величин, определяет максимальную и минимальную величину.
// 6_2 NUMS.cpp: главный файл проекта.
/* Вычисление среднего и нахождение минимального
|
|
и максимального значений для набора данных
*/
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
setlocale (LC_ALL,"Russian");
int i, avg, min, max;
int nums [6];
avg = 0;
cout << "Введите 6 элементов массива nums \n";
for (i = 0; i < 6; i++) {
cout << "nums [" << i << "] = ";
cin >> nums[i];
// Вычисление суммы элементов массива
avg += nums[i];
}
// Определение максим или миним значения
min = max = nums [0];
for (i = 0; i < 6; i++) {
if (nums[i] < min) min = nums[i];
if (nums[i] > max) max = nums[i];
}
// Вывод полученных значений на печать
cout << " Среднее значение = " << (float) avg / 6 << "\n";
cout << " МИН_значение = " << min << "\n";
cout << " МАКС_значение = " << max << "\n";
_getch();
}
Примечания
· В С++ недопустимо копировать один массив в другой с помощью операции присваивания вида a = b, а именно:
int a[10], b[10];
//……
a = b; // ошибка – недопустимая операция
|
|
for (i = 0; i <10; i++) a[i] = b[i]; //правильный вариант копирования
· С++ не выполняет проверку границ массива. Это означает, что при использовании массива не появится сообщение об ошибке, если индекс элемента массива превысит его максимальное значение.
Двумерные массивы
С ++ допускает возможность создания многомерных массивов. Простейшей формой многомерного массива является двумерный массив. Для объявления двумерного массива twoD целых чисел размера 10Х20 необходимо использовать предложение:
int twoD [10] [20]
Задание 6-3
Программа заполняет двумерный массив числами от 1 до 12.
// 6_3 NUMS.cpp: главный файл проекта.
// Заполнение двумерного массива числами от 1 до 12
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
setlocale (LC_ALL,"Russian");
int i, j, nums[3][4];
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
nums [i][j] = (i*4) + j +1;
cout << "nums [" << i << "] [" << j <<" ] = "
<< nums[i] [j] << "\n";
}
cout << "\n";
}
cin.get();
}
Двумерные массивы сохраняются в памяти в виде матрицы, состоящей из строк и столбцов, причём первый индекс определяет строку, а второй – столбец. Отсюда следует, что если элементы массива обрабатываются в том порядке, в каком они фактически располагаются в памяти, то правый индекс изменяется быстрее левого. Поэтому предыдущая программа (задание 6-3) заполнила массив следующим образом:
|
|
Правый индекс |
0 | 1 | 2 | 3 | ||
0 | 1 | 2 | 3 | | |
1 | 5 | 6 | 7 | 8 | |
| 9 | 10 | 11 | 12 |
Многомерные массивы
С++ допускает создание массивов с числом измерений больше двух. Общая форма объявления многомерного массива такова:
тип имя [размер1] [размер2] ……..[размер N];
Например, следующее объявление создаёт массив целых чисел с размерностью 4Х10Х3:
int multidim[4] [10] [3]
Массивы с числом измерений более трёх используются не часто отчасти из-за того, что требуют для своего хранения значительных объёмов памяти и могут быть причиной нехватки памяти для остальных частей программы.
Использование данных массива в программах часто сопряжено с необходимостью сортировки массива в том или ином порядке. Существует несколько различных алгоритмов упорядочения массива. Наиболее известным, удобным и простым для понимания является алгоритм носящий название метода всплывающего пузырька или просто пузырькового упорядочения.
Проект 4-1 Упорядочение массива
Задание 6-4
// Задание 6_4.cpp: определяет точку входа для консольного приложения.
// Пузырьковое упорядочение массива
#include "stdafx.h"
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int size, i, j, t, nums[10];
size = 10; //число элементов массива
// присвоение элементам массива случайных величин
srand(time(NULL));
cout << "\n Исходный массив - случайные числа \n";
for (i = 0; i < size; i++) {
nums[i] = rand()%100+1;
cout << "nums [" << i << "] = " << nums[i] << "\n";
}
cout << "\n";
// упорядочение массива
for (i = 1; i < size; i++)
for (j = size - 1; j >= i; j--) {
if (nums[j - 1] > nums[j]) {
// поменять местами
t = nums[j - 1];
nums[j - 1] = nums[j];
nums[j] = t;
}
}
// вывод упорядоченного массива
cout << "\n Упорядоченный массив \n";
for (i = 0; i < size; i++)
cout << "nums [" << i << "] = " << nums[i] << "\n";
return 0;
}
Строки
Важным применением одномерных массивов является создание символьных строк. С++ поддерживает строки двух типов. Первый, часто используемый, - это строка с завершающим нулём. Строка с завершающим нулём содержит символы, образующие эту строку, за которыми помещается ноль. Такие строки широко используются, так как обеспечивают высокий уровень эффективности и предоставляют программисту возможность выполнять разнообразные строковые операции.
Второй вид строк, определённый в С++ - это класс string, который входит в библиотеку классов С++.
Класс string позволяет использовать объектно-ориентированный подход при обработке строк, однако он используется не так широко, как строки с завершающим нулём.
Основы техники строк
Объявляя символьный массив, который будет содержать строку с завершающим нулём, необходимо задать ему длину на один символ больше, чем у самой длинной помещаемой в него строки. Символьная константа в С++ представляет собой список символов, заключённый в двойные кавычки, например:
“Привет!” “ Ilike C++” “Mars” “ “
Строка вида ““ - называется нулевой строкой и содержит лишь завершающий нуль. Добавлять ноль в конец строки вручную нет необходимости; компилятор сделает это сам. Так строка “Mars” будет выглядеть в памяти таким образом:
M | a | r | s | 0 |
Ввод строки с клавиатуры
Самый простой способ прочитать в программу строку, вводимую с клавиатуры, заключается в использовании массива char и предложения cin как показано в примере: .
Задание 6-5
// Задание 6_5.cpp: определяет точку входа для консольного приложения.
// Ввод строки с клавиатуры
#include "stdafx.h"
#include <iostream>
#include<Windows.h> // Для русского языка
using namespace std;
int main()
{
SetConsoleCP(1251); // установка кодовой страницы win-cp 1251 в поток ввода
SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
char str[80];
cout << "Введите строку: ";
cin >> str; //Ввод строки с клавиатуры
cout << "Вот ваша строка: ";
cout << str << "\n";
return 0;
}
Хотя приведённая программа технически правильна, она не всегда будет работать, как вы ожидаете. При вводе строки, включающей пробелы, на экране в качестве результата, появятся символы до первого пробела. Это происходит потому, что система ввода-вывода С++ прекращает ввод с клавиатуры при получении пробельного символа. Пробельные символы – это пробелы, символы табуляции символы новой строки. Для решения проблемы необходимо использовать функцию gets(), общая форма которой следующая:
gets (имя_массива); Для использования этой функции нужен заголовок <cstdio>.
Предыдущая программа с использование функции выглядит следующим образом:
Задание 6-6
// 6_6 VVSIM.cpp: главный файл проекта.
// Ввод строки с клавиатуры
#include "stdafx.h"
#include <iostream>
#include<Windows.h> // Для русского языка
#include <cstdio> // для использования функции gets()
using namespace std;
int main()
{
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
char str[80];
cout << "Введите строку: ";
gets_s(str); //Ввод строки с помощью gets()
cout << "Вот ваша строка: ";
cout << str << "\n";
return 0;
}
Функции обработки строк
С++ поддерживает широкий диапазон функций для манипуляций со строками. Самые известные из них: strcpy_ s(); strcat_ s(); strcmp(); strlen(). Все строковые функции используют один и тот же заголовок <string>.
strcpy(куда, откуда); - копирует содержимое строки откуда в строку куда.
strcat(s1, s2); - присоединяет строку s2 к концу строки s1; строка s2 остаётся без изменений.
strcmp(s1, s2); - сравнивает две строки и возвращает 0, если они равны. Если s1 больше s2 лексикографически (по порядку следования символов алфавита), возвращается положительное число, если s1 меньше s2, возвращается отрицательное число
strlen(s) – возвращает длину строки, на которую указывает s (s - это строка).
Дата добавления: 2019-07-15; просмотров: 243; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!