【零基础C语言】第四节 数组

【零基础C语言系列】

【零基础C语言】第一节 C语言概述+【数制进制码制】-优快云博客

【零基础C语言】第二节 数据类型、运算符、表达式-优快云博客

【零基础C语言】第三节 控制结构-优快云博客

目录

一、一维数组 

1.1 数组的定义

1.2 数组元素的引用

1.3 数组的初始化 

1.4 ☆代码练习

二、二维数组 

2.1 初始化 

2.2 元素存储 

2.3 ☆练习题 

三、数组排序(扩展)

3.1 选择排序

3.2 ☆示例解析

​编辑 四、字符数组 

3.1 字符数组的定义

3.2 字符串结束标志  '\0'

3.3 字符数组的输入输出

说明:

五、☆课后练习 

数组:具有相同数据类型有序集合

使用过程中需要保留原始数据

一、一维数组 

1.1 数组的定义

  • 常量表达式可以是常量和符号常量,但不能是变量
  • C语言不允许对数组大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值
//类型 名字[常量表达式]
int a[10]; //能放10个数据
float f[10];
char c[20];

1.2 数组元素的引用

数组的基本单元——数组元素

表现形式:数组名[下标]

                  下标:整型常量/表达式(整数)

               a0=a5+a7-a2*3]√

              int k=3;   a[k];  √

int a[10]; //数组的声明
 //访问数组第1个元素
a[0];
//a[10] 越界错误

1.3 数组的初始化 

//数组定义时,给数据元素赋值
int a[] = {0,1,2,3,4};
  • 初始化时可以只给部分元素赋初值,其余元素自动赋值 0 。  int a[5]={01}
  • 未初始化或采用赋值语句赋值,其他数组元素为不确定值int a[5]a[0]=1a[1]a[2]值不确定
  • 只能给元素逐个赋值,不能给数组整体赋值。 int a[5]={1,1,1,1,1};
  • 如果给全部元素赋值,可以不给出元素个数。    int a[]={1,2,3,4,5};

1.4 ☆代码练习

#include <stdio.h>
void main()
{
int i,a[10];
for (i=0; i<=9;i++)
a[i]=i;
for(i=9;i>=0; i--)
printf("%d ″,a[i]);
printf("\n″);
}
/**
* 求解斐波那契 Fibonacci数列
*/
# include <stdio.h>

int main() {
    int i;
    int fB[20] = {1, 1};
    //填后面的值
    for (i = 2; i < 20; i++) {
        fB[i] = fB[i - 2] + fB[i - 1];
    }
    //打印前20个斐波那契数字
    for (i = 0; i < 20; i++) {
        if (i % 5 == 0) printf("\n");
        printf("%d ", fB[i]);
    }
}
/**
* 保留2位小数 %.2f
 *占位符占12个宽度 %12d
*/

二、二维数组 

数组名[行][列]

2.1 初始化 

2.2 元素存储 

2.3 ☆练习题 

 

三、数组排序(扩展)

3.1 选择排序

#include <stdio.h>

int main() {
    int a[11] = {127, 3, 6, 28, 54, 68, 87, 105, 162, 18}; //第11个元素初始化为0
    int i, p, q, j, s;
    /**
     * 双循环: 相当于 127和后面所有数字都比一遍,
     * 再换 3和后面都比一遍
     * 看不懂就去体会双循环是怎么运行的
     */
    for (i = 0; i <= 10; i++) {
        //暂时存储 位置和值
        p = i;    //0
        q = a[i];  //127

        for (j = i + 1; j <= 10; j++) {
            //找到比原来大的就更新一次 p 和 q
            if (q < a[j]) {
                p = j;
                q = a[j];
            }
        }

        //交换,让大的放前面
        if (p != i) {
            s = a[i];
            a[i] = a[p];
            a[p] = s;
        }
        printf("%d ", a[i]);

    }//外层循环结束
}

3.2 ☆示例解析

 四、字符数组 

3.1 字符数组的定义

  • 如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符。
  • 如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。
char c[10]; //放10个数据
c[0]=′I′;        c[1]=′ ′;        c[2]=′a′;
c[3]=′m′;       c[4]=′ ′;      c[5]=′h′;
c[6]=′a′;        c[7]=′p′;    c[8]=′p′;
c[9]=′y′;

3.2 字符串结束标志  '\0'

为了测定字符串的实际长度, C 语言规定了 字符串结束标志

字符数组并不要求它的最后一个字符为0′,甚至可以不包含0′

但是由于系统对字符串常量自动加一个′\0′,

因此,为了使处理方法一致,在字符数组中也常人为地加上一个′\0′

char c[5]={′C′,′h′,′i′,′n′,′a′};

char c[6]={′C′,′h′,′i′,′n′,′a′,′\0′};

3.3 字符数组的输入输出

操作格式符说明
逐个字符输入输出%c用于输入或输出一个字符
整个字符串输入输出%s用于一次输入或输出一个字符串

说明:

1 )用 “%s” 格式符输出字符串时, printf 函数中的输出项是字符数组名,而不是数组元素名。
2 )如果数组长度大于字符串实际长度,也只输出到遇 0′ 结束。
3 )输出字符不包括结束符 0′。
4 )如果一个字符数组中包含一个以上 0′ ,则遇第一个 0′ 时输出就结束。
5 )可以用 scanf 函数输入一个或多个(输入时以空格分隔)字符串。数组中未被赋值的元素自动为 '\0' 。
/**
* 字符数组的输入输出
*/
#include <stdio.h>
int main(){
    char c1[6] = {'h','a','p','p','y','\0'};
    printf("%s\n",c1); //(1)

    char c2[7] = {'h','a','\0','p','\0','p','y'};
    printf("%s\n",c2); // (2)

    //用scanf函数输入字符串

    char str1[5],str2[5],str3[5];
    scanf("%s%s%s",str1,str2,str3);
}

 

五、☆课后练习 

输入一个矩阵,求该矩阵的转置,并输出?

int main() {
    printf("请输入一个2行3列的矩阵:\n");

    int a[2][3]; // 原始矩阵
    // 输入矩阵
    for (int i = 0; i < 2; ++i) { // 行
        for (int j = 0; j < 3; ++j) { // 列
            scanf("%d", &a[i][j]);
        }
    }

    // 转置并输出
    int b[3][2]; // 转置后的矩阵
    printf("转置后的矩阵为:\n");
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 2; ++j) {
            b[i][j] = a[j][i];
            // 输出矩阵,使用空格分隔
            printf("%d ", b[i][j]);
        }
        // 每行结束后换行
        printf("\n");
    }

    return 0; // 添加返回语句
}
//省略数组b,直接在输出时按转置的顺序访问原数组a的元素。
//节省内存,减少数据复制,提高了效率
#include <stdio.h>

int main() {

    printf("请输入一个2行3列的矩阵:\n");

    int a[2][3];

    for (int i = 0; i < 2; ++i) {
        for (int j = 0; j < 3; ++j) {
            scanf("%d", &a[i][j]);
        }
    }

    printf("转置后的矩阵为:\n");
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 2; ++j) {
            printf("%d ", a[j][i]);
        }
        printf("\n");
    }
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值