注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

又一个部落格

换过很多备忘录,不知道这本怎么样!

 
 
 

日志

 
 

函数  

2010-02-03 16:54:13|  分类: c++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 return-type name(parameter-list) { // body of function }
注意:在使用函数之前要定义原型,这样编译器才能知道函数的返回值以及参数,main不需要,因为这个是预定义的
     endl 和 "\n" 效果一样
    #include <iostream>
    using namespace std;

    void myfunc();

    int main() {
        cout << "In main." << endl; // prints !!!Hello World!!!
        myfunc();
        cout << "Back in main." << endl; // prints !!!Hello World!!!
        return 0;
    }

    void myfunc(){
        cout << "In myfunc." << endl;
    }
函数的返回值
函数不能返回数组
如果一个 non-void 返回值 的函数,在函数体中没有return 语句 返回只是 1

局部变量是指申明在 {}之间的变量
 A variable that is declared inside a block is called a local variable
局部变量的声明周期也就是在 从声明开始 到 } 之间
函数的参数是函数内的本地变量

全局变量
全局变量是指申明在所有的函数体外的变量
全局变量如果没有被初始化 那么值为0
    char i;
    int main() {
        if (i == 0)
            cout << 1;
    }

函数参数
传数组
当一个数组作为参数是,实际上是传递了数组的第一个元素的地址
个人认为传递数组有个很严重的问题,怎么知道这个数组有多大?
有三种方式可以接受数组参数
第一种 相同类型和大小数组参数
    void func(int i[10]);

    int main() {
        int t[10];
        func(t);
        cout<< t[0];
    }

    void func(int i[10]){
        i[0] = 1;
    };
第二种 相同类型数组参数
    void func(int i[]);

    int main() {
        int t[10];
        func(t);
        cout<< t[0];
    }

    void func(int i[]){
        i[0] = 1;
    };

以上两种,虽然参数申明的是一个数组,实际上编译器会把它转换成 形同类型的指针.
第三种 申明同类型的指针, 这个是最常见的方法
    void func(int i[10]);

    int main() {
        int t[10];
        func(t);
        cout<< t[2];
    }

    void func(int *i){
        *(i + 2) = 1;
    };
    
字符串参数
前面提到过,字符串其实是一个char的数组,所以当参数传递时,实际上是传递了一个char的指针

指针返回值
指针返回值用在比如要返回一个字符串时候使用比较多

main()函数
一个c++程序之允许一个main函数
main函数有两个内置的 ,但是是可选的参数(argc 和 argv,其实名称可以自定义,但是这两个是 很多人使用的,公认的参数,没有必要修改它),可能还有一些参数支持在不同的操作系统中

argc
    是一个整数,保存了在命令行参数的个数,它总是至少1,因为该程序的名称作为第一个参数的资格.

argv
    是一个字符串指针数组的指针,数组中的每个字符串的指针指向一个字符串包含一个命令行参数。
    argv[0] 表示程序名称
    argv[1] 表示第一个参数
如果是整数参数会被强制转换成字符
    #include <iostream>
    using namespace std;

    int main(int argc, char *argv[]){
        for(int i=0;i<argc;i++){
            cout << argv[i] <<endl;
        }
        return 0;
    }

假如传递了一个数字参数,系统会自动把他们转换成字符串,那么通常会使用下面3个函数转回来
    #include <cstdlib>
    atof()    string ==> double
    atol()    string ==> long int
    atoi()    string ==> int

函数原型
    type func-name(type parm_name1, type parm_name2,..., type parm_nameN);
函数原型告诉了编译器3件事情
    1.返回值类型
    2.参数类型
    3.参数个数

函数原型 参数名称(parm_name) 其实是可选的 下面这个格式是合法的
    int a(int,char *);

函数原型并不一定需要, 假如函数定义在使用之前 就不需要定义函数原型

递归 Recursion
递归又名 循环定义 circular definition
一个函数调用自身被认为是递归.
通常情况下,递归速度比较慢,以为他们有很多的额外函数调用,开销很大.
有些的函数递归调用可能会导致堆栈溢出。因为函数的参数和局部变量存储在堆栈上,每个新的调用创建的这些变量的新副本,它有可能堆栈将被耗尽。
递归 通常用在快速排序方法上

快速排序法实现
    #include <iostream>
    #include <cstring>

    using namespace std;

    void quicksort(char * items, int len);
    void qs(char * items, int left, int right);

    int main() {
        char str [] = "oiuejdkfhvn";
        cout << "Original order: " << str << endl;
        quicksort(str, strlen(str));
        cout << "Sorted order: " << str << endl;
        return 0;
    }

    void quicksort(char * items, int len){
        qs(items, 0 , len-1);
    }

    void qs(char * items, int left, int right){
        int i,j;
        char x,y;

        i = left;
        j= right;

        x=items[(left+right)/2];

        do{
            while((items[i] < x) && (i<right)) i ++;
            while((x<items[j]) && (j>left)) j--;

            if(i<=j){
                y=items[i];
                items[i]=items[j];
                items[j]=y;
                i++;
                j--;
            }
        }while(i<=j);

        if(left<j)qs(items,left,j);
        if(i<right)qs(items,i,right);
    }

  评论这张
 
阅读(84)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017