C语言 编程例子

goto

无条件跳转语句,通常跟if语句配合使用,goto跳转,只能在当前函数内跳转


int main(int argc, const char * argv[]){
    int n;
    scanf("%d",&n);
     number:
     if (n<10) {
        n++;
        goto number;
    }
    return 0;
}

goto 求1~100的和


int main(int argc, const char *argv[])
{
    int i=1,sum=0;
number:
    sum+=i;
    i++;
   if (i<=100) {
      
        goto number;
    }
   
   printf("sum = %d\n", sum);
   return 0;
}


goto 错误写法

    void print(void)//错误写法
    {
    number:
        printf("hello world\n");
    }
    
    int main(int argc, const char *argv[])
    {
        int i;
        scanf("%d",&i);
        if (i<10) {
    
            goto number;
        }
        return 0;
    }


统计输入字符个数

ahangxueming\n


int main(int argc, const char *argv[])
    {
        char ch;
        int count=0;
        while (scanf("%c",&ch),ch!='\n') {
            count++;
        }
        printf("count = %d", count);
        printf("%c",ch);
        return 0;
    }
    
    int main(int argc, const char *argv[])
    {
        int count=0;
        while (getchar()!='\n') {
            count++;
        }
        printf("count = %d\n",count);
    
        return 0;
    }

 条件语句 if(num) 如果num>0 就为真

int main(int argc,const char *argv[])
    {
        int num;
        int ret;
        ret = scanf("%d",&num);
        if (ret) {
            printf("Y\n");
        }
        else
        {
            printf("N\n");
        }
        return 0;
    }

while和do-while的区别

   do

    {

        环体语句列表;

    

    }while(件表达式);

    执行循环语句体,判断表达式是否成立,达式成立,继续执行循环语句体,到表达式不成立,退出循环

 1-100内的奇数的和(dowhile做)

int main(int argc,const char *argv[])
    {
        int i=1,sum=0;
        do{
            if (i%2)
            {
                sum+=i;
            }
            i++;
        }while (i<100);
    
        printf("sum = %d\n", sum);
    
        return 0;
    }


for

for (初始化表达式;条件表达式自增自减表达式) {

    循环语句体;

}


for的初始条件,自增条件,和条件表达式都可以省略

 //输入一个整数,求他的各位数字之和.如:178,数字之和为1+7+8 = 16
    int main(int argc,const char *argv[])
    {
        int num;
        int sum=0;
        scanf("%d", &num);
    
        for (; num!=0; )
        {
            sum+=num%10;
            num/=10;
        }
        printf("sum = %d\n", sum);
        return 0;
    }

  //for( ; ; ;)演示
    int main(int argc,const char *argv[])
    {
        int i=0;
        for (; ; )
        {
            if (i<10)
            {
                printf("hello world\n");
            }
            else
            {
                break;
            }
            i++;
        }
        return 0;
    }

break, continue

    continue : 结束当次循环,继续执行下一次循环

    break: 跳出当前对应的整个循环,但是只能跳出一层循环


    int main(int argc,const char *argv[])
    {
        for (int i=0; i<10; i++)
        {
            if (i==5) {
                continue;
                //break;
            }
            printf("i =%d ",i);
            printf("hello world\n");
        }
        putchar('\n');
    
        return 0;
    }


编程例子

  九乘法表

    1*1=1

    1*2=2 2*2=4

    1*3=3 2*3=6  3*3=9

    1*4=4 2*4=8  3*4=12 4*4=16

    1*5=5 2*5=10 3*5=15 4*5=20 5*5=25

    1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36

    1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49

    1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64

    1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72

 int main(int argc, const char *argv[])
    {
        int i, j;
        for (i=1; i<=9; i++) {
            for (j=1; j<=i; j++) {
                printf("%d*%d=%2d  ",j,i,j*i);
            }
            printf("\n");
        }
        return 0;
    }

1~100内所有的素数

    int main(int argc,const char *argv[])
    {
        int i,j;
        for (i=1; i<=100; i++) {
            //判断i是否为素数
            for (j=2; j<i; j++) {
                if (!(i%j)) {
                    break;
                }
            }
            if (j!=i) {
                continue;
            }
            printf("%d ",i);
        }
        printf("\n");
    
        return 0;
    }

   母金字塔1

    输入:F

    \

    输出

         F

        EFE

       DEFED

      CDEFEDC

     BCDEFEDCB

    ABCDEFEDCBA

    

 int main(int argc,constchar *argv[])
    {
        char ch;
        scanf("%c",&ch);
        
        int i,j;
        for (i=0; i<ch-'A'+1; i++) {
            for (j=ch-'A'-i; j>0 ; j--)
            {
                printf(" ");
            }
            
            for (j=i; j>=0; j--) {
                printf("%c",ch-j);
            }
            
            for (j=0; j<i; j++) {
                printf("%c", ch-1-j);
            }
            printf("\n");
        }
        
        return 0;
    }


    母金字塔2

    流程控制(for循环)输入一个大写字母,如F

    比如:

    输入:F

    输出:

    

         A

        ABA

       ABCBA

      ABCDCBA

     ABCDEDCBA

    ABCDEFEDCBA


 int main(int argc,const char *argv[])
    {
        char ch;
        scanf("%c", &ch);
    
        for (int i=0; i < ch-'A'+1; i++) {
            for (int j = ch-'A'-i; j>0; j--) {
                printf(" ");
            }
            for (int j=0; j<=i; j++) {
                printf("%c",'A'+j);
            }
            for (int j=i; j>0; j--) {
                printf("%c",'A'+j-1);
            }
            printf("\n");
        }
    
    
        return 0;
    }

母金字塔3


    入一个大写字符,如F

    比如

    输入:F

    输出

    

    FEDCBA

     EDCBAB

      DCBABC

       CBABCD

        BABCDE

         ABCDEF


int main(int argc, const char *argv[])
    {
        char ch;
        scanf("%c",&ch);
    
        for (int i=0; i<ch-'A'+1; i++) {
            for (int j=i; j>0; j--) {
                printf(" ");
            }
            for (int j=i; j<ch-'A'+1; j++) {
                printf("%c", ch-j);
            }
            for (int j=0; j<i; j++) {
                printf("%c",'A'+1+j);
            }
            printf("\n");
        }
        return 0;
    }


    字母金字塔四

    输入一个大写字母,如F

    比如:

    输入:F

    输出:

    A

    ABA

    ABCBA

    ABCDCBA

    ABCDEDCBA

    ABCDEFEDCBA

    

    输入:C

    输出:

    A

    ABA

    ABCBA


int main(int argc,const char *argv[])
    {
        char ch;
        scanf("%c",&ch);
        for (int i=0; i<ch-'A'+1; i++) {
            for (int j=0; j<=i; j++) {
                printf("%c", 'A'+j);
            }
            for (int j=i; j>0; j--) {
                printf("%c",'A'+j-1);
            }
            printf("\n");
        }
        return 0;
    }

        

      字母金字塔五

        输入一个大写字母,如 F,输出

        比如:

        输入:F

        输出:

        F

        EFE

        DEFED

        CDEFEDC

        BCDEFEDCB

        ABCDEFEDCBA

        

        输入:D

        输出:

        D

        CDC

        BCDCB

        ABCDCBA   

      

  #include <stdio.h>
        int main(int argc,const char *argv[])
        {    char ch;
            int i,j;
            scanf("%c",&ch);
            for(i=0;i<ch-'A'+1;i++)
            {
                for(j=i;j>=0;j--){
                    printf("%c",ch-j);
                }
        
                for (j=0;j<i; j++) {
                    printf("%c",ch-j-1);
                }
        
                printf("\n");
            }
        
            return 0;
        }

字母金字塔六

        

        使用嵌套循环产生下列图案:输入底边长 n

        比如:

        输入:F

        输出:

        F

        FE

        FED

        FEDC

        FEDCB

        FEDCBA

        

        输入:C

        输出:

        C

        CB

        CBA

        

        
        #include <stdio.h>
        int main(int argc,const char *argv[])
        {    char ch;
            int i,j;
            scanf("%c",&ch);
            for(i=0;i<ch-'A'+1;i++)
            {
                for(j=0;j<=i;j++){
                    printf("%c",ch-j);
                }
        
        
                printf("\n");
            }
        
            return 0;
        }


        



 斐波那契数列1

    输出数字序列2/13/25/38/513/821/13...,输出个数由键盘输入。注意输入使用scanf输入

    比如:

    

    输入 3输出为

    

    2/1

    3/2

    5/3

    

    输入 4 输出为

    2/1

    3/2

    5/3

    8/5


int main(int argc,const char *argv[])
    {
        for (int i=0; i<10; i++)
        {
            if (i==5) {
                continue;
                //break;
            }
            printf("i =%d ",i);
            printf("hello world\n");
        }
        putchar('\n');
    
        return 0;
    }

 斐波那契数列2

出数字序列 123581321...,输出个数由键盘输入。注意输入使用scanf输入

    比如

    输入 3输出为

    

    1

    2

    3

    

    输入 4 输出为

    1

    2

    3

    5


int main(int argc,const char *argv[])
    {
        int a=1,b=0;
        int n;
        scanf("%d",&n);
    
        for (int i=0; i<n; i++) {
            printf("%d ", a+b);
            int temp;
            temp = a;
            a=a+b;
            b=temp;
        }
        putchar('\n');
        return 0;
    }

   斐波那契数列3

     输出斐波那契数列的前20

     1 1 2 3 581321345589 ....

     a[n]=a[n-1]+a[n-2]

        
        int main(int argc,const char *argv[])
        {
            int a[20]={1,1};
            for (int i=2; i<20; i++) {
                a[i]=a[i-1]+a[i-2];
            }
        
            for (int i=0; i<20; i++) {
                printf("%d ", a[i]);
            }
            printf("\n");
        
            return 0;
        }

 斐波那契数列4 递归法

 int fabonaci(int n)
    {
        if (n==1 || n==2) {
            return 1;
        }
        return fabonaci(n-1)+fabonaci(n-2);
    }
    
    int main(int argc,const char *argv[])
    {
        for (int i=1; i<=50; i++) {
            printf("%d ",fabonaci(i));
        }
        printf("\n");
        return 0;
    }




不借助第三个变量交换两个变量的值

int main(int argc, const char *argv[])
    {
        int a=3, b=5;
    
        a=a+b;//a=8;
        b=a-b;//b=3;
        a=a-b;//a=5;
        printf("a=%d b=%d\n",a, b);
        return 0;
    }

求阶乘 输入n(int类型),打印1!+2!+3!+4!+5!+。。。+n!的值

    int main(int argc,const char *argv[])
    {
        int Sn=0;
        int n;
        int temp=1;
        scanf("%d",&n);
    
        for (int i=1; i<=n; i++)
        {
            temp=i*temp;
            Sn+=temp;
        }
        printf("Sn = %d\n", Sn);
    
        return 0;
    }

辗转相除法求最大公约数

    a    b

    319 377    ---319

    a    b

    377 319    ---58

    a    b

    319  58    ---29

    a    b

    58   29    ---0

    a    b

    29   0

    

     300 480  300

     480 300  180

     300 180  120

     180 120  60

     120 60   0

     60  0


int main(int argc, const char *argv[])
    {
        int a, b;
        scanf("%d%d",&a,&b);
        while (b!=0) {
            int temp;
            temp = a%b;
            a=b;
            b=temp;
        }
        printf("最大公约数%d\n",a);
    
        return 0;
    }

用递归法求最大公约数

  如果a除以b能整除,则最大公约数是b。

    

    否则,最大公约数等于b和a%b的最大公约数。


int euclid(int a,int b)
    {
        if(a%b==0)
        {
            return b;
        }
        return euclid(b, a%b);
    }
    
    int main(int argc,const char *argv[])
    {
        printf("%d\n", euclid(319, 377));
    
        return 0;
    }


序输出两个大写字母之间的字母序

    比如

    输入 U Y

    输出为

    Y

    X

    W

    V

    U

    输入 V X 输出为

    X

    W

    V

 #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc,const char *argv[])
    {
        char ch1,ch2;
        scanf("%c %c",&ch1,&ch2);
        for (int i=0; i< abs(ch1-ch2)+1; i++) {
            if (ch1>ch2) {
                printf("%c ",ch1-i);
            }
            else
            {
                printf("%c ",ch2-i);
            }
        }
        printf("\n");
    
        return 0;
    }

整数逆置

   定一个 5 位的整数,将该数按照 10进制位逆置,

   例如给定 12345 变成  54321

    12320 变成2321

    

 

   int main(int argc,const char *argv[])
    {
        int num;
        scanf("%d",&num);
        if (num<10000 || num >99999)
        {
            return -1;
        }
        while (num%10==0)
        {
            num/=10;
        }
        while (num)
        {
            int temp = num%10;
            printf("%d",temp);
            num/=10;
        }
        printf("\n");
        return 0;
    }

    输入一个自然数n,统计 n! 末尾有多少个0?

    51  120   5*4*3*2*1

    10! 2        2*5*9*8*7*6*5*4*3*2*1

    15! 5 10 15  3

    25! 5 10 15 2025  6

    

  int main(int argc,const char *argv[])
     {
     int n;
     int count=0;
     scanf("%d", &n );
     for (int i=n/5; i>0; )
     {
     //        int temp=i;
     //        while (!(temp%5))
     //        {
     //            count++;
     //            temp/=5;
     //        }
     count+=i;
     i/=5;
     }
     printf("%d\n", count);
     
     return 0;
     }

   递增,递减序列

          输入十个数,任意相邻的两个数不同,输出所有的递增,递减序列

        比如:

        输入:1 598122130 -19

        输出:

        1 59

        9 8

        8 1221

        21 30 -1

        -1 9

        

        输入: 3 98 -114218 -302

        输出:

        3 9

        9 8 -11

        -11 421

        21 8 -3

        -3 02


    int main(int argc,constchar *argv[])
        {
            int arr[10];
            for (int i=0; i<10; i++) {
                scanf("%d", &arr[i]);
            }
            
            printf("%d ", arr[0]);
            for (int i=1; i<9; i++) {
                printf("%d ",arr[i]);
                if ((arr[i]>arr[i-1] && arr[i]>arr[i+1])||(arr[i]<arr[i-1]&&arr[i]<arr[i+1])  ) {
                    printf("\n");
                    printf("%d ",arr[i]);
                }
            }
            printf("%d\n",arr[9]);
            return 0;
        }

   计算字符宽度

        计算某个由英文、数字以及标点符号构成的数组的总宽度,其中英文字符的宽度为

        1cm,数字宽度为0.5cm、标点符号宽度为0.8cm。

                   

    //1.计算某个由英文、数字以及标点符号构成的数组的总宽度,其中英文字符的宽度为1cm,数字宽度为 0.5cm、标点符号宽度为 0.8cm。

    //2.接上题,如果规定行的宽度为 10cm,将某个字符长度超过 50 的字符串截断,恰好使 10cm宽的行能容纳。输出这个被截断的子数组。


float jugechar(char ch)
        {
            if ((ch>='A'&& ch<='Z') || (ch>='a'&&ch<='z'))
            {
                return 1.0;
            }
            else if (ch>='0'&&ch<='9')
            {
                return 0.5;
            }
            else
            {
                return 0.8;
            }
        }
      
        int main(int argc,constchar * argv[])
        {
            char str[100];
            float length=0.0;
            int i=0;
            /*scanf("%s",str);
             int len= (int)strlen(str);
             */
            while (scanf("%c",&str[i]),str[i]!='\n')
            {
                i++;
            }
            str[i]='\0';
            int len = i+1;
            
            for (i=0; i<len; i++) {
                length+=jugechar(str[i]);
                if (length>10) {
                    str[i]='\0';
                    break;
                }
            }
            
            printf("%s\n",str);
            return 0;
        }

 输出二项式系数

            1

           1  1

         1  2 1

        1  3 3 1

      1   4  6 41

    1  5  10  10  51


       
 int main(int argc,const char *argv[])
        {
            int a[10][10]={};
            
            for (int i=0; i<10; i++)
            {
                for (int j=0; j<=i; j++)
                {
                    if (j==i || j==0)
                    {
                        a[i][j]=1;
                    }
                    else
                    {
                        a[i][j]=a[i-1][j]+a[i-1][j-1];
                    }
                }
            }
            
            for (int i=0; i<10; i++) {
                printf("%*d",24-2*i, a[i][0]);
                for (int j=1; j<=i; j++) {
                    printf("%4d", a[i][j]);
                }
                printf("\n");
            }
            
            return 0;
        }

 n*n矩阵转置

        1 234    1534

        5 678 -> 2627

        3 259    3752

        4 723    4893


        void reverse(int *a[],int n)
        {
            for (int i=0; i<n; i++) {
                for (int j=i; j<n; j++) {
                    int temp = a[i][j];
                    a[i][j]=a[j][i];
                    a[j][i]=temp;
                }
            }
        }
        
        int main(int argc,constchar *argv[])
        {
            int a[3][3]={
                {1,2,3},
                {4,5,6},
                {7,8,9}
            };
            int *p[3];
            for (int i=0; i<3; i++) {
                p[i]=a[i];
            }
            reverse(p, 3);
            
            /*for (int i=0; i<3; i++) {
             for (int j=i; j<3; j++) {
             if (i!=j)
             {
             int temp = a[i][j];
             a[i][j]=a[j][i];
             a[j][i]=temp;
             }
             }
             }*/
            for (int i=0; i<3; i++) {
                for (int j=0; j<3; j++) {
                    printf("%d ", a[i][j]);
                }
                printf("\n");
            }
            printf("\n");
            return 0;
        }

nXn的矩阵 转圈赋值

  输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限

        比如:

        输入:5 18

        输出:

        1  2 3 4 5

        16 17180 6

        15 0 0 0 7

        14 0 0 0 8

        13 1211109

        

        输入: 4 12

        输出:

        1  2 3 4

        12 0 0 5

        11 0 0 6

        10 9 8 7



       

        int main(int argc,constchar *argv[])
        {
            int a[20][20]={};
            int m,n;
            int type=1;//1:从左往右赋值, 2:从上往下赋值 3:从右往左赋值 4:从下往上
            int s1,s2,s3,s4,i;//控制边界
            scanf("%d%d",&n,&m);
            if (n<0 || n>20 || m>n*n) {
                return -1;
            }
            s1=n-1;
            s2=n-1;
            s3=0;
            s4=1;
            int p=0,q=0;//控制二维数组下标
            for (i=1; i<=m; i++) {
                a[p][q]=i;
                switch (type) {
                    case 1://从左往右赋值
                        q++;
                        if (q==s1) {
                            type=2;
                            s1--;
                        }
                        break;
                    case 2:
                        p++;
                        if (p==s2) {
                            type=3;
                            s2--;
                        }
                        break;
                    case 3:
                        q--;
                        if (q==s3) {
                            type=4;
                            s3++;
                        }
                        break;
                    case 4:
                        p--;
                        if (p==s4) {
                            type=1;
                            s4++;
                        }
                        break;
                    default:
                        break;
                }
            }
            
            for (int i=0; i<n; i++) {
                for (int j=0; j<n; j++) {
                    printf("%4d", a[i][j]);
                }
                printf("\n");
            }
            printf("\n");
            return 0;
        }

围圈报数

    有n个人围成一圈,顺序排号。从第一个人开始报数(从1到m报数),凡报到m的人退出圈子,问最后留下的是原来第几号的哪位。

        1. 有m个人围成一圈,开始报数,报道n,退出,问最后剩下的是几号。(从1号开始)

        比如:

        输入:5 3

        输出:

        4

        

        输入: 6 2

        输出:

        5

        


        int main(int argc,constchar *argv[])
        {
            int a[20];
            int m,n,cnt=0,k=0,i=0;
            scanf("%d%d",&m,&n);
            if (m<1 || m>20 || n<1) {
                return -1;
            }
            for (int i=0; i<m; i++) {
                a[i]=i+1;
            }
            while (cnt < m-1)
            {
                if (a[i]) {
                    k++;
                }
                if (k==n) {
                    cnt++;
                    a[i]=0;
                    k=0;
                }
                i++;
                if (i==m) {
                    i=0;
                }
            }
            i=0;
            while (a[i]==0) {
                i++;
            }
            printf("%d\n",a[i]);
        }
       

 魔方阵

 魔方阵是一个古老的智力问题,它要求在一个m*m的矩阵中填入1~m^2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等。请编程实现输入m,输出m*m的魔方阵出来。

        比如:

        输入:3

        输出:

        6 18

        7 53

        2 94


        (1)将1放在第一行中间一列;

        (2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1/减1(例如上面的三阶魔方阵,54的上一行后一列);

        (3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1

        (4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;

        (5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;

        

       

 int main(int argc,constchar *argv[])
        {
            int a[19][19]={};
            int n;
            int i,j,tempi,tempj;
            int k=1;
            scanf("%d",&n);
            if (n<3||n%2==0||n>19)
            {
                return -1;
            }
            i=0;
            j=n/2;
            while (k<=n*n)
            {
                a[i][j]=k++;
                tempi = i;
                tempj = j;
                i--;
                j--;
                if (tempi==0)
                {
                    i=n-1;
                }
                if (tempj==0)
                {
                    j=n-1;
                }
                if (a[i][j]) {
                    i=tempi+1;
                    j=tempj;
                }
            }
            
            for (i=0; i<n; i++) {
                for (j=0; j<n; j++) {
                    printf("%4d", a[i][j]);
                }
                printf("\n");
            }
            printf("\n");
            return 0;
        }

找出数组中出现次数最多的数

    输入10个数,找出出现次数最多的数(如果多个并列,则按数字出现顺序分别输出)

        比如:

        输入:1 223456789

        输出:2

        数据结构:定义一个整型数组 int count[10]存储每个元素的个数,开始时每个元素个数初始化为1

        

        算法:

        (1) 利用双层循环,每一个元素都与后面一个元素比较,如果两者相同,则该元素次数+1,

        (2) 以上的算法中两个相同的元素的次数是一样的,优化如下,比较两个元素的时候,如果两者相等,则该元素次数+1,后面的元素次数设置为0,比较的时候再判断这个元素是否已经比较

        

        //1 2 3 4 5 3 3 2 1 2  a[10]

        //2 1 1 1 1 1 1 1 0 1 count[10]

        

        int main(int argc,constchar *argv[])
        {
            int a[10];
            int cnt[10];
            int max;
            for (int i=0; i<10; i++) {
                scanf("%d", &a[i]);
                cnt[i]=1;
            }
            for (int i=0; i<10; i++) {
                if (cnt[i]) {
                    for (int j=i+1; j<10; j++) {
                        if (a[j]==a[i]) {
                            cnt[i]++;
                            cnt[j]=0;
                        }
                    }
                }
            }
            max = cnt[0];
            for (int i=1; i<10; i++) {
                if (cnt[i]>max) {
                    max = cnt[i];
                }
            }
            for (int i=0; i<10; i++) {
                if (max == cnt[i]) {
                    printf("%d ", a[i]);
                }
            }
            printf("\n");
            
            return 0;
        }


 数组常规操作

数组初始化

        定义一个数组后,如果不初始化,那么数组的值是未定义的;

        1.完全初始化:把数组中的每个成员都给初值;

    int main(int argc, const char *argv[])
        {
            int a[10]={1,2,3,4,5,6,7,8,9,10};
            for (int i=0; i<10; i++) {
                printf("%d ", a[i]);
            }
            return 0;
        }

        2.部分初始化:只对数组部分元素赋初值

 

      int main(int argc,const char *argv[])
        {
            int a[10]={1,2,3};
            for (int i=0; i<10; i++) {
                printf("%d ",a[i]);
            }
            return 0;
        }

      

        3.数组初始化为0;

 

       int main(int argc,const char *argv[])
        {
            int a[10]={};
            
            int a[10]={0};
            for (int i=0; i<10; i++) {
                printf("%d ", a[i]);
            }
            return 0;
        }

        4.省约数组长度,必须初始化

        int a[]={1,2,3};

        int main(int argc, const char * argv[])
        {
            int a[]={1,2,3,4};
            printf("%ld\n",sizeof(a));
            
            return 0;
        }



 数组的倒序操作   

   int main(int argc, const char *argv[])
        {
            int score[5];
            for (int i=4; i>=0; i--) {
                scanf("%d",&score[i]);
            }
            for (int i=0; i<5; i++) {
                printf("%d ", score[i]);
            }
            printf("\n");
            return 0;
        }

 查找某个数值 打印数值下标

        int main(int argc,const char *argv[])
        {
            int a[10]={0};
            int i,val;
            int flag=0;
            for (i=0; i<10; i++) {
                scanf("%d",&a[i]);
            }
            printf("请输入要查找的数值: ");
            scanf("%d",&val);
            for (i=0; i<10; i++) {
                if (a[i]==val) {
                    flag =1;
                    printf("%d ",i);
                }
            }
            if (!flag) {
                printf("没有该数值");
            }
            printf("\n");
            
            return 0;
        }

字符数组

        int main(int argc,const char *argv[])
        {
            int a[10]={};
            printf("%p\n",a); 数组名是一个地址常量
            printf("%p\n",&a[0]);
            printf("%p\n",&a);
            
            return 0;
        }
        
        int main(int argc,const char *argv[])
        {
            char str[20]="hello world";
            char str[10]={'h','e','l','l','o'};
            char str[11]="helloworld";
            
            printf("%s\n", str);
            return 0;
        }

二维数组

        int a[5][6];

        把二维数组看成由一维数组组成的数组

    

  int main(int argc,const char *argv[])
        {
            int a[3][2]={};
            for (int i=0; i<3; i++) {
                for (int j=0; j<2; j++) {
                    scanf("%d",&a[i][j]);
                    printf("%d ",a[i][j]);
                }
            }
            
            printf("\n");
            printf("%ld\n", sizeof(a));
            return 0;
        }
        
        
        int main(int argc,const char *argv[])
        {
            int a[2][3]={1,2,3,4,5,6};
            int a[2][3]={{1,2,3},
                {4,5,6}};
            
            for (int i=0; i<2; i++) {
                for (int j=0; j<3;j++) {
                    printf("%d ", a[i][j]);
                }
            }
            
            return 0;
        }
        

递归法求趣味年龄问题

   有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?用递归算法实现。

    int age(int n)
    {
        if (n==1) {
            return 10;
        }
        return 2+age(n-1);
    }
    
    int main(int argc, const char *argv[])
    {
        printf("%d ", age(5));
        return 0;
    }

    

递归法求求n!

    5 = 5*4!120

    4!= 4*3!24

    3!= 3*2!6

    2!= 2*1!2

    1!= 1

    

    factrial(2)=2*factrial(1)

    factrial(3)=3*factrial(2)=3*2*factrial(1)

     

 int factrial(int n)
    {
        if (n==1)
        {
            return 1;
        }
        return n*factrial(n-1);
    }
    
    int main(int argc, const char *argv[])
    {
    
        printf("%d\n",factrial(5));
    
        return 0;
    }

 递归法求小明走阶梯

  小明一次可以爬一级或者二级台阶试问n级台阶小明来走共有几种走法

    示例:

    台阶数1 走法1

    台阶数2 走法21. 一级一级2.二级

    台阶数3 走法31.一级一级一级2.一级二级3.二级一级

    4   111112121111222

   

   

    int func(int n)
    {
        if (n==1)
        {
            return 1;
        }
        else if (n==2)
        {
            return 2;
        }
        else
        {
            return func(n-1)+func(n-2);
        }
    }
    
    int main(int argc, const char * argv[])
    {
    
        printf("%d\n",func(6));
        return 0;
    }

 字符串

1. 字符串中每个字符占用一个字节内存空间

2. 字符串必须以'\0'表示结束

3. 字符串要用双引号括起来


基本操作

int main(int argc, const char * argv[])
{
    printf("alnum = %d\n", isalnum('A'));//判断是否为数字或者字母
    printf("alpha = %d\n", isalpha('a'));//判断是否为字母是返回1, 反之返回0
    printf("isdigit = %d\n", isdigit('9'));//判断是否为十进制数字字符
    printf("isgraph = %d\n",isgraph('\t'));//判断是否为可见字符
    printf("islower = %d\n", islower('a'));//判断是否为小写字母
    printf("isspace = %d\n",isspace(' '));//判断是否为空格
    printf("isupper = %d\n",isupper('a'));//判断是否为大写字母
    printf("isxdigit = %d\n", isxdigit('F'));//是否为十六进制字符
    printf("tolower = %c\n",tolower('A'));//把大写字母转换成小写字母
    printf("toupper = %c\n", toupper('a'));//把小写字母转换成大写字母
    printf("digittoint= %d\n", digittoint('f'));//把十六进制字符转换成十进制整型
    printf("ishexnumber = %d\n",ishexnumber('e'));//类似isxdigit()
    printf("isnumber = %d\n",isnumber('F'));//类似isdigit()

    return 0;
}

 求长度

字符串有效长度(不包含'\0')

strlen()

求变量或者常量占用内存空间大小

sizeof()

区别:

1.strlen求字符串有效长度,sizeof求变量或者常量占用内存空间大小;

2.strlen是一个函数,在函数调用的时候执行,sizeof是一个运算符在编译的执行

#include <ctype.h>
#include <string.h>

unsigned long mystrlen(char *src)
{
    char *pstr = src;
    unsigned long len=0;
    while (*pstr!='\0') {
        len++;
        pstr++;
    }
    return len;
}
int main(int argc,const char *argv[])
{
    //char str[4]={'a','b','c','d'};

    //printf("%lu\n", sizeof("\0"));
    //printf("%lu\n", strlen("hello world"));
    //printf("len = %lu\n",strlen(str));
    printf("%lu\n", mystrlen("qinafeng"));
    return 0;
}

字符串拷贝函数

字符串不能直接赋值,


strcpy 

char *strcpy(char *dest, const char *src);

strcpy拷贝包含'\0'

dest src指向的内存空间不呢过重叠(段错误)

dest 指向的内存空间足够容纳src


自己实现一个mystrcpy

char *mystrcpy(char *dest, const char *src)
{
    char *pstr = dest;
    while (*src) {
        *pstr = *src;
        pstr++;
        src++;
    }
    *pstr = '\0';
    return dest;
}


int main(int argc,const char *argv[])
{
    //char str1[20]="hello world";
    char str1[100];
    char str2[20]="wjlhelloworld";
    mystrcpy(str1, str2);
    printf("%s\n", mystrcpy(str1, str2));
//    strcpy(str1, str2);
    //printf("%s\n", strcpy(str1, str2));
//    printf("%s\n",&str1[9]);

//    strcpy(str1, &str1[5]);
//    printf("%s\n",str1);

    return 0;
}



char *strncpy(char *dest, const char *src, size_t size);

size_t == unsigned long

size_t size: 允许从src指向的字符串中最多拷贝到dest中的字节数

strncpy 拷贝后得到的字符串不一定以'\0'结束

dest src指向的内存空间不呢过重叠

int main(int argc, const char *argv[])
{
    char str1[100];
    char str2[20]="hello world";
    strncpy(str1, str2, 99);
    str1[99]='\0';
    printf("%s\n", str1);
    return 0;
}


字符串拼接函数 strcat  strncat

char *strcat(char *dest , const char *src);

dest src 指向的内存不能重叠

dest 剩下的内存足够容纳src指向的字符串长度

char *mystrcat(char *dest, const char *src)
{
    size_t len = strlen(dest);
    char *pstr = dest+len;
    while (*src)
    {
        *pstr = *src;
        pstr++;
        src++;
    }
    *pstr = '\0';
    return dest;
}

int main(int argc,const char *argv[])
{
    char dest[100]="hello world";
    char src[50]="qian feng";
    //printf("%s\n", strcat(dest, src));
    printf("%s\n", mystrcat(dest, src));
    //printf("%s\n", strcat(dest, &dest[3]));

    return 0;
}



char *strncat(char *dest , const char *src, size_t size);

size : 允许从src中最大拷贝字节数

得到的新字符串自动添加'\0';


int main(int argc,const char *argv[])
{
    char str1[20];
    str1[18]='@';
    str1[19]='\0';
    char str2[40]="qianfengyuioprtyuiopertyu";

    //strncat(str1, str2, sizeof(str1) - strlen(str1) - 1);
    strncat(str1, str2, 18);
    printf("%s\n", str1);
    return 0;
}



字符串比较函数

strcmp

int strcmp(const char *str1, const char *str2);

返回值:

大于0 str1 > str2

等于0 str1== str2

小于0 str1 < str2

int mystrcmp(char *str1,char *str2)
{
    while (*str1 && *str2) {
        if (*str1!=*str2) {
            //return *str1-*str2;
            break;
        }
        str1++;
        str2++;
    }
    return *str1-*str2;
}


int main(int argc,const char *argv[])
{
    char *str1="hello wabcd";
    char *str2="hello wabbd";

    //printf("val = %d\n", strcmp(str1, str2));
    printf("val = %d\n", mystrcmp(str1, str2));

    return 0;
}


strncmp

int strncmp(const char *str1, const char *str2, size_t size);

size : 表示最大比较字节数


int main(int argc,const char *argv[])
{
    char *str1 = "hellowo";
    char *str2 = "helloworld";
//    printf("val = %d\n",strncmp(str1, str2, (size_t)sizeof(str1)));
    printf("val = %d\n",strncmp(str1, str2, 11));
    return 0;
}



字符串排序

 比较三个字符串的大小,然后按从小到大的顺序将字符串输出。

 比如:

 输入

 asdfwd

 ddrwf

 ffweff

 输出为

 asdfwd

 ddrwf

 ffweff

 

 输入

 sgfgeasdfw

 aabbe

 wrwwdfaf

 输出为

 aabbe

 sgfgeasdfw

 wrwwdfaf

    

#include <stdlib.h>
   #include <string.h>
    int main(int argc,constchar * argv[])
    {
        char *pstr[10]={NULL};
        int cnt = 0;
        for (int i=0; i<10; i++) {
            pstr[i]=(char *)calloc(100,1);
            if (!pstr[i]) {
                return -1;
            }
            scanf("%s",pstr[i]);
            cnt++;
            if (getchar()=='\n') {
                break;
            }
        }
        for (int i=0; i<cnt-1; i++) {
            for (int j=0; j<cnt-i-1; j++) {
                if (strcmp(pstr[j], pstr[j+1])>0) {
                    char *temp = pstr[j];
                    pstr[j]=pstr[j+1];
                    pstr[j+1]=temp;
                }
            }
        }
        for (int i=0; i<cnt; i++) {
            printf("%s\n", pstr[i]);
            free(pstr[i]);
            pstr[i]=NULL;
        }
        
        return 0;
    }

   字符串查找字符

 查找一个字符在字符串1中第一次出现的字符位置,

 比如:

 输入

 asdfwd

 d

 输出为

 2 

 输入

 hhff

 h

 输出为

 0

 

int main(int argc,const char *argv[])
 {
     char str[100];
     char ch;
     scanf("%s %c", str, &ch);
     char *pstr = strchr(str, ch);
     printf("%lu\n", pstr-str);
     return 0;
 }


求一个字符串s的最大连续递增数字子串。

 比如:

 输入

 f123fffwf3210a1234

 输出为

 123


#include <ctype.h>
int main(int argc,const char *argv[])
{
    char str[100];
    char *pstr = str;
    char *pmax = NULL;
    int maxlen=0;
    int cnt=0;
    scanf("%s", str);
    while (*pstr)
    {
        if (isdigit(*pstr))
        {
            cnt = 1;
            while (*pstr == *(pstr+1)-1) {
                cnt++;
                pstr++;
            }
            pstr++;
            if (maxlen < cnt) {
                maxlen = cnt;
                pmax = pstr -cnt;
                cnt = 0;
            }
        }
        else
        {
            pstr++;
        }
    }

    if (pmax) {
        *(pmax + maxlen)='\0';
        printf("%s\n", pmax);
    }
    return 0;
}
  



字符串压缩算法

 把输入的字符串压缩处理后的结果保存到第二个字符串中,并输出。

比如:

输入:aaaaaaaaaaaeefggg

输出为:a11e2f1g3

输入:eeeeeaaaff

压缩为:e5a3f2

int main(int argc,const char *argv[])
{
    char str[100];
    char buf[100];
    scanf("%s", str);
    char *pbuf = buf;
    char *pstr = str;
    char ch = *pstr;
    int cnt = 0;
    int val=0;
    while (*pstr)
    {
        if (*pstr == ch)
        {
            cnt++;
        }
        else
        {
            val = sprintf(pbuf, "%c%d",ch,cnt);
            pbuf+=val;
            cnt=0;
            ch = *pstr;
            pstr--;
        }
        pstr++;
    }
    val = sprintf(pbuf, "%c%d", ch, cnt);
    pbuf+=val;
    *pbuf='\0';
    printf("%s\n", buf);
    return 0;
}

字符串解压缩算法

  把输入字符串解压处理后结果保存在第二个字符串中,并输出。

 比如:

 输入:a11e2f1g3

 输出:aaaaaaaaaaaeefggg

 输入:e5a3f2

 输出:eeeeeaaaff

  

  char * str_write(char *pstr,char ch,int len)
    {
        for (int i=0; i<len; i++) {
            pstr[i]=ch;
        }
        pstr[len]='\0';
        return pstr;
    }
    
    int main(int argc,constchar *argv[])
    {
        char str[100];
        char buf[100];
        scanf("%s", str);
        char *pstr = str;
        char *pbuf = buf;
        char ch;
        int len = 0;
        while (*pstr)
        {
            ch = *pstr;
            sscanf(pstr, "%c%d", &ch, &len);
            str_write(pbuf, ch, len);
            pbuf += len;
            pstr++;
            while (isdigit(*pstr))
            {
                pstr++;
            }
        }
        //    pbuf = buf;
        //    pstr = str;
        printf("%s\n", buf);
        return 0;
    }

 以空格作为分隔符,统计单词个数

  "wangjunling    love    hello   world"

  "    i love you fallinto"

  

int word_number(const char *str) {
      int cnt=0;
      int flag=0;
      while (*str)
      {
          if (*str!=' ')
          {
              if (!flag)
              {
                  cnt++;
                  flag=1;
              }
          }
          else
          {
              if (flag) {
                  flag =0;
              }
          }
          str++;
      }
      return cnt;
  }
  int main(int argc, const char *argv[]){
      char str[100]={};
      scanf("%[^\n]", str);
      printf("%d\n", word_number(str));
      return 0;
  }


  

  字符查找函数

  strchr strrchr

  char *strchr(const char *src, char ch);

  查找在src中第一次出现的字符ch,把字符的地址返回

  没有找到返回null

  
  char *mystrchar(const char *src, char ch)
  {
      while (*src) {
          if (*src==ch) {
              return (char *)src;
          }
          src++;
      }
      return NULL;
  }
  int main(int argc,const char *argv[])
  {
      char str[]="hello world";
      //printf("%s\n", strchr(str, 'H'));
      printf("%s\n", mystrchar(str,'w'));
      return 0;
  }


  

  倒序查找字符

  char *strrchr(const char *src, char ch);

  倒序查找字符

  

  char *mystrrchr(const char *src, char ch)
  {
      long len = strlen(src);
      char *pstr = (char *)src+len-1;
      for (long i=len-1; i>=0; i--) {
          if (*pstr==ch) {
              return pstr;
          }
          pstr--;
      }
      return NULL;
  }
  
  int main(int argc,const char *argv[])
  {
      char *str="hello world";
      printf("%s\n", mystrrchr(str, 'o'));
      return 0;
  }

  字符串查找函数

  strstr

  char *strstr(const char *, const char *);

  找到字串返回字串在原串中的地址没有找到返回null

  

  int main(int argc,const char *argv[])
  {
      char str[]="qianfenghellofengworldfengzhang";
  
      //printf("%s\n", strstr(str, "feng"));
      char *pstr1, *pstr2;
      pstr1 = pstr2 = str;
      while ((pstr2 = strstr(pstr2, "feng")))
      {
          *pstr2 = '\0';
          printf("%s\n", pstr1);
          pstr2+=strlen("feng");
          pstr1 = pstr2;
      }
      printf("%s\n", pstr1);
      return 0;
  }

  

  字符串分割函数

  strtok

  char *strtok(char *src, const char *demi);

  1.分割符必须用双引号包含

  2.首次分割,传字符串首地址,从第二次的开始传NULL

  3.每次分割后,返回分割后的字符串地址   

 int main(int argc,const char *argv[])
    {
        char str[]="hello:world,:qian;;:,feng*&hello;:";
        
        //    char *pstr = strtok(str, ":");
        //    printf("%s\n", pstr);
        //    pstr = strtok(NULL, ":;,*&");
        //    printf("%s\n", pstr);
        char *pstr=str;
        while ((pstr=strtok(pstr,":;,*&"))) {
            printf("%s\n", pstr);
            pstr = NULL;
        }
        return 0;
    }

  字符串解析函数

  sscanf

  从字符缓冲区中解析数据到内存变量中

  int sscanf(const char *src, const char *format, ...)

  sprintf

  int sprintf(char *dst, const char *format, ...)

  

  scanf

  标准输入文件缓冲区 stdin

  printf

  标准输出文件缓冲区 stdout  

int main(int argc,const char *argv[])
     {
      int a, b;
       scanf("%d%d",&a,&b);
       printf("a = %d b = %d\n", a, b);
       char str[]="#123*23.4#";
       int a;
       float b;
       sscanf(str, "#%d*%f#",&a, &b);
       printf("a = %d b= %.2f\n", a, b);
     
     int a = 39;
     float b = 3.14;
     char *str = "hello world";
     char buf[500];
     sprintf(buf, "%d%f%s", a,b,str);
     printf("%s\n", buf);
     return 0;
     }

    文件解析函数

    fscanf fprintf

    int fprintf(FILE * file, const char * format, ...)

    int fprintf(FILE * file, const char * format, ...)

    

 int main(int argc,const char *argv[])
     {
         int a, b;
         fscanf(stdin, "%d%d", &a, &b);
         fprintf(stdout, "a= %d b= %d\n", a, b);
     
     
         FILE *pfile=NULL;
         pfile = fopen("/Users/wangjunling/Desktop/file.rtf", "w");
         if (pfile) {
             printf("hello world\n");
             fwrite("中国教育", sizeof("中国教育"), 1, pfile);
             fclose(pfile);
         }
     return 0;
     }

   atoi

   double atof(const char *);

   int atoi(const char *);

   long atol(const char *);

   #include <stdlib.h>

   

   

int myatoi(const char *str)
   {
       int inter=1;
       int number = 0;
       while (isspace(*str))
       {
           str++;
       }//跳过空字符
       if (*str=='-') {
           inter = -1;
       }
       if (*str=='-' || *str=='+') {
           str++;
       }
       while (isdigit(*str)) {
           number=number*10 + *str-'0';
           str++;
       }
       return number;
   }
   int main(int argc,const char *argv[])
   {
   
       printf("%d\n", myatoi("    +34b456"));
       printf("%f\n", atof("-3.145gt"));
       return 0;
   }

   两字符串中第一个相同的子串(大于1个字符),并将子串输出

    比如:

    输入

    adbAFEHHFS

    acwfagAFEf

    输出为

    AFE

    

    输入

    qfdgJKlin

    qdfgJKwfo

    输出为

    gJK

    

   

 /*#include <string.h>
     
     int main(int argc,const char *argv[])
     {
     char str1[100]={};
     char str2[100]={};
     int i=0;
     char *pstr1 = NULL;
     char *pstr2 = NULL;
     scanf("%s %s", str1,str2);
     int len1 = (int)strlen(str1);
     int len2 = (int)strlen(str2);
     for (i=0; i<len2-1; i++) {
     pstr1 = (char *)memmem(str1, len1, &str2[i], 2);
     if (pstr1) {
     break;
     }
     }
     pstr2 = &str2[i];
     while (*pstr1 == *pstr2) {
     pstr1++;
     pstr2++;
     }
     *pstr2 = '\0';
     printf("%s\n", &str2[i]);
     
     
     return 0;
     }*/

字符串拼接

实现一个函数,传递两个字符数组,利用指针将第二个数组中的字符,拼接到第一个字符数组尾部,并在main函数里输出。

比如:

输入:

hello

world

输出:helloworld


int main(int argc, const char *argv[])
{
    char str1[50]={};
    char str2[20]={};
    scanf("%s%s",str1,str2);

    int len1 = (int)strlen(str1);
    int len2 = (int)strlen(str2);
    for (int i=0;i<len2;i++) {
        str1[i+len1]= str2[i];
    }
    str1[len1+len2]='\0';
    printf("%s\n", str1);
    return 0;
}

指针

基础知识

  1.取地址符号: &

     int a  

     &a  0xfff89900

     

    2.指针   数据类型 + * + 标示符

      指针变量:保存内存地址的变量空间

    

   数据类型 + * +标示符

    int *p char *pstr float *pf

 int main(int argc, const char * argv[])
     {
     	int a=10;
        printf("%p\n", &a);
     
     	int *p = &a;
    	 printf("%p\n", p);
     
     	*p = 20; *间接寻址符
     	printf("%d \n", *p);
     	*(int *)(0x7fff5fbff87c)=30;
     	printf("%d \n", a);
     	return 0;
     }


  3.64位系统指针变量在内存中占8字节空间

  int main(int argc,const char *argv[])
     {
         printf("%lu\n", sizeof(char *));
         printf("%lu\n", sizeof(int *));
         printf("%lu\n", sizeof(float *));
         printf("%lu\n", sizeof(long *));
     
         return 0;
     }

    4 *和&一起使用

     int a[6] int (*(&a))[6]  int (*)[6]

   

  int main(int argc, const char *argv[])
     {
         int a=10;
         int *p=&a;
         printf("%d \n", *(&a));
         printf("%d \n", *p);
         return 0;
     }

   5. NULL 空指针

     (void *)0  泛型指针

     #define NULL ((void *)0)

     typedef (void *)0 NULL

    

     int main(int argc,const char *argv[])
     {
         int a=40; 
         void *p= &a;   int *(&a);
          printf("%p\n", p);
          printf("%p\n", &p);
          p++;
          printf("%p\n", p);
     
         *(int *)p = 50;
         printf("%d\n", *(int *)p);
     
         return 0;
     }

     6.指针运算

     1. ++ --

    

   int main(int argc, const char * argv[])
     {
     int a=10;
     int *p= &a;
     
     printf("%p\n", p);
     p++;
     printf("%p\n", p);
     p--;
     printf("%p\n", p);
     *p = 20;
     printf("%d\n", a);
     
     return 0;
     }

    2.地址相减:地址之差除指针数据类型的长度

     

 int main(int argc,const char *argv[])
     {
     int a=10, b=20;
     int *p,*q;
     p = &a;
     q = &b;
     printf("p = %p\n", p);
     printf("q = %p\n", q);
     
     printf("%lu\n", p-q); 
     
     return 0;
     }
    
     int main(int argc, const char *argv[])
     {
         int a[10]={0};
         int *p,*q;
         p = &a[0];
         q = &a[9];
         printf("%ld\n", q-p);
     
         return 0;
     }
    
   
     int main(int argc,const char *argv[])
     {
     char str[100]="hello world";
     char *pstr = &str[4];
     
     printf("%lu\n", pstr - str +1);
     
     return 0;
     }
    

     3.指针不能进行加法运算

  int main(int argc, const char *argv[])
     {
     int a,b;
     int *p,*q;
     p = &a;
     q= &b;
     printf("%p\n", p);
     printf("%p\n", q);
     
      printf("%p\n", p+q);
     if (p>q) {
     printf("a的地址比b的地址高\n");
     }
     else
     {
     printf("b的地址比a的地址高\n");
     }
     return 0;
     }

    4.指针常量

     const

     const+type+变量   type+const+变量

            

 int main(int argc,const char *argv[])
     {
          char *str="hello world";
          str = "qianfeng";
          const char str[100]="hello world";
         char str[100]="hello world";
         *(str+2)='A';
         printf("%s\n", str);
         return 0;
     }


#define LEN 10
    int main(int argc,constchar *argv[])
    {
         const int a=10;
        int const a=10;
         a=20;
        int *p = &a;
        *p =20;
        printf("%d\n", a);
        printf("%d\n", *p);
        printf("%p\n%p\n", &a, p);
        printf("%d\n", 10);
        return 0;
    }
  #endif

     const  *

   

 int main(int argc,const char *argv[])
     {
     
     
          int a=10;
          int b=20;
          argv[0] = &a;
     
          const int *p=&a, *q=&b; *p *q不能被修改, p,q能被修改
          *p = 50;
          *q = 40;
     
      const int *const p=&a,*q=&b; *p,p,*q不能被修改, q能被修改
      *p=30;
      p=&b;
      *q = 79;
      q= &a;
     
          const int *p = &a;  *p不可以修改  p可以被修改
           *p = 20;
          p= &b;
          printf("%d\n", *p);
          int * const p = &a; p不可以被修改, *p可以被修改
          *p = 30;
           p=&b;
          printf("%d\n", *p);
     
          const int *const p= &a; *p不能修改, p不能修改
          *p = 90;
          p = &b;
     
     return 0;
     }

    



 7.数据类型分析

     int a[10]

    

     a[0]~~~a[9] 类型  int

     int *p= &a[0]    p的类型 int (*(&a[0])) ==> int *

    

     int *p = a;  

     int [10] 类型 int *

        

  int main(int argc, const char * argv[])
     {
     	int a[10]={};
     	int (*p)[10]=&a;
     	printf("%p\n", p);
     	p++;
     	printf("%p\n", p);
     	return 0;
     }


     int a[3][5]

     a &a &a[0] &a[0][0] a[0] a[0][0]

     a: int [3][5] ==> int (*)[5]

     &a: int (*(&a))[3][5]  == > int (*)[3][5]

     &a[0]: int a[0][5] ==> int (*(&a[0]))[5] ==> int (*)[5]

     &a[0][0]: int *

     a[0]: int a[0][5] ==> int [5] ==> int *

     a[0][0]: int


 int main(int argc,const char *argv[])
     {
       int a[3][5]={};
       int (*p)[5] = &a[0];
       int (*q)[3][5] = &a;
       printf("%p\n", p);
       printf("%p\n", q);
       return 0;
     }

   8. 指针与数组

          指针数组

     int *a[10]

    

  int main(int argc,const char *argv[]) {
         char *ch[4]={"hello","world","qian","feng"};
     
         for (int i=0; i<4; i++) {
             printf("%s\n",ch[i]);
         }
          printf("\n");
         return 0;
     }

    指针数组与二维数组

    int sum_func(int *a[], int len1, int len2)
     {
     	int sum=0;
     	for (int i=0; i<len1; i++) {
     		for (int j=0; j<len2; j++) {
     		sum+= *(*(a+i)+j);
    	 }
     	}
     	return sum;
     }
     int main(int argc,const char *argv[])
     {
     	int a[3][2]={1,2,3,4,5,6};
     	int *p[3]={NULL};
     	for (int i=0; i<3; i++) {
     		p[i]=a[i];
    	 }
    	 printf("sum = %d\n", sum_func(p,3,2));
     	return 0;
     }

     数组的指针

     int (*p)[5]

     int (*p)[2][3]

     int (*p)[2][3][4]

    

int main(int argc,const char *argv[])
     {
      int a[2][3];
      int (*p)[2][3] = &a;
      int (*p[5])[2][3]
      printf("%p\n", p);
       p++;
       printf("%p\n", p);
     
     int b[2][3][4];
     int (*q)[2][3][4] = &b;
       printf("%p\n", q);
       q++;
       printf("%p\n", q);
      return 0;
     }
    

数组的指针与二维数组

 

  int sum(int (*p)[2][3])
     {
     	int sum = 0;
     	for (int i=0; i<2; i++) {
     	for (int j=0;   j<3; j++) {
      	sum += (*p)[i][j];
     	sum += *(*(*p+i)+j); *p : int (*)[3]
      	*(*p+i)+j: ==> int [3]==> int *
    	 }
     	}
     	return sum;
     }
     
     int sum2(int (*p)[3], int len)
     {
     	int sum=0;
     	for (int i=0; i<len; i++) {
    	 for (int j=0; j<3; j++) {
     		sum += *(*(p+i)+j);
    	 }
     	}
     	return sum ;
     }
     
     int main(int argc,const char *argv[])
     {
     	int a[2][3]={1,2,3,4,5,6};
    	 printf("sum = %d\n", sum(&a));
     
     	return 0;
     }

函数的指针

     //int (*pfunc)(int, int)

    

 int add(int a, int b)
     {
     return a+b;
     }
     
     int multi(int a, int b)
     {
     return a*b;
     }
     
     void print(int cnt)
     {
     for (int i=0; i<cnt; i++) {
     printf("hello world\n");
     }
     }
     
     int main(int argc,const char *argv[])
     {
     int (*pfunc)(int, int)= add;
     
      printf("%d\n", add(10, 20));
      printf("%d\n", pfunc(10,20));
      pfunc = multi;
      printf("%d\n", pfunc(10,20));
     
       void (*qfunc)(int)=print;
       qfunc(5);
     
     return 0;
     }
     
    
     回调函数
    void  printhello(void)
    {
        printf("hello\n");
    }
    
    void printworld(void)
    {
        printf("world\n");
    }
    
    void print_welcome(void(*pfunc)(void),int times)
    {
        for (int i=0; i<times; i++) {
            pfunc();
        }
    }
    
    int main(int argc,constchar *argv[])
    {
        print_welcome(printhello, 5);
        print_welcome(printworld, 5);
        return 0;
    }

    指针与一维数组

    利用指针,输入10个数到数组中,再输出

    

 int main(int argc, const char * argv[])
     {
         int a[10];
         int *p=a;
         for (int i=0; i<10; i++) {
             scanf("%d", p);
             p++;
         }
         p=a;
         for (int i=0; i<10; i++) {
             printf("%d ", *p);
             p++;
         }
         printf("\n");
         return 0;
     }
    

    

    指针实现数组逆序

    

    void  reverse_arr(int *a, int len)
     {
     for (int i=0; i<len/2; i++) {
     int temp = *(a+i);
     *(a+i)= *(a+len-1-i);
     *(a+len-1-i) = temp;
     }
     }
     
     int main(int argc, const char *argv[])
     {
     int a[100];
     int i,len;
     for (i=0; i<100; i++) {
     scanf("%d", &a[i]);
     if (getchar()=='\n') {
     break;
     }
     }
     len = i+1;
     reverse_arr(a, len);
     for (i = 0; i<len; i++) {
     printf("%d ", a[i]);
     }
     printf("\n");
     return 0;
     }

    

    

    指针练习

编写函数 replace,在一个字符数组里面查找指定字符,并用相应的字符替代。函数原型如下:
     void replace(char *array, char old, char new, int length)
#include <string.h>

    char * replace(char *array,char old,char new,int length)
    {
        for (int i=0; i<length; i++) {
            if (*(array+i)==old) {
                *(array+i)= new;
            }
        }
        return array;
    }
    
    
    int main(int argc,constchar *argv[])
    {
        char str[100];
        scanf("%[^\n]", str); 
        printf("%s\n", str);
        int len = (int)strlen(str);
        
         replace(str, 'a', 'A', len);
        
        printf("%s\n",replace(str, 'a', 'A', len));
        
        /*gets(str);
         printf("%s\n", str);
         */
        /*scanf("%[A-Z,a-z,0-9]", str);
         printf("%s\n", str);
         */
        /*scanf("%[abcABC]",str);
         printf("%s\n", str);
         */
        
        return 0;
    }


    指针练习3

       编写函数 insert,向一个字符数组指定位置插入一个字符,后面的字符依次向后移动。函数原型如下:

     void insert(char *array, int index, char new, int length)

 

 
    void insert(char *array,int index,char new,int length)
    {
        for (int i=length-1; i>=index; i--) {
            *(array+i+1)= *(array+i);
        }
        *(array+index)= new;
    }
    int main(int argc,constchar *argv[])
    {
        char str[100];
        scanf("%[^\n]", str); 
        printf("%s\n", str);
        int len = (int)strlen(str);
        
        insert(str, 5, 'A', len);
        printf("%s\n",str);
        
        return 0;
    }

    指针的数组(指针数组)

    指针数组中的每个元素都是一个指针变量

     int main(int argc, const char *argv[])
     {
         char *ch[5]={"hello one","hello two","hello three","hello four","hello five"};
     
         for (int i=0; i<5; i++) {
             printf("%s\n", ch[i]);
         }
         return 0;
     } 
    

    指针数组与二维数组

    
    int sum_func(int *a[], int len)
     {
     int sum=0;
     
     for (int i=0; i<len; i++) {
     
      sum += a[0][i];
     sum += *(*a+i);  a int **  *a  int *  **a int
     }
     return sum;
     }
     int sum_func(int *a[], int len1, int len2)
     {
         int sum=0;
     
         for (int i=0; i<len1; i++) {
             for (int j=0; j<len2; j++) {
                  sum += a[i][j];
                 sum += *(*(a+i)+j); *a  int *
             }
         }
         return sum;
     }
     
     int main(int argc,const char *argv[])
     {
         int a[3][2]={1,2,3,4,5,6};
          int a[5]={1,2,3,4,5};
          printf("%ld\n", sizeof(int **));
         int *p[3]={NULL};
         for (int i=0; i<3; i++) {
             p[i]=a[i];
         }
          p[0]=a;
         printf("sum = %d\n",sum_func(p,3,2));
     
         return 0;
     }
    数组的指针与二维数组

        int sum(int (*p)[2][3])
    {
        int sum = 0;
        for (int i=0; i<2; i++) {
            for (int j=0;   j<3; j++) {
                 sum += (*p)[i][j];
                sum += *(*(*p+i)+j); *p : int (*)[3]
                 *(*p+i)+j: ==> int [3]==> int *
            }
        }
        return sum;
    }
    
    int sum2(int (*p)[3],int len)
    {
        int sum=0;
        for (int i=0; i<len; i++) {
            for (int j=0; j<3; j++) {
                sum += *(*(p+i)+j);
            }
        }
        return sum ;
    }
    
    int main(int argc,constchar *argv[])
    {
        int a[2][3]={1,2,3,4,5,6};
        printf("sum = %d\n", sum(&a));
        
        return 0;
    }



  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
适用于初学者    经典c程序100例==11--20 【程序11】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月    后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... 2.程序源代码: #include "stdio.h" #include "conio.h" main() { long f1,f2; int i; f1=f2=1; for(i=1;i<=20;i++) { printf("%12ld %12ld",f1,f2); if(i%2==0) printf("\n"); /*控制输出,每行四个*/ f1=f1+f2; /*前两个月加起来赋值给第三个月*/ f2=f1+f2; /*前两个月加起来赋值给第三个月*/ } getch(); } ============================================================== 【程序12】 题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,       则表明此数不是素数,反之是素数。        2.程序源代码: #include "stdio.h" #include "conio.h" #include "math.h" main() { int m,i,k,h=0,leap=1; printf("\n"); for(m=101;m<=200;m++) { k=sqrt(m+1); for(i=2;i<=k;i++) if(m%i==0) { leap=0; break; } if(leap) { printf("%-4d",m); h++; if(h%10==0) printf("\n"); } leap=1; } printf("\nThe total is %d",h); getch(); } ============================================================== 【程序13】 题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数    本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 2.程序源代码: #include "stdio.h" #include "conio.h" main() { int i,j,k,n; printf("'water flower'number is:"); for(n=100;n<1000;n++) { i=n/100;/*分解出百位*/ j=n/10%10;/*分解出十位*/ k=n%10;/*分解出个位*/ if(i*100+j*10+k==i*i*i+j*j*j+k*k*k) printf("%-5d",n); } getch(); } ============================================================== 【程序14】 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,  重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 2.程序源代码: /* zheng int is divided yinshu*/ #include "stdio.h" #include "conio.h" main() { int n,i; printf("\nplease input a number:\n"); scanf("%d",&n); printf("%d=",n); for(i=2;i<=n;i++) while(n!=i) { if(n%i==0) { printf("%d*",i); n=n/i; } else break; } printf("%d",n); getch(); } ============================================================== 【程序15】 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,    60分以下的用C表示。 1.程序分析:(a>b)?a:b这是条件运算符的基本例子。 2.程序源代码: #include "stdio.h" #include "conio.h" main() { int score; char grade; printf("please input a score\n"); scanf("%d",&score); grade=score>=90?'A':(score>=60?'B':'C'); printf("%d belongs to %c",score,grade); getch(); } ============================================================== 【程序16】 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 1.程序分析:利用辗除法。 2.程序源代码: #include "stdio.h" #include "conio.h" main() { int a,b,num1,num2,temp; printf("please input two numbers:\n"); scanf("%d,%d",&num1,&num2); if(num1<num2)/*交换两个数,使大数放在num1上*/ { temp=num1; num1=num2; num2=temp; } a=num1;b=num2; while(b!=0)/*利用辗除法,直到b为0为止*/ { temp=a%b; a=b; b=temp; } printf("gongyueshu:%d\n",a); printf("gongbeishu:%d\n",num1*num2/a); getch(); } ============================================================== 【程序17】 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 1.程序分析:利用while语句,条件为输入的字符不为'\n'.        2.程序源代码: #include "stdio.h" #include "conio.h" main() { char c; int letters=0,space=0,digit=0,others=0; printf("please input some characters\n"); while((c=getchar())!='\n') { if(c>='a'&&c<='z'||c>='A'&&c<='Z') letters++; else if(c==' ') space++; else if(c>='0'&&c<='9') digit++; else others++; } printf("all in all:char=%d space=%d digit=%d others=%d\n",letters, space,digit,others); getch(); } ============================================================== 【程序18】 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时    共有5个数相加),几个数相加有键盘控制。 1.程序分析:关键是计算出每一项的值。 2.程序源代码: #include "stdio.h" #include "conio.h" main() { int a,n,count=1; long int sn=0,tn=0; printf("please input a and n\n"); scanf("%d,%d",&a,&n); printf("a=%d,n=%d\n",a,n); while(count<=n) { tn=tn+a; sn=sn+tn; a=a*10; ++count; } printf("a+aa+...=%ld\n",sn); getch(); } ============================================================== 【程序19】 题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程    找出1000以内的所有完数。 1. 程序分析:请参照程序<--上页程序14. 2.程序源代码: #include "stdio.h" #include "conio.h" main() { static int k[10]; int i,j,n,s; for(j=2;j<1000;j++) { n=-1; s=j; for(i=1;i<j;i++) { if((j%i)==0) { n++; s=s-i; k[n]=i; } } if(s==0) { printf("%d is a wanshu",j); for(i=0;i<n;i++) printf("%d,",k[i]); printf("%d\n",k[n]); } } getch(); } ============================================================== 【程序20】 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在    第10次落地时,共经过多少米?第10次反弹多高? 1.程序分析:见下面注释 2.程序源代码: #include "stdio.h" #include "stdio.h" main() { float sn=100.0,hn=sn/2; int n; for(n=2;n<=10;n++) { sn=sn+2*hn;/*第n次落地时共经过的米数*/ hn=hn/2; /*第n次反跳高度*/ } printf("the total of road is %f\n",sn); printf("the tenth is %f meter\n",hn); getch(); }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值