ОАП_решения_задачи
.pdf
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;
}
