Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Упражнения и тесты. Какие из следующих присваиваний допустимы и что они означают?



1. Пусть const n=10;

int a[n]={-1,-2,33,44,-5,-6,77,8}, *q;

Какие из следующих присваиваний допустимы и что они означают?

1) q=a; 2) q=*a[0]; 3) q=a[0]; 4) q=&a[0]; 5) q=n;

6) int i=5; q=*a[i]; 7) int i=n/2; q=a[i]; 8) int i=n/2; q=&a[i];

9) int i=n-1; q=a[i]; 10) q=&a[n]; 11) q=&a[n];

2. Дан код:

void F2 (int *x, int N, int &S)

{ S=0; for (int i=0;;)

{ S+=x[i++];

if (x[i]==0 || i ==N) return; }

}

int main()

{ const n=10;

// Вариант a)

int a[n]= {11, -2, 30, 44, 5, -60, 7, -8, 0, 100 };

/* или другие варианты

b) int a[n]={11, -2, 30, 0, 5, -60, 7, -8, 9, 100 };

с) int a[n]={11, -2, 0, 44, 5, 0, 7, -8, 9, 100 };

d) int a[n]={11, -2,30, 4,5, -60,7, -8,9,100 }; */

int &S1; F2 (a,n,S1); cout<<S1; //1

int S2; F2 (&a[0],n/2,S2); cout<<S2; //2

int S3; F2 (a,n,S3); cout<<S3; //3

int S4; F2 (&a[5], 5, S4); cout<<S4; //4

int *S5; F2 (a,n,S5); cout<<S5; //5

int *q=a[5], S6; F2 (q, n/2, S6); cout<<S6; //6

int* q=&a[n/2], S7; F2 (q, 5, S7); cout<<S7; //7

int* q; q=&a[n/2], S8=0; F2 (q, n/2, S8); cout<< S8;//8

getch(); return 0; }

В каких вариантах (//1 — //8) правильно вызвана функция F2? Что будет выведено для каждого из вариантов массива (a — d)?

3. Дан код: void F3 (int *x, int N, int S)

{ S=0; for (int i=0; i<N-1;)

{ if (x[++i]>0) S+=x[i];

cout<<S<<” “; }

}

int main() { const n=10;

int a[n]= {11, -2, 0, 44, 5, 60, 7, -8, 9, 100 };

/* Записано 8 вариантов вызова функции F3 (см. упр. 2)*/

getch(); return 0; }

В каких вариантах (//1 — //8) правильно вызвана функция F3? Что будет выведено?

4. Описана функция:

void OutChar (int *a, int N, int k)

{ for (int i=0; i<N; i++) printf ("%d %c %c", a[i], a[i], (i+1)%k? '\n': ' '); }

/*Какие из следующих вызовов правильные? Что и где, в каких строках, будет выведено? */

main() { const n=10; int k=5;

int a[n]= {48, 49,50,51, 52, 53, 54, 55, 56, 57};

OutChar (a,n,k); /* 1 */ OutChar(a, k, n); //2

OutChar(&a[0], k,k/2); /* 3 */ OutChar(&a[k], k,k/2); //4

OutChar(a[0], k, n); /* 5*/ OutChar (a,2*k,k); //6

OutChar(a[0], n, k); /* 7 */ OutChar(*a[0], n, k); //8

getch(); return 0; }

5. Описана функция:

void OutChar (int *a, int N, int k)

{ for (int i=0; i<N; i++) printf("%X %c %c", a[i], a[i], i%k? ' ‘: '\n'); }

/*Какие из следующих вызовов правильные? Что и где, в каких строках, будет выведено? */

main() { const n=10; int k=2;

int a[n]= {65,66,67,68,69,70,71,72,73,74};

/* дальше см. упр. 4 */ }

6. В одномерном целочисленном массиве найти все числа с наибольшим количеством единиц в его двоичном представлении.

Это пример задачи, которую за один просмотр массива решить нельзя. Первый раз анализируем все числа для нахождения наибольшего количества единиц. При повторном просмотре массива найдём и выведем на экран все числа с наибольшим таким количеством. В отличие от однопроходного такой алгоритм называется двухпроходным.

unsigned NUM (unsigned);

main() { const n=5; unsigned maxnum=0, num2, A[n]={10,7,14,2,19};

/* Находим наибольшее количество единиц для чисел массива (maxnum) */

for(int i=0; i<n; i++) { num2=NUM(A[i]); if (num2>maxnum)

maxnum = num2; }

/* Выводимвсе числа с наибольшим количеством единиц в его двоичном представлении. */

for(int i=0; i<n; i++) if (NUM(A[i])==maxnum) cout<<A[i]<<" ";

getch(); return 0; }

/* Функция находит количество единицв двоичном представлении одного целого числа */ unsigned NUM (unsigned a)

{ unsigned num=0;

while (a) { num+=a%2; a/=2; }

return num; }

Задачи

1. Задан массив из n точек плоскости, т. е. два одномерных массива X [ n ] и Y [ n ], где (Xi, Yi) — координаты i -й точки. Составить следующие функции:

1) логическую функцию Test с параметрами x, y, k для определения, принадлежит ли одна точка с координатами (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<<endl<<K<<” “<<Num(X,Y,K);

getch(); return 0; }

bool Test (float x, float y, unsigned k)

{ switch (k) { case 1: return x>0 && y>0;

case 2: return x<0 && y>0;

case 3: return x<0 && y<0;

case 4: return x>0 && y<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);

main()

{ const N=5; float arr[N], a, b; INP(arr, N);

cout<<"Исходный массив \n"; OU1(arr, N);

cout<<"Среднее значение \t" <<AVER(arr, N)<<endl;

cout<<"a="; cin>>a; cout<<"b="; cin>>b;

CHANGE(a, b, arr, N);

cout<<"Измененный массив \n"; OU1(arr, N);

getch(); return 0; }

void INP(float x[], int n)

{ for (int i=0; i<n; i++)

{ cout<<(i+1) <<" element -\t"; cin>>x[i]; } }

void OU1(float x[], int n)

{ cout<<endl;

for (int i=0; i<n; i++) cout<<x[i]<<” “; }

float AVER(float x[], int n)

{ float s=0;

for (int i=0; i<n; s+=x[i++]);

return s/n; }

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. Составить следующие функции для работы с одномерным массивом: ввод массива с контролем ввода; вывод массива; логическую функцию, которая проверяет, рассортирован ли массив по возрастанию. В main вызвать эти функции.

void MyInp(int* x, int size);

void MyOut(int* x, int size);

bool Sorted(int* x, int size);

main()

{ const n=10; int A[n]; MyInp(A, n);

cout<<" Integer array"; MyOut(A, n);

if (Sorted(A, n)) cout<<" \n Yes”; else cout<<" \n No”;

getch(); return 0; };

void MyInp(int x[],int size)

{ for(int i=0; i<size; i++)

/* Цикл do для ввода одного числа с проверкой */

do { textcolor (15); cin>>x[i];

if (x[i]>0) break;

textcolor (12); cprintf("Error. Repeat. ");

} while (1);

}; // The end of function

/* При вводе неположительных чисел выводим сообщение об ошибке, и программа повторяет ввод этого же элемента массива, не меняя индекс */

void MyOut(int x[], int size) { cout<<endl;

for(int i=0; i<size; i++) cout<<x[i]<<" "; };

bool Sorted(int x[], int size)

{ for (int i=0; i<size-1; i++) if (x[i]>x[i+1])

return false; // else не надо!

return true; }

Упражнение. Как будет работать последняя функция, если оставить else?

4. Рассортировать заданный массив точек по возрастанию расстояния до начала координат. Если расстояния одинаковы, то вначале должны быть точки области, ограниченной параболой y=x2 и прямой y=2, а затем — точки, не принадлежащие этой области. Составим следующие методы класса:

· MyInp для ввода координат точек;

· MyPoint для определения расстояния от одной точки до начала координат (d1) и принадлежности точки указанной области (b1);

· ArrPoint для построения массива расстояний и логического массива, определяющего принадлежность каждой точки области;

· RR для перестановки двух величин. Эта функция дважды перегружена для вещественного и логического типов;

· MySort для сортировки массива с использованием функций RR; Используемый здесь алгоритм обменной сортировки описан в гл.7, пункт 1.1;

· MyOut для вывода координат точек.

const nmax=20;

class clCoord

{ float *x, *y, *d; bool *b; 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=u; u=v; v=t; };

void RR(bool &u, bool &v)

{ bool t=u; u=v; v=t; };

public:

clCoord (int, float *, float *); void ArrPoint();

void MySORT();

void MyOut();

~clCoord() // Дeструктор

{ cout<<"\nThe destructor deletes array\n";

getch(); delete []x; delete []y;

delete []d; delete []b;

} // The end of destructor

}; // The end of class

clCoord::clCoord (int m, float *u, float *v)

{ n=m; if (n>nmax || n<1) n=nmax;

x= new float[n]; y= new float[n];

d= new float[n]; b= new bool[n]; //??

for(int i=0; i<n; i++) { x[i]=u[i]; y[i]=v[i]; } };

void clCoord::ArrPoint ()

{ for(int i=0; i<n; i++)

MyPoint (x[i],y[i],d[i],b[i]); };

void clCoord::MySORT() { int k=n; bool flag;

do { k--; flag=false;

for(int i=0; i<k; i++)

if (d[i]>d[i+1] || d[i]==d[i+1] && b[i]<b[i+1])

{ flag=true; RR(x[i],x[i+1]); RR(y[i],y[i+1]);

RR(d[i],d[i+1]); RR(b[i],b[i+1]); }

} while (flag); };

void clCoord::MyOut()

{ cout<< "\n \n";

cout<< " T A B L E \n";

cout<< " x y d b \n";

cout<< " \n";

for (int i=0; i<n; i++)

printf (" %7.2f %7.2f %8.3f %1d \n",

x[i], y[i], d[i], b[i]);

};

int main() { int N; cout<<”\n N=”; cin>>N;

float *X= new float[N], *Y= new float[N];

for (int i=0; i<N; i++)

{ cin>>X[i]; cin>>Y[i];}

clCoord OBJ (N,X, Y);

OBJ.ArrPoint (); OBJ.MyOut();

OBJ.MySORT(); OBJ.MyOut();

getch(); return 0; }

Функции MyPoint и RR имеют атрибут доступа private по умолчанию. Они доступны, как и поля, только в функциях этого класса и недоступны в других функциях. Например, из функции main их вызвать нельзя.

Массивы координат точек вводятся в main и передаются в объект с помощью конструктора через параметры. Кроме этого, их можно ввести или задать с помощью датчика случайных чисел в методе класса.

5. В одномерном целочисленном массиве найти, сколько раз повторяется наибольшее число, сколько раз повторяется наименьшее и вывести жёлтым цветом то из них, которое повторяется чаще. Например, в массиве {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[n], MyMax, MyMin, num1, num2;

ReadArr(a, n); WriteArr(a, n);

MaxMin(a, n, MyMax, MyMin);

num1 = Num(a, n, MyMax); num2 = Num(a, n, MyMin);

cout<<"\nMax "<<MyMax <<" Min "<<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 c1,int c2)

{ for (int i=0; i<size; i++)

{ if (x[i] == w) textcolor(c1); else textcolor(c2);

cprintf("%5d ", x[i]); } printf("\n"); }





Дата публикования: 2015-02-18; Прочитано: 205 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.025 с)...