zoukankan      html  css  js  c++  java
  • C语言程序设计-第6章 利用数组处理批量数据

    数据是一组有序数据的集合.数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号.

    用一个数组名和下标来唯一地确定数组中的元素.

    数组中的每一个元素都属于同一数据类型.

    定义一维数据的一般形式:

    类型符 数组名[常量表达式];

    在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度.

    常量表达式中可以包括常量和符号常量,不能包含变量.C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序远行过程中变量的值.

    如果在被调用的函数(不包括主函数)中定义数组,其长度可以是变量或非常量表达式.允许在调用函数时,形参有不同的值(形参从实参得到值),但在执行函数时,形参的值是不变的,数组长度是固定的.

    如果指定数组为静态(static)存储方式,则不能用"可变长数组".

    只能引用数组元素而不能一次整体调用整个数组全部元素的值.形式为: 数组名[下标]

    定义数组时用到的"数组名[常量表达式]"和引用数组元素时用的"数组名[下标]"形式相同,但含义不同,定义时指的是包含元素个数,引用时是指定某个元素.

    例6.1 对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int i,a[10];
        for(i=0;i<=9;i++)
        {
            a[i]=i;
        }
        for(i=9;i>=0;i--)
        {
            printf("%d	",a[i]);
        }
    
        return 0;
    }

    为了使程序简洁,常在定义数组的同时,给各数组元素赋值,这称为数组的初始化.可以用"初始化列表"方法实现数组的初始化.

    (1)在定义数组时给全部数组元素赋予初值.(2)可以只给数组中的一部分元素赋值.

    int a[10]={0,1,2,3,4};

    定义a数组长度为10,但花括号内只提供5个值,这表示只给前面5个元素赋初值,系统自动给后5个元素赋初值为0.

    (3)如果想给一个数组中全部元素值为0,可以写成

    int a[10]={0};//未赋值的部分元素自动设为0

    (4)在对全部数组元素赋初值时,由于数据的个数已经确定,因为可以不指定数组长度.例如可以这样写:

    int a[]={1,2,3,4,5};

    但如果数据长度与提供的初值个数不相同,则方括号中的数组长度不能省略.

    定义数值型数组时,指定了数组长度并对之初始化,凡未被"初始化列表"指定初始化的数组元素,系统会自动把它们初始化为0(如果是字符型数组,则初始化为'',如果是指针型数组,则初始化为NULL,即空指针).

    例6.2 用数组来处理求Fibonacci数列问题.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int i;
        int f[20]={1,1};
        for(i=2;i<20;i++)
        {
            f[i]=f[i-2]+f[i-1];
        }
        for(i=0;i<20;i++)
        {
            if(i%5==0) printf("
    ");
            printf("%12d",f[i]);
        }
        printf("
    ");
        return 0;
    }

    例6,3 从键盘输入10个数,要求按由小到大的顺序输出.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int a[10];
        int i,j,t;
        printf("input 10 numbers:
    ");
        for(i=0;i<10;i++)
            scanf("%d",&a[i]);
        printf("
    ");
        for(j=0;j<9;j++)
            for(i=0;i<9-j;i++)
                if(a[i]>a[i+1])
                {
                    t=a[i];
                    a[i]=a[i+1];
                    a[i+1]=t;
                }
        printf("the sorted numbers:
    ");
        for(i=0;i<10;i++)
            printf("%d",a[i]);
        printf("
    ");
        return 0;
    }

    二维数组常称为矩阵(matrix).

    二维数组定义形式:

    类型说明符 数组名[常量表达式][常量表达式]

    二维数组可被卸任是一种特殊的一维数组:它的元素又是一个一维数组.

    多维数组元素在内存中的排列顺序为:第1维的下标变量最慢,最右边的下标变化最快.

    二维数组元素的表示形式为:

    数组名[下标][下标]

    可以用"初始化列表"对二维数组初始化.

    (1)分行给二维数组赋初值.

    (2)可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值.

    (3)可以对部分元素赋初值.

    (4)如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第1维的长度可以不指定,但第2维长度不能省.

    例6.5 有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int i,j,row=0,colum=0,max;
        int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};//定义数组并赋初值
        max=a[0][0];//先认为a[0][0]最大
        for(i=0;i<=2;i++)
        {
            for(j=0;j<=3;j++)
            {
                if(a[i][j]>max)
                {
                    max=a[i][j];
                    row=i;
                    colum=j;
                }
            }
        }
        printf("max=%d
    row=%d
    colum=%d
    ",max,row,colum);
        return 0;
    }

    C语言中没有字符串类型,字符串是存放在字符型数组中的.

    用来存放字符数据的数组是字符数组.字符数组中的一个元素存放一个字符.

    如果花括号中提供的初值个数(即字符个数)大于数组长度,则出现语法错误.

    如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度.

    可以引用字符数组中的一个元素,得到一个字符.

    例6.6 输出一个已知的字符串.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        char c[15]={'I',' ','a','m',' ','a',' ','s','t','u','d','e','n','t','.'};
        int i;
        for(i=0;i<15;i++)
        {
            printf("%c",c[i]);
        }
        printf("
    ");
        return 0;
    }

    字符串的字符是逐个存放存放到数组元素中的.

    为了测定字符串的实际长度,C语言规定了一个"字符串结束标志",以字符''作为结束标志.如果字符数组中存有若干字符,前面9个字符都不是空字符(''),而第10个字符是'',则认为数组中有一个字符串,其有效字符为9个.也就是说,在遇到字符''时,表示字符串结束,把它前面的字符组成一个字符串.

    C系统在用字符数组存储字符串常量时会自动加一个''作为结束符.

    在程序中往往依靠检测''的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度.

    用''来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志.

    字符数组的输入输出可以有两种方法:

    (1)逐个字符输入输出.用格式符”%c"输入或输出一个字符.

    (2)将整个字符串一次输入或输出.用"%s"格式符,意思是对字符串(string)的输入输出.

    输出的字符串中不包括结束符''.

    用"s"格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名.

    如果数组长度大于字符串的实际长度,也只输出到遇''结束.

    如果一个字符数组中包含一个以上的'',则遇到第一个时输出就结束.

    scanf函数中的输入项如果是字符数组名,不要再加地址符&,因为在C语言中数组名代表该数组的起始地址.

    printf("%s",c);

    实际是这样执行的:按字符数组名c找到其数组起始地址,然后逐个输出其中的字符,直到遇到''为止.

    6.3.6使用字符串处理函数.

    1.puts函数--输出字符串的函数

    形式为:

    puts(字符数组)

    其作用是将一个字符串(以''结束的字符序列)输出到终端.

    用puts函数输出的字符串中可以包含转义字符.

    2.gets函数--输入字符串的函数

    形式为:

    gets(字符数组)

    其作用是从终端输入一个字符串到字符数组,并且得到一个函数值.该函数值是字符数组的起始地址.

    注意:用puts和gets函数只能输出或输入一个字符串.

    3.strcat函数--字符串连接函数

    形式为:

    strcat(字符数组1,字符数组2)

    其作用是把两个字符数组中的字符串连接起来,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值--字符数组1的地址.

    字符数组1必须足够大,以便容纳连接后的新字符串.

    连接前两个字符串的后面都有'',连接时将字符串1后面的''取消,只在新串最后保留''.

    4.strcpy和strncpy函数--字符串复制函数

    形式为:

    strcpy(字符数组1,字符串2)

    它表示"字符串复制函数",作用是将字符串2复制到字符数组1中去.

    字符数组1必须定义得足够大,以便容纳被复制的字符串2.字符数组1的长度不应小于字符串2的长度.

    "字符数组1"必须写成数组名形式,"字符串2"可以是字符数组名,也可以是一个字符串常量.

    不能用赋值语句将一个字符常量或字符数组直接给一个字符数组.

    只能用strcpy函数将一个字符串复制到另一个字符数组中去.用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素.

    可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去.

    5.strcmp函数--字符串比较函数

    形式为:

    strcmp(字符串1,字符串2)

    它的作用是比较字符串1和字符串2.

    字符串比较的规则是:将两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到''为止.

    (1)如全部字符相同,则认为两个字符串相等;

    (2)若出现不相同的字符,则以第1对不相同的字符比较结果为准.

    如果参加比较的两个字符串都由英文字母组成,则有一个简单的规律:在英文字典中位置在后面的为"大".

    比较结果由函数值带回:

    (1)如果字符串1=字符串2,则函数值为0.

    (2)如果字符串1>字符串2,则函数值为一个正整数.

    (3)如果字符串1<字符串2,则函数值为一个负整数.

    6.strlen函数--没字符串长度的函数

    形式为:

    strlen(字符数组)

    它是测试字符长度的函数.函数的值由字符串中实际长度(不包括''在内).也可以直接测试字符常量的长度.

    7.strlwr函数--转换为小写的函数.

    形式为:

    strlwr(字符串)

    函数的作用是将字符串中大写字线换成小写字母.

    8.strupr函数--转换成大写的函数.

    形式为:

    strupr(字符串)

    函数的作用是将字符串中小写字母换成大写字母.

    库函数并非C语言本身的组成部分,而是C语言编译系统为方便用户使用而提供的公共函数.不同的编译系统提供的函数数量和函数名,函数功能不尽相同,作用时要小心,必要时查一下库函数手册.

    注意:在使用字符串处理函数时,应当在程序文件的开头用

    #includ<string.h>

    把"string.h"文件包含到本文件中.

    6.3.7字符数组应用举例

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        char string[81];
        int i,num=0,word=0;
        char c;
        gets(string);//输入一个字符串给数组string
        for(i=0;(c=string[i])!='';i++)//只要字符不是''就继续执行循环
            if(c==' ')word=0;//如果是空格字符,使word置0
            else if(word==0)//如果不是空格字符且word原值为0
            {
                word=1;//使word置1
                num++;//num累加1,表示增加一个单词
            }
        printf("There are %d words in this line.
    ",num);
        return 0;
    }

    例6.9 有3个字符串,要求找出其中最大者.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
        char str[3][20];//定义二维字符数组
        char string[20];//定义一维字符数组,作为交换字符串时的临时字符数组
        int i;
        for(i=0;i<3;i++)
            gets(str[i]);//读入3个字符串,分别给str[0],str[1],str[2]
        if(strcmp(str[0],str[1])>0)//若str[0]大于str[1]
            strcpy(string,str[0]);//把str[0]的字符串赋给字符数组string
        else//若str[0]小于等于str[1]
            strcpy(string,str[1]);//str[1]的字符串赋给字符数组string
        if(strcmp(str[2],string)>0)//若str[2]大于string
            strcpy(string,str[2]);//把str[2]的字符串赋给字符数组string
        printf("
    the largest string is:
    %s
    ",string);//输出string
        return 0;
    }

    习题

    1.用筛选法求100之内的素数.

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int main()
    {
        int i,j,n,a[101];//定义数组包含101个元素
        for(i=1;i<=100;i++)//a[0]不用,只用a[1]到a[100]
            a[i]=i;
        a[1]=0;//先"挖到"a[1]
        for(i=2;i<sqrt(100);i++)
            for(j=i+1;j<=100;j++)
            {
                if(a[i]!=0&&a[j]!=0)
                    if(a[j]%a[i]==0)
                        a[j]=0;//把非素数"挖到"
            }
        printf("
    ");
        for(i=2,n=0;i<=100;i++)
        {
            if(a[i]!=0)//选出值不为0的数组元素,即素数
            {
                printf("%5d",a[i]);//输出素数,宽度为5列
                n++;//累积本行已输出的数据个数
            }
            if(n==10)
            {
                printf("
    ");
                n=0;
            }
        }
        printf("
    ");
        return 0;
    }

    4.有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中.

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int main()
    {
        int a[11]={1,4,6,9,13,16,19,28,40,100};
        int temp1,temp2,number,end,i,j;
        printf("array a:
    ");
        for(i=0;i<10;i++)
            printf("%5d",a[i]);
        printf("
    ");
        printf("insert data:");
        scanf("%d",&number);
        end=a[9];
        if(number>end)
            a[10]=number;
        else
        {
            for(i=0;i<10;i++)
            {
                if(a[i]>number)
                {
                    temp1=a[i];
                    a[i]=number;
                    for(j=i+1;j<11;j++)
                    {
                        temp2=a[j];
                        a[j]=temp1;
                        temp1=temp2;
                    }
                    break;
                }
            }
        }
        printf("Now array a:
    ");
        for(i=0;i<11;i++)
            printf("%5d",a[i]);
        printf("
    ");
        return 0;
    }

    5.将一个数组中的值按逆序重新存放.例如,原来顺序为8,6,5,4,1.要求改为1,4,5,6,8.

    解题思路:以中间的元素为中心,将其两侧对称的元素的值互换即可.

    #include <stdio.h>
    #include <stdlib.h>
    #define N 5
    
    int main()
    {
        int a[N],i,temp;
        printf("enter array a:
    ");
        for(i=0;i<N;i++)
            scanf("%d",&a[i]);
        printf("array a:
    ");
        for(i=0;i<N;i++)
            printf("%4d",a[i]);
        for(i=0;i<N/2;i++)
        {
            temp=a[i];
            a[i]=a[N-i-1];
            a[N-i-1]=temp;
        }
        printf("
    Now,array a:
    ");
        for(i=0;i<N;i++)
            printf("%4d",a[i]);
        printf("
    ");
        return 0;
    }

    13.编一程序,将两个字符串连接起来,不要用strcat函数.

    #include <stdio.h>
    #include <stdlib.h>
    
    
    int main()
    {
        char s1[80],s2[40];
        int i=0,j=0;
        printf("input string1:");
        scanf("%s",s1);
        printf("input string2:");
        scanf("%s",s2);
        while(s1[i]!='')
            i++;
        while(s2[j]!='')
            s1[i++]=s2[j++];
        s1[i]='';
        printf("
    The new string is:%s
    ",s1);
        return 0;
    }

    15.编写一个程序,将字符数组s2中的全部字符复制到字符数组s1中.不用strcpy函数.复制时,''也要复制过去.''后面的字符不复制.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
        char s1[80],s2[80];
        int i;
        printf("input s2:");
        scanf("%s",s2);
        for(i=0;i<=strlen(s2);i++)
            s1[i]=s2[i];
        printf("s1:%s
    ",s1);
        return 0;
    }
  • 相关阅读:
    循环语句
    JAVA-数据类型、变量、常量
    JAVA——程序流程控制——循环语句——for循环(打印三角形)
    循环语句
    JAVA基础学习1
    新手上路
    mysql内置函数之事务
    mysql内置功能
    mysql内置函数之视图
    pymysql模块
  • 原文地址:https://www.cnblogs.com/sunshinegirl-7/p/5024685.html
Copyright © 2011-2022 走看看