1. Задан массив точек плоскости, т. е. два одномерных массива одинаковой фиксированной размерности X[n] и Y[n], где (Xi, Yi) — координаты i-й точки. Составить следующие функции:
1) логическую функцию Test для определения, принадлежит ли точка с координатами (x, y) k-й четверти;
2) функцию Num, которая с помощью первой функции в массиве точек определяет их количество в k-й четверти;
3) функцию main, которая с помощью второй функции находит количество точек в каждой четверти.
const n = 10;
bool Test (float , float , unsigned );
unsigned Num (float x[], float y[],unsigned k);
main()
{ float X[n]={1.1, 2.2, 3, 44, 0.5, -6.6, -0.7, -88, -9, -10},
Y[n]={11, 0.2, 33, 0.4,-5.5, 66, 77, -8.8,-9.9,-10};
cout<<" Number of points in\n";
for(unsigned K=1; K<=4;K++)
cout<<" "<<K<<" quarter "<<Num(X,Y,K)<<endl;
getch(); return 0;
}
bool Test (float u, float v, unsigned k)
{ switch (k)
{ case 1: return u>0 && v>0;
case 2: return u<0 && v>0;
case 3: return u<0 && v<0;
case 4: return u>0 && v<0;
}
}
unsigned Num (float x[], float y[], unsigned k)
{ unsigned number=0;
for (int i=0; i<n; i++)
if (Test (x[i], y[i], k)) number++;
return number;
}
2. В одномерном вещественном массиве найти среднее значение. Числа из отрезка [a, b] увеличить в 10 раз, а остальные оставить без изменения. Составить и использовать следующие функции: ввод массива; вывод массива; вычисление среднего значения элементов массива; изменение массива; функцию main для проверки названных функций.
void INP(float x[], int n);
void OU1(float x[], int n);
float AVER(float x[], int n);
void CHANGE(float a, float b, float x[], int n);
int main()
{ const N=5; float arr[N], a, b; INP(arr, N);
cout<<"Исходный массив"<<endl; OU1(arr, N);
cout<<"Среднее значение \t"<<AVER(arr, N)<<endl;
cout<<"a="; cin>>a; cout<<"b="; cin>>b;
CHANGE(a, b, arr, N);
cout<<"Измененный массив"<<endl; OU1(arr, N);
getch(); return 0;
}
void INP(float x[], int n)
{ for (int i=0; i<n; i++)
{ cout<<"enter "<<(i+1)<<" element of array -\t";
cin>>x[i]; clrscr();
}
}
void OU1(float x[], int n)
{ for (int i=0; i<n; i++)
cout<<(i+1)<<" element of array \t"<<x[i]<<endl;
}
float AVER(float x[], int n)
{ float s=0;
for (int i=0; i<n; i++, s+=x[i]);
s=s/n; return s; }
void CHANGE(float a,float b, float x[], int n)
{ for (int i=0; i<n; i++)
if(a<=x[i] && x[i]<=b)
x[i]*=10;
}
3. В одномерном целочисленном массиве найти, сколько раз повторяется наибольшее число, сколько раз повторяется наименьшее и вывести жёлтым цветом то из них, которое повторяется чаще. Например, в массиве {99, 8, 99, 99, 2} наибольшее число 99 повторяется чаще (три раза), чем наименьшее 2, которое встречается только один раз. Поэтому число 99 выделяем жёлтым цветом. Для другого массива {99, 7, 99, 7, 7} жёлтым цветом выделим число 7.
Составим и используем следующие функции: ввод массива (ReadArr); обычный, не “цветной” вывод массива (WriteArr); функцию ColorWriteArr, которая выводит число w массива цветом color1, остальные числа массива — цветом color2; поиск наибольшего и наименьшего элементов массива (MaxMin); функцию Num, которая определяет, сколько раз число w повторяется в массиве; main, проверяющую перечисленные выше функции.
void ReadArr(int [], int );
void WriteArr(int [], int );
void ColorWriteArr(int a[], int , int , int , int );
void MaxMin(int [], int , int &mx, int &mn);
int Num(int [], int , int );
main()
{ const n = 5; int a[5], MyMax, MyMin, num1, num2;
clrscr(); ReadArr(a, n);
WriteArr(a, n); MaxMin(a, n, MyMax, MyMin);
num1 = Num(a, n, MyMax); num2 = Num(a, n, MyMin);
cout<<"\nMyMax "<<MyMax<<" MyMin "<<MyMin<<endl;
cout<<"\nNumMax "<<num1<<" NumMin "<<num2<<endl;
if (num1>num2) ColorWriteArr(a, n, MyMax, 14, 11);
else if (num1<num2) ColorWriteArr(a, n, MyMin, 14, 11);
else cout<<" Number of max = number of min ";
getch(); return 0;
}
void ReadArr(int x[], int size)
{ for (int i=0; i<size; i++)
{ cout<<"a["<<i<<"]="; cin>>x[i];
}
}
void WriteArr(int x[], int size)
{ for (int i=0; i<size; i++) cout<<x[i]<<" ";
printf("\n");
}
void MaxMin(int x[], int size, int& mx, int& mn)
{ mx=x[0]; mn=x[0];
for (int i=0; i<size; i++)
if (x[i]<mn) mn = x[i];
else if (x[i]>mx) mx = x[i];
}
int Num(int x[], int size, int w)
{ int k=0;
for (int i=0; i<size; i++)
if (x[i] == w) k++;
return k;
}
void ColorWriteArr(int x[], int size, int w, int color1, int color2)
{ for (int i=0; i<size; i++)
{ if (x[i] == w) textcolor(color1);
else textcolor(color2);
cprintf("%5d ", x[i]);
}
printf("\n");
}
4. Запрограммировать в виде функции следующий алгоритм сортировки по убыванию. На первом шаге находим наибольший элемент всего массива, его номер k и переставляем x[0] c x[k]. На втором шаге находим наибольший элемент, начиная со второго элемента (с x[1]), его номер k и переставляем x[1] c x[k]. На третьем шаге находим наибольший элемент, начиная с третьего элемента (с x[2]), его номер k и переставляем x[2] c x[k]. Так продолжаем до конца массива.
5. Дан одномерный вещественный массив a[n]. Вычислить
Вариант 1) Составить одну функцию типа void с тремя результатами, которая вычисляет наибольшее число массива, сумму всех его элементов и их произведение.
Вариант 2) Составить следующие три вещественные функции, каждая из которых имеет один результат: 1) вычисление наибольшего числа массива, 2) вычисление суммы всех его элементов, 3) нахождение их произведения.
В головной функции определить массив и с помощью одной или трех функций вычислить f.
6.Ввести два одномерных массива. В каждом из них найти наибольшее количество одинаковых подряд идущих элементов и этот элемент.
7.Ввести три одномерных массива — a[n],b[n],c[n]. Получить массив d[n] по формуле d=(a+b) ∙ (b+c), где сложение и умножение выполняются поэлементно. Составить и использовать следующие функции: для ввода массива, поэлементного сложения двух массивов, их поэлементного умножения, функцию main.
8.Рассортировать массив по возрастанию первых двух цифр числа. Составить и использовать следующие функции: для ввода массива, нахождения первой и второй цифры для одного целого числа, построения массива первых и вторых цифр, сортировки массивов, вывода массивов в виде таблицы, функцию main.
Замечание. В следующих задачах, как и в предыдущих, проект разбить на несколько функций.
9.Рассортировать массив следующим образом: сначала должны размещаться палиндромы по возрастанию их значений, а затем не палиндромы тоже по возрастанию их значений. Палиндром – это целое симметричное число, которое одинаково читается слева направо и справа налево.
10.Рассортировать целочисленный массив по убыванию следующих параметров числа:
a) количества единиц в двоичном представлении числа;
б) общего количества пар соседних различных цифр в двоичном представлении числа. Например, 2510 = 110012 имеет две такие пары, а число 7410 = 10010102 содержит пять таких пар;
в) количества букв в шестнадцатеричном представлении числа.
11.Массив точек плоскости рассортировать по убыванию первой координаты.
12.Даны массивы a[5], b[5], c[5]. Вычислить
13.Даны два массива x[10] и y[10]. Построить третий массив z[10]:
Составить и использовать следующие функции: вычисление наименьшего из двух чисел r = min(u, v); вычисление r = max(u, v); построение массива; функцию main().
§ 5. Область действия имён.
Локальные и глобальные имена
Так как в C++ нет вложенных функций, этот вопрос решается проще, чем на языке Pascal.
Есть несколько мест объявления переменных:
1) вне всех функций, в том числе вне main, например, в самом начале перед прототипами функций, между ними, перед функцией main или между текстами функций. Такие переменные, названные глобальными, “видны” из любой функции, размещенной после описания переменной, т. е. их можно там использовать. Память для глобальных переменных занята на всё время выполнения проекта;
2) в скобках в прототипе и в описании функции. Как видно из предыдущих примеров, не все используемые в функции переменные объявляются в заголовке. Здесь перечисляются только те переменные, которые должны быть переданы в функцию, то есть входные, и её результаты (выходные параметры), если такие есть. Такие переменные, названные формальными параметрами, доступны только в той единственной функции, в заголовке которой они описаны. Повторно в теле функции формальные параметры объявлять не надо! В прототипе функции имена параметров можно не писать, достаточно указать только их типы. Эта информация используется компилятором при проверке соответствия фактических и формальных параметров. При описании функции в её заголовке имена параметров и повторно их типы записываются обязательно:
3) переменные, содержащие некоторые промежуточные значения, объявляются в теле функции и доступны только в ней. Они не являются формальными параметрами, в заголовке функции не записываются, при вызове функции никак не передаются в неё и из функции не возвращаются.
4) как частный случай последней возможности переменные можно объявить внутри блока. Блок или составной оператор — это последовательность операторов, заключённая в фигурные скобки. Таким блоком может быть, например, тело любого из циклов, одна из ветвей if или switch, например, if (…) { float t; …}. Такую переменную (t) можно использовать только в этом блоке и во всех внутренних (вложенных) по отношению к нему. Вне данного блока она недоступна. Этим мы гарантируем, что вне блока такая переменная не будет изменена.
Переменные, объявленные по правилам 2), 3), 4), называются локальными. Они имеют следующие особенности:
· их можно объявить в любом месте функции или блока до первого их использования, то есть не обязательно в самом начале. Это, конечно, не относится к формальным параметрам, которые объявляются всегда в скобках заголовка;
· локальные переменные создаются при входе в функцию или блок и уничтожаются при выходе из них. При этом не просто теряются значения, но и освобождается память;
· локальные переменные в разных функциях или блоках, не вложенных друг в друга, могут иметь одинаковые идентификаторы. Но на самом деле это разные переменные, для них отводится разная память;
· как правило, использование локальных переменных предпочтительнее глобальных. Например, из двух вариантов функции
a) float MyMax1 (float x, float y)
{ return x>y?x:y;
}
b) float x, y;
float MyMax2 ()
{ return x>y?x:y;
}
первый лучше, так как использует локальные переменные. Во втором варианте используются глобальные переменные.
Сказанное выше относится к константам и типам. Эти элементы также могут быть локальными, то есть объявленными в функции или в блоке, и глобальными, которые доступны всем или нескольким функциям. Понятно, что не имеет смысла говорить о формальных константах или формальных типах.