C数组

一批具有同名的同属性的数据(element)就组成了一个数组(array),数组是具有相同类型的数据组成的序列,是有序集合。数组中每个数据成为数组元素或下标变量。

  • 数组是一组有序数据的集合
    数组中各数据的排列是有一定规律的,下标(subscript)代表数据在数组中的序号。
  • 用一个数组名和下标来唯一地确定数组中的元素
  • 数组中的每个元素都属于同一个数据类型
C数组_第1张图片
数组声明

使用注意

  • 数组不能相互赋值或初始化
  • 不能使用数组类型作为函数的参数或返回值
  • 数组类型做右值使用时,自动转换成指向数组首元素的指针。
  • 在函数原型中如果参数写成数组的形式,则该参数实际上是指针类型。

一维数组

例:求平均分不使用数组

#include 

int main(void)
{
    int grade = 0;
    unsigned int count = 3;
    long sum = 0L;
    float average = 0.0f;

    for(unsigned int i=0; i

一维数组定义:类型符 数组名[常量表达式]

int arr[];
int a[10]; // 定义一个整型数组,数组名为a,数组拥有10个整型元素。
定义一维数组

数组引用:数组名[下标]

例:对元素赋值后逆序输出

#include 

int main()
{
    int i;
    int arr[10];

    for(i=0; i<10; i++){
        arr[i] = i;
    }

    int length = sizeof(arr)/sizeof(int);
    for(i=length-1; i>=0; i--){
        printf("%d\n", arr[i]);
    }

    return 0;
}

一维数组初始化

int arr[10] = {0,1,2,3,4,5};// 定义数组时对全部数组元素赋初值
int arr[] = {1,2,3,4};//数组元素个数确定可不指定数组长度

例:求数组中最大值

#include 

int main()
{
    int len = 10;
    int arr[len];
    int i,max;

    printf("input %d number:\n",len);
    for(i=0; i max){
            max = arr[i];
        }
    }

    printf("the max number is %d\n", max);

    return 0;
}

例:使用数组处理Fibonacci数列

#include 

int main()
{
    int i;
    int arr[20] = {1,1};
    for(i=2; i<20; i++){
        arr[i] = arr[i-2] + arr[i-1];
    }

    for(i=0; i<20; i++){
        if(0 == i%5){
            printf("\n");
        }
        printf("%12d", arr[i]);
    }
    printf("\n");

    return 0;
}

例:冒泡排序,将相邻两个数个数比较,将小的调到前头。

思路:相邻两数比较,前大后小则交换。

C数组_第2张图片
起泡法排序
C数组_第3张图片
冒泡法流程图
#include 

int main()
{
    int len = 10;
    int arr[len];
    int i,j,tmp;

    printf("input %d numbers:\n",len);
    for(i=0; i arr[i+1]){
                tmp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = tmp;
            }
        }
    }

    printf("the sorted numbers:\n");
    for(i=0; i

例:统计随机数,生成0~9的随机数,统计每个数字出现次数并打印,检查数字的随机性。

#include 
#include 

#define MAX_RAND 20

int arr[MAX_RAND];

void generate_random(int upper_bound)
{
    int i;
    for(i=0; i

二维数组

C数组_第4张图片
二维数组内存结构

二维数组称为矩阵(matrix),把二维数组写成行(column)和列(row)的排列形式。

C数组_第5张图片
二维矩阵

二维数组定义的形式:类型说明符 数组名[常量表达式][常量表达式]

int a[3][4] = {1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3};
int a[3][4] = {{1,1,1,1}, {2,2,2,2}, {3,3,3,3}};
C数组_第6张图片
二维矩阵表示

例:小组中5人,每人3门成绩,求全组分科的平均成绩和总平均成绩。

C数组_第7张图片
平均成绩
#include 

int main()
{
    int arr[5][3] = {{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};
    int i,j;
    int sum = 0;
    int avg[3];
    int average;

    for(i=0; i<3; i++){
        for(j=0; j<5; j++){
            sum = sum + arr[j][i];
        }
        avg[i] = sum/5;
        sum = 0;
    }

    average = (avg[0]+avg[1]+avg[2])/3;
    printf("%d %d %d %d\n",avg[0],avg[1],avg[2],average);

    return 0;
}

例:将二维数组的矩阵,行列互换。

C数组_第8张图片
矩阵行列互换
#include 

int main()
{
    int arr[2][3] = {{1,2,3}, {4,5,6}};
    int ary[3][2];
    int i,j;

    printf("array arr:\n");
    for(i=0; i<2; i++){
        for(j=0; j<3; j++){
            printf("%5d", arr[i][j]);
            ary[j][i] = arr[i][j];
        }
        printf("\n");
    }

    printf("array ary:\n");
    for(i=0; i<3; i++){
        for(j=0; j<2; j++){
            printf("%5d", ary[i][j]);
        }
        printf("\n");
    }

    return 0;
}

例:求二维矩阵中最大元素的值以及所在的行号和列号

思考在打擂台时怎样确定最后的优胜者

C数组_第9张图片
打擂台算法
#include 

int main()
{
    int a[3][4] = {{1,2,3,4}, {5,6,7,8}, {-1,-2,-3,-4}};
    int max;
    int i,j;
    int row,col;

    max = a[0][0];
    for(i=0; i<3; i++){
        for(j=0; j<4; j++){
            if(a[i][j] > max){
                max = a[i][j];
                row = i;
                col = j;
            }
        }
    }

    printf("max is %d\nrow is %d\ncolumn is %d\n", max, row, col);
    return 0;
}

例:从键盘键入9个整数,对照九宫格形式,输入三行三列保存在二维数组中,按数组原来位置输出第一行和第一列的所有元素。

C数组_第10张图片
九宫格
#include 
#include 
#include 

int main(int argc, const char * argv[])
{
    int i,j,arr[3][3];
    for(i=0; i<3; i++){
        for(j=0; j<3; j++){
            printf("input arr[%d][%d] number:\n",i,j);
            scanf("%d", &arr[i][j]);
        }
    }
    for(i=0; i<3; i++){
        for(j=0; j<3; j++){
            if(1==i || 1==j){
                printf("%-6d", arr[i][j]);
            }else{
                printf("%-6c",' ');//打印空格
            }
        }
        printf("\n");
    }

    return 0;
}

字符数组

字符型数据是以字符的ASCII代码存储在存储单元中,一般占一个字节,由于ASCII代码也属于整数形式,因此在C99标准中,把字符类型归纳为整型类型中的一种。

字符数组初始化,若初值个数大于数组长度则出现语法,若初值个数小于数组长度则其余元素自动定义为空字符即'\0'。

char c[10] = {'I',' ','a','m',' ','h','a','p','p','y'};
char c = “I am happy”;
printf("%s", c);

字符串处理函数

  • puts(str) 输出字符串
  • gets(str) 输入字符串
  • strcat(str1,str2...) 字符串连接
  • strcpy(str1, str2...) 字符串复制
  • strcmp(str1, str2...) 字符串比较
  • strlen(str) 获取字符串长度
  • strlwr(str) 转换为小写
  • strupr(str) 转换为大写

例:输入一行字符统计其中单词个数,单词之间使用空格分隔。

C数组_第11张图片
统计单词个数
C数组_第12张图片
统计单词个数
#include 

int main()
{
    char str[81];
    int i;
    char c;
    int num = 0;
    int word = 0;
    
    printf("input a line words:\n");
    gets(str);
    for(i=0; (c=str[i])!='\0'; i++){
        if(c==' '){
            word = 0;
        }else if(word==0){
            word = 1;
            num++;
        }
    }
    printf("there are %d words in this line.\n", num);

    return 0;
}

例:获取多个字符串中最大者

C数组_第13张图片
获取字符串中最大值
#include 
#include 

int main()
{
    char str[3][20];
    char string[20];
    int i;

    printf("input 3 word:\n");
    for(i=0; i<3; i++){
        gets(str[i]);
    }

    if(strcmp(str[0], str[1])>0){
        strcpy(string, str[0]);
    }else{
        strcpy(string, str[1]);
    }
    
    if(strcmp(str[2], string)>0){
        strcpy(string, str[2]);
    }
    printf("the largest string is: %s\n", string);

    return 0;
}

二分法

利用数组进行二分法查找数据,又叫折半查找法。适用情况是在一批“有序”数据中查找某数。

例:数组中按由小到大排列,从键盘输入某数,判断是否在数组中,若存在则输出所在序号。

#include 
#include 
#define MAX_RAND 20

int arr[MAX_RAND];

void make_rand(int upper_bound)
{
    for(unsigned int i=0; i arr[j+1]){
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
}

int main(void)
{
    make_rand(100);
    sort_rand();
    print_rand();
    return 0;
}

你可能感兴趣的:(C数组)