• Coursera课程笔记----C程序设计进阶----Week 6


    指针(三)(Week 6)

    指针与函数

    指针用做函数参数

    • 虽然仍是值传递,但这里的值变成了“地址”,所以数据本身会发生变动
    • 可否将数组名作为实参赋给指针型形参?
      • 可以
    • 可否将数组名当作形参来处理
      • 可以,C++编译器会将形参数组名作为指针变量来处理
    • 如何限制指针的功能
      • const int array[]
      • 指向符号常量的指针
        • 符号常量:const 数据类型 常量名 = 常量值;
        • 不能修改其指向区域的内容,但可以让他指向别的地方(只读的感觉)

    指针用做函数返回值

    • 函数的返回值可以是多种类型

      • 返回整型数据的函数
        • int max(int x, int y);
      • 返回指针类型数据的函数
        • int *****function(int x, int y);
        • 注意:若返回局部变量的地址,会产生不可预料的结果
        • 返回一个处于生命周期的变量的地址,是安全的
          • 返回全局变量的地址
          • 返回静态局部变量的地址
    • 静态局部变量

      • 函数中的局部变量的值在函数调用结束后不消失而保留原值
        • 即其占用的存储单元不释放,在下一次该函数调用时,仍可以继续使用该变量
      • 用关键字static进行声明
      • 静态变量的有效范围:变量定义开始,到整个程序结束

    总结

    • 指针与函数
      • 指针用做函数参数
        • 函数拿到地址可对其所指内容进行修改
        • 可以使用const来限制指针的功能
      • 指针用做函数返回值
        • 必须确保函数返回的地址是有意义的
        • 返回全局变量或静态局部变量

    编程作业

    Quiz1 分配病房

    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    void outputer(int a, double b)
    {
        if(a<1000 && a>=100)
            cout<<a<<' ';
        else if(a<100 && a>=10)
            cout<<"0"<<a<<' ';
        else if(a<10 && a>=0)
            cout<<"00"<<a<<' ';
    
        cout<<fixed<<setprecision(1)<<b<<endl;
    }
    
    int main()
    {
        int num;
        double stanard;
        cin >> num >> stanard;
    
        int numIll[50]={''};
        double numLevel[50]={''};
    
        for (int i = 0; i < num; i++) {
            cin >> numIll[i] >> numLevel[i];
        }
    
        for (int i = 0; i < num-1; i++) {
            for (int j = 0; j < num-i-1; j++) {
                if(numLevel[j] < numLevel[j+1])
                {
                    double temp1 = numLevel[j];
                    numLevel[j] = numLevel[j+1];
                    numLevel[j+1] = temp1;
                    int temp2 = numIll[j];
                    numIll[j] = numIll[j+1];
                    numIll[j+1] = temp2;
                }
            }
        }
    
        if(numLevel[0] < stanard)
        {
            cout<<"None."<<endl;
            return 0;
        }
    
        for (int i = 0; i < num; i++)
        {
            if(numLevel[i] >= stanard)
                outputer(numIll[i],numLevel[i]);
            else
                break;
        }
    
        return 0;
    }
    

    Quiz2 配对碱基链

    #include <iostream>
    using namespace std;
    int main()
    {
        int n;
        cin >> n;
        char *all[n];
        char after[1000][256] = {''}; //组数要足够大
        cin.get();
    
    
        for (int i = 0; i < n; i++) {
            char before[256] = {''};
            cin.getline(before,256,'
    ');
    
            for (int j = 0; j < 255; j++) {
                if(*(before + j) == 'A')
                    *(after[i] + j) = 'T';
                else if(*(before + j) == 'T')
                    *(after[i] + j) = 'A';
                else if(*(before + j) == 'G')
                    *(after[i] + j) = 'C';
                else if(*(before + j) == 'C')
                    *(after[i] + j) = 'G';
                else if(*(before + j) == '')
                    break;
            }
            *(all+i) = after[i];
        }
    
        for (int i = 0; i < n; i++) {
            cout<<*(all+i)<<endl;
        }
        return 0;
    }
    

    Quiz3 寻找山顶

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int m,n;
        int moun[20][20] = {''};
        int x[200],y[200];
        int count = 0;
        cin >> m >> n;
    
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                cin >> moun[i][j];
            }
        }
    
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                int flag = 0;
                if(j != 0)
                {
                    if(moun[i][j-1] > moun[i][j])
                        flag = 1;
                }
                if(j != n-1)
                {
                    if(moun[i][j+1] > moun[i][j])
                        flag = 1;
                }
                if(i != 0)
                {
                    if(moun[i-1][j] > moun[i][j])
                        flag = 1;
                }
                if(i != m-1)
                {
                    if(moun[i+1][j] > moun[i][j])
                        flag = 1;
                }
    
                if(flag == 0)
                {
                    x[count] = i;
                    y[count] = j;
                    count++;
                }
            }
        }
    
        for (int i = 0; i < count; i++) {
            cout<<x[i]<<' '<<y[i]<<endl;
        }
    
        return 0;
    }
    
  • 相关阅读:
    (转)Linux netstat命令详解
    4G模块*99#拨号上网
    (转)Linux系统-tcpdump常用抓包命令
    (转)Makefile介绍
    导航和渲染首页文章列表
    删除项目开发中的.pyc文件
    django之media配置
    基于Ajax提交formdata数据、错误信息展示和局部钩子、全局钩子的校验。
    点击头像上传文件的效果
    使用python实现滑动验证码
  • 原文地址:https://www.cnblogs.com/maimai-d/p/12863674.html
Copyright © 2020-2023  润新知