
- •Линейные и разветвляющиеся вычислительные процессы Краткие теоретические сведения
- •Классификация данных
- •Декларирование объектов
- •Структура программы
- •Константы
- •Операции Операции выражения
- •Арифметические операции
- •Операция присваивания
- •Сокращенная запись операции присваивания
- •X##; - постфиксную.
- •Преобразование типов операндов арифметических операций
- •Операция приведения типа
- •Операции сравнения
- •Логические операции
- •Побитовые логические операции, операции над битами
- •Операция «,» (запятая)
- •Функции вывода информации
- •Функции ввода информации
- •Ввод - вывод потоками
- •Стандартные математические функции
- •Синтаксис операторов языка Си
- •Операция присваивания
- •Условные операторы
- •If (условие ) оператор1;
- •If (условие1) оператор1;
- •Условная операция "? :"
- •Оператор выбора switch
- •Программирование циклических вычислительных процессов
- •Циклические операторы while и do–while
- •Вложенные циклы
- •Программирование циклических вычислительных процессов с использованием одномерных массивов и строк Краткие теоретические сведения
- •Строки, как одномерные массивы символов
- •Указатели и операции над адресами
- •Операции над указателями (адресная арифметика)
- •Связь указателей и массивов
- •Пример 1: Упорядочить по алфавиту массив строк (не более 20) длиной не более 10 символов в каждой:
- •Многомерные массивы, динамическое распределение памяти Краткие теоретические сведения
- •Массивы указателей
- •Указатели на указатели
- •Динамическое размещение данных
- •Проверить, является ли введенная строка полиндромом (справа-налево читается также как и слева-направо).
- •Функции пользователя Краткие теоретические сведения
- •Декларация функций.
- •Вызов функции.
- •Изменение значений параметров.
- •Область действия переменных
- •Классы памяти.
- •Рекурсивные функции.
- •Операция typedef
- •Указатели на функции
- •Примеры работы с функциями
- •Программирование алгоритмов с использованием структур Краткие теоретические сведения Структуры
- •Декларация структурного типа данных
- •Создание структурных переменных
- •Обращение к полям структур
- •Вложенные структуры
- •Использование typedef
- •Массивы структур
- •Размещение структурных переменных в памяти
- •Пример на использование структур
Примеры работы с функциями
Пример указатель на функцию:
Написать функцию вычисления суммы sum, обозначив слагаемое формальной функцией fun(x), а при вызове функции суммирования передавать через параметр реальное имя функции, в которой запрограммирован явный вид этого слагаемого. Например, пусть требуется вычислить две суммы:
Поместим слагаемые этих сумм в пользовательские функции f1 и f2. При этом для удобства работы воспользуемся операцией typedef, введем пользовательский тип данных: указатель на функции, который можно устанавливать на функции, возвращающие результат, указанного типа, и имеющие указанный список параметров:
typedef тип_результата (* переменная-указатель)(параметры);
Тогда в списке параметров функции суммирования достаточно указывать фактические имена функций данного типа. Программа для решения данной задачи может быть следующей:
#include<iostream.h>
typedeffloat(*p_f)(float); // Декларация указателя на функциию
floatsum(p_ffun,int,float); // Декларации прототипа функции
floatf1(float); // Декларации прототипа функции
floatf2(float); // Декларации прототипа функции
void main(void)
{
float x, s1, s2;
intn;
cout<<" Введите кол-во слагаемых n: "
cin>>n;
cout<<" Введите значение x: ";
cin>>x;
s1=sum(f1, 2*n, x);
s2=sum(f2, n, x);
cout<<"\nN = "<< n;
cout <<"\nX = "<< x;
cout<<"\nСумма 1 = "<< s1<<' ';
cout<< "\nСумма 2 = "<< s2<<' ';
}
// Функция вычисления суммы, первый параметр которой – формальное имя функции, //имеющей тип, введенный с помощью операции typedef
float sum(p_f fun, int n, float x)
{
float s=0;
for(int i=1; i<=n; i++) s+=fun(x);
return s;
}
float f1(float r) // Первое слагаемое
{
return (r/5.);
}
float f2(float r) // Второе слагаемое
{
return (r/2.);
}
Пример передача в функцию двухмерного массива:
Ввести массив NxN(не больше 50) целых чисел, в функции подсчитать сумму его положительных элементов.
#include <iostream.h>
void vvod(int, int, int a2[ ][50]); // прототип функции ввод массива
int summa(int, int, int a1[ ][50]); // прототип функции поиск суммы
void main(void)
{
int a[50][50];
int i,j,Nstr,Nstb;
cout<<"\nВведите количество строк матрицы (<50) ";
cin>>Nstr;
cout<<"\nВведите количество столбцов матрицы (<50) ";
cin>>Nstb;
vvod(Nstr,Nstb,a); // вызов функции ввод массива
cout<<"\a\nСумма = "<<summa(Nstr,Nstb,a); // вызов функции поиск суммы и вывод на экран
cout<< "\nPress any key... ";
}
void vvod(int nstr, int nstb, int a2[][50]) // функция ввод массива
{
int i,j;
cout<<"\n Введите массив \n";
for(i=0; i<nstr ; i++)
for(j=0; j<nstb; j++)
{
cout<<"a["<<i+1<<"]["<<j+1<<"]= ";
cin>>*(*(a2+i)+j);
}
}
int summa(int nstr, int nstb, int a1[ ][50]) //функция поиск суммы
{
int i,j,s;
cout<<"\n Функция summa ";
for (s=0,i=0; i<nstr; i++)
for (j=0;j<nstb;j++)
if (a1[i][j]>0) s+=a1[i][j];
return s;
}
Пример передача в функцию двухмерного массива (с динамическим выделением памяти):
Ввести массив NxN(не больше 50) целых чисел, в функции подсчитать сумму его положительных элементов.
#include <iostream.h>
#include <conio.h>
void vvod(const int, const int, int **a2); // прототип функции ввод массива
void summa(const int, const int, int **a1); // прототип функции поиск суммы
void main(void)
{
int i,j,Nstr, Nstb;
cout<<"\nВведите количество строк матрицы (<50)\n";
cin>>Nstr;
cout<<" Введите количество столбцов матрицы (<50)\n";
cin>>Nstb;
int**a;
// выделение памяти под матрицу а
a=new int* [Nstr];
for(i=0; i<Nstr; i++)
a[i]=new int[Nstb];
vvod(Nstr,Nstb,a); // вызов функции ввод массива
summa(Nstr,Nstb,a); // вызов функции поиск суммы
}
void vvod(const int nstr, const int nstb, int **a2) // функция ввод массива
{
int i,j;
cout<<"\n Введите массив \n";
for(i=0; i<nstr ; i++)
for(j=0; j<nstb; j++)
{
cout<<"a["<<i+1<<"]["<<j+1<<"]= ";
cin>>*(*(a2+i)+j);
}
}
void summa(const int nstr, const int nstb, int **a1) //функция поиск суммы
{
int i,j,s;
cout<<"\n Функция summa ";
for (s=0,i=0; i<nstr; i++)
for (j=0;j<nstb;j++)
if (*(*(a1+i)+j)>0) s+=*(*(a1+i)+j);
cout<<"\n Сумма = "<< s <<" \n Press any key... ";
}