zoukankan      html  css  js  c++  java
  • 12天学好C语言——记录我的C语言学习之路(Day 11)

    12天学好C语言——记录我的C语言学习之路

    Day 11:

    因为指针部分比较的难,所以我们花费的时间也是最长的,希望大家耐的住性子,多多理解,多多打代码。好了,废话不多说,来看第11天的学习。

    //编写一个求定积分的通用函数,分别求出x+1,2*x+3,x*x*x的定积分

    /*program 11.1
    #include <stdio.h>
    int main()
    {
        void djf(int x,int y,double (*p)(int,int));//大的函数也要有上下限做形参,因为我们调用的是大的函数,小函数是取大函数传入的值
        double h1(int x,int y);
        double h2(int x,int y);
        double h3(int x,int y);
        printf("please enter b(下限) and a(上限): ");
        int q,a,b;
        scanf("%d%d",&b,&a);
        printf("please choose 1/2/3 for this number: ");
        scanf("%d",&q);
        if (q==1) {
            djf(a,b,h1);
        }
        else if (q==2){
            djf(a,b,h2);
        }
        else if(q==3)
        {
            djf(a,b,h3);
        }
        else{
            printf("error!!!");
        }
        return 0;
    }
    void djf(int x,int y,double (*p)(int,int))
    {
        double result=(*p)(x,y);
        printf("%5.3lf",result);
    }
    double h1(int x,int y)
    {
        double res=0.5*x*x+x-0.5*y*y-y;
        printf("x+1 在 %d~%d 间的定积分等于: ",y,x);
        return res;
    }
    double h2(int x,int y)
    {
        double res=x*x+3*x-y*y-3*y;
        printf("2*x+3 在 %d~%d 间的定积分等于: ",y,x);
        return res;
    }
    double h3(int x,int y)
    {
        double res=0.25*x*x*x*x-0.25*y*y*y*y;
        printf("x*x*x 在 %d~%d 间的定积分等于: ",y,x);
        return res;
    }
    */

    一个小插曲,今天用Xcode写代码发现了一点需要注意的地方。(program 11.2)

    //小数是不会有错的,分数就会出错(一般来说,用小数去写代码比较稳妥)

    /*//program 11.2
    #include <stdio.h>
    int main()
    {
        float x=1,y=2;
        float c=0.5*y*y+y-0.5*x*x-x;//c=2.50
        float d=1/2*y*y+y-1/2*x*x-x;//c=1.00
        printf("%-5.2f   %-5.2f",c,d);
        return 0;
    }
    */

    再来看这个程序,这

    //有a个学生,每个学生有4门成绩,输入学生的学号,输出该学生的各科成绩(要建立一个返回指针值的函数,返回的指针值正好就是你要输出的那个学生的成绩的首地址,然后依次输出后面的3门成绩,这就是思路)

    /*//program 11.3
    #include "stdio.h"
    int main()
    {
        int a[][4]={{80,85,75,70},{65,70,75,80},{90,85,80,100},{50,66,12,67}};
        int *search(int (*p)[4],int n);//search是一个返回指针值的函数
        printf("please enter one number for a student: ");
        int m;
        scanf("%d",&m);
        int *f;
        f=search(a,m);//返回的是地址,也就是要用指针变量去接收返回值
        for(int i=0;i<4;i++)
        {
            printf("%d  ",*(f+i));//依次输出地址中的值,这里得加上空格输出啊,不然一串数字,我还以为是一串地址呢!!没错的程序愣说成有错了
        }
        return 0;
    }
    int *search(int (*p)[4],int n)
    {
        int *q=*(p+n-1);//将该行的首元素地址赋给指针变量q
        return q;//返回要输出的行的首地址
    }
    */

    //用返回指针值的函数search找出有不及格学科成绩的学生号码

    /*//program 11.4
     #include <stdio.h>
     int main()
     {
     float score[3][4]={{56,66,69,68},{68,66,76,66},{55,77,77,60}};
     float *p;
     float *search(float (*p2)[4]);//这里的参数是一维数组的地址,所以必须把*p2用括号括起来
     for (int i=0; i<3; i++) {
     p=search(score+i);//因为定义的参数是一维数组的地址,所以说这个地方调用也应该调用一维数组的地址,用定义的指针变量p接收这个一维数组的地址,然后在函数中遍历这个一维数组。
     if(p==*(score+i))//score是二维数组的数组名,所以要取一维数组的地址,就要加*,但是我们不一定是取这个二维数组的第一行一维数组,所以后面跟上+i,表示到底是第几行
     {
     printf("No.%d is bad! ",i+1);
     for (int j=0; j<4; j++) {
     printf("%-3.2f ",*(p+j));//这里还是要括起来,因为p就是指的该行的首地址了,所以要在该行的基础上+j才是对列的变化,如果是*p+j,那么指针便会指到下一行。
     }
     printf(" ");
     }
     }
     //printf("%f ",score[4]);
     //printf("%f",score[3]);
     return 0;
     }
     float *search(float (*p2)[4])
     {
     float *q;
     q=NULL;
     for (int j=0; j<4; j++) {
     if (*(*p2+j)<60) {//这个地方*p2就是传进来的一维数组的首地址,这里就可以看作该一维数组的首元素的地址了,然后j是表示是该行的哪个元素(列)的地址,然后括起来再加*,就表示的该元素的值,而不是地址了。
     q=*p2;
     }
     }
     return q;
     }
     */


    //定义一个指针数组name,然后将各字符串进行初始化,对他们进行排序(由小到大),然后输出。

    /*//program 11.5
     #include "stdio.h"
     #include "string.h"
     int main()
     {
     char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};//数组name中有五个元素,然后这个数组的初始值不是这五个元素,二十这五个元素的首地址,也就是这个数组存的是五个字符串的首地址。
     void sort(char *s[],int n);//字符串排序函数
     void point(char *s[],int n);//输出字符串函数
     sort(name,5);
     point(name,5);
     return 0;
     }
     void sort(char *s[],int n)
     {
     char *temp;
     int i,j,k;
     for (i=0; i<n-1; i++) {
     k=i;
     for (j=i+1; j<n; j++) {//找出从i+1个开始到最后一个里面最大的一个来
     if (strcmp(s[k],s[j])>0) {//这里不能改成if(*s[k]>*s[j]) k=j; 因为这样比较只能比较这两个地址所指向的字符串中的第一个字符,字符串的比较应该遵循strcmp函数(用strcmp函数的时候可以传入字符串的初始地址,也就是字符串中首字符的地址)
     k=j;//不断把当前一趟循环的较小值赋给k,因为这是由小到大排序的
     }
     }
     if(k!=i)
     {
     temp=s[k];//与s[k]交换其实就是和当前一趟最大的s[j]交换
     s[k]=s[i];//这里的s[k]和s[i]都是对地址的操作
     s[i]=temp;
     }
     }
     }
     void point(char *s[],int n)
     {
     for(int i=0;i<n;i++)
     {
     printf("%s ",s[i]);
     }
     }
     */

    指向指针数据的指针

    /*//program 11.6
    //指向指针数据的指针 char **p; (由于*是从右至左结合,所以相当于char *(*p); )
    #include "stdio.h"
    int main()
    {
        char **p;
        char *s[]={"BASIC","Computer games","Wangzhongyao","MaXingze","Tianhao Yue"};
        p=s+2;
        printf("%d ",*p);//以%d输出的是  3943
        printf("%s ",*p);//以%s输出的是  Wangzhongyao
        //*p就是引用的字符指针变量的值(因为p指向的是一个字符指针变量),所以上面两次输出,输出的都是和这个 字符指针变量(s[2]) 有关,一次输出的是地址,第二次输出的是以s[2]为首地址的字符串
        return 0;
    }
    */

    动态数组与指针

    /*//program 11.7
    //建立动态数组,输入5个学生的成绩,另外用一个函数检查有没有不及格成绩,输出不及格成绩
    #include "stdio.h"
    #include "stdlib.h"//malloc函数存在于这个头文件中
    int main()
    {
        void check(int *);
        int *p1,i;
        p1=(int *)malloc(5*sizeof(int));//开辟动态内存区,然后将地址转换成 int * 型,存放在p1中。
        for (i=0; i<5; i++) {
            scanf("%d",p1+i);
        }
        check(p1);
        return 0;
    }
    void check(int *p)
    {
        int j;
        for (j=0; j<5; j++) {
            if (*(p+j)<60) {
                printf("%d ",*(p+j));//这里也可以将*(p+j)换成p[j]输出
            }
        }
    }
    */

    一个小整合。

    //输入10个整数,将最小的数和第一个数对换,将最大的数和最后一个数对换。(写三个函数:①输入数据,②操作对换,③输出函数。用指针方法实现)
    /*program 11.8
    #include "stdio.h"
    int main()
    {
        int a[10];
        void scanf1(int *);//都是传进来地址参数,当然数组的首地址也能传进来咯
        void sort(int *);//声明时可以这样声明,但是在下面函数定义的时候必须在类型(int *)后面加上参数名。
        void print(int *);
        scanf1(a);
        sort(a);
        print(a);
        return 0;
    }
    void scanf1(int *b)
    {
        printf("please enter 10 numbers: ");
        for (int i=0; i<10; i++) {
            scanf("%d",&b[i]);
        }
    }
    void sort(int *b)
    {
        
        int *p=b;
        int *max=b+9;
        int *min=b;
        int temp;
        int i=0;
        for (; p<b+9; p++) {
            if (*max<p[i]) {//因为b接收的是数组的受地址,而p又指向b,所以自然可以写成p[i]这种形式。(这里比较均是比较的地址中的 值。)
                max=&p[i];//max=p; 可否? 答案当然是肯定的。因为max接收的就是一个地址,这个地址是满足上面if语句条件的临时地址,满足即存入。(这里均是对地址进行操作)
            }
            if (*min>p[i]) {
                min=&p[i];
            }
        }
        if (max!=b+9)//上面的操作完毕后,将合适地址中的值在下面进行交换
        {
            temp=*max;
            *max=*(b+9);
            *(b+9)=temp;
        }
        if (min!=b) {
            temp=*min;
            *min=*b;
            *b=temp;
        }
    }
    void print(int *b)
    {
        int *q=b;
        for (; q<b+10; q++) {
            printf("%d  ",*q);
        }
    }
    */

    第11天的学习结束了,大家还对指针这个东西迷惑么。我觉得头脑发热是肯定的,不过大家肯定也尝到的解决问题的快乐了吧!

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    canvas 文本坐标(0,0)显示问题
    canvas 图片跨域处理
    canvas 文字换行
    什么是柯理化函数?
    记录一下学习webpack原理的过程
    pika和kombu实现rpc代码
    pika和rabbitMQ实现rpc代码
    docker部署rabbitMQ
    rabbitMQ和pika模块
    ubuntu搭建关于amd64或arm64,armhf架构的本地apt源
  • 原文地址:https://www.cnblogs.com/wzy294250051/p/4787904.html
Copyright © 2011-2022 走看看