• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天之道

            享受編程的樂趣。
            posts - 118, comments - 7, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            構造函數是什么?看下面幾行代碼:
            class GradeBook
            {
              public:
                  void setCourseName(string name)
                  {
                          courseName=name;
                   }
                   string getCourseName()
                   {
                        return courseName;
                   }
                   GradeBook myGradeBook;
                   cout<<"Initial course name is: "<<myGradeBook.getCourseName()<<endl;
            }
            這幾行代碼中,定義一個類GradeBook,成員訪問說明符public表示在這個符號之下的函數,函數都是公共可相互被調用的。創建GradeBook類的對象時(對象可以這樣創建:GradeBook myGradeBook; 這里myGradeBook就是類的對象 ),該對象的數據成員courseName被初始化為默認的空串。事實上,我們可用定義一個構造函數,用于類對象創建時的初始化。
            構造函數是一種特殊的成員函數,定義時必須與類同名。它和其他成員函數的一個重大差別是構造函數不能返回值,通常構造函數聲明為public。

            請看一個實例:
             1 #include<iostream>
             2 #include<string>
             3 using namespace std;
             4 
             5 class GradeBook  //定義類
             6 {
             7 public:
             8     GradeBook(string name)//定義了GradeBook類的一個構造函數,有一個string形參name,與下面的形參name名字相同,但互不干擾
             9     {
            10         setCourseName(name);//調用函數賦值,構造函數的好處是:只是簡單調用,要改變時只需對被調用函數進行修改
            11     }
            12 
            13     void setCourseName(string name)//這個函數的形參為name
            14     {
            15         courseName=name;
            16     }
            17     string getCourseName()
            18     {
            19         return courseName;
            20     }
            21 
            22     void displayMessage()
            23     {
            24         cout<<"Welcome to the grade book for\n"<<getCourseName() //下面的main()函數中,沒有調用getCourseName()函數
            25             <<"!"<<endl;
            26     }
            27 private:    // 私有的,在這個成員訪問說明符之后聲明的變量或者函數,只可以被聲明它們的類的成員函數所訪問
            28     string courseName;
            29 };
            30 
            31 int main()
            32 {
            33     GradeBook gradeBook1("CS101 Introduction to C++ Programming"); //創建類的對象,并把實參賦予形參name
            34     GradeBook gradeBook2("CS102 Data Structures in C++");
            35 
            36     cout<<"gradeBook1 created for course: "<<gradeBook1.getCourseName()   //調用類的成員函數getCourseName(),初始化類的對象
            37         <<"\ngradeBook2 created for course: "<<gradeBook2.getCourseName()<<endl;
            38 }
            39 
            40 


            PS:1)為類提供默認構造函數的兩種方法:編譯器隱式地在沒有定義構造函數的類中創建一個默認的構造函數,這樣的默認構造函數不初始化類的數據成員,而是調用其他類的對象的每個數據成員的默認構造函數。沒有初始化的變量通常包含“垃圾”值。
              程序員顯式定義一個不接受實參的構造函數。

            2)除非沒有必要初始化類的數據成員(幾乎不可能),否則請提供構造函數,這樣可以保證當類的每一個新對象被創建時,類的數據成員都用有意義的值進行了初始化。






                      

            posted @ 2011-09-22 00:01 hoshelly 閱讀(2224) | 評論 (0)編輯 收藏

            先給出一個程序,C++寫成。
            #include<iostream>
            int main()
            {
                
            int number1;
                
            int number2;
                
            int sum;
                std::cout
            <<"Enter first integer:\n";
                std::cin
            >>number1;
                std::cout
            <<"Enter second integer:\n";
                std::cin
            >>number2;
                sum
            =number1+number2;
                std::cout
            <<"Sum is"<<sum<<std::endl;//輸出變量sum;
                
            return 0;
            }


            std::cout是標準輸出流對象,通常“連接”到屏幕;雙尖括號<<運算符稱為流插入運算符,顯示輸入的值;
            std::cin是輸入流對象,流提取運算符>>是來獲取鍵盤輸入的值。
            std::endl輸出一個換行符,然后“刷新輸出緩沖”。簡單來說,在一些系統中,輸出在機器中積存,直到積累到“值得”輸出到屏幕上為止;而std::endl 則強制顯示所有積存的輸出。

            運算符的優先級規則。
            1)圓括號具有最高的優先級;
            2)接下來是乘法、除法和求模運算(%)。
            3)最后是加法和減法運算。加法和減法具有相同的運算級。


            聲明:using std::cout;是一個using 聲明,它可以消除重復使用std::前綴的需要。
            更多程序員用using namespace std;使程序可以使用程序包含的任何標準的C++頭文件中的所有名字(如std)。


            例子:編寫一個完整的程序,計算并顯示三個整數的乘積。

            #include<iostream>
            using namespace std;
            int main()
            {
             int x;
             int y;
             int z;
             int result;
             cout<<"input three numbers:\n";
             cin>>x>>y>>z;
             result=x*y*z;
             cout<<"The product is "<<result<<endl;
             return 0;
            }

             


            posted @ 2011-09-19 23:22 hoshelly 閱讀(216) | 評論 (0)編輯 收藏

            要求:編寫一個遞歸函數,將一個整數n轉換為字符串,例如輸入483,應輸出字符串“483”。
            設計思想:設置一個字符型數組str,用于存放轉換后的字符串,因為遞歸函數中要反復使用它,所以將其設置為全局數組變量。要實現整數n轉換成字符串的遞歸轉換,首先要將n的個位數n%10轉換為字符,插入到str字符串的最前面,然后將除個位后的高位部分n/10按照相同的方式來轉換,直到要轉換的數為0結束。
            #include<stdio.h>
            #include
            <string.h>
            void IntToStr(int n);
            char str[80]={0};
            void main()
            {
                
            int num;
                printf(
            "input an integer number:");
                scanf(
            "%d",&num);
                IntToStr(num);
                printf(
            "The string is:%s\n",str);
            }

            void IntToStr(int n)
            {
                
            int i;
                
            if(n==0)//整數為0時,遞歸結束
                    return;
                
            for(i=strlen(str)-1;i>=0;i--//將字符串整個往后移一個字符
                    str[i+1]=str[i];
                str[
            0]=n%10+0x30;  //將該數的個位數轉換成字符放在字符數組的第一個元素的位置,+0x30表示十六進制的0,其實可以不加

                IntToStr(n
            /10);//將該數的商,即除個位外的其他數通過遞歸轉換
            }

            //遞歸過程:例如輸入n=148,那么第一次遞歸時,str[0]存放的數是8,n/10=14,得到第二次遞歸的數是14;
            //8原先存儲在str[0],但第二次遞歸向后移動一個字符,變成存在str[1]內,而4存在str[0]內;
            //第三次遞歸時,同理可知8放在str[2],4放在str[1],而1放在str[0],這樣就將148轉換為字符串。


            posted @ 2011-09-18 21:03 hoshelly 閱讀(382) | 評論 (0)編輯 收藏

            注:斐波納契數列的第一項和第二項的值都為1,以后各項的值為其前兩項值之和。所以要計算第n項的值F(n),可以列出遞歸式F(n)=F(n-1)+F(n-2),當n=1或n=2時,其值為1;

            用C語言代碼表示如下:


            #include<stdio.h>
            long F(int n);
            void main()
            {
                
            int i;
                
            for(i=1;i<=40;i++)
                {
                    printf(
            "F(%2d)=%-9ld",i,F(i));
                    
            if(i%4==0)
                    printf(
            "\n");
                }
            }

            long F(int n)//求第n項的值
            {
                
            if(n<=2)
                    
            return (1);
                
            return(F(n-1)+F(n-2));
            }



            posted @ 2011-09-18 15:27 hoshelly 閱讀(1081) | 評論 (0)編輯 收藏

             冒泡排序的基本概念:
            依次比較相鄰的兩個數,將小數放在前面,大數放在后面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放后。然后比較第2個數和第3個數,將小數放前,大數放后,如此繼續,直至比較最后兩個數,將小數放前,大數放后。至此第一趟結束,將最大的數放到了最后。在第二趟:仍從第一對數開始比較(因為可能由于第2個數和第3個數的交換,使得第1個數不再小于第2個數),將小數放前,大數放后,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到一個新的最大數(其實在整個數列中是第二大的數)。如此下去,重復以上過程,直至最終完成排序。需要用二重循環排序。
            Example:
            #include<stdio.h>
            int main() 

                
            int i,j,temp,tag; 
                
            int a[11];  //數組第0位空出
                
            for(i=1;i<=10;i++
                scanf (
            "%d,",&a[i]); 
                
            for(j=1;j<=10;j++
                

                   tag
            =1;
                   
            for (i=1;i<=10-j;i++
                   
            {
                    
            if (a[i]>a[i+1]) 
                   

                       temp
            =a[i]; 
                       a[i]
            =a[i+1]; 
                       a[i
            +1]=temp;
                       tag
            =0;
                   }
             
                   }


                   
            if(1==tag)
                   
            {
                     
            break;
                   }

                }

                    
            for(i=0;i<10;i++)
                        printf(
            "%5d",a[i]);
                        
            return 0;
            }




            以下是選擇排序法:

            每次外循環先將定位元素的小標i值記錄到K,認為a[k]是最小值,第一輪比較時,若遇到比a[k]更小的數,則交換兩數的下標,由下面的if語句進行交換處理。
            這樣第一輪就選出了最小的數,第二輪,同理選出次小的數排在最小的數后面。如果是輸入10個數,那么進行9輪排序后就可完成整個排序過程。



            #include<stdio.h>//選擇排序法
            void main()
            {
                
            int i,j,t,a[10],k;
                printf(
            "input 10 numbers:\n");
                
            for(i=0;i<10;i++)
                scanf(
            "%d",&a[i]);

                
            for(i=0;i<9;i++)//這里也要注意i=0;i<9;
                {
                    k
            =i;
                    
            for(j=i+1;j<10;j++)
                        
            if(a[k]>a[j])
                            k
            =j;

                        
            if(k!=i)//如果k不等于i,改變了,則交換兩個數的位置
                        {
                            t
            =a[i];
                            a[i]
            =a[k];
                            a[k]
            =t;
                        }
                }
                
            for(i=0;i<10;i++)//最后輸出已經排好序的數
                    printf("%5d",a[i]);
            }




            PS:大一剛開始接觸這兩個排序算法時,感覺有點亂,現在回過頭來仔細看,思路清晰了不少。時刻回顧過去的知識,進行整理,再認識,很重要呀。:-D












            posted @ 2011-09-17 16:53 hoshelly 閱讀(351) | 評論 (0)編輯 收藏

            輾轉相除法,又名歐幾里得算法,是求最大公約數的算法。

            原理及其詳細證明

              設兩數為a、b(b<a),用gcd(a,b)表示a,b的最大公約數,r=a mod b 為a除以b以后的余數,輾轉相除法即是要證明gcd(a,b)=gcd(b,r)。
              第一步:令c=gcd(a,b),則設a=mc,b=nc
              第二步:根據前提可知r =a-kb=mc-knc=(m-kn)c
              第三步:根據第二步結果可知c也是r的因數
              第四步:可以斷定m-kn與n互素【否則,可設m-kn=xd,n=yd,(d>1),則m=kn+xd=kyd+xd=(ky+x)d,則a=mc=(ky+x)dc,b=nc=ycd,故a與b最大公約數成為cd,而非c】
              從而可知gcd(b,r)=c,繼而gcd(a,b)=gcd(b,r)。
              證畢。

            用C表示則:

                 int gcd(int a,int b)
              {
              int temp;
              if(a<b)/*交換兩個數,使大數放在a上*/
              {
              temp=a;
              a=b;
              b=temp;
              }
              while(b!=0)/*利用輾除法,直到b為0為止*/
              {
              temp=a%b;
              a=b;
              b=temp;
              }
              return a;
              }




            posted @ 2011-09-17 02:00 hoshelly 閱讀(2421) | 評論 (0)編輯 收藏

            算法分析:因為對于a與b兩個數,當a>b時,如果a中含有與b相同的公約數,則a-b也含有與b相同的公約數,反復循環,直到a和b相等為止,這時a或b就是它們的最大公約數。

             1 #include<stdio.h>
             2 int Maxcommonfactor(int a,int b);
             3 void main()
             4 {
             5     int a,b,c;
             6     printf("input two integer number:");
             7     scanf("%d%d",&a,&b);
             8     c=Maxcommonfactor(a,b);
             9     if(c!=-1)
            10         printf("The biggest common factor of %d and %d is %d\n",a,b,c);
            11     else
            12         printf("The biggest common factor of %d and %d isn't exist\n",a,b);
            13 }
            14 int Maxcommonfactor(int a,int b)
            15 {
            16     if(a<=0||b<=0)
            17         return(-1);
            18     while(a!=b)
            19     {
            20         if(a>b)
            21             a=a-b;
            22         else if(b>a)
            23             b=b-a;
            24     }
            25     return(a);//返回的值為最大公約數
            26 }
            27 
            28 


            posted @ 2011-09-16 18:35 hoshelly 閱讀(1088) | 評論 (0)編輯 收藏

             

             1 #include<stdio.h>
             2 #include<math.h>
             3 int pdss(int number);//定義一個函數,判斷一個數是 否為素數
             4 int main()
             5 {
             6     int n;
             7     printf("input the integer:\n");
             8        scanf("%d",&n);
             9     if(pdss(n))//如果是1,輸出素數
            10        printf("%d 是素數.",n);
            11     else
            12        printf("%d 不是素數.",n);
            13     return 0;
            14 }
            15 
            16 int pdss(int number)
            17 {
            18     int i;
            19     if(number<=1)
            20         return 0;
            21     for(i=2;i<=sqrt(number);i++)//檢驗一個數為素數時,用其平方根小或等于的數去整除所輸入的數,即可判斷。為什么?
            22         if(number%i==0)
            23         return 0;
            24         else 
            25         return 1;
            26         return 0;
            27 }
            28 

             

            posted @ 2011-09-16 14:31 hoshelly 閱讀(874) | 評論 (0)編輯 收藏

            僅列出標題
            共12頁: First 4 5 6 7 8 9 10 11 12 
            久久国产乱子伦免费精品| 亚洲va中文字幕无码久久| 精品久久久久久国产| 久久99精品国产麻豆不卡| 久久精品国产一区二区三区| 国产精品免费久久久久久久久| 国产无套内射久久久国产| 久久免费看黄a级毛片| 国产亚洲精久久久久久无码| 国内精品久久久久久久coent | 久久精品国产福利国产琪琪| 亚洲伊人久久成综合人影院| 国内精品久久久久影院一蜜桃| 亚洲午夜福利精品久久| 日韩一区二区久久久久久| 久久丫忘忧草产品| 亚洲乱亚洲乱淫久久| 国内精品久久久久久99| 久久人妻AV中文字幕| 人妻中文久久久久| 久久国产影院| 久久强奷乱码老熟女网站| 狠狠色丁香久久综合婷婷| 久久亚洲美女精品国产精品| 久久久这里有精品| 中文精品99久久国产| 久久人人爽人人爽AV片| 亚洲AⅤ优女AV综合久久久| 久久无码精品一区二区三区| 国产真实乱对白精彩久久| 精品久久久久久久| 亚洲国产精品久久久久婷婷软件| 久久久久国产一级毛片高清版| 久久99亚洲网美利坚合众国| 亚洲精品无码久久一线| 伊人久久综合无码成人网| 亚洲第一极品精品无码久久| 国产精品天天影视久久综合网| 99精品伊人久久久大香线蕉| 国产精品美女久久久久网| 久久国产精品久久|