- •Предисловие
- •Задание 1. Задачи целочисленной арифметики
- •If (Условие) Оператор1;
- •Варианты контрольных заданий
- •Задание 2. Использование функций
- •Задание 3. Обработка одномерных массивов
- •Задание 4. Обработка двумерных массивов
- •Задание 5.Обработка символов и строк
- •Задание 6. Одномерный массив–параметр функции
- •Задание 7. Двумерный массив–параметр функции
- •Задание 8. Структуры
Задание 6. Одномерный массив–параметр функции
Цель задания
Изучение основных приемов программирования задач обработки динамических одномерных массивов, передачи одномерных массивов в функции.
Основные понятия
Указатель - переменная, содержащая адрес другой переменной некоторого типа. Объявление переменной типа указатель:
Тип * ИмяУказателя;
При определении указателя можно выполнять его инициализацию.
Тип * ИмяУказателя = ИнициализирующееВыражение;
double a, *b;
b = &a; //Указатель b инициализируется адресом переменной a
или int a;
int *b = &a;
Операция разыменования *
Записи a=5; и *b = 5; равнозначны.
Основными арифметическими операциями, применимыми к указателям, являются операции увеличения и уменьшения указателя:
ИмяУказателя + i ИмяУказателя - i
При работе с указателями можно использовать операцию вычитания двух указателей: ИмяУказателя1 -ИмяУказателя2
Имя статического массива является константным указателем и содержит адрес первого элемента массива.
Доступ к i-ому элементу одномерного массива, объявленного
float A[10];
адрес начала которого хранится в указателе p,
float* p = A;
возможен тремя способами:
A[i] *(A + i) *(p + i)
Массивы динамической памяти
Для динамического выделения памяти используют операцию new.
ТипМассива* ИмяМассива = new ТипМассива[РазмерМассива];
Для освобождения динамической памяти, занимаемой массивом, служит операция delete [] ИмяМассива;
Передача массивов в функции
В списке формальных параметров для массива-параметра используют []. Например:
void DisplayArrayFixed ( int Array[], int ArraySize ) {
for(int i = 0; i < 10; i++)
cout << Array[i] << ' ';
}
Array - массив, ArraySize-переменная,.задающая размер массива.
Учитывая то, что имя массива является указателем, заголовок функции может иметь вид: void DisplayArrayFixed ( int *Array, int ArraySize )
Все сказанное относится к статичаским и к динамическим массивам.
Примеры выполнения задания
//Пример 6.1. Определить динамический одномерный массив A.
//Разбить массив на два динамических массива:
//B- массив положительных, C-массив отрицательных чисел.
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
int main() {
cout<<"\nЗадайте количество чисел в массиве:";
int n;
cin>>n;
int *A=new int [n]; //Выделение динамической памяти для массива А
int KolPlus=0, KolMinus=0;
for(int i = 0; i < n; i++) {
A[i]=random(n)-random(n);
if(A[i]>0) KolPlus++;
if(A[i]<0) KolMinus++;
}
int *B=new int [KolPlus]; //Выдел. динамич. памяти для массива B
int *C=new int [KolMinus]; //Выдел. динам. памяти для массива C
int indB = 0, indC = 0;
for ( int i = 0; i < n; i++) {
if (A[i]>0) {
B[indB] = A[i];
indB++;
};
if(A[i]<0) {
C[indC] = A[i];
indC++;
}
}
cout<<"Исходный массив A:\n";
for(int i = 0; i < n; i++)
cout << A[i] << ' ';
cout<<endl;
cout<<"Массив положительных чисел В:\n";
if(! indB) cout<<"Положительных чисел в массиве нет\n";
for(int i = 0; i < indB; i++)
cout << B[i] << ' ';
cout<<endl;
cout<<"Массив отрицательных чисел С:\n";
if(! indC) cout<<"Отрицательных чисел в массиве нет\n";
for(int i = 0; i < indC; i++)
cout << C[i] << ' ';
cout<<endl;
//Освобождение динамической памяти, занимаемой массивами A, B, C
delete []A;
delete []B;
delete []C;
getch();
return 0;
}
//Пример 6.2.Выполнить Пример 6.1, оформив в виде функций
//ввод, вывод и обработку массивов.
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
void Vvod(int *, int ,int&, int&);
void Vyvod(int *, int);
void PlusMinus(int* , int, int*, int*);
int main() {
cout<<"\nЗадайте количество чисел в массиве:";
int n;
cin>>n;
int *A=new int [n]; //Выделение динамической памяти для массива А
int KolPlus, KolMinus;
Vvod(A, n, KolPlus, KolMinus); //Вызов функции Vvod для масива A
int *B=new int [KolPlus]; //Выдел. динам.памяти для массива B
int *C=new int [KolMinus]; //Выдел. динам. памяти для массива C
PlusMinus(A, n, B, C); //Вызов функции PlusMinus
cout<<"Исходный массив A:\n";
Vyvod(A, n); //Вызов функции Vyvod для массива A
cout<<"Массив положительных чисел В:\n";
if(! KolPlus) cout<<"Положительных чисел в массиве нет\n";
Vyvod(B, KolPlus); //Вызов функции Vyvod для массива B
cout<<"Массив отрицательных чисел С:\n";
if(! KolMinus) cout<<"Отрицательных чисел в массиве нет\n";
Vyvod(C, KolMinus); //Вызов функции Vyvod для массива C
//Освобождение динам. памяти, занимаемой массивами A, B, C
delete []A;
delete []B;
delete []C;
getch();
return 0;
}
void Vvod(int * A, int n, int &KolPlus, int &KolMinus) {//Функция Vvod
KolPlus=0, KolMinus=0;
for(int i = 0; i < n; i++) {
A[i]=random(n)-random(n);
if(A[i]>0) KolPlus++;
if(A[i]<0) KolMinus++;
}
}
void PlusMinus(int* A, int n, int* B, int* C) { //Функция PlusMinus
int indB = 0, indC = 0;
for ( int i = 0; i < n; i++) {
if (A[i]>0) {
B[indB] = A[i];
indB++;
};
if(A[i]<0) {
C[indC] = A[i];
indC++;
}
}
}
void Vyvod(int *A , int n) { //Функция Vyvod
for(int i = 0; i < n; i++)
cout << A[i] << ' ';
cout<<endl;
}
Постановка задания
Разработать алгоритм решения задачи. Написать программу, которая реализует данный алгоритм. Создать динамический(ие) массив(ы). Ввод, вывод элементов одномерного массива и его обработку оформить в виде функций.
Варианты контрольных заданий
Смотри варианты контрольных заданий задания 3.