|
#include<stdio.h> #include<string.h> char* strins(char* str1,char* str2,int pos) { int s_len; int d_len; int i,j; pos--; s_len=strlen(str1); d_len=strlen(str2); for(i=s_len+1;i>=pos;i--) /*空出str2的空間*/ str1[i+d_len]=str1[i]; for(j=pos;str2[j-pos]!='\0';j++) /*將字符串str2插入str1中的特定位置*/ str1[j]=str2[j-pos];
return str1; }
void main() { char string1[200]; char string2[100]; int pos; printf("請(qǐng)輸入初始字符串:"); gets(string1); printf("請(qǐng)輸入插入字符串:"); gets(string2); printf("請(qǐng)輸入插入位置:"); scanf("%d",&pos); strins(string1,string2,pos); printf("插入后的字符串是%s\n",string1); }
運(yùn)算符重載函數(shù)一般采用兩種形式,一種是定義為類的成員函數(shù),另一種是定義為類的友元函數(shù)。 大多數(shù)情況下,使用成員函數(shù)和友元函數(shù)重載運(yùn)算符在功能實(shí)現(xiàn)上是相同的,重載時(shí)如果沒有本質(zhì)的區(qū)別,則應(yīng)該首先考慮使用成員函數(shù)以保證數(shù)據(jù)封裝。然而在某些情況下,如C++不能直接進(jìn)行復(fù)數(shù)加、減、乘、除的四則運(yùn)算,但是使用友元函數(shù)就可以實(shí)現(xiàn)重載這些運(yùn)算符。 如 定義 class complex { public: complex(){real=imag=0;} complex(double r,double i) { real=r,imag=r; } friend complex operator+(const complex &c1,const complex &c2) { return complex(c1.real+c2.real,c1.imag+c2.imag); }...
!注意友元運(yùn)算符函數(shù)的參數(shù)類型是引用類型!
一般而言,以下兩種調(diào)用方法是等價(jià)的: aa@ bb //隱式調(diào)用 operator @ (aa,bb) // 顯式調(diào)用 @為運(yùn)算符
在實(shí)際開發(fā)過程中,單目運(yùn)算符建議重載為成員函數(shù),而雙目運(yùn)算符建議重載為友元函數(shù)。通常下雙目運(yùn)算符重載為友元函數(shù)比重載為成員函數(shù)更方便,但是有時(shí)雙目運(yùn)算符必須重載為成員函數(shù),例如賦值運(yùn)算符。
用友元函數(shù)重載“++”“--”時(shí)需要注意幾點(diǎn): 1)運(yùn)算符++、--都對(duì)單值操作數(shù)產(chǎn)生影響,因此使用成員運(yùn)算符函數(shù)重載++和--的成員函數(shù)通常返回指針this。 2)由于友元運(yùn)算符函數(shù)沒有this指針,因此不能引用this指針?biāo)傅膶?duì)象,使用友元函數(shù)重載++、--時(shí),應(yīng)采用引用參數(shù)傳遞數(shù)據(jù)。 3)采用前綴和后綴方式的函數(shù)內(nèi)部的語(yǔ)句可以相同,也可以不同,這取決于用戶的考慮。 例子: class book { public: book(int i=0,int j=0); void print(); friend book operator++(book &op); private: int x,y; };
book::book(int i,int j) { x=i; y=j; }
void book::print() { cout<<" x: "<<x<<", y "<<y<<endl; }
book operator++(book &op) //此處不能寫成book operator++(book op), 參數(shù)必須是引用傳遞類型,而不是值傳遞。若這樣做,以下主函數(shù)輸出的值是不變的 { ++op.x; ++op.y; return op; }
void main() { book ob(20,30); ob.print(); operator++(ob); ob.print(); ++ob; ob.print(); }
類的實(shí)現(xiàn):
class CNumber { private: int n; public: CNumber(int number) { n=number; } ~CNumber(){ } int isEven() { if(n%2==0) return 1; else return 0; } int isOdd() { if(n%2!=0) return 1; else return 0; } int isPrime() { int i; if(n<1) return 0; for(i=2;i<=sqrt(n);i++) if(n%i==0) return 0; else return 1; return 0; } bool isAPrime(int n) { for(int i=2;i<sqrt(n);i++) if(n%i==0) return false; return true; } int isGoldBach() { int i; int halfnum=n/2; for(i=2;i<=halfnum;i++) if(isAPrime(i)&&isAPrime(n-i)) return 1; return 0; }
void print() { if(isEven()) cout<<"This number is even."<<endl; if(isOdd()) cout<<"This number is odd."<<endl; if(isPrime()) cout<<"This number is prime."<<endl; if(isGoldBach()) cout<<"This number is goldbach."<<endl; } };
主函數(shù): void main() { int num; cout<<"Please enter one number:"<<endl; cin>>num; CNumber numb(num); numb.print(); }
二分法思想:假定f(x)在區(qū)間(x,y)上連續(xù) 先找到a、b屬于區(qū)間(x,y),使f(a),f(b)異號(hào), 說明在區(qū)間(a,b)內(nèi)一定有零點(diǎn),然后求f[(a+b)/2], 現(xiàn)在假設(shè)f(a)<0,f(b)>0,a<b ①如果f[(a+b)/2]=0,該點(diǎn)就是零點(diǎn), 如果f[(a+b)/2]<0,則在區(qū)間((a+b)/2,b)內(nèi)有零點(diǎn),(a+b)/2=>a,從①開始繼續(xù)使用 中點(diǎn)函數(shù)值判斷。 如果f[(a+b)/2]>0,則在區(qū)間(a,(a+b)/2)內(nèi)有零點(diǎn),(a+b)/2<=b,從①開始繼續(xù)使用 中點(diǎn)函數(shù)值判斷。 這樣就可以不斷接近零點(diǎn)。 通過每次把f(x)的零點(diǎn)所在小區(qū)間收縮一半的方法,使區(qū)間的兩個(gè)端點(diǎn)逐步迫近函數(shù)的零點(diǎn),以求得零點(diǎn)的近似值,這種方法叫做二分法。 頭文件定義 class CEquation { private: double solution; //方程的近似解 double a, b; //近似解的區(qū)間 double (*p_fx)(double x); //p_fx是一個(gè)指向函數(shù)的指針,指向方程式求值函數(shù) double (*p_solution)(double x, double y); //指向由近似解區(qū)間求近似解的函數(shù)的指針 double delta; //求解精度 public: CEquation(double av, double bv, double (*p1)(double), double (*p2)(double,double), double dv); double biSection(); //二分法求方程近似解 void printSolution() const; };
類的實(shí)現(xiàn)及主函數(shù)實(shí)現(xiàn):
CEquation::CEquation(double a_val, double b_val, double (*p1)(double), double (*p2)(double, double), double delta_val)
  {
a = a_val;
b = b_val;
p_fx = p1;
p_solution = p2;
solution = p_solution(a, b);
delta = delta_val;
}

double fx(double x) //方程為: e^x+4^x3-6^x2+3x-2=0
  {
return exp(x)+4.0*x*x*x-6.0*x*x+3.0*x-2.0;
}

double middle(double x, double y) //中值
  {
return 0.5*(x+y);
}

double CEquation::biSection()
  {
double h;

while (fabs(a-b) > delta)
 {
h = p_solution(a, b);
if (p_fx(a)*p_fx(h) > 0)
a = h;
else
b = h;
}
solution = p_solution(a, b);
return solution;
}

void CEquation::printSolution() const
  {
cout << "Solution is: " << solution << endl;
}

void main ()
  {
CEquation a(0.0, 1.0, fx, middle, 1e-6);

a.biSection();
a.printSolution();
}

摘要: 小累,國(guó)慶假期過去一大半,C++這時(shí)候才把遞歸和函數(shù)這一塊知識(shí)點(diǎn)慢慢地啃完了,結(jié)束之前,今晚自己寫了一個(gè)小程序,實(shí)現(xiàn)四則運(yùn)算,適合小學(xué)生使用。程序說明:1)允許用戶選擇一種類型的算術(shù)問題來學(xué)習(xí),輸入1表示加法,2表示減法,3表示乘法,4表示除法,5表示四種混合運(yùn)算;2)由于程序代碼中反復(fù)無窮遞歸,所以該程序的運(yùn)算會(huì)不斷進(jìn)行下去,退出請(qǐng)自動(dòng)關(guān)閉程序;源代碼如下:
Code highl... 閱讀全文
下午照樣看C++how to program,加油,要到數(shù)組和指針了,接下來就是類的深入剖析了,這幾天在加強(qiáng)火力猛攻這塊地方,哈哈,還是編程菜鳥!不過我自己感覺比大一那時(shí)候真的有點(diǎn)進(jìn)步了,有那種coding 的感覺了,努力學(xué)習(xí)還是有收獲的。閑話休說,把今天下午自己寫的代碼發(fā)上來!
#include<iostream> using namespace std; int main() { int row,line;//定義行、列數(shù)的變量 for(row=1;row<=10;row++) { for(line=1;line<=row;line++) cout<<"*"; cout<<endl; } cout<<"\n";//第一個(gè)圖形至此打印出來 for(row=10;row>=1;row--) { for(line=1;line<=row;line++) cout<<"*"; cout<<endl; } cout<<"\n";//第二個(gè)圖形打印出來 for(row=10;row>=1;row--) { for(line=1;line<=row;line++) cout<<"*"; cout<<endl; for(line=1;line<=(11-row);line++) cout<<" "; } cout<<"\n";// 第三個(gè)圖形打印出來 for(row=1;row<=10;row++) { for(line=1;line<=10-row;line++) cout<<" ";
for(line=1;line<=row;line++) cout<<"*"; cout<<endl; } //最后一個(gè)圖形! cout<<endl; return 0;
}
程序運(yùn)行結(jié)果 :  
|