- •1. Основные этапы решения задач на эвм
- •Формулировка задачи
- •Математическая постановка задачи
- •Разработка алгоритма решения задачи
- •Написание текста программы на языке программирования
- •Ввод текста программы в эвм
- •Поиск и устранение синтаксических ошибок
- •Тестирование программы. Поиск и устранение логических ошибок в программе
- •Этапы создания исполняемой программы
- •Базовые компоненты программ
- •Буквы и цифры
- •Пробельные символы
- •Знаки пунктуации и специальные символы
- •Идентификаторы
- •Ключевые слова
- •Комментарии
- •Лексемы
- •Типы данных
- •Целые константы
- •Константы с плавающей точкой
- •Константа-символ
- •Строковые литералы
- •Универсальные функции ввода и вывода любых типов данных
- •Структуры и форма написания программы
- •Программирование разветвляющихся вычислительных процессов
- •Цикл while – цикл с предусловием.
- •Цикл do while – цикл с постусловием
- •Цикл for
- •Безусловная передача управления внутри цикла
- •Описание некоторых стандартов алгоритмов
- •Работа с файлами (функции ввода вывода верхнего уровня)
- •Указатели
- •Одномерные массивы Объявление массива.
- •Стандартные функции обработки строк
- •Многомерные массивы на примере двумерных
- •Классы памяти
- •Способы передачи данных в функцию
- •Функции и строки
- •Функции и одномерные числовые массивы
- •Функции и двумерные массивы
- •Функции с параметрами по умолчанию
- •Перегрузка функции
- •Шаблоны функции
- •Типы данных, определяемые пользователем
- •4.1. Структуры
- •Шаблон структуры
- •Структурные переменные
- •Инициализация структуры
- •Доступ к полям структуры
- •Массив структур
- •Вложенные структуры
- •Битовые поля структур
- •Передача структуры в функцию
- •Двоичный ввод-вывод структур
- •Функции двоичного ввода-вывода
- •Динамические структуры данных
- •4.2. Объединения
- •4.3. Перечисления
- •Файловые операции ввода/вывода
- •Файловый ввод/вывод с прямым доступом
Функции и одномерные числовые массивы
Любой одномерный массив определяется адресом начала массива и количеством элементов в массиве, следовательно, для передачи массива в функцию необходимо написать два параметра.
int *p – для передачи адреса.
int n – для передачи количества элементов массива.
Поскольку каждый элемент массива доступен нам по адресу, то исходный массив и массив-результат предаются одинаково.
Внутри функции может быть вычислен адрес любого элемента массива, следовательно, мы можем извлечь любой элемент массива (массив как исходное данное) или изменить любой элемент массива (массив как результат работы функции (причем память под этот массив выделяется вызывающей функцией))
При формировании массива-результата, память может выделяться внутри вызывающей функции в том же количестве, что и исходный массив. Внутри функции он заполняется данными и его размер может уменьшиться, поэтому вновь подсчитанный размер массива результата передается через оператор return, при этом тип функции - int.
Память под массив результат может быть выделена и внутри функции пользователя, но только -динамически. Его размер может быть предварительно подсчитан или устанавливается приблизительно. В процессе заполнения размер массива определяется. Вызывающая функция ничего не знает об этом массиве, поэтому его надо передать как результат, то есть: через оператор return передать адрес начала массива, при этом тип функции будет указатель на тип массива, например int * . Количество элементов в массиве передаем как второй результат, через параметр-ссылку (int & n). Не забыть освободить динамическую память (в main), как только массив нам станет не нужным.
Для написания оператора вызова функции необходимо уметь определить адрес начала массива:
---------------------------------------------------------
int mas[5]; | int * p = new int[5];
mas - адрес начала массива | p - адрес начала массива
Задача 1
Демонстрирует работу с массивом как с исходным данным
Даны два массива, сравнить их на равенство.
1. Функция заполнения массива случайными числами
2. Ф-я вывода массива на экран
3. Ф-я сравнения массива на равенство
Анализ характеристик функций
1/
1. InMasRnd
2. Исходные данные:
а) массив
int *p;
int n;
б) int min; - левая граница интервала
int max; - правая граница интервала
3. Результат: нет => void
2/
1. OutMas
2. Исходные данные
а) массив
int *p;
int n;
3. Результат: нет => void
3/
1. CmpMas
2. Исходные данные
а) 2 массива - int *p1;
int*p2;
int n;
3. Результат: да/нет => bool
файл: mas1.h
----------------
#ifndef MAS1_H
#define MAS1_H
void InMasRnd(int *p, int n, int min, int max);
void OutMas(int *p, int n);
bool CmpMas(int *p1, int *p2, int n);
#endif
----------------
файл: mas1.cpp
----------------
#include<iostream> //подключение системных средств для
using namespace std; //возможности использовать потоки ввода-вывода
#include <stdlib.h>
#include <time.h>
void InMasRnd(int *p, int n, int min, int max)
{
int i;
for (i=0; i<n; i++)
p[i]=rand()%(max-min+1)+min;
return;
}
void OutMas(int *p, int n)
{
int i;
cout << endl;
for (i=0; i<n; i++)
cout << p[i] << " | ";
return;
}
------------------------------------
первый вариант
------------------------------------
bool CmpMas(int *p1, int *p2, int n)
{
int i;
int kol=0;
for (i=0; i<n; i++) {
if (p1[i] == p2[i])
kol++;
}
if (kol != n)
return false;
else
return true;
}
------------------------------------
второй вариант
------------------------------------
bool CmpMas(int *p1, int *p2, int n)
{
int i;
for (i=0; i<n; i++) {
if (p1[i] != p2[i])
return false;
}
return true;
}
----------------
файл: main.cpp
----------------
#include<iostream> //подключение системных средств для
using namespace std; //возможности использовать потоки ввода-вывода
#include <stdlib.h>
#include <time.h>
#include "mas1.h"
int main(void)
{
const int N=5;
int mas1[N], mas2[N];
bool res;
srand((unsigned)time(NULL));
InMasRnd(mas1,N,-5,10);
InMasRnd(mas2,N,-5,10);
cout << "\nПервый массив:";
OutMas(mas1,N);
cout << "\nВторой массив:";
OutMas(mas2,N);
res = CmpMas(mas1,mas2,N);
if (res == true)
cout << "\nМассивы равны";
else
cout << "\nМассивы не равны";
return 0;
}
Замечание. Вряд ли вы получите равенство массивов при заполнении массивов случайными числами. Замените соответствующую функцию заполнением с клавиатуры.
Задача 2
Создать массив-результат из исходного путем перезаписи всех положительных чисел
Память под массив-результат выделить в вызывающей функции.
Выделяем функции проекта:
1. Функция заполнения случайными числами
2. Ф-я вывода массива на экран
3. Ф-я создания нового массива
3/
1. OtrOut
2. Исходные данные
а) исходный массив
int*p1;
int n;
массив результат
int*p2;
int n;
3. Результат (количество в массиве результате) => int
файл: mas1.h
#ifndef MAS1_H
#define MAS1_H
void InMasRnd(int *p, int n, int min, int max);
void OutMas(int *p, int n);
int OtrOut(int *p1, int *p2, int n);
#endif
файл: mas1.cpp
#include<iostream> //подключение системных средств для
using namespace std; //возможности использовать потоки ввода-вывода
#include <stdlib.h>
#include <time.h>
void InMasRnd(int *p, int n, int min, int max)
{
int i;
for (i=0; i<n; i++)
p[i]=rand()%(max-min+1)+min;
return;
}
void OutMas(int *p, int n)
{
int i;
cout << endl;
for (i=0; i<n; i++)
cout << p[i] << " | ";
return;
}
int OtrOut(int *p1, int *p2, int n)
{
int i, j=0;
for (i=0; i<n; i++) {
if (p1[i] > 0) {
p2[j]=p1[i];
j++;
}
}
return j;
}
файл: main.cpp
#include<iostream> //подключение системных средств для
using namespace std; //возможности использовать потоки ввода-вывода
#include <stdlib.h>
#include <time.h>
#include "mas1.h"
int main(void)
{
const int N=5;
int mas1[N], mas2[N], z;
srand((unsigned)time(NULL));
InMasRnd(mas1,N,-5,10);
cout << "\nПервый массив:";
OutMas(mas1,N);
z = OtrOut(mas1,mas2,N);
cout << "\nВторой массив:";
OutMas(mas2,z);
return 0;
}