天之道

享受编程的乐趣。
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 阅读(2193) | 评论 (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 阅读(201) | 评论 (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 阅读(366) | 评论 (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 阅读(1058) | 评论 (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 阅读(329) | 评论 (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 阅读(2408) | 评论 (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 阅读(1068) | 评论 (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 阅读(861) | 评论 (0)编辑 收藏

仅列出标题
共12页: First 4 5 6 7 8 9 10 11 12