Linux C 之 数组

一维数组(构造类型之一,连续存放)

定义:

【存储类型】 数据类型 标识符 【下标】

初始化:

不初始化

全部初始化

部分初始化

static

元素引用:

数组名【下标】

数组名:

数组名是表示地址的常量,也是数组起始位置

数组越界:

数组越界是因为指针机制(arr[i] = *(arr + i),需要程序员自己检查)

一维数组应用:

1 fibonacci 数列(求该数列的前十项,并在数组中逆序存放)

2 数据排序

3 进制转换

4 删除法求质数

fibonacci 数列:

#include <stdio.h>
#include <stdlib.h>

static void fabonacci(void)
{
        int fib[10] = {1,1};
        int i,j,temp;

        for(i = 2; i < sizeof(fib)/sizeof(fib[0]); i++)
                fib[i] = fib[i-1] + fib[i-2];//一个数等于其前两项之和
        for(i = 0 ; i < sizeof(fib)/sizeof(fib[0]) ; i++)
                printf("%d\t",fib[i]);
        printf("\n");

        i = 0;
        j = sizeof(fib)/sizeof(fib[0]) - 1;

        while(i < j)//逆序存放,a[9]与a[0]互换
        {

                temp = fib[i];
                fib[i] = fib[j];
                fib[j] = temp;

                i++;
                j--;

        }

        for(i = 0;i < sizeof(fib)/sizeof(fib[0]); i++)
                printf("%d\t",fib[i]);
        printf("\n");

        return ;

}

int main()
{
        fabonacci();

        exit(0);
}

冒泡排序法(把大值往前面推):

#include <stdio.h>
#include <stdlib.h>

#define N  10

int main()
{

        int i,j,temp;
        int a[]= {10,7,6,54,8,9,22,1,13,99};//设定序列

        for(i = 0;i < N;i++ )//打印序列
                printf("%d\t",a[i]);
        printf("\n");

        for(i = 0;i < N-1;i++)//第一层
        {
                for(j = 0 ;j < N-i-1;j++)//第二层
                {
                        if(a[j] > a[j+1])//如果当前数比后一个数大则交换位置
                        {
                                temp = a[j];
                                a[j] = a[j+1];
                                a[j+1] = temp;
                        }
                }
        }

        for(i = 0; i < N;i++)
                printf("%d\t",a[i]);//打印
        printf("\n");

        exit(0);
}

顺序排序法(把小的值往前面堆)

#include <stdio.h>
#include <stdlib.h>

#define N  10


int main()
{

        int i,j,k,temp;
        int a[]= {10,7,6,54,8,9,22,1,13,99};//设定序列

        for(i = 0;i < N;i++ )//打印序列
                printf("%d\t",a[i]);
        printf("\n");

        for(i = 0;i < N-1;i++)
        {
                k = i;//假设a[i]为小值
                for(j = i+1;j < N;j++)
                {
                        if(a[k] > a[j])
                                k = j;//

                }
                if(i != k)//如果值不相等,就交换
                {
                        temp = a[i];
                        a[i] = a[k];
                        a[k] = temp;

                }


        }

        for(i = 0; i < N;i++)
                printf("%d\t",a[i]);//打印
        printf("\n");

        exit(0);
}   

进制转换:

#include <stdio.h>
#include <stdlib.h>

int main()
{
        int i,n[128];
        int base,num;//定义要转换的进制和被转换的数字

        printf("please enter the converted num : \n");
        scanf("%d",&num);

        printf("please enter the base num: \n");
        scanf("%d",&base);

        do
        {
                n[i] = num % base;//被转换数字除以进制获取余数
                num = num /base;//被除数降级
                i++;//次数递增

        }while(num != 0);

        for(i--;i >= 0; i--)
        {
                if(n[i] >= 10)
                        printf("%c",n[i] - 10 + 'A');//十六进制,大于十用A来表示
                else
                        printf("%d",n[i]);
        }
        printf("\n");


}

删除法求质数:

#include <stdio.h>
#include <stdlib.h>

#define NUM 1001  //定义要求质数的范围

int main()
{
        int i,j;
        char primer[NUM] = {0};//先将所有的标记设置为0

        for(i = 2; i < NUM; i++)//从2开始判断
        {
                if(primer[i] == 0)
                {
                        for(j = i*2 ;j <= NUM; j+=i)//判断是否为质数
                                primer[j] = -1;//不是的话则将改标记置-1

                }

        }

        for(i = 0;i < NUM; i++)
        {
                if(primer[i] == 0)//质数的标记为0
                        printf("%d\t",i);

        }
        printf("\n");


        exit(0);
}    

二维数组

1 定义、初始化

【存储类型】 数据类型 标识符 【行下标】 【列下标】

2 元素引用

数组名 【行标】 【列表】

3 存储模式

顺序存储、按行存储

4 深入理解二维数组

元素初始化:

全部元素赋值:a[M][N] = {{1,2,3},{4,5,6}};
部分元素赋值:a[M][N] = {{1,2,3}};//第二行自动补0或空值  a[M][N] = {{1,3},{4}};
按顺序赋值:a[M][N] = {1,2,3,4,5,6};

*二维数组的定义中只有行号可以省略:a[][N]
*a 的地址值为数组的起始地址

元素引用

#include <stdio.h>
#include <stdlib.h>

#define M  2
#define N  3

int main()
{
        int a[M][N];
        int i,j;

        for(i = 0; i < M; i++)
            for(j = 0; j < N; j++)
                scanf("%d",&a[i][j]);

        for(i = 0;i < M; i++)
        {

            for(j = 0; j < N; j++)
            {
                printf("%d\t",a[i][j]);

            }
            printf("\n");
        }


}

二维数组的应用:

1 行列互换

2 求最大值及其所在位置

3 求各行与各列的和

4 矩阵乘积

行列互换:

#include <stdio.h>
#include <stdlib.h>

#define M  2
#define N  3

static void change()
{
        int i,j;
        int a[M][N] = {1,2,3,4,5,6},b[N][M];

        for(i = 0; i < M; i++)
        {
                for(j = 0;j < N; j++)
                {
                        printf("%d\t",a[i][j]);//打印
                        b[j][i] = a[i][j];//互换
                }
                printf("\n");


        }

        for(i = 0; i< N; i++)
        {
                for(j = 0; j < M; j++)
                        printf("%d\t",b[i][j]);//互换后打印
                printf("\n");

        }



}

int main()
{
        change();//在主函数中调用
}
              

求最大值及其所在位置:

#include <stdio.h>
#include <stdlib.h>

#define  M  2
#define  N  3

int main()
{
        int i,j,row,colum,MAX;
        int a[M][N] = {1,2,3,4,5,6};

        MAX = a[0][0];//假设

        for(i = 0; i < M; i++)
        {
                for(j = 0; j < N ; j++)
                {
                        if(MAX < a[i][j])//比较
                        {
                                MAX = a[i][j];
                                row = i;
                                colum = j;

                        }

                }
        }

        printf("MAX = %d , row = %d , colum = %d\n",MAX,i,j);

        exit(0);
}

求各行各列的和:

#include <stdio.h>
#include <stdlib.h>

//求4行3列数组的总和及其各列和
#define  M  4
#define  N  3

int main()
{
        int i,j;
        int a[5][4] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}};//拓展为5*4的数列,存储和的值


        for(i = 0 ; i < M ; i++)
        {       for(j = 0 ; j < N ; j++)
                {
                        a[4][3] += a[i][j];//总和
                        a[4][j] += a[i][j];//行和
                        a[i][3] += a[i][j];//列和
                }
        }


        for(i = 0 ; i < 5 ; i++)
        {
                for(j = 0 ; j < 4 ; j++)
                      printf("%4d",a[i][j]);//打印
                printf("\n");
        }

}

矩阵乘积:

#include <stdio.h>
#include <stdlib.h>

#define  M  2
#define  N  3
#define  K  2
int main()
{
        int i,j,k;
        int a[M][N] = {1,2,3,4,5,6};//两行三列
        int b[N][K] = {1,0,0,1,1,0};//三行两列
        int c[M][K] = {0};//结果就是两行两列

        for(i = 0 ; i < M ; i++)
        {       for(j = 0 ; j < K ; j++)
                {
                        for(k = 0; k < N ; k++)
                        {
                                c[i][j] += a[i][k]*b[k][j];  

                        }


                }
        }


        for(i = 0 ; i < M ; i++)
        {
                for(j = 0 ; j < K ; j++)
                      printf("%d\t",c[i][j]);
                printf("\n");
        }

}
~  

深入理解二维数组:

#include <stdio.h>
#include <stdlib.h>

#define  M  2
#define  N  3
#define  K  2
int main()
{
        int i,j;
        int a[M][N] = {1,2,3,4,5,6};

        printf("a = %p\n",a);//a为首地址
        printf("a+1 = %p\n",a+1);//a+1 为行地址+1

        for(i = 0 ; i < M ; i++)
        {
                for(j = 0; j < N ;j++)
                {
                        printf("a[%d][%d] = %p\n",i,j,&a[i][j]);
                }

        }

}

字符数组

1 定义、初始化、存储特点

【存储类型】 数据类型 标识符 【下标】

char str[N] = {};

单个字符初始化

char str[N] = {'a','b','c'};

用字符串常量初始化

char str[N] = {"a"};

2 输入输出

#include <stdio.h>
#include <stdlib.h>


int main()
{
    
    scanf("%s",str);//%s输入注意数组越界问题,以及scanf遇到空格、换行符、制表符就会输出,造成输入内容不完整
    printf("%s",str);
    
    exit(0);
}

3 常用函数

strlen & sizeof(获取长度)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{
        char str[] = "hello";

        printf("%d\n",strlen(str));//strlen打印有效字符的个数(包括空格),以'\0'作为结束标记   结果为 5 
        printf("%d\n",sizeof(str));//sizeof打印该字符串所占空间的字节数            结果为 6 

}

strcpy & strncpy(将字符串拷贝到数组中)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFSIZE 128

int main()
{
        char str[BUFFSIZE] = "hello";//初始化数组

        strcpy(str,"abcdefg");//将abcdefg字符串拷贝到str数组中,包括'\0',拷贝会将原先的内容完全覆盖,注意越界问题
        puts(str);


        strncpy(str,"abcdefg",BUFFSIZE);//strncpy与strcpy作用相同,但多了一个size的限制,用来限制输入的字符串的大小,										  使用时建议size的大小与数组的大小一致,即size = BUFFSIZE
        puts(str);

}

strcat & strncat(连接内容)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFSIZE 128

int main()
{
        char str[BUFFSIZE] = "hello";


        strcat(str," ");//将空格连接到hello后面的空字符'\0'上
        strcat(str,"world!");//将world连接到空格后面
    
        strncat(str," ",BUFFSIZE);//将空格连接到hello后面的空字符'\0'上,
        strncat(str,"world!",BUFFSIZE);//将world连接到空格后面,但多了一个size的限制,用来限制输入的字符串的大小,										  使用时建议size的大小与数组的大小一致,即size = BUFFSIZE
    	

        puts(str);//输出
}

strcmp & strncmp(比较两个字符串的ASCII码大小)(不太懂)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFSIZE 128

int main()
{
        char str1[BUFFSIZE] = "hello";
        char str2[BUFFSIZE] = "hello";
        printf("%d\n",strcmp(str1,str2));//相同为1

        char str3[BUFFSIZE] = "helloa";
        char str4[BUFFSIZE] = "hello";
        printf("%d\n",strcmp(str3,str4));//str3-str4 = 97

        char str5[BUFFSIZE] = "hello";
        char str6[BUFFSIZE] = "helloa"; //str5-str6 = -97
        printf("%d\n",strcmp(str5,str6));
}

单词计数:

#include <stdio.h>
#include <stdlib.h>

int main()
{
        int i;
        int flag = 0,count = 0;
        char str[128];

        gets(str);

        for(i = 0 ; str[i] != '\0'; i++)
        {
                if(str[i] == ' ' || str[i] == '\t')
                        flag = 0;
                else //如果有字符输入
                        if(flag == 0)//它上一个字符有空格,就是一个单词的开始
                        {
                                count++;
                                flag = 1;
                        }

        }
        printf("the number of count :%d \n",count);


        exit(0);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值