第4章 数组 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境) 第4章 数组 本章导读 数组是一种非常重要的构造类型。它是由若干个具有相同数据类型的变量按一定的存储顺序组成的,每一个变量称为一个数组元素。数组元素用数组名及下标来唯一确定。本章通过C程序实例分析着手,使读者能够掌握数组的定义及引用方法,并能够应用数组解决实际问题。 《 C语言程序设计》 (Visual C++ 6.0环境) 本章主要知识点 (1)一维数组的定义和引用。 (2)二维数组的定义和引用。 (3)字符数组与字符串的应用。 返回本书目录
第4章 数组 4.1 数组应用的C程序实例 4.2 一维数组的定义和引用 4.3 二维数组的定义和引用 4.4 字符数组与字符串 第4章 数组 《 C语言程序设计》 (Visual C++ 6.0环境) 4.1 数组应用的C程序实例 4.2 一维数组的定义和引用 4.3 二维数组的定义和引用 4.4 字符数组与字符串 4.5 综合实训 返回本章导读
4.1 数组应用的C程序实例 1. C程序实例1 2. C程序实例1 《 C语言程序设计》 (Visual C++ 6.0环境) 数组是若干具有相同数据类型且按一定存储顺序排列的一组变量。数组中的变量称数组元素。每一个元素通过数组名和存储位置(下标)来确定。根据确定数组的一个元素所需要的下标数把数组分为一维数组、二维数组、三维数组等,二维以上的数组也称为多维数组。 1. C程序实例1 2. C程序实例1 返回本章目录
4.1.1 C程序实例(1) 1.C程序实例1 《 C语言程序设计》 (Visual C++ 6.0环境) 【例4.1】应用一维数组,实现从键盘输入10个整数,输出其中的最小数。 程序名为l4_1.cpp。 #include"stdio.h" main() { int a[10],i,min; /*定义一维整型数组a及整型变量i和min, 数组a有10个元素*/ for(i=0;i<10;i++) /*循环输入数组a的10个元素*/ scanf("%d",&a[i]); min=a[0]; /*设a[0]元素为最小值min的初值*/ for(i=1;i<10;i++) /*逐个元素与min比较,找出最小值*/ if(min>a[i]) min=a[i]; printf("MIN=%d\n",min); /*输出找到的最小值min*/ } 程序结果 返回本节目录
[例4.1]程序结果 在【例4.1】程序实例中,输入10个整型数12,34,56,9,21,-12,34,0,-3,1分别存放在一维数组a的10个元素中。故程序运行结果见下图所示。 输入数据 输出结果 返回例题 返回本节目录
4.1.1 C程序实例(2) 2.C程序实例2 《 C语言程序设计》 (Visual C++ 6.0环境) 【例4.2】应用二维数组,实现从键盘为23数组输入值,并输出数组所有元素之和。 程序名为l4_2.cpp。 #include"stdio.h" main() { int a[2][3],i,j,sum=0; /*定义二维整型数组a及整型变量i,j和 sum,数组a有2行3列6个元素*/ for(i=0;i<2;i++) for(i=0;i<2;i++) /*按行向数组a输入6个元素,并将元素 值送入sum进行累加求和*/ for(j=0;j<3;j++) { scanf("%d",&a[i][j]); sum+=a[i][j]; } printf("Sum=%d\n",sum); /*输出和值sum*/ 程序结果 返回本节目录
[例4.2]程序结果 在【例4.2】程序实例中,输入6个整型数23,12,45,-12,-34,35分别存放在二维数组a两行三列的6个元素中。故程序运行结果见下图所示。 输入数据 输出结果 返回例题 返回本节目录
4.2 一维数组的定义和引用 4.2.1 一维数组的定义 4.2.2 一维数组元素的引用 4.2.3 一维数组的初始化 4.2 一维数组的定义和引用 《 C语言程序设计》 (Visual C++ 6.0环境) 4.2.1 一维数组的定义 4.2.2 一维数组元素的引用 4.2.3 一维数组的初始化 返回本章目录
4.2.1 一维数组的定义 《 C语言程序设计》 (Visual C++ 6.0环境) 一维数组定义的一般格式为: 4.2.1 一维数组的定义 一维数组定义的一般格式为: 类型说明符 数组名[常量表达式]; 《 C语言程序设计》 (Visual C++ 6.0环境) (1)类型说明符可以是int、char和float等,指明该数组的类型,即数组中每个元素的类型; (2)数组名的命名规则遵循标识符的命名规则,它代表数组存储时的首地址; (3)常量表达式是指数组的长度,即数组元素的个数。 在【例4.1】实例中“int a[10];”表示数组名是a,数组元素是整型,数组有10个元素。故定义了一个10个元素的整型数组a。 定义数组时,应该注意以下几点: (1)常量表达式的值必须是一个正的整数值。 (2)数组定义后,数组的长度就不能再改变。 (3)定义时,可用一个类型说明符来定义多个相同类型的数组和变量,相互之间用逗号分隔。如【例4.1】程序实例中“int a[10],i,min;”定义了一维整型数组a和整型变量i及min。 返回本节目录
4.2.2 一维数组元素的引用 《 C语言程序设计》 (Visual C++ 6.0环境) 4.2.2 一维数组元素的引用 数组的使用仍然遵从“先定义,后使用”的原则。数组使用是通过数组元素引用实现的,而不能直接使用整个数组,每一个数组元素就是一个简单变量。一维数组的数组元素表示形式为: 《 C语言程序设计》 (Visual C++ 6.0环境) 数组名 [下标] 下标是一个整型常量或整型表达式。一维数组元素的下标从0开始,如果数组长度为n,则元素的最大下标为n-1。 【例4.1】程序实例中“int a[10]”定义了一个10元素的整型数组a,则数组的10个元素分别是a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7], a[8],a[9],通过for(i=0;i<10;i++)scanf("%d",&a[i]);语句完成数组元素赋值,即输入给10个元素a[0]到a[9]。min=a[0];功能是假设a[0]元素为最小元素,将其值赋给记录最小值的变量min 。语句for(i=1;i<10; i++) if(min>a[i]) min=a[i];完成从a[1]到a[9]逐个元素与min比较,并将较小的元素值赋给min。最后循环结束后,min存储的是最小元素的值。输出语句printf("MIN=%d\n",min);执行后,输出结果为:MIN=-12。 注意:在一维数组引用过程中要防止下标越界问题。如“int a[10]”定义的数组a,数组a中不包括a[10]元素,下标为10已经越界。对于数组下标越界问题,C语言编译系统不进行检测,即不进行错误报告,只是会造成程序运行结果的错误。 返回本节目录
4.2.3 一维数组的初始化 《 C语言程序设计》 (Visual C++ 6.0环境) 4.2.3 一维数组的初始化 《 C语言程序设计》 (Visual C++ 6.0环境) 在定义一维数组同时给数组元素赋初始值,称为一维数组的初始化。一般格式为: 类型说明符 数组名[常量表达式]={初始值表}; 初始值表中数据与数组元素依次对应,初始值表中的数据用逗号(,)分隔。如,int a[5]={12,-3,4,0,367};则数组a的5个元素依次取得初始值。 一维数组初始化时,要注意以下两点: (1)当初始化,初始值表给出全部元素值时,则数组长度可缺省。如,前例造价于int a[]={12,-3,4,0,367}; (2)给数组中的部分元素赋初始值。如,int a[5]={1,2,3};则按照下标递增的顺序依次赋值,后两个元素系统自动赋0值。即a[0]=1,a[1]=2,a[2]=3,而a[3]和a[4系统自动赋值为0。 (3)数组中的全部元素赋初值为0。如,int a[5]={0}; 返回本节目录
4.3 二维数组的定义和引用 4.3.1 二维数组的定义 4.3.2 二维数组元素的引用 4.3.3 二维数组的初始化 4.3 二维数组的定义和引用 《 C语言程序设计》 (Visual C++ 6.0环境) 4.3.1 二维数组的定义 4.3.2 二维数组元素的引用 4.3.3 二维数组的初始化 返回本章目录
4.3.1 二维数组的定义 《 C语言程序设计》 (Visual C++ 6.0环境) 二维数组定义的一般格式为: 4.3.1 二维数组的定义 二维数组定义的一般格式为: 类型说明符 数组名[常量表达式1][常量表达式2]; 《 C语言程序设计》 (Visual C++ 6.0环境) (1)类型说明符和数组名含义均与一维数组相同。 (2)二维数组区别于一维数组的根本在于数组名后有两个常量表达式。常量表达式1表示行数,而常量表达式2表示列数。也就是他们分别指出数组的行长度和列长度。 在【例4.2】实例中“int a[2][3];”表示数组名是a,数组元素是整型,数组有2行3列,共计6(23)个元素。即定义了一个2行3列的整型数组a。 二维数组的行列下标也是从0开始。则数组a的6个元素是: a[0][0],a[0][1],a[0][2] a[1][0],a[1][1],a[1][2] 二维数组被定义后,编译系统将为该数组在内存中分配一片连续的存储空间,按行的顺序连续存储数组中的各个元素。即先顺序存储第一行元素,从a[0][0]到a[0][2],再存储第二行的元素,从a[1][0]到a[1][2]。数组名a仍然代表数组的起始地址。 返回本节目录
4.3.2 二维数组元素的引用 《 C语言程序设计》 (Visual C++ 6.0环境) 二维数组元素的引用形式为: 4.3.2 二维数组元素的引用 二维数组元素的引用形式为: 数组名[行下标][列下标] 《 C语言程序设计》 (Visual C++ 6.0环境) 行(列)下标表达式可以是整型常量、整型变量及表达式,表示二维数组的行(列)长度。下标值仍然从0开始,到行(列)长度减1。 在【例4.2】程序实例中“int a[2][3];”,定义了一个2行3列的二维整型数组a,则在内存中依次连续存储的数组元素为a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2],通过循环嵌套语句给数组a的各个元素输入值。如下: for(i=0;i<2;i++) /*按行向数组a输入6个元素,并将元素值送入 sum进行累加求和*/ for(j=0;j<3;j++) { scanf("%d",&a[i][j]); sum+=a[i][j]; } 外循环中变量i指示行下标,内循环中变量j指示列下标,从而完成6次输入,即23 12 45 -12 -34 35<CR>,输入6个元素值,并将值依次送入sum变量累加求和。循环结束后,由输出语句printf("Sum=%d\n",sum);完成累加和sum的输出,结果为:Sum=69 返回本节目录
4.3.3 二维数组的初始化 《 C语言程序设计》 (Visual C++ 6.0环境) 4.3.3 二维数组的初始化 定义二维数组时,给数组元素赋初值称为二维数组初始化。二维数组初始化时要注意二维数组的元素排列顺序。初始值的排列顺序必须与数组元素在内存的存储顺序完全一致。具体的方法如下: 1.分行给二维数组赋初值。 2.按数组排列顺序对各元素赋初值。 3.对部分元素赋初值。 4.赋初值时,有些情况可缺省第一维长度,但第二维长度不能缺省。 《 C语言程序设计》 (Visual C++ 6.0环境) 如,int a[2][3]={{1,2,3},{4,5,6}}; 按行赋初值的方法直观。 如,int a[2][3]={1,2,3,4,5,6}; 此方法数据所处的行列位置不直观,尤其是数据多时,数据存储所在的行列需要仔细定位,容易出现错误。 如,int a[2][3]={{1},{0,4}}; 此法对数组中各行部分元素赋初值,其余元素值自动为0。即赋值后数组a的各元素为: 1 0 0 0 4 0 (1)数组的全部元素都赋初值时,则定义数组时对第一维长度可以缺省。如,int a[ ][3]={1,2,3,4,5,6}; 等价于 int a[2][3]={1,2,3,4,5,6}; (2)在分行赋值时),可以在定义时省略第一维的长度。如,int a[ ][3]={{0},{0,3}};赋值后数组a的元素分别为: 0 0 0 0 3 0 返回本节目录
4.4 字符数组与字符串 4.4.1 字符数组的定义 4.4.2 字符数组的初始化 4.4.3 字符数组的引用 4.4 字符数组与字符串 《 C语言程序设计》 (Visual C++ 6.0环境) 4.4.1 字符数组的定义 4.4.2 字符数组的初始化 4.4.3 字符数组的引用 4.4.4 字符数组的输入输出 4.4.5 字符串处理函数 返回本章目录
4.4.1 字符数组的定义 《 C语言程序设计》 (Visual C++ 6.0环境) 字符数组是用来存放字符数据的数组,即数组的数据类型是字符型(char)的数组称为字符数组。字符数组的每个元素存放一个字符。 字符数组的定义形式为: 一维字符数组定义: 二维字符数组定义: char 数组名[常量表达式]; char 数组名[常量表达式1][常量表达式2]; 如, char c[10]; /*定义了一个10个元素的一维字符数组c*/ char c[2][10]; /*定义了一个2行10列的二维字符数组c*/ 由于字符型与整型是互相通用的,因此上面的定义也可改为: int c[10]; int c[2][10]; 但是,此种方法定义会浪费存储空间。 返回本节目录
4.4.2 字符数组的初始化 《 C语言程序设计》 (Visual C++ 6.0环境) 1.用字符常量初始化数组 4.4.2 字符数组的初始化 1.用字符常量初始化数组 2.用字符串常量初始化数组 《 C语言程序设计》 (Visual C++ 6.0环境) (1) 一维字符数组初始化,如,char c[10]={’a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’,’i’,’j’}; (2) 二维字符数组初始化,如,char c[2][10]={{ ’a’,’b’,’c’},{’d’,’e’,’ ’}}; 字符数组c各元素初值为:‘a’‘b’‘c’‘\0’‘\0’‘\0’‘\0’‘\0’‘\0’‘\0’ ‘d’‘e’‘ ’‘\0’‘\0’‘\0’‘\0’ ‘\0’‘\0’‘\0’ (3) 当初值个数与字符数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。 (4) 用整型常量初始化字符数组。如,char c[5]={‘H’,111,119}; 字符串是用双引号括起来的字符序列,在C语言中,字符串是利用字符数组来存放和处理的。 (1)用字符串常量初始化一维字符数组。如,char c[ ]={“How are you”};也写成:char c[ ]=“How are you”;相当于:char c[ ]={‘H’,’o’,’w’,’ ‘,’a’,’r’,’e’,’ ‘,’y’,’o’,’u’,’\0’} (2)二维数组初始化时,也可以使用字符串进行初始化。例如: char c[ ][ 8]={ "white","black"}; 返回本节目录
4.4.3 字符数组的引用 《 C语言程序设计》 (Visual C++ 6.0环境) 4.4.3 字符数组的引用 字符数组的引用,也是通过对数组逐个元素引用实现的。引用数组的元素可以得到一个字符。 【例4.3】应用一维字符数组,输入一个字符串。程序名为l4_3.cpp。 《 C语言程序设计》 (Visual C++ 6.0环境) #include "stdio.h" main() { char c[ ]="How are you!"; /*定义一维数组c有13元素*/ int i; for(i=0;i<13;i++) /*通过循环控制输出数组每个元素*/ printf("%c",c[i]); printf("\n"); } 运行结果: How are you! 返回本节目录
4.4.4 字符数组的输入输出 《 C语言程序设计》 (Visual C++ 6.0环境) 4.4.4 字符数组的输入输出 通过scanf()或getchar()对字符数组输入赋值,通过printf()或putchar()对字符数组输出,在1.4节中已介绍。使用scanf()和printf()完成输入输出时,%c格式是逐个字符元素输入输出,而%s格式是对整个字符串一次完成输入和输出。在使用%s格式时请注意以下问题: 《 C语言程序设计》 (Visual C++ 6.0环境) (1)在scanf中使用格式说明符%s实现整串的输入。如, char c[20]; scanf(“%s”,c);执行时,若输入:abcd<CR>则字符串将从数组c的起始地址(&c[0]或数组名c)开始依次放入数组c中,数组剩余空间补’\0’。 (2)用%s格式符输入字符串时,空格、Tab符和回车符只能作为分隔符而不能输入到数组中。如,若输入字符串为:How are you!<CR>则只有字符串“How”存入到数组中,其余被截掉。 (3)当输入项为数组元素的地址时,输入数据将从这一元素开始存放。(4)输入字符串时,避免发生越界。 (5)在printf()中使用格式说明符%s可以实现整串的输出。其调用形式为:printf(“%s”,c); c是存储单元的首地址。调用这个函数时,将从c地址开始输出存储单元中的字符,直到遇到第一个’\0’为止。输出结束后不自动换行。 返回本节目录
4.4.5 字符串处理函数 1. 字符串输入函数gets() 2.字符串输出函数puts() 3.字符串长度函数strlen() 4.4.5 字符串处理函数 C语言编译系统提供了大量处理字符串的库函数,下面介绍几种常用的函数。使用字符串输入函数gets()和输出函数puts()时,要用#include命令将“stdio.h”头文件包含到源文件中。而使用其他的字符串处理函数时,要用#include命令将“string.h”头文件包含到源文件中。 《 C语言程序设计》 (Visual C++ 6.0环境) 1. 字符串输入函数gets() 2.字符串输出函数puts() 3.字符串长度函数strlen() 4.字符串连接函数strcat() 5.字符串复制函数strcpy() 6.字符串比较函数strcmp() 返回本节目录
4.4.5 字符串处理函数(1) 1. 字符串输入函数gets() 《 C语言程序设计》 (Visual C++ 6.0环境) 4.4.5 字符串处理函数(1) 1. 字符串输入函数gets() 《 C语言程序设计》 (Visual C++ 6.0环境) 调用gets()函数实现字符串的输入,其调用形式为: gets(字符数组); 功能:从终端输入一个字符串(包括空格)赋给从字符数组起始的存储单元中,直到读入一个回车符为止。回车符读入后,不作为字符串的内容,系统将自动用’\0’替换,作为字符串结束的标志。 如: char c[20]; gets(c); 执行上面的语句,如果输入:How are you!<CR> 则将读入的12个字符依次存入到c[0]开始的存储单元中,并在其后自动加入一个字符串结束标志’\0’。 返回 返回本节目录
4.4.5 字符串处理函数(2) 2.字符串输出函数puts() 《 C语言程序设计》 (Visual C++ 6.0环境) 4.4.5 字符串处理函数(2) 2.字符串输出函数puts() 《 C语言程序设计》 (Visual C++ 6.0环境) 调用puts()函数实现字符串的输出,其调用形式为: puts(字符数组); 功能:将字符数组起始地址开始的一个字符串(以’\0’结束的字符序列)输出到终端,并将字符串结束标志’\0’转化成’\n’,自动输出一个换行符。 如: char c[ ]= "How\nare\nyou!"; puts(c); 输出结果: How are you! 返回 返回本节目录
4.4.5 字符串处理函数(3) 3.字符串长度函数strlen() 《 C语言程序设计》 (Visual C++ 6.0环境) 4.4.5 字符串处理函数(3) 3.字符串长度函数strlen() 《 C语言程序设计》 (Visual C++ 6.0环境) 调用strlen()函数实现字符串长度的测试,其调用形式为: strlen(字符数组或字符串); 功能:测试字符数组起始地址开始的字符串(以’\0’结束的字符序列)有效长度。函数值为字符数组或字符串的有效字符个数,不包括’\0’在内。 如: char c[20 ]= "How\nare\nyou!"; printf("%d\n",strlen(c)); 输出结果:12 返回 返回本节目录
4.4.5 字符串处理函数(4) 4.字符串连接函数strcat() 《 C语言程序设计》 (Visual C++ 6.0环境) 4.4.5 字符串处理函数(4) 4.字符串连接函数strcat() 《 C语言程序设计》 (Visual C++ 6.0环境) 调用strcat()函数实现两个字符串的连接,其调用形式为: strcat(字符数组1,字符数组2或字符串); 功能:将字符数组2(字符串)连接到字符数组1的后面,函数值为字符数组1的地址。 如: char c1[30 ]= "How are you!\n"; char c1[ ]= "I am fine!"; printf("%s ",strcat(c1,c2)); 输出结果: How are you! I am fine! 使用strcat()函数应注意两个问题:(1)连接前字符数组1和字符数组2的尾部都有一个’\0’,连接时将字符数组1后的’\0’自动取消,字符数组2后的’\0’一并连接到字符数组1后。 (2)字符数组1必须有足够长度,以便在其有效字符后能够容纳下字符数组2中的字符串。 返回 返回本节目录
4.4.5 字符串处理函数(5) 5.字符串复制函数strcpy() 《 C语言程序设计》 (Visual C++ 6.0环境) 4.4.5 字符串处理函数(5) 5.字符串复制函数strcpy() 《 C语言程序设计》 (Visual C++ 6.0环境) 调用strcpy()函数实现字符串的拷贝,其调用形式为: strcyp(字符数组1,字符数组2或字符串); 功能:将字符数组2(字符串)复制到字符数组1中去。函数值为字符数组1的起始地址。 如: char c1[30 ],c2="How are you!\n"; printf("%s ",strcpy(c1,c2)); 输出结果:How are you! 在使用strcpy()函数时,需要注意下面问题: (1)字符数组1的长度容纳字符数组2中的字符串。 (2)将字符数组2中字符串的结束标志’\0’一起复制到字符数组1中。 (3)strcpy()函数能够将字符数组2前面若干个字符复制到字符数组1中。如:strcpy(c1,c2,4); 该语句的作用是将c2中前面的4字符复制到c1 中去,然后系统自动添入一个字符串结束标志’\0’。 返回 返回本节目录
4.4.5 字符串处理函数(6) 6.字符串比较函数strcmp() 《 C语言程序设计》 (Visual C++ 6.0环境) 4.4.5 字符串处理函数(6) 6.字符串比较函数strcmp() 《 C语言程序设计》 (Visual C++ 6.0环境) 调用strcmp()函数实现字符串的大小比较,其调用形式为: strcmp(字符数组1或字符串1,字符数组2或字符串2); 功能:将两个字符数组(字符串)自左向右对应的字符逐个进行比较(按ASCII码值大小比较),直到出现不同字符或遇到’\0’字符为止,函数值为一个整型数。 当字符串中的对应字符全部相等且同时遇到’\0’字符时,则两个字符串相等,否则,以第一个不相同的字符的比较结果作为整个字符串的比较结果,比较结果由函数值带回,具体情况见下表所示。 字符串大小情况 函数值 VC++ 6.0函数值 TC 2.0函数值 字符串1等于字符串2 字符串1大于字符串2 1 首不同字符的ASCII码差值(正整数) 字符串1小于字符串2 -1 首不同字符的ASCII码差值(负整数) 返回 返回本节目录
4.5 综合实训 1. 程序实例1【例4.5】 2. 程序实例2【例4.6】 3. 程序实例3【例4.7】 4. 程序实例4【例4.8】 4.5 综合实训 《 C语言程序设计》 (Visual C++ 6.0环境) 1. 程序实例1【例4.5】 2. 程序实例2【例4.6】 3. 程序实例3【例4.7】 4. 程序实例4【例4.8】 返回本章目录
4.5 综合实训( 1【例4.5】 ) 《 C语言程序设计》 (Visual C++ 6.0环境) 4.5 综合实训( 1【例4.5】 ) 【例4.5】输入10位学生的成绩,求出平均分,并输出高于平均分的同学成绩。程序名为l4_5.cpp。 《 C语言程序设计》 (Visual C++ 6.0环境) #include "stdio.h" main() { int i; float score[10],aver=0.0; printf("Please input scores of 10 students:"); for(i=0;i<10;i++) /*输入10位学生成绩并累加和*/ { scanf("%f",&score[i]); aver+=score[i]; } aver/=10; /*求出10位学生的平均成绩*/ printf("The average score is:%.2f\n",aver); printf("They are:"); for(i=0;i<10;i++) /*输出高于平均成绩的学生成绩*/ if(score[i]>aver) printf("%6.2f",score[i]);} 返回 返回本节目录
4.5 综合实训( 1【例4.5】结果) 运行结果 《 C语言程序设计》 (Visual C++ 6.0环境) 输入10个成绩 输出平均成绩 4.5 综合实训( 1【例4.5】结果) 《 C语言程序设计》 (Visual C++ 6.0环境) 运行结果 输入10个成绩 输出平均成绩 输出高于平均分成绩 返回 返回本节目录
4.5 综合实训( 2【例4.6】 ) 《 C语言程序设计》 (Visual C++ 6.0环境) 4.5 综合实训( 2【例4.6】 ) 《 C语言程序设计》 (Visual C++ 6.0环境) 【例4.6】用冒泡法对10个整型数按升序进行排序。 冒泡法是使较小的值像空气泡一样逐渐“上浮”到数组的顶部,而较大的值逐渐下沉到数组的底部。 具体思路是:从第一数开始将相邻的两个数比较,较大的数向后移动,较小的数向“上浮”一个,经过一轮的比较,最大的数移动到末尾。对剩下的数继续下一轮的比较和移动。如果n个数比较,这样n-1轮后,就完成了排序工作。程序名为l4_6.cpp,程序如下: 返回 返回本节目录
4.5 综合实训( 2【例4.6】程序 ) 《 C语言程序设计》 (Visual C++ 6.0环境) #include "stdio.h" 4.5 综合实训( 2【例4.6】程序 ) #include "stdio.h" main() { int i,j,t,a[10]; printf("Please input 10 numbers:\n"); for(i=0;i<10;i++) /*输入10个整数存入数组a中*/ scanf("%d",&a[i]); for(i=0;i<9;i++) /*对数组a中的10个整数排序*/ for(j=0;j<9-i;j++) if(a[j]>a[j+1]) /*前面的元素大于后面的元素则交换*/ { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } printf("The sorted numbers are:"); for(i=0;i<10;i++) /*输出数组a中的10个元素*/ printf("%d ",a[i]); printf("\n"); } 《 C语言程序设计》 (Visual C++ 6.0环境) 返回 返回本节目录
4.5 综合实训( 2【例4.6】结果) 运行时输入:89 67 45 87 32 1 0 45 2 3<CR> 4.5 综合实训( 2【例4.6】结果) 运行时输入:89 67 45 87 32 1 0 45 2 3<CR> 运行结果: 《 C语言程序设计》 (Visual C++ 6.0环境) 输入10个无序数 输出排序结果 返回 返回本节目录
4.5 综合实训( 3【例4.7】 ) 《 C语言程序设计》 (Visual C++ 6.0环境) 4.5 综合实训( 3【例4.7】 ) 《 C语言程序设计》 (Visual C++ 6.0环境) 【例4.7】用选择法对10个整型数按升序进行排序。 选择法的思路是:从第一元素开始逐个元素进行比较,并记录下较小元素的下标,经过一轮的比较和记录后,记录的下标为最小元素的下标,将该元素与第一个元素交换。对剩下的数继续下一轮的比较和记录。如果n个数比较,这样n-1轮后,就完成了排序工作。程序名为l4_7.cpp。 程序如下: 返回 返回本节目录
4.5 综合实训( 3【例4.7】程序 ) 《 C语言程序设计》 (Visual C++ 6.0环境) #include "stdio.h" 4.5 综合实训( 3【例4.7】程序 ) #include "stdio.h" main() { int i,k,j,t,a[10]; printf("Please input 10 numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); /*输入10个整数存入数组a中*/ for(i=0;i<9;i++) /*对数组a中的10个整数排序*/ { k=i; for(j=i+1;j<10;j++) if(a[k]>a[j]) k=j; t=a[k]; a[k]=a[i]; a[i]=t; /*本轮最小的元素与本轮首的元素交换*/ } printf("The sorted numbers are:"); for(i=0;i<10;i++) printf("%d ",a[i]); /*输出排序后数组a中的10个元素*/ printf("\n"); 《 C语言程序设计》 (Visual C++ 6.0环境) 返回 返回本节目录
4.5 综合实训( 4【例4.8】 ) 《 C语言程序设计》 (Visual C++ 6.0环境) 4.5 综合实训( 4【例4.8】 ) 【例4.8】应用二维数组,实现简单的学生成绩查询系统的设计。具体要求如下: (1)根据用户输入的学号,能够给出该生各科成绩及平均分。 (2)根据用户输入的课程代号,能够给出该课程中每位学生的成绩及课程平均分。 (3)能够查询出某个学生某一门的考试成绩。 《 C语言程序设计》 (Visual C++ 6.0环境) 程序分析:学生成绩用二维数组存储,各行代表各位学生的信息,各列代表学生学号和各门课程代号的信息。程序依次有5项功能:学生信息的输入;输入学号,输出该生各科成绩及平均分;输入课程代号,输出该课程每位学生成绩及课程平均分;输入学生学号及课程代号,输出成绩;设计功能选择菜单及利用switch —case语句实现以上功能。程序名为l4_8.cpp,程序如下: 返回 返回本节目录
4.5 综合实训( 4【例4.8】程序1) 《 C语言程序设计》 (Visual C++ 6.0环境) #include "stdio.h" 4.5 综合实训( 4【例4.8】程序1) #include "stdio.h" #define N 4 /*定义符号常量N等于4*/ #define M 5 /*定义符号常量M等于5*/ main() { int select; int score[N][M],i,j,aver,num; while (1) /*菜单循环显示和功能循环处理*/ { printf(" 欢迎使用学生查询系统!\n\n");/*菜单显示*/ printf("* * * * * * * * * * * * * * * * * * * * * *\n"); printf("* 请选择查询对象: *\n"); printf("* 1.据学生学号查询学生成绩及平均成绩 *\n"); printf("* 2.据课程代号查询学生课程成绩及平均成绩 *\n"); printf("* 3.据学生学号和课程代号查询学生成绩 *\n"); printf("* 4.学生原始数据的依次输入 *\n"); printf("* 5.谢谢使用,退出本系统! *\n"); INPUT: 《 C语言程序设计》 (Visual C++ 6.0环境) 返回 返回本节目录
4.5 综合实训( 4【例4.8】程序2) 《 C语言程序设计》 (Visual C++ 6.0环境) INPUT: 4.5 综合实训( 4【例4.8】程序2) 《 C语言程序设计》 (Visual C++ 6.0环境) INPUT: printf("* * * * * * * * * * * * * * * * * * * * * *\n"); printf(" 请选择功能号1—5: "); scanf("%d",&select); if(select==5) /*退出系统*/ break; if(select>=6||select<=0) /*输入功能号有误处理*/ { printf("* * * 输入有误,请重新功能号1-5:* * *\n"); goto INPUT; } aver=0; 返回 返回本节目录
4.5 综合实训( 4【例4.8】程序3) 《 C语言程序设计》 (Visual C++ 6.0环境) switch(select) 4.5 综合实训( 4【例4.8】程序3) switch(select) { case 1: /*按学号查询功能*/ printf("请输入查询学生的学号\n"); scanf("%d",&num); for(i=0;i<N;i++) if(num==score[i][0]) for(j=1;j<M;j++) { printf("%d号课程成绩是%d\n",j,score[i][j]); aver+=score[i][j]; } printf("%d号学生的平均成绩为%d\n",num,aver/(M-1)); break; 《 C语言程序设计》 (Visual C++ 6.0环境) 返回 返回本节目录
4.5 综合实训( 4【例4.8】程序4) 《 C语言程序设计》 (Visual C++ 6.0环境) 4.5 综合实训( 4【例4.8】程序4) case 2: /*按课程查询功能*/ printf("请输入查询课程的代号(1-%d):\n",M-1); scanf("%d",&j); for(i=0;i<N;i++) { printf("%d号学生的成绩为%d\n",i+1,score[i][j]); aver+=score[i][j]; } printf("%d号课程的平均成绩为%d\n",j,aver/N); break; 《 C语言程序设计》 (Visual C++ 6.0环境) 返回 返回本节目录
4.5 综合实训( 4【例4.8】程序5) 《 C语言程序设计》 (Visual C++ 6.0环境) 4.5 综合实训( 4【例4.8】程序5) case 3: /*按学号和课程查询功能*/ printf("请输入查询的学生学号和课程代号:\n"); scanf("%d%d",&num,&j); for(i=0;i<N;i++) if(num==score[i][0]) printf("%d号学生%d号课程成绩为%d\n",num,j,score[i][j]); break; case 4: /*输入学生原始数据*/ printf("请依次输入%d个学生的%d门成绩(学号、各门成绩)\n",N,M-1); for(j=0;j<M;j++) scanf("%d",&score[i][j]); default:break; } } } 《 C语言程序设计》 (Visual C++ 6.0环境) 返回 返回本节目录
4.5 综合实训( 4【例4.8】结果) 运行结果: 《 C语言程序设计》 (Visual C++ 6.0环境) 4.5 综合实训( 4【例4.8】结果) 运行结果: 《 C语言程序设计》 (Visual C++ 6.0环境) 运行程序后出现功能菜单,用户根据需要选择相应的功能序号(1—5)执行即可。 返回 返回本节目录