C数组

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

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

使用注意

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

一维数组

例:求平均分不使用数组

#include <stdio.h>

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

    for(unsigned int i=0; i<count; ++i){
        printf("enter a grade: ");
        scanf("%d", &grade);
        sum += grade;
    }
    average = (float)sum/count;
    
    printf("\naverage of the grades entered is: %f\n",average);

    return 0;
}

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

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

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

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

#include <stdio.h>

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 <stdio.h>

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

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

    max = arr[0];
    for(i=1; i<len; i++){
        if(arr[i] > max){
            max = arr[i];
        }
    }

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

    return 0;
}

例:使用数组处理Fibonacci数列

#include <stdio.h>

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;
}

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

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

起泡法排序
冒泡法流程图
#include <stdio.h>

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

    printf("input %d numbers:\n",len);
    for(i=0; i<len; i++){
        scanf("%d", &arr[i]);//动态赋值
    }
    printf("\n");

    for(j=0; j<len-1; j++){//需要进行len-1次扫描
        for(i=0; i<len-1-j; i++){//每次扫描到arr[len-j-1],和arr[len-j-1]进行比较
            if(arr[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<len; i++){
        printf("%12d", arr[i]);
    }
    printf("\n");

    return 0;
}

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

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

#define MAX_RAND 20

int arr[MAX_RAND];

void generate_random(int upper_bound)
{
    int i;
    for(i=0; i<MAX_RAND; i++){
        arr[i] = rand()%upper_bound;
    }
}

void print_random()
{
    int i;
    for(i=0; i<MAX_RAND; i++){
        printf("%4d", arr[i]);
    }
    printf("\n");
}

int count(int value)
{
    int i, count=0;
    for(i=0; i<MAX_RAND; i++){
        if(arr[i] == value){
            ++count;
        }
    }
    return count;
}

int main(void)
{
    int i, size=10;

    generate_random(size);
    print_random();

    for(i=0; i<size; i++){
        printf("%d\t%d\n", i, count(i));
    }

    return 0;
}

二维数组

二维数组内存结构

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

二维矩阵

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

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}};
二维矩阵表示

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

平均成绩
#include <stdio.h>

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;
}

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

矩阵行列互换
#include <stdio.h>

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;
}

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

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

打擂台算法
#include <stdio.h>

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个整数,对照九宫格形式,输入三行三列保存在二维数组中,按数组原来位置输出第一行和第一列的所有元素。

九宫格
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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) 转换为大写

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

统计单词个数
统计单词个数
#include <stdio.h>

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;
}

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

获取字符串中最大值
#include <stdio.h>
#include <string.h>

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 <stdio.h>
#include <stdlib.h>
#define MAX_RAND 20

int arr[MAX_RAND];

void make_rand(int upper_bound)
{
    for(unsigned int i=0; i<MAX_RAND; ++i){
        arr[i] = rand()%upper_bound;
    }
}

void print_rand(){
    for(unsigned int i=0; i<MAX_RAND; ++i){
        printf("%6u", arr[i]);
    }
    printf("\n");
}

void sort_rand(){
    int tmp;
    for(unsigned int i=0; i<MAX_RAND-1; ++i){
        for(unsigned int j=0; j<MAX_RAND-1-i; ++j){
            if(arr[j] > 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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,976评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,249评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,449评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,433评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,460评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,132评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,721评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,641评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,180评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,267评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,408评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,076评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,767评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,255评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,386评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,764评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,413评论 2 358

推荐阅读更多精彩内容