- •1. Основные этапы решения задач на эвм
- •Формулировка задачи
- •Математическая постановка задачи
- •Разработка алгоритма решения задачи
- •Написание текста программы на языке программирования
- •Ввод текста программы в эвм
- •Поиск и устранение синтаксических ошибок
- •Тестирование программы. Поиск и устранение логических ошибок в программе
- •Этапы создания исполняемой программы
- •Базовые компоненты программ
- •Буквы и цифры
- •Пробельные символы
- •Знаки пунктуации и специальные символы
- •Идентификаторы
- •Ключевые слова
- •Комментарии
- •Лексемы
- •Типы данных
- •Целые константы
- •Константы с плавающей точкой
- •Константа-символ
- •Строковые литералы
- •Универсальные функции ввода и вывода любых типов данных
- •Структуры и форма написания программы
- •Программирование разветвляющихся вычислительных процессов
- •Цикл while – цикл с предусловием.
- •Цикл do while – цикл с постусловием
- •Цикл for
- •Безусловная передача управления внутри цикла
- •Описание некоторых стандартов алгоритмов
- •Работа с файлами (функции ввода вывода верхнего уровня)
- •Указатели
- •Одномерные массивы Объявление массива.
- •Стандартные функции обработки строк
- •Многомерные массивы на примере двумерных
- •Классы памяти
- •Способы передачи данных в функцию
- •Функции и строки
- •Функции и одномерные числовые массивы
- •Функции и двумерные массивы
- •Функции с параметрами по умолчанию
- •Перегрузка функции
- •Шаблоны функции
- •Типы данных, определяемые пользователем
- •4.1. Структуры
- •Шаблон структуры
- •Структурные переменные
- •Инициализация структуры
- •Доступ к полям структуры
- •Массив структур
- •Вложенные структуры
- •Битовые поля структур
- •Передача структуры в функцию
- •Двоичный ввод-вывод структур
- •Функции двоичного ввода-вывода
- •Динамические структуры данных
- •4.2. Объединения
- •4.3. Перечисления
- •Файловые операции ввода/вывода
- •Файловый ввод/вывод с прямым доступом
Многомерные массивы на примере двумерных
тип имя_массива_[размер по 1 индексу] [размер по второму индексу]….[размер по n индексу].
int mas1 [2][3];
2 - количество строк, 3 - количество столбцов. В памяти многомерные массивы располагаются так, что быстрей всего меняется самый первый индекс. => Двумерный массив располагается построчно.
a [0] [0], a [0] [1], a [0] [2]
a [1][0], a [1] [1], a [1] [2]
Двумерный массив может быть объявлен с инициализацией.
int mas1 [2] [3] = {
{1,2,3}, // элементы 1-ой строки матрицы
{4,5,6} // элементы 2-ой строки матрицы
};
или
int mas [2] [3] = {1,2,3,4,5,6};
Обращение к элементам матрицы осуществляется с указателем индекса строки и индекса столбца. (индексация начинается с нуля).
mas1 [0] [0] – строка – 0
столбец – 0
mas1 [1] [2] – строка – 1
столбец – 2
Динамическое выделение памяти под двумерный массив.
Massiv 2*3
1. Способ.
int **p;
Выделяем память под массив адресов строк:
p=new int**[2];
Выделение памяти динамически под каждую строку двумерного массива.
for (i=0;i<2;i++)
*(p+i) = new int[3];
Обращение к элементам матрицы
*(p+i) – адрес начала i – строки.
*(p+i)+j – адрес элемента массива с индексами i,j.
*(*(p+i)+j) – значение элемента массива с индексами i,j.
2. Способ (более простой) (выделение памяти динамически).
Будем рассматривать двумерный массив как одномерный с определенным количеством элементов.
Пусть массив 2*3
p=new int[2*3];
Зная индекс элемента i,j вычислим смещение от первого элемента массива с индексами [0] [0] до элементов массива с индексами i,j.
Смешение = количество элементов в полных строках + смещение по неполной строке.
Смещение = i*m (количество столбцов) +j
p + i * m + j – адрес элемента массива с индексами i,j.
*( p + i * m + j) - значение элемента массива с индексами i,j.
Организация перебора элементов массива в матрице.
1. Способ (перебор построчно)
a00 a01 a02 a03
a10 a11 a12 a13
a20 a21 a22 a23
int a [3] [4];
for (i=0;i<3;i++)
{ // начало i – строки
for (j=0;j<4;j++)
a [1] [j] = 0;
// конец i – строки
}
2. Способ (перебор матрицы по столбцам)
a00 a01 a02 a03
a10 a11 a12 a13
a20 a21 a22 a23
int a [3] [4];
for (j=0;j=4;j++)
{ // начало j – столбца
for (i=0;i<3;i++)
a [i] [j] = 0;
// конец j – столбца
}
Задача 1.
Дан массив. Память выделить статически. Ввести с клавиатуры и вывести на экран.
Вычислить произведение не нулевых элементов матрицы.
#include<iostream> //подключение системных средств для
using namespace std; //возможности использовать потоки ввода-вывода
int main(void) {
const int N=3;
const int M=4;
int A[N][M], proiz=1;
for (int i=0; i<N; i++) {
for (int j=0; j<M; j++) {
cout << "Enter" << i << j;
cin >> A[i][j];
}
}
for (i=0; i<N; i++) {
for (j=0; j<M; j++) {
cout << A[i][j];
if (A[i][j]!=0) {
proiz *= A[i][j];
}
}
cout << endl;
return 0;
}
Функции языка С++
Любая нетривиальная задача требует разбиения ее на несколько логически завершенных частей, каждая из которых реализуется определенной функцией. Выполнение программы начинается с функции main, а она в свою очередь вызывает другие функции.
Наличие функций избавляет нас от повторного программирования, программа, написанная с помощью функций, имеет более четкую структуру, а небольшую функцию легче понять, отладить, модифицировать.
Функция – это самостоятельная единица программы, спроектированная для реализации единой задачи. Функция содержит в себе алгоритм, который указывает, как из набора исходных данных получить результат.
Каждая из функций состоит из заголовка и тела функции. Каждая функций может находится в определенном файле, или все функции в одном файле, в любом порядке, но при этом каждая функция пишется от начала до конца.
Заголовок функции – это директивы препроцессора и имя функции. Если все функции помещены в одном файле, директивы препроцессора пишутся в самом начале файла один раз. Имя функции включает в себя тип функции, название функции и в круглых скобках параметры вместе с их типом, разделенные запятой.
Тип функции определяется типом результата функции, передаваемого через оператор return. Если функция не передает результат, тип функции void. Если тип функции не указан, то по умолчанию она типа int.
Параметры функции – это переменные, содержащие исходные данные, без которых нельзя вычислить результат.
Тело функции пишется аналогично телу main. После { скобки описывается внутренние переменные функций, необходимые для вычисление результата и для реализации алгоритма функции. Затем следуют операторы, реализующие алгоритм. Оператор return обычно завершает функцию. Хотя он может быть написан в любом месте функции в составе условного оператора.
Return; //при этом тип функции void.
Return res; //при этом тип функции как у переменной res
return a*b;
return 1; //если результат выражен const.
Сама по себе функция не выполняется, необходимо, чтобы в теле другой функции, обычно main, появился оператор вызова этой функции. При написании оператора вызова функции пишутся аргументы функции в том же порядке, количества, что и параметры.
Аргументы функции – это конкретные значения исходных данных, передаваемых параметрам в процессе выполнения функции. Функции, кроме типа void, могут вызываться внутри выражения.
Прототип функции пишется до вызова функции обычно перед именем вызывающей функции, и содержит тип функции, название функции и в круглых скобках список типов параметров. Завершается ;
Если тип аргумента в операторе вызова функции не соответствует прототипу, он автоматически (если это возможно) приводятся к нужному типу и функция вызывается правильно; в противном случае возникает ошибка компиляции.
Итак, при написании функции необходимо:
Объявить функцию или написать прототип.
Определить функцию (написать имя и тело).
В нужном месте программы организовать вызов функции.
ПРАВИЛА (основные принципы построения функции):
Каждая функция реализует одну подзадачу.
Исходные данные всегда передаются через параметры. Исключаются диалоги на ввод данных.
Результат всегда передается из функции с помощью оператора return или через параметры.
Функция не должна содержать констант, кроме общепринятых. Присутствие const объясняется нехваткой параметра.
Написать программу с функцией вычисляющей площадь произвольного треугольника по формуле Герона.
1. Название функции: Streug
2. Исходные данные:
а) сторона a => double a;
б) сторона b => double b;
в) сторона c => double c;
3. Тип результата функции: площадь => double
#include <math.h>
double Streug(double a,double b,double c)
{
double s, p;
p = (a+b+c)/2;
s = sqrt(p*(p-a)*(p-b)*(p-c));
return s;
}
Помещаем функцию в отдельный файл (streug.cpp).
Затем необходимо создать заголовочный файл streug.h. В этот файл помещаем:
#ifndef STREUG_H
#define STREUG_H
double Streug(double a,double b,double c);
#endif
Создаем файл main.cpp, содержащий решение всей программы:
#include<iostream> //подключение системных средств для
using namespace std; //возможности использовать потоки ввода-вывода
#include “streug.h”
int main (void)
{
double A,B,C,S; // имена аргументов не должны совпадать с именами параметров, хотя и могут
cout << «\nВведите стороны»;
cin >> A >> B >> C;
cout << «\n\nРезультат»;
S=Streug(A,B,C); // функцию можно вызвать и другим способом – S=Streug(5.0,3.5,7);
cout << “\Ns=” << S << endl;
return;
}