Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

zadachi

.pdf
Скачиваний:
13
Добавлен:
31.05.2015
Размер:
694.99 Кб
Скачать

void 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

cout<<"A= "; cin>>A; cout<<"B="; cin>>B;
// создание объекта и передача ему введенных A и B,
// или можно в объект передать константы: firstB ob(5,4); // вызов метода show

числа, создать объект, вычислить и вывести их сумму и произведение. Все методы оформить как внешние.

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

Average of positive =%10.3f\n",sr1); There are not positive elements"); return 0;

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]