وبلاگ من

۳ مطلب در ارديبهشت ۱۳۹۶ ثبت شده است

تابع جایگزینی در c++

جمعه, ۲۲ ارديبهشت ۱۳۹۶، ۱۲:۱۴ ب.ظ

تابع جایگزینی در c++

تابع replace به صورت زیر تعریف می شود:

str1.replace(pos,len,str2);

str1 : رشته اصلی که عمل جایگزینی بر روی آن صورت می گیرد

pos : مکان جایگزینی

len : طول رشته ای که می خواهید به جای آن جایگزین کنید

str2 : رشته ای که می خواهید جایگزین کنید


#include <iostream>
#include <string>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
string A="Hello World";
    string B="L"; 
string C="ll";
int temp=0;
temp=A.find(C,temp);
while(temp!=string::npos)
{
A.replace(temp,C.length(),B);
temp=A.find(C,temp+B.length());
}
cout<<A<<endl;


system("pause");
return 0;
}

  • مرتضی رحیم زاده

تابع سازنده ، مخرب و سازنده کپی

جمعه, ۲۲ ارديبهشت ۱۳۹۶، ۱۲:۴۴ ق.ظ


تابع سازنده (constructor) :

برای مقدار دهی اولیه به مقادیر کلاس به کار می رود و می تواند ورودی بگیرد یا حتی بدون ورودی باشد.

تابع سازنده مقداری را بر نمی گرداند و void هم نیست و حتما باید هم نام با کلاس باشد ، همان طور که گفته شد می تواند به دفعات به صورت بدون مقادر ، با دریافت مقدار و با دریافت مقدار به صورت پیش فرض تعریف شود.

برنامه به صورت پیش فرض تابع سازنده دارد اما برای اینکه با مقادیر کلاس هنگام تعریف مقدار دهید باید از تابع سازنده استفاده کنید.


تابع سازنده کپی (copy constructor) :

برای اینکه هنگام تعریف کلاس مقادیر یک شی از همان کلاس را در آن کپی کنید از تابع سازنده استفاده می شود . 

تابعی هم نام با کلاس ، بدون ورودی که هیچ مقداری را بر نمی گرداند و همان طور که گفته شد به صورت پیش فرض توسط خود برنامه فراخوانی می شود.

کامپایلر به صورت پیش فرض تابع سازنده دارد اما هنگامی که از اشاره گر ها یا مقادیر پویا (dynamic) استفاده می کنید باید حتما از سازنده کپی استفاده نمایید چرا که بدون سازنده به جای مقادیر متغیر مورد نظر تنها آدرس آن در اشاره گر جدید کپی می شود یعنی برای یک خانه حافظه دو اشاره گر خواهیم داشت (این اتفاق باعث می شود عملا دسترسی شما به خانه حافظه شی جدیدالتعریف تان از دسترس خارج شود و تغییرات روی شی ای که از آن کپی گرفته اید اعمال شود)

تفاوت تابع سازنده کپی با عملگر(operator) = در این است که از عملگر = در همه جای برنامه می توان استفاده کرد اما تابع سازنده در زمان تعریف شی فراخوانی می شود.


تابع مخرب (destructor) :

هنگامی که کارمان با یک شی تمام می شود بهتر است خانه حافظه هایی که توسط آن در RAM اشغال شده است را آزاد کنیم برای این کار از تابع مخرب استفاده می کنیم.

تابعی است هم نام با کلاس به علاوه علامت (مَد) ~ (در صفحه کلید انگلیسی بالای tab قرار دارد) بدون ورودی که خروجی را بر نمی گرداند .

به صورت خودکار در پایان هر بلاک  {} فراخوانی می شود . مقادیری که به صورت پویا تعریف شده اند (یعنی با دستور new) را با دستور delete از حافظه خارج می کنیم اما سایر مقادیر مانند مقادیر اولیه دیگر نیازی به حذف با delete ندارند.

#include <iostream>

using namespace std;
class myclass{
int a,b;
int *c; //single 
int *d; //array
public:
myclass(const myclass &A) //copy constructor
{
a=A.a;
b=A.b;
c=new int;
*c=A.c[0];
d=new int[5];
for(int i=0;i<5;i++)
d[i]=A.d[i];
}
myclass(int a1,int b1 , int c1,int d0,int d1,int d2,int d3,int d4) //constructor with value
{
a=a1;
b=b1;
c=new int;
*c=c1;
d=new int[5];
d[0]=d0;
d[1]=d1;
d[2]=d2;
d[3]=d3;
d[4]=d4;
}
myclass() //constructor without value
{
a=1;
b=2;
c=new int;
*c=3;
d=new int[5];
d[0]=11;
d[1]=12;
d[2]=13;
d[3]=14;
d[4]=15;
}
~myclass() //destructor
{
delete c;
delete [] d;
cout<<"Destructor"<<endl; //message for show when destructor is run
}
void set(int a1,int b1 , int c1,int d0,int d1,int d2,int d3,int d4)
{
a=a1;
b=b1;
*c=c1;
d[0]=d0;
d[1]=d1;
d[2]=d2;
d[3]=d3;
d[4]=d4;
}
void print()
{
cout<<a<<endl;
cout<<b<<endl;
cout<<*c<<endl;
cout<<d[0]<<endl;
cout<<d[1]<<endl;
cout<<d[2]<<endl;
cout<<d[3]<<endl;
cout<<d[4]<<endl;
cout<<endl; //space
}
};
void Des()
{
myclass D;
}
int _tmain(int argc, _TCHAR* argv[])
{
myclass A(10,20,30,0,1,2,3,4);
myclass B=A;
myclass C;
A.set(100,200,300,5,6,7,8,9);

A.print();
B.print();
C.print();
Des(); //this function just for show destructor running after compiler pass block {}
system("pause");
return 0;
}


  • مرتضی رحیم زاده

String Find Function

پنجشنبه, ۲۱ ارديبهشت ۱۳۹۶، ۰۲:۲۸ ب.ظ

این برنامه شماره تمام کاراکتر های l موجود در رشته ی a را در خروجی چاپ می کند :

#include "stdafx.h"
#include <iostream>
#include <string.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string a="Hello World";
int temp=0;
temp=a.find('l',temp);
while(temp!=string::npos)
{
cout<<temp<<endl;
temp=a.find('l',temp+1);
}
system("pause");
return 0;
}

فراخوانی تابع find

Str1.find( Str2 , num );
که Str1 رشته ای است که عمل جستجو را در آن انجام می دهیم ، Str2 عبارت یا کاراکتری است که جستجو می شود و num شماره کاراکتری است که جستجو از انجا آغاز می شود
string::npos
این تکه کد به معنی عدم یافتن عبارت است ، درواقع بیانگر :
static const size_t npos = -1;


  • مرتضی رحیم زاده