- •Лекция 1 Создание консольного приложения
- •2. Консоль. Построение консольного проекта
- •3. Запуск приложения
- •4. Сохранение и редактирование проекта
- •Лекция 2
- •4. Функции форматированного ввода и вывода
- •4.1. Функция форматированного ввода с клавиатуры
- •4.2. Функция форматированного вывода на экран
- •5. Математические функции
- •Лекция 3 Линейные вычислительные процессы
- •1. Алгоритм. Управляющие структуры
- •2. Линейные вычислительные алгоритмы
- •2.1. Условный оператор if()
- •2.2. Условное выражение
- •2.3. Оператор выбора switch()
- •Лекция 5 Программирование разветвляющихся вычислительных процессов
- •Лекция 6 Циклические вычислительные процессы.
- •1. Типы циклов
- •3. Операторы безусловного перехода
- •Лекция 7 Вычисление последовательностей
- •4. Примеры вычисления последовательностей
- •5. Структура алгоритмов вычисления рекуррентных последовательностей
- •Лекция 8 Одномерные массивы
- •1. Массивы
- •1.1. Примеры программ обработки одномерных массивов
- •1.2. Сортировка выбором
- •1.3. Сортировка простыми вставками
- •Лекция 10 Двухмерные массивы
- •1. Двухмерные массивы
- •Лекция 11 Алгоритмы матричной алгебры
- •1. Алгоритмы матричной алгебры
- •Лекция 12 Динамические массивы
- •1. Память компьютера. Адресное пространство
- •2. Динамическая память
- •3. Адреса и указатели
- •4. Указатели и массивы. Динамические массивы
- •5. Проблемы, связанные с указателями
- •6. Поразрядные операции
- •1.2. Способы объявления и обращения к элементам двухмерных массивов
- •Лекция 14 Символы и строки
- •1. Символьный тип данных
- •2. Строки
- •Лекция 15 Структуры
- •1. Понятие структуры
- •2. Определение нового имени типа
- •3. Массивы структур. Указатели на структуры
- •3.1. Определение статического массива структур
- •3.1. Определение динамического массива из n структур
- •Лекция 16 Файлы
- •1. Потоковый ввод-вывод данных
- •3. Понятие файла. Функции работы с файлами
- •Лекция 17 Файлы
- •Лекция 18 Функции пользователя
- •I. Приёмы построения алгоритмов
- •2. Понятие функции
- •2.1. Определение функции
- •2.2. Область видимости переменных
- •2.3. Параметры функции
- •2.4. Описание функции
- •2.5. Организация вызова функции
- •2.5. Передача параметров в функцию
- •3. Рекурсия
- •Лекция 20 Нахождение приближенного значения корня нелинейного уравнения
- •На отрезке [a;b] с заданной точностью eps
- •1.1. Метод дихотомии (половинного деления)
- •1.2. Метод хорд
- •1.3. Метод касательных (Ньютона)
- •Лекция 22 Объектно-ориентированное программирование
- •Полиморфизм – это свойство класса, позволяющее определить одно и то же по имени, но разное по смыслу действие. Основные этапы ооп:
- •Уточнённое имя принадлежит классу (т.Е. Компонентной) функции
- •Лекция 23 Объектно-ориентированное программирование
- •1. Конструкторы и деструкторы
- •1.2. Определение компонентных функций
- •Лекция 25 Объектно-ориентированное программирование
- •1. Свойства классов
- •1.1. Наследование классов
- •1.2. Полиморфизм
- •Библиографический список
1.1. Примеры программ обработки одномерных массивов
Пример 1. Дан одномерный массив. Найти минимальный и максимальный элементы массива, их порядковые номера и вывести их на печать.
Ход выполнения работы
-
Для нахождения минимального элемента применим стандартный ход. На первом шаге примем за минимальный нулевой элемент массива и номер этого элемента равен нулю. Затем, меняя индексы элементов массива, будем сравнивать найденное минимальное значение с текущим элементом. Если окажется, что текущий элемент меньше минимального значения, найденного на предыдущих шагах, то он становится минимальным и т.д. Для нахождения максимального элемента используют аналогичную схему. Следовательно, для того чтобы проверить каждый элемент массива, нужно использовать цикл с параметром. В алгоритме и программе переменные min и imin обозначают соответственно минимальное значение и его номер, а переменные max и imax – максимальное значение и его номер.
-
Написать программу, соответствующую алгоритму:
Алгоритм
Программа
объявление вещ: а[10], min, max; цел: i, imin, imax
для i=0 до 10-1 шаг 1
ввод а[i]
все для i
//задаются начальные максимальное и //минимальное значения элементов
//массива и их номера
min=a[0], imin =0
max=a[0], imax=0
для i=1 до 10-1 шаг 1
// в цикле изменяется номер i
// элемента массива
//поэтому переменные min и max
//сравниваются с
// каждым элементом отдельно
если min>а[i]
min=a[i]
imin=i
все_ если
если max<а[i]
max=a[i]
imax=i
все_ если
все_для i
печать imin, min
печать imax, max
для i=0 до 10-1 шаг 1
вывод a[i]
все_для i
#include "stdio.h"
#define N 10
int main ( )
{
float а[N], min, max;
int i, imin, imax;
// ввод массива с клавиатуры
for ( i=0; i<=N-1; i++ )
{
printf ("a[%i]= " ,i );
scanf ("%f", &а[i]);
}
//находим максимальное и минимальное
//значение в массиве
min=a[0], imin =0;
max=a[0], imax=0;
for ( i=1; i<=N-1; i++ )
{
if(min>а[i])
{
min=a[i];
imin=i;
}
if(max<а[i])
{
max=a[i];
imax=i;
}
}
//вывод номеров минимального и
//максимального элементов массива и их
//значений на экран
printf("№min=%i, min=%f\n",imin,min);
printf("№max=%i,max=%f\n",imax,max);
// вывод массива на экран
for (i=0; i<=N-1; i++)
printf ("%.3f ", а[i]);
printf("\n");
return 1;
}
-
Создать проект и реализовать данную задачу в среде Visual C++ 6.0.
Пример 2. Сформировать массив по закону . При заданном k подсчитать среднее арифметическое элементов массива, больших k.
Ход выполнения работы
-
Средним арифметическим называется отношение суммы чисел к их количеству. Таким образом, для решения задачи нужно найти сумму и количество элементов, удовлетворяющих условию задачи. Так как нужно проверить каждый элемент массива, то необходимо использовать цикл с параметром, где параметр будет обозначать индекс элемента массива. В алгоритме и программе переменные sum и count будут обозначать сумму и количество определенных элементов соответственно.
-
Написать программу, соответствующую алгоритму:
Алгоритм
Программа
объявление вещ: а[15], sum, k; цел: i, count
ввод k
// формирование элементов массива
для i=0 до 15-1 шаг 1
все для i
//сначала сумма элементов и их
// количество равны нулю
sum=0,count=0
для i=0 до 15-1 шаг 1
// в цикле изменяется номер i элемента
// массива
// каждый элемент сравнивается со
//значением k
// нужный элемент добавляется к сумме
если а[i]>k
sum=sum+a[i]
count++
все_ если
все_для i
// находим среднее арифметическое
sum=sum/count
// печатаем полученное значение
печать sum
// вывод массива на экран
для i=0 до 15-1 шаг 1
вывод a[i]
все_для i
#include "stdio.h"
#include "math.h"
#define N 15
int main ( )
{
float а[N], sum, k;
int i, count;
// ввод k
printf ("k=" );
scanf ("%f", &k);
// ввод массива с клавиатуры
for ( i=0; i<=N-1; i++ )
{
a[i]=sqrt(i)+sin(i);
}
//сначала сумма элементов и их //количество равны нулю
sum=0, count=0;
//вычисление суммы и количества
//элементов
for ( i=0; i<=N-1; i++ )
{
if(а[i]>k)
{
sum=sum+a[i];
count++;
}
}
// находим среднее арифметическое
sum=sum/count;
// печатаем полученное значение
printf("sred_arif=%f\n", sum);
// вывод массива на экран
for (i=0; i<=N-1; i++)
printf ("%.3f ", а[i]);
printf("\n");
return 1;
}
-
Создать проект и реализовать данную задачу в среде Visual C++ 6.0.
Пример 3. Дан одномерный массив. Вычислить произведение нечетных элементов массива, расположенных на четных позициях.
Ход выполнения работы
-
Первоначально значение произведения равно 1 (при умножении на 1 значение произведения не меняется). Затем организуется цикл для проверки каждого элемента на соответствие указанному в задаче условию. Если текущий элемент удовлетворяет условию, то с его помощью изменяется искомое произведение.
-
Написать программу, соответствующую алгоритму:
Алгоритм
Программа
объявление цел: а[14], цел: i, p
// ввод массива a с клавиатуры
для i=0 до 14-1 шаг 1
ввод а[i]
все_для i
// вычисление произведения
p=1
для i=0 до 14-1 шаг 1
если a[i]%2=1 и i%2=0
p=p*a[i]
все_если
все_для i
// печатаем полученное значение
печать p
// вывод массива a на экран
для i=0 до 4-1 шаг 1
вывод a[i]
все_для i
#include "stdio.h"
#define N 14
int main ( )
{
int а[N]; int i, p=1;
// ввод массива a с клавиатуры
for ( i=0; i<=N-1; i++ )
{
printf ("a[%i]= " ,i );
scanf ("%i", &а[i]);
}
// вычисление произведения
for ( i=0; i<=N-1; i++ )
{
if(а[i]%2==1 && i%2==0)
{
p=p*a[i];
}
}
// печатаем полученное значение
printf("p=%i\n", p);
// вывод массива a на экран
for (i=0; i<=N-1; i++)
printf ("%i ", а[i]);
printf("\n");
return 1; }
-
Создать проект и реализовать данную задачу в среде Visual C++ 6.0.
Пример 4. Даны одномерные массивы x[5] и y[5]. Сформировать новый массив z[5] по правилу .
Ход выполнения работы
-
Организуется цикл для проверки индекса каждого элемента на соответствие указанному в задаче условию. Если индекс – четное число, то выполняется одно действие, иначе элементом массива z становится наименьший из текущих элементов массивов x и y.
-
Написать программу, соответствующую алгоритму.
Алгоритм
Программа
объявление вещ: x[5], y[5], z[5], цел: i
// ввод массива x с клавиатуры
для i=0 до 5-1 шаг 1
ввод x[i]
все_для i
// ввод массива y с клавиатуры
для i=0 до 5-1 шаг 1
ввод y[i]
все_для i
// формирование массива z
для i=0 до 5-1 шаг 1
если i%2= =1 // i – нечетное
z[i]=sin(x[i])
иначе // т.е. i – четное
если x[i]<y[i] // находится
// минимальное из
// xi и yi
z[i]=x[i]
иначе
z[i]=y[i]
все_если
все_если
все_для i
// вывод массива x на экран
для i=0 до 5-1 шаг 1
вывод x[i]
все_для i
// вывод массива y на экран
для i=0 до 5-1 шаг 1
вывод y[i]
все_для i
// вывод массива z на экран
для i=0 до 5-1 шаг 1
вывод z[i]
все_для i
#include "stdio.h"
#include "math.h"
#define N 5
int main ( )
{
float x[N], y[N], z[N];
int i;
// ввод массива x с клавиатуры
for ( i=0; i<=N-1; i++ )
{
printf ("x[%i]= " ,i );
scanf ("%f", &x[i]);
}
// ввод массива y с клавиатуры
for ( i=0; i<=N-1; i++ )
{
printf ("y[%i]= " ,i );
scanf ("%f", &y[i]);
}
// формирование массива z
for ( i=0; i<=N-1; i++ )
{
if(i%2= =1)
z[i]=sin(x[i]);
else
if(x[i]<y[i])
z[i]=x[i];
else
z[i]=y[i];
}
// вывод массива x на экран
for (i=0; i<=N-1; i++)
printf ("%.3f ", x[i]);
printf("\n");
// вывод массива y на экран
for (i=0; i<=N-1; i++)
printf ("%.3f ", y[i]);
printf("\n");
// вывод массива z на экран
for (i=0; i<=N-1; i++)
printf ("%.3f ", z[i]);
printf("\n");
return 1;
}
-
Создать проект и реализовать данную задачу в среде Visual C++ 6.0.
Пример 5. Дан одномерный массив a[15]. Сформировать новый массив b из элементов массива а, меньших заданного k.
Ход выполнения работы
-
При решении данной задачи нужно знать, сколько элементов должен содержать массив b. Так как массив а вводится с клавиатуры, то значения его элементов заранее неизвестно. В общем случае все элементы массива могут быть меньше заданного k. Предполагаем, что массив b будет содержать столько же элементов, что и массив а. Однако при формировании нового массива не все элемента старого могут удовлетворять условию задачи. По этой причине индексация элементов этих массивов может различаться и, следовательно, для этой цели объявляют разные переменные.
-
Написать программу, соответствующую алгоритму:
Алгоритм
Программа
объявление вещ: a[15], b[15],k, цел: i, j
ввод k
для i=0 до 15-1 шаг 1
ввод a[i]
все_для i
j=0
для i=0 до 15-1 шаг 1
если a[i]<k
b[j]=a[i]
j++
все_если
все_для i
для i=0 до 15-1 шаг 1
вывод a[i]
все_для i
для i=0 до j-1 шаг 1
вывод b[i]
все_для i
#include "stdio.h"
#include "math.h"
#define N 15
int main ( )
{
float a[N], b[N], k;
int i,j;
printf ("k=" );
scanf ("%f", &k);
// ввод массива a с клавиатуры
for ( i=0; i<=N-1; i++ )
{
printf ("a[%i]= " ,i );
scanf ("%f", &a[i]);
}
j=0;
// формирование массива b
//переменная j после завершения
//формирования нового массива будет
//определять количество элементов этого
//массива
for ( i=0; i<=N-1; i++ )
{
if(a[i]<k)
{
b[j]=a[i];
j++;
}
}
// вывод массива a на экран
for (i=0; i<=N-1; i++)
printf ("%.3f ", a[i]);
printf("\n");
// вывод массива b на экран
for (i=0; i<=j-1; i++)
printf ("%.3f ", b[i]);
printf("\n");
return 1;
}
-
Создать проект и реализовать данную задачу в среде Visual C++ 6.0.
Пример 6. Дан одномерный массив t[7]. Осуществить циклический сдвиг массива на k элементов влево.
Ход выполнения работы
-
Под циклическим сдвигом на k элементов понимается перемещение элементов вправо или влево. Высвободившиеся элементы помещаются в конец массива (в данном случае) в порядке их следования. Начальное состояние массива:
1 |
-5 |
9 |
0 |
8 |
41 |
33 |
Если будет произведен циклический сдвиг на 3 элемента влево, то массив будет изменен следующим образом:
0 |
8 |
41 |
33 |
1 |
-5 |
9 |
-
Написать программу, соответствующую алгоритму:
Алгоритм |
Программа |
объявление вещ: t[7], x, цел: i, j, k,p ввод k для i=0 до 7-1 шаг 1 ввод t[i] все_для i //цикл по j показывает сколько раз должен // произойти циклический сдвиг на один //элемент для j=1 до k шаг 1 // запоминаем первый элемент массива p=t[0] //сдвигаем элементы массива на одну // позицию для i=0 до N-2 шаг 1 x=t[i] t[i]=t[i+1] t[i+1]=x все_для i //на место последнего элемента // записываем первый t[N-1]=p все_для j для i=0 до 7-1 шаг 1 вывод t[i] все_для i
|
#include "stdio.h" #include "math.h" #define N 7 int main ( ) { float t[N], x; int i,j, k,p; printf ("k=" ); scanf ("%i", &k); // ввод массива t с клавиатуры for ( i=0; i<=N-1; i++ ) { printf ("t[%i]= " ,i ); scanf ("%f", &t[i]); } for ( j=1; j<=k; j++ ) { //запоминаем первый элемент массива p=t[0]; //сдвигаем элементы массива на одну //позицию for ( i=0; i<=N-2; i++ ) { x=t[i]; t[i]=t[i+1]; t[i+1]=x; } //на место последнего элемента //записываем первый t[N-1]=p; } // вывод массива t на экран for (i=0; i<=N-1; i++) printf ("%.3f ", t[i]); printf ("\n"); return 1; } |
Примечание. В алгоритме два соседних элемента массива меняются местами при помощи операторов:
x=t[i-1]
t[i-1]=t[i]
t[i]=x
-
Создать проект и реализовать данную задачу в среде Visual C++ 6.0.
Лекция 9
Алгоритмы сортировки одномерных массивов
Цели:
-
познакомиться с некоторыми алгоритмами сортировки массивов и разработки соответствующего проекта в среде Visual C++ 6.0.
1. Сортировка одномерных массивов
Под сортировкой понимается упорядочение элементов некоторой последовательности в нужном порядке (убывания или возрастания). Существует достаточно много алгоритмов сортировок послед-овательностей. Но мы остановимся только на трёх, наиболее простых.
1.1. Метод пузырька (метод обменной сортировкой с выбором)
Идея метода отражена в его названии. Шаг сортировки состоит в проходе снизу вверх по массиву. По пути просматриваются пары соседних элементов. Если элементы некоторой пары находятся в неправильном порядке, то они меняются местами. При этом самые «легкие» (наименьшие) элементы массива «всплывают» наверх, а самые «тяжелые» – «тонут». Алгоритмически это можно реализовать следующим образом. Весь массив просматривается снизу вверх, стоящие рядом элементы меняются в том случае, если «нижний» элемент меньше, чем «верхний». Таким образом, наверх «всплывет» самый «легкий» элемент всего массива. Так нужно повторять для оставшихся неотсортированными N-1 элементов (т.е. для тех, которые лежат «ниже» первого) и т.д. Алгоритм достаточно прост:
Алгоритм (в порядке возрастания) |
Программа |
объявление вещ: t[10], x, цел: i, j, k, flag для i=0 до 10-1 шаг 1 ввод t[i] все_для i для i=10-1 до 1 шаг -1 //обмена не было flag=0 для j=0 до i-1 шаг 1 если t[j]>t[j+1] //меняем местами два соседних //элемента x=t[j] t[j]=t[j+1] t[j+1]=x //обмен состоялся flag=1 все_если все_для j если flag==0 выход из цикла по i // не было // обмена все_если все_для i для i=0 до 10-1 шаг 1 вывод t[i] все_для i
|
#include "stdio.h" #include "math.h" #define N 10 int main ( ) { float t[N], x; int i, j, k, flag; // ввод массива t с клавиатуры for ( i=0; i<=N-1; i++ ) { printf ("x[%i]= " ,i ); scanf ("%f", &t[i]); } for ( i=N-1; i>=1; i-- ) { //обмена не было flag=0; for ( j=0; j<=i-1; j++ ) { if (t[j]>t[j+1]) { // элементы меняются // местами x=t[j]; t[j]=t[j+1]; t[j+1]=x; //обмен состоялся flag=1; } } if(flag= =0) //если обмена не было, то нужно //выйти из цикла break; } // вывод массива t на экран for (i=0; i<=N-1; i++) printf ("%.3f ", t[i]); printf ("\n"); return 1; } |