1

基础实例(2)

C语言编程基础实例2

数组

在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类型数据元素的集合称为数组。
在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型,因此按数组元素的类型不同,数组又可以分为数值数组、字符数组、指针数组、结构数组等各种类别。

一维数组

  • 一维数组定义方式
    一维数组的定义方式如下:
    类型说明符 数组名 [常量表达式]
    例如:
    int a[10];//说明整型数组a,有10个元素
    float b[10],c[20];//说明实行数组b,有10个元素,实行数组c,有20个元素
    char ch[20];//说明字符数组ch,有20个元素
    关于数组类型有几点需要注意:
    • 数组类型实际指数组元素的取值类型。对于同一数组。其所有元素的数据类型都是相同的。
    • 数组名的书写规则应符合标识符的书写规定
    • 数组名不能与其他变量名相同
    • 方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标是从0开始计算。因此5个元素分布为a[0],a[1],a[2],a[3],a[4]
    • 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。例如:
      #define FD 5
      main(){
      int a[3+2],b[6+DF];
      }
      
      是合法的。
    • 允许在同一个类型说明中,说明多个数组和多个变量。例如:int a,b,c,d,k1[10],k2[20];
  • 一维数组元素的引用
    数组元素是组成数组的基本单元。数组元素也是一种变量,其标识方法为数组名后跟一个下标。下标标识了元素在数组中的顺序号。
    数组元素的一般形式:
    数组名[下标]
    其中下标只能为整型常量或整型表达式。如为小数时,C编译将自动取证。例如:
    a[5]
    a[i+j]
    a[i++]
    都是合法的数组元素。数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。
    实例1
#include<stdio.h>
//数组
int main(){
    int i,a[10];
    for (i=0;i<10;)
        a[i++]=2*i+1;
    for (i=0;i<=9;i++)
        printf("%d ",a[i]);

    printf("\n%d %d\n",a[5],a[6]);
}

结果输出:

  • 一维数组的初始化
    给数组赋值的方法除了用赋值语句对数组元素逐个赋值外, 还可采用初始化赋值和动态赋值的方法。数值初始化赋值是指在数组定义时给数组元素赋予初值,数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。
    初始化赋值的一般形式:
    类型说明符 数组名[常量表达式]={值,值,...,值};。例如:
    int a[10] = {1,2,3,4,5,6,7,8,9,10};
    C语言对数组的初始化赋值有几点规定:
    • 可以只给部分元素赋初值。
      {}中值的个数少于元素个数时,只给前面部分元素赋值。例如int a[10] = {0,1,2,3,4};表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋值0.
    • 只能给元素逐个赋值,不能给数组整体赋值。
      例如给十个元素全部赋1值,只能写为:int a[10] = {1,1,1,1,1,1,1,1,1,1};,而不能写为int a[10]=1;
    • 如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。
      例如:int a[5]= {1,2,3,4,5};可以写为:int a[] = {1,2,3,4,5};
      实例2
#include<stdio.h>
int main(){
    int i, max, a[10];
    printf("input 10 numbers:\n");
    for(i=0;i<10;i++)
        scanf("%d",&a[i]);
    max=a[0];
    for (i=1;i<10;i++)
        if (a[i]>max)
            max = a[i];
    printf("max num=%d\n",max);

}

结果输出:

实例3:

#include<stdio.h>
int main(){
    int i,j,p,q,s,a[10];
    printf("\n input 10 nums:\n");
    for (i=0;i<10;i++)
        scanf("%d",&a[i]);

    for (i=0;i<10;i++){
        p=i;q=a[i];
        for (j=i+1;j<10;j++)
            if (q<a[j]){
                p=j;
                q=a[j];
            }
        if (i!=p){
            s=a[i];
            a[i]=a[p];
            a[p]=s;
        }
        printf("%d\n",a[i]);
    }
}

结果输出:

二维数组

  • 二维数组定义
    二维数组定义的一般形式是:
    类型说明符 数组名[常量表达式1][常量表达式2];
    例如:int a[3][4];说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3*4=12个,即:
a[0][0],a[0][1],a[0][2],a[0][3]
a[1][0],a[1][1],a[1][2],a[1][3]
a[2][0],a[2][1],a[2][2],a[2][3]
  • 二维数组元素的引用
    二维数组的元素也称为双下标变量,其表示的形式为:
    数组名[下标][下标]
    例如:a[3][4]表示a数组三行四列的元素。
#include<stdio.h>
//二维数组
int main(){
    int i,j,s=0,ave,v[3],a[5][3];
    printf("input the scores \n");
    for (i=0;i<3;i++){
        for (j=0;j<5;j++){
            scanf("%d",&a[j][i]);
            s = s + a[j][i];
        }
        v[i] = s/5;
        s= 0;
    }

    ave = (v[0] + v[1] +v[2])/3;
    printf("math:%d\nc language:%d\nbase:%d\n",v[0],v[1],v[2]);
    printf("total average:%d\n",ave);
}

结果输出:

  • 二维数组的初始化
    二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,
    也可按行连续赋值。例如对数组a[5][3]:
    • 按行分段赋值可写为:
      int a[5][3]={{80,75,92},{61,65,71},{57,69,80},{85,87,90},{76,77,85}}
    • 按行连续赋值可写为:
      int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,87}
      以上两种赋初值的结果完全一致。
      对于二维数组初始化还有几点说明:
    • 可以只对部分元素赋初值,未赋初值的元素自动取0值。例如:
      int a[3][3] = {{1},{2},{3}};是对每一行的第一个元素赋值,未赋值元素取0。
      1 0 0
      2 0 0
      3 0 0
      
    • int a [3][3]={{0,1},{0,0,2},{3}};结果为:
      0 1 0
      0 0 2
      3 0 0
      
    • 如对全部元素赋初值,则第一维的长度可以不给出。例如:
      int a[3][3] = {1,2,3,4,5,6,7,8,9};也可以写成:
      int a[][3]={1,2,3,4,5,6,7,8,9};
    • 数组是一种构造类型的数据。二维数组可以看作是一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成可二维数组。当然,前提是各个元素的类型相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。C语言
      允许这种分解。如二维数组a[3][4],可以分解为三个一维数组,其数组名分别为a[0],a[1],a[2]。对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素,例如:
      一维数组a[0]的元素为a[0][0],a[0][1],a[0][2],a[0][3]。必须强调的是,a[0],a[1],a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。
  • 字符数组
    用来存放字符量的数组称为字符数组。
    • 字符数组的定义
      例如:char c[10];字符数组也可以是二维或多维数组。
    • 字符数组的初始化
      字符数组也允许在定义时作初始化赋值。例如:
      char c[10]={‘c’, ‘ ’, ‘p’, ‘r’, ‘o’, ‘g’, ‘r’, ‘a’,’m’};未赋值的元素自动赋''。
    • char c[]={c, ,p,r,o,g,r,a,m};此时C数组的长度自动定为9。
    • 字符数组的引用
      #include<stdio.h>
      //字符数组赋值
      int main(){
          int i,j;
          char a[][5] = {{'B','A','S','I','C'},{'d','B','A','S','E'}};
          for (i=0;i<=1;i++){
              for(j=0;j<=4;j++)
                  printf("%c",a[i][j]);
              printf("\n");
          }
        }
      
      结果显示:
    • 字符串和字符串结束标志
      在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数
      组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志.有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。C语言允许用字符串的方式对数组作初始化赋值。例如:
      char c[] = {'c', '','p','r','o','g','r','a','m'};也可以写成char c[] = {"C program"};char c[] = "C program;。用字符串方式赋值比用字符逐个赋值多占一个字节,用于存放字符串结束标志'\0'。上面数组c在内存中的
      实际存放情况为

      '\0'是由C编译系统自动加上的。由于采用了'\0'标志,所以在用字符串赋初值时一般无需指定数组的长度,而由系统自动处理。
    • 字符串处理函数
      C语言提供了丰富的字符串处理函数, 大致可分为字符串的输入、输出、合并、修改、
      比较、转换、复制、搜索几类。使用这些函数可大大减轻编程的负担。用于输入输出的字
      符串函数,在使用前应包含头文件"stdio.h",使用其它字符串函数则应包含头文件
      "string.h"
      • 字符串输出函数:格式:puts(字符串组名)。功能是把字符数组中的字符串输出到显示器,即在屏幕上显示该字符串。
      • 字符串输入函数:格式:gets(字符串组名)。功能是从标准输入设备键盘上输入一个字符串。本函数得到一个函数值,即为该字符数组的首地址。
      • 字符串连接函数:格式:strcat (字符数组名 1,字符数组名 2)。功能是把字符数组 2 中的字符串连接到字符数组 1 中字符串的后面,并删去字符串1 后的串标志“\0”。本函数返回值是字符数组1的首地址。
      • 字符串拷贝函数:格式:strcpy(字符数组名1,字符数组名2)。功能是把字符数组 2 中的字符串拷贝到字符数组 1 中。串结束标志“\0”也一同拷贝.字符数名 2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。
      • 字符串比较函数:格式:strcmp(字符数组名1,字符数组名2)。功能是按照 ASCII 码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。字符串1=字符串2,返回值=0;字符串 1 〉字符串 2,返回值〉0;字符串 1〈字符串 2,返回
        值〈0。
      • 测字符串长度函数strlen:格式:strlen(字符数组名)。功能是测字符串的实际长度(不包含字符串结束标志'\0')并作为函数返回值。
posted @ 2023-04-11 17:31  Bonne_chance  阅读(21)  评论(0编辑  收藏  举报
1