
- •Часть 1
- •18 Сентября 2012 г., протокол № 1
- •Предисловие
- •§ 1. Основные понятия программы
- •1.2. Директива препроцессора #include
- •Структура программы
- •Комментарии
- •Ключевые слова, идентификаторы, переменные
- •§ 2. Ввод, вывод
- •§ 3. Выражения
- •3.1. Константы
- •Непосредственно записать в выражении;
- •3.2. Операции и их приоритет
- •3.3. Операции отношения и логические операции
- •3.4. Операция присваивания
- •§ 4. Программирование ветвлений
- •4.1. Оператор if
- •4.2. Тернарная операция
- •4.3. Оператор выбора switch
- •Г л а в а 2 циклы
- •§ 1. Оператор while
- •§ 2. Оператор break
- •§ 3. Оператор do … while
- •§ 4. Оператор for
- •Г л а в а 3 Введение в массивы
- •§ 1. Основные понятия
- •§ 2. Способы определения массивов
- •§ 3. Вывод массива. Функции printf и cprintf
- •§ 4. Типы задач при работе с массивами
- •Упражнения и тесты
- •Г л а в а 4 модульное программирование. Функции
- •§1. Функции без результатов. Параметры-значения
- •1.1. Примеры. Правила оформления и вызова функций
- •Формальные и фактические параметры
- •Передача параметров по значению
- •§ 2. Функции типа void с результатами
- •2.1. Вычислeниe бeсконeчных сумм
- •2.2. Что такое ссылочный тип
- •2.3. Параметры ссылочного типа
- •§ 3. Функции, отличные от void. Оператор return
- •§ 4. Область действия имён. Локальные и глобальные имена
- •§ 5. Встраиваемые (inline) функции
- •§ 6. Параметры по умолчанию
- •§ 7. Перегрузка функций
- •7. Сравнение функций типа void и отличных от типа void.
- •Г л а в а 5 введение в объектно-оРиентированное программирование
- •§ 1. Первое знакомство с ооп
- •§ 2. Класс. Поля и методы класса
- •§ 3. Создание объектов. Конструктор
- •Упражнения и тесты
- •Оглавление
- •3.1. Константы …………………………………………….………..….........…8
- •Упражнения и тесты …….………………..………………………….…………....19
- •Методы программирования:
- •Лекции, примеры, тесты
- •Пособие для студентов механико-математического факультета
- •В двух частях
- •Часть 1
§ 4. Типы задач при работе с массивами
1. Анализ всего или части массива, то есть найти какую–нибудь его характеристику: наименьшее, наибольшее значение, сумму или произведение всех элементов или элементов с некоторым условием, количество элементов с некоторым условием и т.п.
Пример 10. Найти количество положительных, отрицательных и нулевых чисел и вывести их разным цветом.
int main() { const n=10, c1=10, c2=11, с3=12; int k1=0, k2=0;
int a[n]={1, 0,-3,22, -33,-4,0 ,0, -22};
for( int i=0;i<n; i++)
{ if (a[i]>0) { textcolor(c1); k1++; }
else if (a[i]<0) { textcolor(c2); k2++; }
else textcolor (с3);
cprintf("%d ", a[i] ); }
textcolor(c1); cprintf ("\r\n Number of positive %d", k1);
textcolor(c2); cprintf ("\r\n Number of negative %d ", k2);
textcolor(с3); cprintf ("\r\n Number of 0 %d", n-k1-k2);
getch(); return 0; }
Поиск в массиве, т. е. определить, есть ли элемент с некоторым условием. Найти индекс и (или) значение первого (последнего) такого элемента, всех таких элементов.
Пример 11. Определить, есть ли в одномерном массиве отрицательные числа. Если есть, вывести “Yes” и номер последнего такого числа, в противном случае вывести “No”.
int main() { const n=10; int a[n]={1, 22, -3, 40, -55 ,-6, 0 , -0, -99};
/*Второй тест: нет отрицательных
int a[n]={1, 22, 3, 40, 55, 6, 0, 0, 99};*/
int N0=-1; /* Пусть нет отрицательных. Для поиска последнего отрицательного числа просматриваем массив в обратном порядке.*/
for (int i=n-1; i>=0; i--) if (a[i] <0) { N0=i; break; }
/* Нашли первое с конца, или последнее в массиве отрицательное число, и дальше массив не просматриваем, вышли из цикла с помощью break;*/
if (N0 == -1) cout<<”\nNo”;
/* В массиве нет отрицательного числа, вышли из цикла после того, когда просмотрели все элементы, то есть когда i>=0 стало ложным. */
else /* В массиве было отрицательное число и вышли из цикла с помощью break. */
cout<<"\n Yes, number of the last "<< N0+1 ;
getch(); return 0; }
Пример 12 объединяет два типа алгоритмов в одной задаче. Ввести массив с экрана. Найти сумму чисел до первого нуля и его номер. Если нуля нет, вывести сумму всех чисел массива.
int main() { const n=5; int a[n]; for(int i=0; i<n; i++) cin>>a[i];
int n2=-1 , /* Номер первого нуля. */
s=0, i=0;
while (i<n ) { if (a[i]==0) { n2=i+1; break; }
s+=a[i++]; }
if (n2 == -1) cout<<"No 0, sum = "<<s;
else { cout<<"Number of the first 0 " <<n2;
if (n2!=1) cout<<", sum before the first 0 = "<<s; }
getch(); return 0; }
Построение массива по некоторому правилу, используя при этом индексы , одно или несколько чисел и (или) один или несколько массивов.
Пример 13. Построить массив положительных и массив отрицательных чисел и вывести их.
int main()
{ const n = 10; int a[n], //Исходный массив
b[n], //Массив положительных чисел
d[n]; // Массив отрицательных чисел
cout<<"Array : "; randomize();
for (int i=0; i<n; i++) { a[i]=random(100)-50;
printf ("%5d",a[i]); }
int nd=0, nb=0;
for (int i=0; i<n; i++)
if (a[i]<0) d[nd++] = a[i];
else if (a[i]>0) b[nb++] = a[i];
cout<<"\nPositive array: "; for (int i=0; i<nb; i++)printf ("%5d",b[i]);
cout<<"\nNegative array: "; for (int i=0; i<nd; i++)printf ("%5d",d[i]);
getch(); return 0; }
Преобразование массива: изменить их значения, переставить местами некоторые элементы, удалить один или несколько элементов массива, вставить элементы массива и т. п.
Пример 14. Массив преобразовать следующим образом: все числа из отрезка [0,1] увеличить в 10 раз, отрицательные уменьшить в (–2) раза, остальные уменьшить в 10 раз. Преобразованный массив оставить на том же месте.
int main()
{ const n=5; float a[n]= { 0.12, -3.4, .5, 67, 8 };
for (int i=0; i<n; i++)
if(a[i]>=0 && a[i]<=1) a[i] = a[i]*10;
else if (a[i]<0) a[i]=a[i] / (-2);
else a[i] = a[i]/10. ;
for (int i=0; i<n; i++) printf ("%10.3f", a[i]);
getch(); return 0; }
Вывод массива в специальном виде (см. § 3).
Одна и та же задача может состоять из нескольких частей, каждая из которых относится к разным типам.
Пример 15. Ввести массив с экрана. Найти его наибольший и наименьший элементы и переставить их, т. е. на место каждого наибольшего поместить наименьший элемент, на место каждого наименьшего поместить наибольший элемент.
Поиск наибольшего и наименьшего элементов массива относятся к первому типу, а их перестановка — к четвёртому.
int main() { const n=5; int a[n], i;
for (i=0; i<n; i++) { cout<<"a["<<i<<"] "; cin>>a[i]; }
int min1=a[0], max1=a[0];
for (i=1; i<n; i++) if (min1>a[i]) min1=a[i];
else if ( max1<a[i]) max1=a[i];
cout<<endl<<"Max "<<max1 ; cout<<" Min "<<min1 ;
for (i=0; i<n; i++) if (max1==a[i]) a[i]=min1;
else if (min1==a[i]) a[i]=max1;
cout<<"\n The new array\n" ;
for (i=0;i<n;i++) cout<<"a["<<i<<"]= "<<a[i]<<endl; getch(); return 0; }