zoukankan      html  css  js  c++  java
  • 四、数组

    • 例题:输入n个学生的成绩,求他们的平均成绩,并求出成绩大于平均分的人数

      • 先考虑求平均成绩,代码怎么写?

        #include <cstdio>
        int main() {
            int n, score, sumn = 0;
            double aver;
            scanf("%d", &n);
            for (int i = 0; i < n; ++i) { //边读边累加求和
                scanf("%d", &score);
                sumn += score;
            }
            aver = (double)sumn / n;
        }
        
      • 分析:要求出人数,必须先求出平均数,但是score里面保存的是最后一个学生的成绩,但我们需要的是所有学生的成绩,因此,我们必须借助数组来实现这个保存数据的功能了

    • 数组的概念

      数组是连续存储数据的集合。

      • 组成数组的每个数据称为数组的元素
      • 数组的每个元素都属于同一种数据类型
      • 一个数组的所有元素在内存中的存储位置是连续的

    4.1 一维数组

    4.1.1数组的定义

    ​ 格式:数据类型 数组名[常量表达式];

    • 例如:

      • int a[10]; //定义能存储10个整形变量的数组,下标是:0~9
        char c[100];//定义能存储100个字符变量的数组,下标是:0~99
        double f[5];//定义能存储5个双精度实数变量的数组,下标是:0~4
        

    4.1.2 数组定义规定:

    1. 数组名的命名规则与变量名的命名规则一致。
    2. 常量表达式表示数组元素的个数。可以是常量和符号常量,但不能变量
    3. 数组的长度必须是整数
    • 以下方式定义数组是错误的

      int n;
      scanf("%d", &n);
      int a[n];//不能用变量n定义数组
      

    4.1.3 数组的初始化

    • 数组的初始化可以在定义时一并完成,有多种形式:

      1. 顺序指定全部元素的初始值

        int a[5] = {1,2,3,4,5};
        
      2. 顺序指定部分元素的初始值

        int x[10] = {0,1,2,3,4};//该方法仅对数组的前5个元素依次进行初始化,其余值为0。
        
      3. 对数组元素全部初始化为0,可以简写为:{}或{0}

        int a[5]={};//将数组a的5个元素都初始化为0。
        
      4. 初始化时不指定数组元素的个数

        int a[]={1, 2, 3};//该方法会定义一个长度为3的数组,每个元素初始值依次为1, 2, 3。
        
    • 注意:初始化时,{}里面的元素个数不能超过数组的大小。

    4.1.4 数组元素的引用

    • 引用的格式:数组名[常量表达式]

    • 数组引用的规定:

      1. 下标可以是任意值为整型的表达式,该表达式里可以包含变量和函数调用。
      2. 下标的范围是 0 到数组的最大长度减 1,引用时,下标值应在数组合法的下标值范围内。例如定义数组int a[3],则元素分别为a[0], a[1], a[2]。
      3. C 语言只能逐个引用数组元素,而不能一次引用整个数组。
      4. 数组元素可以像同类型的普通变量那样使用,对其进行赋值和运算的操作,和普通变量完全相同。例如:a[5] = 34;实现了给 a[5] 赋值为 34。
    • 例如(假设i, j均为整型):

      a[5] //引用a数组下标为5的元素
      a[i + 1] //先计算表达式 i+1 的值再引用相应值作为下标的元素
      a[++j] //先计算表达式 ++j 的值再引用相应值作为下标的元素
      

    4.1.5 数组的输入和输出

    • C语言规定,对数组的使用只能逐个引用数组元素,不能一次引用整个数组。同样,对数组的输入输出也是依次对每个元素进行的,不可整体输入输出。
    • 数组往往和循环一起结合使用,通常循环里面的控制变量来作为数组的下标,对数组的每个元素进行引用。

    例如:输入 n 个整数,并将他们输出。

    int n, a[20];
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
    }
    for (int i = 0; i < n; ++i) {
        printf("%d ", a[i]);
    }
    

    此时,我们返回开头的例题,并完成

    #include <cstdio>
    int main() {
        int n, score[100], sumn = 0;
        double aver;
        scanf("%d", &n);
        for (int i = 0; i < n; ++i) { // 计算分数总和
            scanf("%d", &score[i]);
            sumn += score[i];
        }
        aver = (double)sumn / n;
        int cnt = 0;
        for (int i = 0; i < n; ++i) { // 统计分数大于平均分的人数
            if (score[i] > aver) {
                ++cnt;
            }
        }
        printf("%lf %d", aver, cnt);
        return 0;
    }
    

    4.2 二维数组

    4.2.1 二维数组的定义

    ​ 格式:数据类型 数组名[常量表达式1][常量表达式2];

    • int a[10][5]; //定义一个10行5列的存储整形变量二维数组
      float b[20][9];//定义一个20行9列的存储单精度实数变量二维数组
      char c[100][120];//定义一个100行120列的字符变量二维数组
      
    • 二维数组定义的规则与一维数组一样,不再赘述。

    • 一维数组与二维数组直观上的区别:

      • 一维数组:

      • 二维数组:

    4.2.2 初始化

    • 数组的初始化可以在定义时一并完成,有多种形式:

      1. 顺序指定全部元素的初始值(每一行数据单独写在一个花括号里,中间以逗号隔开)。

        int a[3][2] = {{1, 2}, {3, 4}, {5, 6}};
        
      2. 顺序指定部分元素的初始值。

        int x[10][2] = {{0, 1}, {2}, {3, 4}};//该方法仅对数组对应位置的元素依次进行初始化,其余值为0。
        
      3. 对数组元素全部初始化为0,可以简写为:{}或{0}。

        int a[5][3] = {};// 将数组a的15个元素都初始化为0。
        
      4. 初始化时不指定行数,但必须指定列数。

        int a[][2] = {{1, 2}, {3, 4}};//该方法会定义一个2行2列的数组,每个元素初始值依次为1, 2, 3, 4。
        
    • 注意:初始化时,{}里面的元素个数不能超过数组的大小。

    4.2.3 二维数组的引用

    ​ 引用的的格式:数组名[行下标][列下标]

    • 数组引用的规定:

      1. 下标可以是任意值为整型的表达式,该表达式里可以包含变量和函数调用。

      2. 行(列)下标的范围是0到数组的最大行(列)数减1,引用时,下标值应在数组合法的下标值范围内。

        例如定义数组int a[3][3],则元素分别为:

        a[0][0], a[0][1], a[0][2]

        a[1][0], a[1][1], a[1][2]

        a[2][0], a[2][1], a[2][2]

      3. C 语言只能逐个引用数组元素,而不能一次引用整个数组。

      4. 数组元素可以像同类型的普通变量那样使用,对其进行赋值和运算的操作,和普通变量完全相同。

        例如:a[2][2] = 34;实现了给a[2][2]赋值为34。

    • 例如(若i, j均为整型):

      a[5][10] //引用a数组第5行第10列的元素
      a[i+1][j-1]//先计算再引用
      a[++j]
      

    4.2.4 二维数组的输入和输出

    • C 语言规定,对数组的使用只能逐个引用数组元素,不能一次引用整个数组。同样,对数组的输入输出也是依次对每个元素进行的,不可整体输入输出。
    • 数组往往和循环一起结合使用,通常循环里面的控制变量来作为数组的下标,对数组的每个元素进行引用。

    例如:输入 n 行 m 列的整数,并将它们输出。

    int n, m, a[20][20];
    scanf(“%d%d”, &n, &m);
    for (int i = 0; i < n; ++i) {
    	for (int j = 0; j < m; ++j) {
    		scanf(“%d”, &a[i][j]);
    	}
    }
    for (int i = 0; i < n; ++i) {
    	for (int j = 0; j < m; ++j) {
    		printf(“%d ”, a[i][j]);
    	}
    	printf("
    ");
    }
    
    

    4.3 字符数组

    我们拿一维字符数组的讲解作为示例,多维的类似于上面的方法。

    4.3.1定义

    • 字符数组的定义格式:char 数组名[常量表达式];
    • 例如:char sz[100];

    4.3.2初始化

    • 字符数组的初始化的方式有两种:

      1. 用字符初始化

        char sz1[5]={‘a’, ‘b’, ‘c’, ‘d’, ‘e’};
        
        • 初始值表中的每个数据项是一个字符,用字符给数组sz1的各个元素初始化。
        • 当初始值个数少于元素个数时,从首元素开始赋值,剩余元素默认为空字符(也叫结束符,用''表示,其ASCII码为0,)
      2. 用字符串常量初始化

        char sz1[5] = {“abcd”};
        char sz2[5] = “abcd”;
        
        • 字符串常量即用双引号括起来的若干个字符。
        • 字符串常量的长度不能超过数组的长度,其中的每个字符依次为数组的每个元素进行初始化,剩余的元素用空字符''补全。

    4.3.3 引用

    引用就不多说了,其他类型的数组用法完全一样。

    4.3.4 输入输出

    • 输入

      从键盘输入一个字符数组可以使用scanf函数或cin.getline()函数。

      • scanf 函数

        • 格式:scanf("%s", 字符数组名);

        • 说明:

          1. 这里的字符串名称之前不加&。例如:scanf(“%s”,&s1);错误的。

          2. 系统会自动在输入的字符串常量后添加’’作为字符串结束的标志,因此定义字符数组时,要保证数组大小严格大于输入的字符的个数。

          3. 遇到空格、换行符、tab作为一个字符串输入的结束。

            scanf(“%s%s%s”,s1,s2,s3);//从键盘输入Let us go,则三个字符串分别获取了三个单词。
            
      • cin.getline() 函数

        • cin.getline()需要添加头文件#include <iostream>using namespace std;
        • 此函数会一次读取多个字符(包括空白字符)。它以指定的地址为存放第一个读取的字符的位置,依次向后存放读取的字符,直到读满 (N-1) 个,或者遇到指定的结束符为止(以先遇到的为准)。若不指定结束符,则默认以回车或EOF作为结束符。具体格式如下:
          1. cin.getline(字符数组名, 字符个数);
          2. cin.getline(字符数组名,字符个数,结束符);
      • 两者的区别:

        1. scanf是以空格、tab或回车作为输入结束的标志

        2. cin.getline则可以读取空格、tab、回车,以限定的长度或结束符来停止输入。

          scanf("%s", sz);//遇到空格、回车、换行或文件结束读入截止
          cin.getline(sz, 50);//读入前49个字符,如果输入少于49遇到回车换行或EOF截止
          cin.getline(sz, 50, 'u');//如果存在字符'u'读到'u'截止,否则读满49字符或提前遇到EOF
          
    • 输出

      输出同样有两种方法

      • printf()函数

        格式:printf("%s", 字符数组名);

        说明:

        1. 用%s格式输出时,printf的输出项必须是字符数组名,而不能是数组元素。例如:printf(“%s”,a[5]);是错误的。
        2. 输出的内容遇到结束符''才会结束
      • puts()函数

        格式:puts(字符数组名);

        说明:

        1. puts函数输出一个字符串和一个换行符
        2. 对于已经声明过的字符数组str,printf(“%s ”, str)puts(str)是等价的。

    4.4 字符数组的处理函数

    4.4.1 strcat

    • 函数原型:char * strcat ( char * destination, const char * source );

    • 功能:

      • source所指向的字符串(包括'')复制到destination所指向的字符串后面。
      • 连接时删除destination 后的 ''
      • 要保证 destination足够长,以容纳被复制进来的source
      • source中原有的字符不变。
      • 返回指向destination 的指针
    • eg:

      char s[100]="hello",s1[100]="Jerry"
      strcat(s," world");//把字符串" world"复制并连接到字符传s的后面并在后面添加''
      strcat(s,s1);//把字符串s1及最后的''复制并连接到字符传s的后面
      

    4.4.2 strncat

    • 函数原型:char * strncat ( char * destination, const char * source, size_t num );

    • 功能:

      • source 字符串的前num个元素连接到destination 后面。
      • 连接后自动添加终止符''
      • 如果source字符串长度小于num 复制到终止符''为止,包括终止符。
      • source中原有的字符不变。
      • 返回指向destination 的指针
    • eg:

      char s[100]="hello",s1[100]="Jerry"
      strncat(s," world",3);//把字符串前3个字符" wo"复制并连接到字符传s的后面并在后面添加''
      strncat(s,s1,10);//s1的长度不足10,把字符串s1及最后的''复制并连接到字符传s的后面
      

    4.4.3 strcpy

    • 函数原型:char * strcpy ( char * destination, const char * source );

    • 功能:

      • source 指向的字符串包括终止符复制到 destination
      • 必须保证 source 足够大,能够容纳下destination,否则会导致溢出错误。
      • source中原有的字符不变。
      • 返回指向destination 的指针
    • eg:

      char s[100]="hello",s1[100]="Jerry"
      strcpy(s,"world");//把字符串"world"复制并覆盖s字符串,在后面追加终止符
      strcpy(s,s1);//把字符串s1包括终止符复制到字符串s,并覆盖s字符串
      

    4.4.4 strncpy

    • 函数原型:char * strncpy ( char * destination, const char * source, size_t num );

    • 功能

      • source 字符串的前num个元素拷贝到 destination
      • source 的元素个数少于 num 个拷贝到终止符为止,包括终止符
      • source 的元素个数大于等于num 个,则直接复制这 num 个字符,后面不添加终止符
      • source中原有的字符不变。
      • 返回指向destination 的指针
    • eg:

      char s[100]="hello",s1[100]="Jerry"
      strncpy(s,"world",3);//把字符串"world"前3个字符"wor"复制并覆盖s字符串,在后面不追加终止符
      strcpy(s,s1,10);//把字符串s1包括终止符复制到字符串s,并覆盖s字符串
      

    4.4.5 strcmp

    • 函数原型:int strcmp ( const char * str1, const char * str2 );

    • 功能

      • 比较字符串str1str2的大小
      • 从两个字符串的第一个字符开始比较其字符的ASCII
      • 如果同一位置的字符相同接着比较后面的字符,直到不同为止
      • str1<str2时返回负数,相等返回0,大于返回正数
    • eg:

      char s1[100]="hello",s2[100]="Jerry"
      int x = strcmp(s1,s2);//x>0,因为s1[0]>s2[0]
      int x = strcmp("hello,","hello");//x>0,因为两字符串前五个字符相同,s1[5]==' ',而s2[5]==''
      int x = strcmp("hello","hello");//x=0,两字符串相等
      

    4.5.6 strncmp

    • 函数原型:int strncmp ( const char * str1, const char * str2, size_t num );

    • 功能

      • 比较字符串str1str2num个字符的大小
      • 从两个字符串的第一个字符开始比较其字符的`ASCII
      • 如果同一位置的字符相同接着比较后面的字符,直到不同或比完前 num个为止
      • str1 的前num个字符 小于str2 的前num 个字符时返回负数,相等返回0,大于返回正数
    • eg:

      char s1[100]="hello",s2[100]="hello,world"
      int x = strcmp(s1,s2,5);//x=0,因为两字符串的前五个字符均相对
      int x = strcmp(s1+1,s2,5);//x<0,因为s1+1的第一个字符为'e',比s2的第一个字符'h'小
      int x = strcmp(s1,s2,10);//x<0,s1是s2的子串
      

    4.5.7 strlen

    • 函数原型:size_t strlen ( const char * str );
    • 功能:
      • 返回字符串数组的长度
      • 从数组起始位置开始计数,直到遇到终止符''为止
      • 字符串长度不包括终止符

    4.5.8 strstr

    • 函数原型:char * strstr (char * str1, const char * str2 );
    • 功能:
      • 如果str2str1的一个子串,则返回一个指向str2str1首次出现的位置
      • 如果str2不是str1的一个子串,则返回空指针NULL
  • 相关阅读:
    JavaScript运算符有哪些
    Android 之 Shape (圆角输入框)
    Java开源报表Jasper入门(2) -- 使用JasperSoft Studio创建一个简单报表
    PHP之set_error_handler()函数讲解
    PHP防止SQL注入与几种正则表达式讲解
    PHP对XML添加节点之appendChild()方法讲解
    PHP创建XML文件讲解
    PHP对XML文件操作类讲解
    PHP对XML文件操作之属性与方法讲解
    PHP之SQL防注入代码(360提供)
  • 原文地址:https://www.cnblogs.com/hbhszxyb/p/12232077.html
Copyright © 2011-2022 走看看