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

ОАП_решения_задачи

.pdf
Скачиваний:
113
Добавлен:
26.03.2015
Размер:
2 Мб
Скачать
☆

printf("Массив-результат:\n");

31for (i=0; i<100; cout<<setw(5)<<Ar[i++]); putchar('\n');

getchar(); return 0;

}

Задача 5.2

Даны два массива A и B размера 5, эл-ты которых упорядочены по возростанию. Обьеденить эти массивы так, чтобы результирующий массив остался упорядоченным.

#include "stdafx.h" #include <stdio.h>

void main(void)

{

//объявление переменных int a[5], b[5], c[10]; int k,l,i;

//инициализация переменных printf( "A:\n");

for(int i=0; i<5; i++) scanf( "%d", &a[i]); printf( "B:\n");

for( i=0; i<5; i++) scanf( "%d", &b[i]); i=0; k=0; l=0;

do

{

if(a[k]<=b[l])

{

c[i]=a[k];

k++;

}

else

{

c[i]=b[l];

l++;

}

i++;

if(k==5) for(; l<5;l++)

{

c[i]=b[l];

i++;

}

if(l==5) for(; k<5; k++)

{

c[i]=a[k];

i++;

}

}

while(i<10);

32//выводим результат printf("\n");

for(i=0; i<10; i++) printf( "%d ", c[i]); printf("\n");

}

Задача 5.3

Сформировать одномерный массив целых чисел,

Ииспользуя датчик случайных чисел и выполнить задание c использованием индексов

* Удалить последний элемент равный 0. Добавить после элемента массива с заданным индексом элемент со значением 100.

*/

#include "stdafx.h" #include <stdio.h> #include <algorithm> #include <locale> #include <time.h>

#define MaxN 100 int a[MaxN];

int main (void)

{

setlocale (LC_CTYPE, "Russian");

int n;

printf ("Введите размерность массива\n"); scanf ("%d", &n);

srand ((unsigned) time (NULL)); for (int i = 0; i < n; i++)

{

a[i] = rand () % 10; printf ("%d ", a[i]);

}

putchar ('\n'); int pos;

for (pos = n - 1; pos >= 0 && a[pos] != 0; pos--);

pos == -1 ? printf ("Нету нулевого элемента\n") : printf ("Позиция последнего нулевого элемента: %d\n", pos);

for (int i = pos; i < n - 1; i++) std::swap (a[i], a[i + 1]);

33printf ("Введите позицию элемента, после которого вставить 100\n"); scanf ("%d", &pos);

for (int i = n - 1; i > pos + 1; i--) std::swap (a[i], a[i - 1]); a[++pos] = 100;

for (int i = 0; i < n; i++) printf ("%d ", a[i]); putchar ('\n');

return 0;

}

Задача 5.4

*В массиве M(k) много совпадающих элементов.

*Найти количество различных элементов в нем (не упорядочивая массива).

#include "stdafx.h" #include <stdio.h> #include <locale> #include <math.h> #include <time.h> #define MaxN 100 int m[MaxN];

int main (void)

{

setlocale (LC_CTYPE, "Russian");

int n;

printf ("Введите размерность массива\n"); scanf ("%d", &n);

srand ((unsigned) time (NULL)); for (int i = 0; i < n; i++)

{

m[i] = rand () % 10; printf ("%d ", m[i]);

}

printf ("\nНеповторяющиеся элементы\n");

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

{

bool ans = true;

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

{

if (i == j) continue; if (m[i] == m[j])

{

ans = false; break;

}

34

}

 

if

(ans) printf ("%d ", m[i]);

 

}

 

 

return

0;

}

 

 

Задача 5.5

Найти в массиве наибольшее число подряд идущих одинаковых элементов (например

{1,5,3,6,6,6,6,6,3,4,4,5,5,5} = 5).

#include "stdafx.h" #include <iostream> #include <locale>

int _tmain(int argc, _TCHAR* argv[])

{

setlocale (LC_CTYPE, "Russian"); using namespace std;

int mass[20],rmin=0,rmax=10,n,i,k=1,s=0;

cout<<"Введите число элементов(максимум 20): "; cin>>n;

//Случайное заполнение

for(i=0;i<n;i++) {mass[i]=(int)(((double)rand()/(double)RAND_MAX)*(rmax-rmin)+rmin); cout<<mass[i]<<" ";

};

//Наибольшее число идущих подряд //одинаковых элементов

for(i=1;i<n;i++) {if(mass[i]==mass[i-1]) {if(s==1) k=k+1;

else {k=1; s=1;

k+=1;}}

 

else s=0;

 

};

cout<<"

"<<k<<endl;

//Задание 2

 

cout<<"\n\n-----------------------------------------------------

\n\n";

int K[100],pr[10],pry[10],j,m,max;

for(i=0;i<100;i++) K[i]=(int)(((double)rand()/(double)RAND_MAX)*(rmax-rmin)+rmin); cout<<"Введите m(кол-во наиболее частых) ";

cin>>m;

//Находим кол-во каждой цифры

for(i=0,s=0;i<rmax;i++,s=0) {for(j=0;j<100;j++) if(K[j]==i) s+=1; pr[i]=s;};

35

//Упорядочиваем массив с количеством

for(i=0,max=0;i<10;i++) {for(j=0;j<10;j++) if(pr[j]>pr[max]) max=j;

 

pry[i]=pr[max];

 

K[i]=max;

 

pr[max]=0;}

 

//Выводим на экран m часто встречающихся

 

cout<<"Массив K[100] содержит \n";

 

for(i=0;i<m&&i<10;i++) cout<<K[i]<<" - "<<pry[i]<<"%"<<endl;

 

return 0;

}

 

Задача 5.6

Найти в массиве наибольший и наименьший элемент

#include "stdafx.h" #include "math.h" #include "time.h" #include "locale" #include "iostream"

int _tmain(int argc, _TCHAR* argv[])

{

setlocale(LC_ALL, "rus"); using namespace std; int n, i, a[300];

cout<<"введите размерность массива"<<endl; cin>>n;

srand((unsigned)time(NULL)); for ( i=0; i<n; i++)

{

a[i]=rand()%30; cout<<a[i]<<" ";

}

cout<<endl; cout<<"*************************"<<endl;

int kmin=0,kmax=0;

for (int i=1; i< n;i++)//поиск наименьшего и наиб. элемента в массиве

{

if (a[i]<a[kmin]) kmin=i; if (a[i]>a[kmax]) kmax=i;

}

cout<<"минимальный элемент"<<a[kmin]<<endl;

cout<<"максимальный элемент"<<a[kmax]<<endl; 36 if (a[kmin]>a[kmax])

{

int tmp=a[kmax]; a[kmax]=a[kmin]; a[kmin]=tmp;

}

int b=a[kmin], c=a[kmax]; for(int i=b+1; i<=c; i++)

{

int j=0;

for(j=0; j<n && a[j]!=i; j++); if(j==n) cout<<i<<endl;

}

//с указателем

/*

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

{

*(a+i)=rand()%10; cout<<*(a+i)<<" ";

}

cout<<endl;

cout<<"*************************"<<endl; int kmin=0,kmax=0;

for (int i=1; i< n;i++)//поиск наименьшего и наиб. элемента в массиве

{

if (*(a+i)<*(a+kmin)) kmin=i; if (*(a+i)>*(a+kmax)) kmax=i;

}

cout<<"минимальный элемент"<<*(a+kmin)<<endl; cout<<"максимальный элемент"<<*(a+kmax)<<endl;

if (kmin>kmax)

if (a[kmin]>a[kmax])

{

int tmp=a[kmax]; a[kmax]=a[kmin]; a[kmin]=tmp;

}

int b=*(a+kmin), c=*(a+kmax); for(int i=b+1; i<=c; i++)

{

int j=0;

for(j=0; j<n && *(a+j)!=i; j++); if(j==n) cout<<i<<endl;

}

*/

return 0;

}

Задача 5.7

Сформировать одномерный массив целых чисел, используя датчик случайных чисел и выполнить задание c использованием индексов. Удалить все элементы с заданным значением. Добавить перед каждым четным элементом массива элемент со значением 0.

#include "stdafx.h" #include <iostream> #include <stdio.h> #include <cmath> #include <ctime> using namespace std;

int _tmain(int argc, _TCHAR* argv[]) { srand ((unsigned)time(NULL));

int n,i,j,m,a[100]; cin>>n>>m;

for (i=1;i<=n;i++) a[i]=rand ()%6;

for (i=1;i<=n;i++ ) cout<<a[i]<<" "; cout<<endl;

for (i=1;i<=n;i++)

{

if (a[i]==m)

{

for (j=i;j<=n-1;j++) a[j]=a[j+1];

n--;

}

}

for (i=1;i<=n;i++)

{

if (a[i]%2==0)

{

for (j=n;j>=i;j--) a[j+1]=a[j];

n++;

a[i]=0;

i++;

}

38}

for (i=1;i<=n;i++ ) cout<<a[i]<<" "; cout<<endl;

return 0;

}

39

Тема 6 Многомерные массивы и указатели

Методические указания

Условие задачи

Размерность массива 100. Диапазон значений -50 – 50.

Во всех последовательностях отрицательных чисел ограничить значения тех элементов, абсолютное значение которых превышает абсолютное среднее для этой последовательности Замечание: 0 считается положительным числом, если в задании не оговорен какой-то другой его статус;

когда речь идет о какой-то последовательности чисел, имеется в виду последовательность с длиной, большей

1;

Разработка алгоритма

Алгоритм решения задачи в основном - тот же, что и в работе №7, поэтому его схему мы тут не приводим. Существенные отличия возникают в реализации алгоритма. Проще всего задания могло бы быть выполнено простой заменой во всех местах операции индексации на операцию адресации, имея в виду тождественность:

Ar[i] = *(Ar+i)

Это соответствовало бы букве задания, но не духу языка C++. Если мы переходим от индексации к адресации, у нас устраняется необходимость в индексах и даже в переменных, которые их представляют. Это приводит к другому способу реализации всех циклов. Если имя массива Ar является указателем на его начало, то вместо цикла, в котором индекс i меняется от 0 до size, мы можем организовать цикл, в котором некоторый текущий указатель Cr меняется от Ar до Ar+size. Также, когда нам нужно запомнить начало отрицательной последовательности, мы можем запоминать не индекс соответствующего элемента, а его адрес - указатель на него.

Определение переменных программы

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

int *Ar;

Размерность массива определяется при выполнении программы, так что для ее сохранения нужна отдельная переменная:

int size;

Вместо переменных, которые в работе №7 являются индексами элементов массива, мы будем применять указатели:

int *Cr; это будет указатель на текущий элемент массива при его полном переборе, и:

int *Ir; в этом указателе будет сохраняться адрес начала отрицательной последовательности, а потом - при обработке последовательности - адрес текущего ее элемента.

Переменные для сохранения суммы элементов и среднего значения и количества элементов в последовательности остаются те же самые:

int av; int nn;

Разработка текста программы

Полученный размер массива сразу выводим на экран. Выделяем с помощью операции new память под массив:

Ar=new int[size];

Далее организуем цикл перебора массива. В отличие от работы №7 мы тут в одном цикле и получаем случайные числа, и выводим начальный массив на экран. Заголовок этого цикла существенно отличается от работы №7:

for (Cr=Ar; Cr<Ar+size; Cr++) {

В начальных установках цикла мы записываем в переменную Cr адрес начала массива, т.е. Cr показывает на элемент с индексом 0. В конце каждой итерации Cr увеличивается на 1, т.е. показывает на следующий элемент массива. Последняя итерация происходит при значении Cr=Ar+size-1, т.е. Cr будет показывать на последний элемент. В каждой итерации мы обращаемся к текущему элементу массива как *Cr, т.е. обращаемся к тому, на что показывает указатель Cr.

40

Далее идет заголовок цикла перебора массива, который организуется та же, как предыдущий, но в начальных установках мы еще присваиваем начальное значение счетчику nn.

Тело цикла в основном подобно тому, что есть в лабораторной работе №7 за исключением того, что к текущему элементу массива мы обращаемся через указатель на него: *Cr. Там, где нам требуется запомнить начало отрицательной последовательности, мы просто сохраняем текущее значение указателя Cr в переменной-указателе Ir.

Внутренний цикл, в котором обрабатывается отрицательная последовательность, существенно отличается от работы №7:

for (av/=nn; Ir<Cr; Ir++) if (*Ir<av) *Ir=av;

Начальные установки этого цикла - только усреднение значения в av, переменная Ir уже содержит в себе указатель на первый элемент отрицательной последовательности. В конце каждой итерации Ir увеличивается на 1, т.е. показывает на следующий элемент последовательности (обращение к этому элементу - *Ir). Последняя итерация происходит при значении Ir=Cr-1, поскольку Cr показывает на первый положительный элемент за отрицательной последовательностью.

Остаток программы повторяет предыдущие фрагменты.

Предпоследний оператор - для освобождения памяти, которая была выделена под массив;

Задача 6.1

В массиве M(k) много совпадающих элементов.

Найти количество различных элементов в нем (не упорядочивая массива).

#include "stdafx.h" #include <stdio.h> #include <locale> #include <math.h> #include <time.h>

#define MaxN 100 int m[MaxN];

int main (void)

{

setlocale (LC_CTYPE, "Russian");

int n;

printf ("Введите размерность массива\n"); scanf ("%d", &n);

srand ((unsigned) time (NULL)); for (int i = 0; i < n; i++)

{

*(m + i) = rand () % 10; printf ("%d ", *(m + i));

}

printf ("\nНеповторяющиеся элементы\n");

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

{

bool ans = true;

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

{

if (i == j) continue;

if (*(m + i) == *(m + j))

{

ans = false; break;

}