Проект 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
 
4

1 5 6 7 8
Левый индекс
2

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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!