Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
госы / programmirovanie_vysokogo_urovnya.docx
Скачиваний:
68
Добавлен:
10.04.2015
Размер:
431.53 Кб
Скачать

Void main()

{

int a, S=0;

cout << “\nВведите a: ”; cin >> a;

while (a!=0)

{

S+=a;

cout << “\nВведите a: ”; cin >> a;

}

cout << “Сумма=” <<S <<’\n’;

}

Пример 2: В последовательности из n целых чисел вычислить произведение чисел, попадающих в отрезок [b, c].

#include <iostream.h>

Void main()

{

int n, a, b, c, P=1;

cout << “\nВведите n: ”; cin >> n;

cout << “\nВведите b c: ”; cin >> b >>c;

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

{

cout << “Введите a: ”; cin >> a;

if ((a>=b)&&(a<=c)) P*=a;

}

cout << “Произведение=” <<P <<’\n’;

}

  1. МАССИВЫ. ОСНОВНЫЕ АЛГОРИТМЫ ОБРАБОТКИ МАССИВОВ.

Массив – это упорядоченная совокупность элементов одного типа, которые адресуются с помощью индекса. Доступ к элементу массива осуществляется по его порядковому номеру (индексу). Индексная переменная должна иметь целый тип. Нумерация элементов массивов в языке С++ начинается с нуля.

Массив называется одномерным, если для получения доступа к его элементам достаточно одной индексной переменной. Обработка таких массивов ведется с использованием одного цикла. Параметр цикла определяет порядковый номер элемента массива. Одномерные массивы называются также векторами.

Массив называется двумерным, если для получения доступа к его элементам необходимо иметь две индексные переменные: первая определяет номер строки, вторая – номер столбца элемента в массиве. Обработка таких массивов ведется с использованием вложенных циклов. Двумерные массивы называют еще матрицами.

Для объявления массива необходимо указать тип элементов, имя массива и количество элементов в нём.

Основные алгоритмы обработки массивов - следующие:

  1. вычисление суммы или произведения элементов массива,

  2. поиск максимального или минимального элемента массива,

  3. сортировка элементов:

    1. сортировка обменом,

    2. сортировка вставкой,

    3. сортировка выбором.

Вычисление суммы элементов массива Дан массив X, состоящий из n элементов. Найти сумму элементов этого массива. Переменной S присваивается значение равное нулю, затем последовательно суммируются элементы массива X. Блок-схема алгоритма расчета суммы:

Соответствующий фрагмент алгоритма программы будет иметь вид:

S=0;

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

S+=X[i];

cout<<"S="<<"\n";

Вычисление произведения элементов массива Дан массив X, состоящий из n элементов. Найти произведение элементов этого массива. Переменной P присваивается значение равное единице, затем последовательно перемножаются элементы массива X. Блок-схема алгоритма расчета:

Соответствующий фрагмент алгоритма программы будет иметь вид:

S=0;

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

S+=X[i];

cout<<"S="<<"\n";

Поиск максимального элемента в массиве. Дан массив X, состоящий из n элементов. Найти максимальный элемент массива. Алгоритм решения задачи следующий. Пусть в переменной с именем Max хранится значение максимального элемента. Предположим, что нулевой элемент массива является максимальным и запишем его в переменную Max. Затем все элементы начиная с первого сравниваем в цикле с максимальным. Если текущий элемент массива оказывается больше максимального, то записываем его в переменную Max.

Max = X[0];

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

if (Max < X[i])

Max = X[i];

cout<<"Max="<<Max<<endl;

Алгоритм поиска минимального элемента в массиве будет отличаться лишь тем, что в конструкции if знак поменяется с < на >.

Сортировка методом «пузырька» Здесь используется метод обменной сортировки. Сравним нулевой элемент массива с первым, если нулевой окажется больше первого, то поменяем их местами. Те же действия выполним для первого и второго, второго и третьего, i-го и (i+1)-го, предпоследнего и последнего элементов. В результате этих действий самый большой элемент станет на (n-1)-е место. Теперь повторим данный алгоритм сначала, но последний элемент рассматривать не будем. После проведения данной операции самый большой элемент оставшегося массива станет на (n-2)-е место. Так нужно повторять до тех пор, пока не упорядочим весь массив. Блок-схема алгоритма:

for (j=1; j<n; j++)

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

if (y[i]>y[i+1]) //если текущий элемент больше следущего, то

{

b=y[i]; //сохранить значение текущего элемента;

y[i]=y[i+1]; //заменить текущий элемент следующим;

y[i+1]=b; //заменить следующий элемет текущим.

}

for (i=0; i<n; i++) cout<<y[i]<<"\t"; //вывод упорядоченного массива

Сортировка выбором. В массиве Y, состоящем из n элементов, ищем самый большой элемент и меняем его местами с последним элементом. Повторяем алгоритм поиска максимального элемента, но последний (n-1)-й элемент не рассматриваем, так как он уже занял свою позицию. Найденный максимум ставим на (n-2)-ю позицию. Описанную выше операцию поиска проводим n-1 раз до полного упорядочивания элементов в массиве.

for (j=1; j<n; b=y[n-j], y[n-j]=y[nom], y[nom]=b; j++)

for (max=y[0], nom=0, i=1; i<=n-j; i++)

if (y[i]>max) {max=y[i]; nom=i;}

for (i=0; i<n; i++) cout<<y[i]<<"\t"; //вывод упорядоченного массива

Сортировка вставкой заключается в том, что сначала упорядочиваются два элемента массива. Затем делается вставка третьего в соответствующее место по отношению к первым двум элементам. Четвертый элемент помещают в список из уже упорядоченных трех элементов. Этот процесс повторяется до тех пор, пока все элементы не будут упорядочены.

  1. ФАЙЛЫ В ЯЗЫКЕ С++. СТАНДАРТНЫЕ ПОДПРОГРАММЫ ДЛЯ РАБОТЫ С ФАЙЛАМИ.

Файл – именованный набор байтов, который может быть сохранен на некотором накопителе. Под файлом понимается некоторая последовательность байтов, которая имеет своё, уникальное имя, например файл.txt. В одной директории не могут находиться файлы с одинаковыми именами. Под именем файла понимается не только его название, но и расширение, например: file.txt и file.dat - разные файлы, хоть и имеют одинаковые названия. Существует такое понятие, как полное имя файлов – это полный адрес к директории файла с указанием имени файла, например: D:\docs\file.txt.

Для работы с файлами необходимо подключить заголовочный файл <fstream>. В <fstream> определены несколько классов и подключены заголовочные файлы <ifstream> - файловый ввод и <ofstream> - файловый вывод.

Файловый ввод/вывод аналогичен стандартному вводу/выводу, единственное отличие – это то, что ввод/вывод выполнятся не на экран, а в файл. Если ввод/вывод на стандартные устройства выполняется с помощью объектов cin и cout, то для организации файлового ввода/вывода достаточно создать собственные объекты, которые можно использовать аналогично операторам cin и cout.

Например, необходимо создать текстовый файл и записать в него строку "Работа с файлами в С++". Для этого необходимо проделать следующие шаги:

  1. создать объект класса ofstream;

  2. cвязать объект класса с файлом, в который будет производиться запись;

  3. записать строку в файл;

  4. закрыть файл.

ofstream fout;

fout.open("cppstudio.txt");

fout << "Работа с файлами в С++";

fout.close();

Для того чтобы прочитать файл понадобится выполнить те же шаги, что и при записи в файл с небольшими изменениями:

  1. создать объект класса ifstream и связать его с файлом, в который будет производиться запись;

  2. прочитать файл;

  3. закрыть файл.

char buff[50]; // буфер промежуточного хранения считываемого из файла текста

ifstream fin("cppstudio.txt"); // открыли файл для чтения

fin >> buff; // считали первое слово из файла

fin.getline(buff, 50); // считали строку из файла

fin.close(); // закрываем файл

cout << buff << endl; // напечатали эту строку

  1. УКАЗАТЕЛИ В ЯЗЫКЕ С++. ОРГАНИЗАЦИЯ ДИНАМИЧЕСКИХ СТРУКТУР ДАННЫХ.

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

Указатель представляет собой адрес переменной в оперативной памяти. Переменная указательного типа (переменная-указатель или просто указатель) – это переменная, размер которой достаточен для хранения адреса оперативной памяти.

Переменные-указатели объявляются с помощью символа *, который добавляется после названия обычного типа данных (или перед именем переменной-указателя). Например, описание: int* a; объявляет переменную-указатель a, которая может принимать значение адреса переменной целого типа int. Здесь int является базовым типом для переменной-указателя a. Несколько указателей одного типа можно объявить так: int *a, *b, *c;

Операции над указателями. С указателями можно использовать 4 арифметические операции: +, -, ++ и --, т.е. 2 бинарные (сложения и вычитания) и 2 унарные (инкремент и декремент), а также операции отношения: ==, < и >.

К переменной-указателю можно прибавлять (или вычитать) целое число. При этом происходит смещение указателя на соответствующее базовому типу число адресов памяти.

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

Для получения значения переменной по ее указателю используется унарная операция разыменования (разадресации) *. Выражение *<переменная-указатель> представляет собой переменную (значение переменной), адрес которой равен значению переменной-указателя. Операция * означает «получить значение переменной, расположенной по этому адресу». Пример:

include <iostream.h>

Соседние файлы в папке госы