Видео уроки по языку C++ / Функции с аргументами строками с стиле C / #20

Функции с аргументами — строки в стиле Си. В этом уроке мы научимся обрабатывать динамически выделенный символьный массив типа Char, а также узнаем некоторые особенности передачу символьных массивов и указателя на массив в функции и как их можно обрабатывать. Будет рассмотрен пример программы с функцией принимающей константный указатель на строку, и работа с ним.

Видео уроки по языку C++ / Передача массивов в функцию / #19

Передача массива в функцию по указателю. В ней мы узнаем как можно передавать одномерный и двумерный массив в функцию через указатель, также рассмотрим пример двух одинаковых функций но написанных с разными видами передачи одномерного массива. Напишем небольшую программу которая будет считать сумму всех элементов в одномерном динамическом массиве. Составим две функции, одна для вывода элементов этого массива в консоль а другая для подсчета суммы всех элементов в этом массиве.
 

Видео уроки по языку C++/ Аргументы функций и передача по значению / #18

Передача параметров (аргументов) в функцию по значению. В ней мы узнаем некоторые нюансы такой передачи аргументов в функцию и убедимся в них проверив это все на одном примере а именно на функции возведения числа в куб.

Видео уроки по языку C++ / Прототипирование и вызов функции / #17

 
Прототип функции и вызов функции в языке программирования С++. Для чего они нужны функциям и как они помогают компилятору и программисту. Будут рассмотрены примеры с тщательным описанием и разбором прототипов в примерах.
 

Видео урок по языку C++ / Основы функций / #16

В этом уроке мы начнем изучать важную часть программирования а именно функции. Начнем мы конечно же с основ функций. Первым делом мы узнаем что функции состоят из трех аспектов: объявление функции(прототип или сигнатура), определение функции(тело функции с операторами) и сам вызов функции. Мы рассмотрим два вида функций, возвращающие значение и не возвращающие значение, также мы напишем два примера на такие функции.

Задана матрица размером NxM. Получить массив B, присвоив его k- му элементу значение 1 или 0.

Условие задачиЗадана матрица размером NxM. Получить массив B , присвоив его k- му элементу значение 1, если  строка матрицы симметрична, и значение 0- в противном случае.
Листинг (исходник) программы:
[свернуть]


			#include <iostream>
		#include <locale>
		#include <conio.h>
		#include <time.h>
		using namespace std;
		
			
		void createMassivB( bool* Arr, int j, bool flag)
		{
		    Arr[j] = flag;
		}
		
			
		int main()
		{
		    setlocale(LC_ALL,"Russian");
		    int n(0),m(0);
		    cout<<"Введите размеррность матрицы: ";cin>> n >> m;
		    cout<<endl;
		
			
		    int** Mass = new int* [n]; // Объявление динамического массива
		    for(int i=0; i<n; i++)
		        Mass[i] = new int [m];
		
			
		    srand((int)time(0));
		    for(int i=0; i<n; i++)
		        for(int j=0; j<m; j++)
		            Mass[i][j] = rand()%5; //Присваивание значений элементам матрицы
		
			
		    cout << "Исходная матрица: " << endl << endl;
		    for(int i(0); i<n; i++)//Вывод исходной матрицы
		    {
		        for(int j=0; j<m; j++)
		            if(j==m-1)
		                cout << Mass[i][j] << \' \' << endl;
		            else 
		                cout << Mass[i][j] << \' \';
		    }
		
			
		    bool* MassB = new bool [n]; // Объявление динамического массива в виде булевой маске
		    for(int j=0; j<m; j++)// Истинные значения по всем массиве
		            MassB[j] = false; 
		
			
		    int k;
		    int flagNechet = m%2; 
		    for(int i=0; i<n; i++)
		    {
		        k=true;
		
			
		        for(int j=0; j<m/2; j++)
		        {
		            if (Mass[i][j]==Mass[i][m-j-1])
		                 k = true;
		            else
		            {
		                k = false;
		                break;
		            }
		        }
		        MassB[i]=k;
		    }
		
			
		    cout<<endl;
		    for(int j=0; j<n; j++)
		    {
		        if(j==n-1)
		            cout << MassB[j] << \' \' << endl;
		        else 
		            cout << MassB[j] << \' \';
		    }
		
			
		    _getch();
		    return 0;
		}

		
	

 
‘ style=’default’ collapse_link=’true’]

Создать класс Rational для работы с рациональными дробями.

Условие задачи: Рациональная (несократимая) дробь представляется парой целых чисел (а, b), где а – числитель, b – знаменатель. Создать класс Rational для работы с рациональными дробями. Обязательно должны быть реализованы операции:

– сложения add, (a, b) + (с, d) = (ad + be, bd);
– вычитания sub, (a, b) — (с, d) = (ad — be, bd);
– умножения mul, (a, b) * (c, d) = (ac, bd);
– деления div, (a, b) / (с, d) = (ad, be);
– сравнения equal, greate, less.
Кроме этого, обязательно должны быть реализованы методы инициализации объектов, ввода значений с клавиатуры и вывода на экран. С одномерным массивом, состоящим из n вещественных элементов, произвести следующие операции:
1) вычислить сумму элементов массива с нечетными номерами;
2) вычислить сумму элементов массива, расположенных  между  первым  и последним отрицательными элементами;
3) сжать массив, удалив из него все элементы, модуль которых не превышает 1. Освободившиеся в конце массива элементы заполнить нулями. При сжатии сохранить исходный порядок элементов.
Примечание: Размеры массивов задаются именованными константами. Все операции над массивами  выполняются отдельными процедурами и функциями в том порядке, в котором они описаны в задании. Элементы массивов задаются одним из двух способов: генерация  случайным образом или  ввод с клавиатуры. Способ заполнения массива выбирается пользователем. Реальную размерность массива программа должна спрашивать у пользователя (в диапазоне от единицы до значения, определяемое константой).
Листинг (исходник) программы:


		#include <iostream>
			#include <ostream>
			#include <locale>
			#include <conio.h>
			using namespace std;
			
			class Rational 
			{
			    int a;
			    int b;
			public:
			    Rational(){ a = 0; b = 0;} // Конструктор по умолчанию
			    Rational(const int& _a, const int& _b) // Конструктор с данными
			    {
			        if (_b<0)
			            exit(1);
			        a = _a;
			        if (_b)
			            b = _b;
			        else
			            exit(1);
			        reduce();
			    }
			    Rational operator+( Rational T)
			    {
			        Rational Temp;
			        
			        if( this->b == T.b )
			        {
			            Temp.a = this->a + T.a;
			            Temp.b = this->b;
			        }
			        else
			        {
			            Temp.b = this->b * T.b;
			            Temp.a = (Temp.b / this->b * this->a ) + (Temp.b / T.b * T.a );
			        }
			        Temp.reduce();
			        return Temp;
			    }
			    Rational operator-( Rational T)
			    {
			        Rational Temp;
			        
			        if( this->b == T.b )
			        {
			            Temp.a = this->a - T.a;
			            Temp.b = this->b;
			        }
			        else
			        {
			            Temp.b = this->b * T.b;
			            Temp.a = (Temp.b / this->b * this->a ) - (Temp.b / T.b * T.a );
			        }
			        Temp.reduce();
			        return Temp;
			    }
			    Rational operator*( Rational T)
			    {
			        Rational Temp;
			        Temp.a = this->a * T.a;
			        Temp.b = this->b * T.b;
			        Temp.reduce();
			        return Temp;
			    }
			    Rational operator/( Rational T)
			    {
			        Rational Temp;
			        Temp.a = this->a * T.b;
			        Temp.b = this->b * T.a;
			        Temp.reduce();
			        return Temp;
			    }
			    // Нахождение НОДа
			    int NOD(const int& a1,const int& b1)
			    {
			        int a = abs(a1), b = abs(b1);
			        while(a!=0 && b!=0){
			            if (a>=b)
			                a = a%b;
			            else
			                b = b%a;
			        }
			        return a+b;
			    }
			    // Сокращение дроби
			    void Rational::reduce()
			    {
			        int nod = NOD(a,b);
			        a = a/nod;
			        b = b/nod;
			    }
			    // Перегрузка оператора сout
			    friend ostream& operator << (ostream &out,const Rational& drob)
			    {
			        if (drob.b== 1 || drob.a == 0)
			            out << drob.a;
			        else 
			            out << drob.a << \'/\' << drob.b;
			        return out;
			    }
			    // Перегрузка оператора cin
			    friend istream& operator>> (istream& istr, Rational& b)
			    {
			        char* str = new char [1024];
			        cin.getline(str, sizeof(str));
			        int i = 0;
			        unsigned int bt = 0;
			        bool flag = false;
			    l1:
			        int len = strlen(str)-1;
			        while (str[len]==\' \'){
			            str[len] = NULL;
			            goto l1;
			        }
			        if (strlen(str)==0)
			            exit(1);
			        while (str[i]==\' \')
			            ++i;
			        if (str[i]==\'-\'){
			            flag = true;
			            ++i;
			        }
			        while (str[i]!=\'.\' && str[i]!=\'/\' && i<(int)strlen(str)){
			            bt = (str[i] - \'0\') + bt*10;
			            ++i;
			        }
			        ++i;
			        switch (str[i-1]){
			            case \'.\': {
			                int j = 0;
			                while (i<(int)strlen(str)){
			                    bt = (str[i] - \'0\') + bt*10;
			                    ++i, ++j;
			                }           
			                b.b = int(pow(10.0,j));
			                break;
			            }
			            case \'/\': {
			                b.b = 0;
			                while (i<(int)strlen(str)){
			                    b.b = (str[i]-\'0\') + b.b*10;
			                    ++i;
			                }
			                break;
			            }
			        }
			        b.a = flag ? -int(bt) : bt;
			        b.reduce();
			        return istr;
			    }
			    bool operator < (const Rational & f) const { return a * f.b < f.a * b; }
			    bool operator > (const Rational & f) const { return a * f.b > f.a * b; }
			    bool operator == (const Rational & f) const { return a == f.b && b == f.b; }
			};
			
			
			int main()
			{
			    setlocale(LC_ALL,"Russian");
			    Rational A(1,3);
			    Rational B(1,8);
			    Rational C,D;
			    Rational Result;
			
			
			    cout<<"Введите дробь C в виде */* : ";cin >> C;cout << endl;
			    cout<<"Введите дробь D в виде */* : ";cin >> D; cout << endl;
			
			
			    if( A > B)
			        cout << A <<" - "<< B <<" = " << A-B << endl;
			
			
			    if( C < D)
			        cout << C <<" + "<< D <<" = " << C+D << endl;
			
			
			    if( (A+B) == (C+D) )
			        cout << A << " + " << B << " + " << C << " + " << D << " = " << A+B+C+D << endl;
			    _getch();
			    return 0;
			}

 

[свернуть]

С клавиатуры вводится текст, ввод прекращается при нажатии клавиши Enter

Условие задачи: С  клавиатуры  вводится  текст  из  прописных  и  строчных  латинских  букв  и цифр.  Ввод  прекращается  при  нажатии клавиши Enter. Произвести следующие операции:

1) напечатать только цифры, входящие в этот текст;
2) найти процентное содержание цифр в исходном тексте.
Примечание:  Все  операции  над  строками  выполняются  отдельными функциями в том порядке, в котором они описаны в задании.
Листинг (исходник) программы:


				#include <iostream>
		#include <locale>
		#include <conio.h>
		#include <cctype>
		#include <string>
		using namespace std;
		
			
		void ShowProcents(const char* Stroka);
		void ShowDigit(char* Stroka);
		
			
		int main()
		{
		    setlocale(LC_ALL,"Russian");
		    const int n =1000;
		    char Str[n];
		
			
		    cout<<"Введите текст: "; cin.getline(Str,n,\'\\n\');
		
			
		    ShowDigit(Str); // Выводим цифры которые имеются в тексте
		    ShowProcents(Str); // Выводим значение цифр в тексте в процентах
		    _getch();
		    return 0;
		}
		
			
		void ShowDigit(char* Stroka)
		{
		    int i(0);
		    bool Numbers[10] = {false};
		    for(i = 0; Stroka[i]; i++)
		    {
		        int numb;
		        char tmp[2] = " ";
		        tmp[0] = Stroka[i];
		        if( isdigit(tmp[0]))
		        {
		            int numb = atoi(tmp);
		            Numbers[numb] = true; // Помечаем истиной, что число есть в тексте.
		        }
		    }
		
			
		    cout<<"В тексте присутствуют цифры: ";
		    for(int i(0); i<10; i++)
		        if(Numbers[i] != false)
		            cout<<i<<\' \';//Выводим цифры которые присутствуют в тексте
		    cout<<endl;
		}
		
			
		void ShowProcents(const char* Stroka)
		{
		    int i(0);
		    double numb(0);
		
			
		    for(i = 0; Stroka[i]; i++)
		        if( isdigit(Stroka[i]) )
		            numb++;
		
			
		    numb = (1 * 100) / i;
		    cout.precision(2);
		    cout<< "Цифры в тексте составляют: " << numb << \'%\' << endl;
		}

 

[свернуть]

С одномерным массивом из n вещественных элементов произвести следующие операции

Условие задачи: С одномерным  массивом,  состоящим из n вещественных элементов, произвести следующие операции: 

1) вычислить сумму элементов массива с нечетными номерами;  

2) вычислить сумму элементов массива, расположенных  между  первым  и последним отрицательными элементами; 

3) сжать массив, удалив из него все элементы, модуль которых не превышает 1. Освободившиеся в конце массива элементы заполнить нулями. При сжатии сохранить исходный порядок элементов.  
 
Примечание: Размеры массивов задаются именованными константами. Все операции над массивами  выполняются отдельными процедурами и функциями в том порядке, в котором они описаны в задании. Элементы массивов задаются одним из двух способов: генерация  случайным образом или  ввод с клавиатуры. Способ заполнения массива выбирается пользователем. Реальную размерность массива программа должна спрашивать у пользователя (в диапазоне от единицы до значения, определяемое константой).
Листинг (исходник) программы:


		#include <iostream>
		#include <locale>
		#include <time.h>
		#include <vector>
		#include <windows.h>
		#include <conio.h>
		using namespace std;
		
		
		float SumNe4etnye(const float* M, int n);
		float SumInterval(const float* M, int n);
		void ClearSmallElement(float* M, int n);
		
		
		int main()
		{
		    setlocale(LC_ALL,"Russian");
		    const int max = 20, min=1;int n;
		    float* Arr;
		    cout<<"Введите размерность массива: ";cin>>n;
		    if( n <= 1 )
		    {
		        Arr = new float[min];
		        n = min;
		    }
		    else if(n > 20)
		    {
		        Arr = new float[max];
		        n = max;
		    }
		    else
		        Arr = new float[n];
		    short Question;
		Choozen:
		    system("cls");
		    cout<<"Выберите способ заполнения массива:\\n\\t1-Для ручного заполнения\\n\\t2-Для автоматического заполнения\\n";
		    cin>>Question;
		
		
		    switch(Question)
		    {
		        case 1:
		            cout<<"Заполните одномерный массив:"<<endl;
		            system("cls");
		            for(int i=0; i<n; i++)
		            {
		                cout << \'[\' << i+1 << \']\' << " = ";
		                cin>>Arr[i];
		            }
		            system("cls");
		            break;
		
		
		        case 2:
		            system("cls");
		            srand((int)time(0));
		            for(int i=0; i<n; i++)
		                Arr[i] = (float)(rand()%40-20);
		            system("cls");
		            break;
		
		
		        default:
		            system("cls");
		            cout<<"Вы ввели не допустимую цифру, повторите ввод!";
		            Sleep(2000);
		            goto Choozen;
		    }
		    
		    cout<<"Одномерный массив:"<<endl;
		    for( int i=0; i<n; i++)
		        cout<<Arr[i]<<" ";
		
		
		    cout<<"\\n\\nСумма элементов массива с нечетными номерами: "<<SumNe4etnye(Arr,n)<<endl;
		    cout<<"\\nСумму элементов  массива, расположенных  между первым  и последним отрицательными элементами: "<<SumInterval(Arr,n)<<endl;
		    ClearSmallElement(Arr,n);
		
		
		    cout<<"\\nСжатый массив: "<<endl;
		    for( int i=0; i<n; i++)
		        cout<<Arr[i]<<" ";
		    cout<<endl;
		    _getch();
		    return 0;
		}
		
		
		float SumNe4etnye(const float* M, int n)
		{
		    float Sum = 0;
		    for( int i=0; i<n; i+=2)
		        Sum += M[i];
		    return Sum;
		}
		
		
		float SumInterval(const float* M, int n)
		{
		    float Sum = 0;
		    int begin=0,end=n;
		    for( int i=0; i<n; i++)
		        if( M[i] < 0)
		        {
		            begin = i;
		            break;
		        }
		    for( int i=n; i>0; i--)
		        if( M[i] < 0)
		        {
		            end = i;
		            break;
		        }
		    for( int i=begin; i<end; i++)
		        Sum += M[i];
		    return Sum;
		}
		
		
		void ClearSmallElement(float* M, int n)
		{
		
		
		    vector <float> Mass;
		    for( int i=0; i<n; i++)
		    {
		        if( abs(M[i]) <= 1 )
		            M[i] = 0;
		    }
		
		
		    int counts=0;
		    for( int i=0; i<n; i++)
		        if( M[i] != 0 )
		            Mass.push_back(M[i]);
		        else
		            counts++;
		
		
		    for( int i=0; i<counts; i++)
		        Mass.push_back(0);
		
		
		    for(int i=0; i<n; i++)
		    {
		        if(Mass[i] != 0)
		            M[i] = Mass[i];
		        else
		            M[i] = 0;
		    }
		    Mass.clear();
		}
		
		

 

[свернуть]

Создать класс Pair, определить класс-наследник Fraction.

Условие задачиСоздать класс Pair (пара чисел); определить методы изменения полей и сравнения  пар:  пара  p1  больше  пары  р2,  если (first.pl > first.р2)  или (first.pl = first.р2)  и  (second.pl > second.р2). Определить класс-наследник Fraction с полями: целая часть числа и дробная часть числа. Определить полный набор методов сравнения.

Листинг (исходник) программы:

#include <iostream>
#include <conio.h>
class pair //базовый абстрактный класс персоны
{
protected:
int first;
int second;
public:
void set_first(int t){first=t;};
void set_second(int t){second=t;};
int get_first(){return first;};
int get_second(){return second;};
pair(int ta=0, int tb=0):first(ta), second(tb){};
friend bool operator > (pair, pair);
friend bool operator < (pair, pair);
friend bool operator == (pair, pair);
friend bool operator != (pair, pair);
};
bool operator > (pair p1, pair p2){
return (p1.first>p2.first)?(true):(  (p1.first==p2.first)?(p1.second>p2.second):(false)  );
}
bool operator < (pair p1, pair p2){
return (p1.first<p2.first)?(true):(  (p1.first==p2.first)?(p1.second<p2.second):(false)  );
}
bool operator == (pair p1, pair p2){
return (p1.first==p2.first)&&(p1.second==p2.second);
}
bool operator != (pair p1, pair p2){
return (p1.first!=p2.first)||(p1.second!=p2.second);
}

 

class fraction: public pair
{
public:
void set_second(int t){if (t!=0) second=t;};
void print(){
std::cout<<«(«<<get_first()<<«.»<<get_second()<<«)» ;
}
fraction(const int& f=0, const int& s=1): pair(f, s){
if(s==0){
std::cerr<<«divide by zero»;
second=1;
}
}

};

int main (){
fraction f1(2, 3);
fraction f2(1, 2);
fraction f3;
f1.print();
if (f1>f2) std::cout<<» > «;
else       std::cout<<» < «;
f2.print();
std::cout<<std::endl;
_getch();
return 0;
}

[свернуть]