zadachi
.pdfvoid inp1( int size, int x[])
{ int i; cout<<"vvedite masiv \n "; for(i=0;i<size;i++) cin>>x[i]; }
void out1(int size, int x[])
{cout<<endl;
for( int i=0; i<size; i++) |
cout<<x[i]<<" |
"; |
|
cout<<endl; |
|
|
|
} |
|
|
|
void sort ( int size, int x[]) |
|
|
|
{ int i, b, flag; |
|
|
|
do { |
flag=0; |
|
|
|
for (i=0; i<size-1; i++) |
|
|
|
if(x[i]>x[i+1]) |
{ flag=1; |
|
|
|
b=x[i]; |
x[i]=x[i+1]; x[i+1]=b; |
|
size--; |
} |
|
|
|
|
|
} |
while(flag); |
|
|
} |
|
|
|
4. В одномерном вещественном массиве найти среднее значение. Числа из отрезка [a, b] увеличить в 10 раз, а остальные оставить без изменения. Составить и использовать следующие функции: ввод массива; вывод массива; вычисление среднего значения элементов массива; изменение массива; функцию main для проверки названных функций.
void INP(float x[], int n); |
|
|
|
void OUT(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; |
OUT(arr,N); |
||
cout<<"Среднее значение \t"<<AVER(arr,N)<<endl; |
|||
cout<<"a="; |
cin>>a; |
cout<<"b="; |
cin>>b; |
CHANGE(a, b, arr, N); |
|
|
|
cout<<"Измененный массив"<<endl; |
OUT(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 OUT(float x[], |
int n) |
|
|
{ for (int i=0; i<n; i++)
cout<<(i+1)<<" element of array \t"<<x[i]<<endl;
}
23
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;
}
5. В одномерном целочисленном массиве найти, сколько раз повторяется наибольшее число, сколько раз повторяется наименьшее и вывести красным цветом то из них, которое повторяется чаще. Например, в массиве {99, 8, 99, 99, 2} наибольшее число 99 повторяется чаще (3 раза), чем наименьшее 2, которое встречается только 1 раз. Поэтому число 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, 4, 11); |
||
else if (num1<num2) |
ColorWriteArr(a, n, MyMin, 4, 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]; |
||
} |
|
|
|
} |
|
|
|
24
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");
}
6. Составить и проверить функцию, которая в текстовом режиме с помощью символов псевдографики рисует границу прямоугольника, не заполняя его внутреннюю область.
Замечание. Коды всех символов, в том числе и символов псевдографики, можно
вывести с помощью следующей программы: |
||
main() |
|
|
{ clrscr(); |
textcolor(2); |
|
for (int i=1; i<256; i++) |
|
|
{ cprintf("%4d",i); |
printf("%c%c" , i, i%12?' ':'\n'); |
|
} |
|
|
getch(); |
return 0; |
|
} |
|
|
Программа для задачи 6.
void ramka (int x0, int y0, int, int); |
|
|
|
int main () |
|
|
|
{ ramka (2,5, 10, 30); getch(); |
|
return 0; |
|
} |
|
|
|
void ramka (int x0, int y0, int n1, int n2) |
|
||
{ int x,y,i; |
x=x0; |
y=y0; |
|
gotoxy(x,y++); |
printf("%c",218); |
// символ левого верхнего угла |
for (i=0;i<n1-2;i++)
25
{ gotoxy(x,y++); rintf("%c", 179); |
// для вертикальной линии |
|
} |
|
|
gotoxy(x++,y); |
printf("%c",192); |
// левый нижний угол |
for (i=0;i<n2-2;i++) |
|
|
{ gotoxy(x++,y); |
printf("%c",196); |
} // для горизонтальной линии |
gotoxy(x,y--); |
printf("%c",217); |
// правый нижний угол |
for(i=0;i<n1-2;i++) |
|
|
{ gotoxy(x,y--); |
printf("%c",179); |
|
} |
|
|
gotoxy(x--,y); |
printf("%c",191); |
// правый верхний угол |
for(i=0;i<n2-2;i++) |
|
|
{ gotoxy(x--,y); |
printf("%c",196); |
|
} |
|
|
} |
|
|
7. Дан одномерный вещественный массив a[n]. Вычислить |
|
|
1,еслиmax(ai ) ai , |
|
|
|
i |
|
f |
|
. |
|
|
ai -- впротивном случае. |
||
ai |
|
||
|
i |
i |
|
Составить одну функцию типа void с тремя результатами, которая вычисляет наибольшее число массива, сумму всех его элементов и их произведение. Составить три вещественные функции с одним результатом для вычисления наибольшего числа массива, суммы всех его элементов, их произведения. В головной функции определить массив и с помощью одной или трех функций вычислить f.
8.Ввести два одномерных массива. В каждом из них найти наибольшее количество одинаковых подряд идущих элементов и этот элемент.
9.Ввести три одномерных массива a[n], b[n], c[n]. Получить массив d[n] по формуле d=(a+b) ∙ (b+c), где сложение и умножение выполняются поэлементно. Составить и использовать функции для ввода массива, поэлементного сложения двух массивов, их поэлементного умножения, основную функцию.
10.Рассортировать массив по возрастанию первых двух цифр числа. Составить и использовать функции для ввода массива, нахождения первой и второй цифры для одного целого числа, построения массива первых и вторых цифр, сортировки массивов, вывода массивов в виде таблицы, основную функцию.
Замечание. В следующих задачах, как и в предыдущих, проект разбить на несколько функций.
11. Рассортировать массив следующим образом: сначала должны размещаться палиндромы по возрастанию их значений, а затем не палин-
26
дромы тоже по возрастанию их значений. Палиндром – это целое симметричное число, которое одинаково читается слева направо и справа налево.
12. Рассортировать целочисленный массив по убыванию следующих параметров числа:
a) количества единиц в двоичном представлении числа;
б) общего количества пар соседних различных цифр в двоичном представлении числа. Например, 2510 = 110012 имеет 2 такие пары, а число 7410 = 10010102 содержит 5 таких пар;
c) количества букв в 16-м представлении числа.
13.Массив точек плоскости рассортировать по убыванию первой координаты, а если первая координата одинаковая – то по возрастанию расстояния до прямой a∙x + by + c = 0.
14.Составить функцию для нахождения действительных корней квадратного уравнения a∙x2 + b∙x + c =0. Используя ее, составить функцию решения биквадратного уравнения a∙z4 + b∙z2 + c =0.
15.Вывести n параллельных горизонтальных (вертикальных) линий разными цветами.
16.Заполнить все окно вывода следующими фигурами:
a)ромбами;
б) равнобедренными треугольниками; в) прямоугольными треугольниками с прямым углом внизу слева;
г) прямоугольными треугольниками с прямым углом внизу справа. 17. Нарисовать последовательность прямоугольников, разместив их
одним из следующих способов:
a) по диагонали окна, начиная с левого верхнего угла; б) по диагонали окна, начиная с левого нижнего угла; в) в шахматном порядке.
Замечание. Задачи типа 15 – 17 можно использовать для рисования в следующих системах:
в текстовом режиме Borland C++ 5.01;
в “старой” 3-й версии С++ для DOS в графическом режиме, используя стандартные графические функции;
в Builder, используя методы компонент Image или Form.
7.ВВЕДЕНИЕ В ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ
1. Составить класс для работы с двумя целыми числами. Предусмотреть конструктор, методы для вывода двух чисел, вычисления их суммы, вычисления произведения этих же чисел. В головной функции ввести два
27
числа, создать объект, вычислить и вывести их сумму и произведение. Все методы оформить как внешние.
class firstB
{ int a, b; // поля класса с атрибутом доступа private (частный) public: // атрибут доступа public для методов
firstB(int, int ); // заголовок конструктора с двумя параметрами void show(); // заголовки остальных функций
long sum(); long mult();
};
firstB:: firstB(int u, int v) // текст конструктора
{ a=u; |
b=v; |
|
}; |
// тексты остальных функций, оформленных как внешние |
|
|
||
void firstB:: show() |
|
|
{ cout<<"\nThe first number= "; |
cout<<a; |
|
cout<<", the second number= "; |
cout<<b; cout<<endl; |
};
long firstB:: sum() {return a+b;
} ;
long firstB:: mult() { return a*b;
};
int main() { int A, B;
firstB ob (A, B);
ob.show();
//Вариант 1: полученные с помощью методов сумму и произведение, как и для
//обычных функций, сохраняем в переменных, а затем используем, т. е. выводим.
long S, M; S=ob.sum(); M=ob.mult();
cout<<" \nВариант 1: сумма= "<<S<< " произведение= "<<M<<endl;
// Вариант 2: результаты методов сразу выводим, не сохраняя их в переменных. cout<<"\nВариант 2: сумма= "<<ob.sum()<<" произведение= "<<ob.mult();
getch(); |
return 0; |
}; |
|
2. Составить класс для работы с двумя целыми числами, предусмотрев вычисление и вывод их суммы и произведения со следующими отличиями по сравнению с предыдущей программой:
один и тот же метод и вычисляет, и выводит сумму двух чисел с определенной, указанной в методе позиции окна. Поэтому этот метод не имеет параметров;
28
метод вычисляет и выводит произведение, но позиция вывода передается как параметр метода при ее вызове;
вывод осуществляется разными цветами, которые, как и исходные числа, являются полями класса. Числа и цвета передаются с помощью конструктора, который поэтому имеет четыре поля;
все методы встроенные.
class first |
|
|
{ int a, b, c1, c2; |
|
|
public: |
|
|
first(int x, int y, int s1, int s2) |
|
|
{ a=x; |
b=y; |
|
c1=s1; |
c2=s2; |
|
}; |
|
|
void sum() |
|
|
{textcolor(c1); |
gotoxy(5,2); |
|
printf("x=%d y=%d sum=%d\n", a, b, a+b); |
||
} ; |
|
|
void mult(int x, int y) |
|
|
{ textcolor(c2); |
gotoxy(x,y); |
|
cprintf("x=%d y=%d mult=%d\n", a, |
b, a*b); |
|
}; |
|
|
}; |
|
|
int main() |
|
|
{ first ob (4,5,4,2); |
ob.sum(); |
|
ob.mult(10,6); |
getch(); |
return 0; |
}; |
|
|
3. Составить класс для работы с одномерным массивом максимальной размерности 10, предусмотрев следующие методы:
конструктор для проверки и задания размерности массива. Если размерность массива неположительная или больше 10, то работаем с массивом размерности 10;
ввод массива;
поиск первого по порядку положительного числа и его индекса.
const nmax=10; |
|
|
class clarray1 |
|
|
{ int x[nmax]; |
int n; |
|
public: |
|
|
clarray1(int v=7) |
|
|
{ n=v; |
if (n<1 || n>nmax) n=nmax; |
}; |
void myinput() |
|
|
{ cout<<"Input the array"<<endl; for (int i=0; i<n; i++)
cin>>x[i];
};
29
void myfun (int &first, int &ind) |
|
|
{ for (int i=0; i<n;i++) |
|
|
if (x[i]>0) { first=x[i]; |
ind=i; |
|
} |
return; |
|
|
|
|
first=-10; |
ind=-1; |
|
}; |
|
|
}; |
|
|
int main() |
|
|
{ clrscr(); |
clarray1 OBJ; |
|
OBJ.myinput(); |
int F2,I2; |
OBJ.myfun( F2,I2); |
if (F2!=-10)
cout<<" The first positive number= "<<F2<<" , his index= "<<I2<<endl; else cout<<" There is not positive number\n";
getch(); return 0;
}
В методе MyInput массив вводим с экрана. Его можно было бы определить и другим способом, например, с помощью датчика случайных чисел.
Размерность массива в конструкторе является параметром по умолчанию. Это означает следующее. При создании объекта можно не передавать размерность, тогда она останется равной 7, т. е. той, которая указана в заголовке функции. Если в головной функции записать, например, clarray OBJ(5), то в объекте, как и раньше, будем работать с массивом переданной размерности 5, т. е. параметр по умолчанию 7 изменим.
4. Составить класс для работы с одномерным массивом максимальной размерности 20, предусмотрев следующие функции (методы):
конструктор для проверки и задания размерности массива и определения с помощью датчика случайных чисел элементов массива. Если размерность массива неположительная или больше 20, то работаем с массивом размерности 10.
Замечание: эффективнее формировать динамический массив, который будет рассмотрен во второй части пособия (во втором семестре);
вывод массива разным цветом для положительных и отрицательных чисел;
отображение чисел с помощью символа ‘*’ на числовой оси;
сортировка массива с использованием упрощенного варианта алго-
ритма. Замечание: в пункте 5 приведен другой, более эффективный алгоритм;
вычисление среднеарифметического значения среди отрицательных
исреди положительных чисел массива.
30
class clarr |
|
|
gotoxy ( k,12); |
|
{ |
int a[20]; |
|
|
if(a[i]<0) |
|
int n; |
|
|
textcolor(c1); |
|
public: |
|
|
else textcolor(c2); |
|
clarr (int); |
|
|
cprintf("*"); |
|
void out(int ,int ); |
|
}; |
|
|
void show(int ,int ); |
}; |
|
|
|
void aver(double &,double &); |
void clarr::aver(double &r1, |
||
|
void sort(); |
|
|
double &r2) |
}; |
|
|
{ int k1=0, k2=0, s1=0, s2=0; |
|
clarr::clarr(int size) |
for (int i=0; i<n; i++) |
|||
{ if (size>20 || size<1) size=10; |
if(a[i]>0) |
|||
|
n=size; |
randomize(); |
{ |
k1++; |
|
for(int i=0; i<n; i++) |
|
s1=s1+a[i]; |
|
|
a[i]=150-random(300); |
} |
else |
|
}; |
|
|
|
if(a[i]<0) |
void clarr::out(int c1,int c2) |
|
{ k2++; |
||
{ cout<<endl; |
|
s2=s2+a[i]; |
||
|
for(int i=0; i<n; i++) |
|
} ; |
|
|
{ if(a[i]<0) textcolor(c1); |
if (k1) r1=s1/k1; |
||
|
else textcolor(c2); |
|
else r1=0; |
|
|
cprintf(" %d ",a[i]); |
if (k2) r2=s2/k2; |
||
|
} |
|
else r2=0; |
|
|
cout<<endl; |
}; |
|
|
}; |
|
|
void clarr::sort() |
|
void clarr::show(int c1,int c2) |
{ for(int i=0; i<n-1; i++) |
|||
{ |
int k; textcolor(3); |
|
for(int j=i+1; j<n; j++) |
|
|
for(int i=1;i<80;i++) |
|
if(a[i]>a[j]) |
|
|
{ gotoxy(i,12); |
|
{ int r; |
|
|
if (i!=40) |
|
r=a[i]; |
|
|
cprintf("%c", 196); |
|
a[i]=a[j]; |
|
|
else printf("%c", 197); |
|
a[j]=r; |
|
|
} |
|
|
} |
|
for(int i=0;i<n;i++) |
}; |
|
{k=40+a[i]/4;
//(продолжение вверху правого столбца) int main()
{ int k, col1=4,col2=2; |
clrscr(); |
cout<< "Size of array "; |
cin>>k; |
clrscr(); |
clarr ob(k); |
cout<<" Array is not sorted"; |
|
ob.out(4,2); |
|
ob.sort(); |
cout<<"\n Sorted array"; |
ob.out(4,2); |
ob.show( col1, col2); //or ob.show(4,2); |
double sr1,sr2; |
ob.aver(sr1,sr2); |
textcolor(col1); |
|
if (sr2) cprintf("\n\r\n\r Average of negative = %10.3f",sr2);
31
else cprintf("\n\r\n\r There are not negative elements"); textcolor(col2);
if (sr1) cprintf(" else cprintf("
getch();
};
5. Рассортировать заданный массив точек по возрастанию расстояния до начала координат. Если расстояния одинаковы, то вначале должны быть точки заданной области, а затем – точки, не принадлежащие области. Область ограничена параболой y = x2 и прямой y=2.
Составим следующие методы:
MyInp для ввода координат точек;
MyPoint для определения расстояния от точки до начала координат и принадлежности точки указанной области;
ArrPoint для построения массива расстояний и логического массива, определяющего принадлежность каждой точки области;
RR для перестановки двух величин. Эта функция дважды перегружена для вещественного и логического типов;
MySort для сортировки массива с использованием функций RR;
MyOut для вывода координат точек.
const nmax=10; |
|
|
|
|
class clCoord |
|
|
|
|
{ float x[nmax], |
y[nmax], |
d[nmax]; |
bool b[nmax]; int n; |
|
void MyPoint(float x1, float y1, float &d1, bool &b1) |
||||
{ d1=sqrt(x1*x1 + y1*y1); |
b1= y1>=x1*x1 && y1<2; |
|||
}; |
|
|
|
|
void RR(float &u, float &v) |
|
|
||
{ float t; |
t=u; |
u=v; |
|
v=t; |
} ; |
|
|
|
|
void RR(bool &u, bool &v) |
|
|
||
{ bool t; |
t=u; |
u=v; |
|
v=t; |
}; |
|
|
|
|
public: |
|
|
|
|
clCoord (int , float [], float []); |
|
void ArrPoint(); |
||
void MySORT(); |
void MyOut(); |
|
};
clCoord::clCoord (int m, float u[], float v[])
{ n=m; |
if (n>nmax || n<1) n=nmax; |
|
for(int i=0; i<n; i++) |
||
{ x[i]=u[i]; |
y[i]=v[i]; |
|
} |
|
|
} ; |
|
|
32