模块3-数组与字符串_第1页
模块3-数组与字符串_第2页
模块3-数组与字符串_第3页
模块3-数组与字符串_第4页
模块3-数组与字符串_第5页
已阅读5页,还剩194页未读, 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计任务式教程(微课版)

VisualC++1计算机工程学院模块3数组与字符串任务1一维数组任务2二维数组任务3字符与字符串2计算机工程学院

任务1一维数组

学习目标了解一维数组基本概念;掌握数组类型变量的定义与引用;掌握数组元素的引用;领会一维数组元素的查找、排序、删除、修改和统计等算法。

3计算机工程学院案例一竞赛成绩的录入和输出

1.问题描述录入10名学生的计算机课程的竞赛成绩并输出。

1.1.1案例讲解4计算机工程学院2.编程分析

一维数组中的数组元素是排成一行的一组下标变量,用一个统一的数组名来标识,用下标来指示其在数组中的具体位置。下标从0开始排列。一维数组通常是和一重循环相配合,对数组元素依次进行处理。

5a0a1a2a3a4a5a6a7a8a9计算机工程学院3.编写源程序

/*EX3_1.C*/#include<stdio.h>voidmain(){intintArray[10],intI; printf("请输入十个数:\n"); for(intI=0;intI<10;intI++) scanf("%d",&intArray[intI]);for(intI=0;intI<10;intI++) printf("%4d",intArray[intI]); }6计算机工程学院4.运行结果

图3-1案例1运行结果7计算机工程学院5.归纳分析

数组是一些具有相同数据类型的数组元素的有序集合。数组中的每一个元素(即每个成员、也可称为下标变量)具有同一个名称,不同的下标,每个数组元素可以作为单个变量来使用。在数组元素引用时应注意以下几点:

(1)引用时只能对数组中元素引用,而不能对整个数组引用。如【EX3_1】中的a。(2)在引用数组元素时,下标可以是整型常数、已赋值的变量或含变量的表达式。如【EX3_1】中intArray[intI]的下标intI就是已赋值的变量。(3)由于数组元素本身可看作同一类型的单个变量,因此,对变量的各种操作也都适用于数组元8计算机工程学院素。如例【EX3_1】中对数组元素intArray[intI]的赋值操作和输出操作(4)引用数组元素时,下标上限(即最大值)不能超界。也就是说,若数组含有n个元素,下标的最大值为n-1,(因下标从0开始);若超出界限,C编译程序并不给出错误信息(即其不检查数组是否超界),程序仍可以运行,但可能会改变该数组以外其它变量或其它数组元素的值,由此会造成不正确的结果。如【EX3_1】,若误将第一个for语句中的intI<10写成intI<=10,就会出现下标超界现象。9计算机工程学院案例二竞赛成绩的计算

1.问题描述已录入10名学生的计算机课程的竞赛成绩,计算竞赛成绩的最高分,最低分和平均分。10计算机工程学院2.编程分析先假设最高分和最低分初值为第1个学生的成绩,然后比较10次,如果有比当前最高分还大的元素,它就替代当前最高分,如果有比当前最低分还小的元素,它就替代当前最低分。并累加各元素的值,最后输出结果。11计算机工程学院3.编写源程序

/*EX3_2.C*/#include<stdio.h>voidmain(){intintArray[10]={90,88,86,84,82,80,78,76,74,72};/*为了简单起见用初始化*/intintI,intSum,intMax,intMin;intSum=0;intMax=intMin=intArray[0];/*最高分最低分初值为第0个元素*/for(intI=0;intI<10;intI++)12计算机工程学院{if(intArray[intI]>intMax)

intMax=intArray[intI];/*如果有比当前最高分还大的元素,它就替代当前最高分*/ if(intArray[intI]<intMin)intMin=intArray[intI];/*如果有比当前低分还小的元素,它就替代当前低分*/ intSum+=intArray[intI];/*累加各元素的值*/ } printf("最高分=%d最低分=%d平均分=%d\n",intMax,intMin,intSum/10); }

13计算机工程学院4.运行结果如图3-2所示。图3-2案例2运行结果14计算机工程学院5.归纳分析数组元素是从intArray[0]到intArray[9],千万不要试图使用for(intI=1;intI<=10;intI++),因为这样会引用intArray[10],而这个元素是不存在的。15计算机工程学院案例三竞赛成绩的排序

1.问题描述对已知的10个学生的计算机课程的竞赛成绩从小到大排序,并把排序好的成绩输出。16计算机工程学院2.编程分析

选择法排序是从待排序数列中,每次选出一个最小的数,和相应位置上的元素交换。第一次选最小的元素放到第一个位置,第二次选次小的元素放到第二个位置,如此类推就能产生一个有序序列。

排序方法:快速排序,选择排序,插入排序,冒泡排序,堆排序,归并排序,基数排序17计算机工程学院3.编写源程序/*EX3_3.C*/#include<stdio.h>#defineNUMBER10/*定义数列元素个数*/#include<conio.h>voidmain(){/*初始化数组*/intintArray[NUMBER]={90,88,86,84,82,80,78,76,74,72};intintI,intJ,intK,intTemp;18计算机工程学院printf("排序前数组\n");for(intI=0;intI<NUMBER;intI++)printf("%3d",intArray[intI]);/*打印排序前数组*/for(intI=0;intI<NUMBER;intI++)

{/*第intI次排序*/intK=intI;/*记录当前位置的下标。第一次选择排序时,intK=0,当前位置是intArray[0]*/for(intJ=intI+1;intJ<NUMBER;intJ++)if(intArray[intJ]<intArray[k])intK=intJ;/*某次排序时,如果有任何一个值intArray[intJ]小于当前位置值intArray[k],则intK下标指定这个intJ,intArray[intK]仍是这次排序中的最小值*/

if(intI!=intK)19计算机工程学院{intTemp=intArray[intI];intArray[intI]=intArray[intK];intArray[intK]=intTemp;/*若最小值不在位置intI,则交换intArray[intI]和intArray[intK],交换前array[intK]是本次排序中的最小元素,intArray[intI]是当前比较位置*/

}}printf("\n输出排序后结果\n");for(intI=0;intI<NUMBER;intI++)

printf("%3d",intArray[intI]);

/*输出排序后结果*/getchar(); }20计算机工程学院4.运行结果图3-3案例3运行结果21计算机工程学院5.归纳分析

如果待排序数列存放在数组intArray中,那么:第一次排序时,先假定最小的数是intArray[0]。然后将它依次和第1个元素到第NUMBER-1个元素比较,找出它们中的最小值。将最小值和intArray[0]交换。如果intArray[0]本身最小就不用交换。第二次排序时,intArray[0]已经是最小值了,所以这次找出次小值。取出第2到第NUMBER-1个元素中最小值和intArray[1]交换。这时intArray[1]上是次小值第三次排序就是取出第3个到第NUMBER-1个元素中的最小值和intArray[2]交换。22计算机工程学院

array[2]是第三小值。排序过程如下。粗斜体字表示本次排序中参于交换的两个数。次数a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]初始9088868482807876747217288868482807876749027274868482807876889037274768482807886889047274767882808486889057274767880828486889023计算机工程学院案例四新队员招录

1.问题描述

有一只足球队只有10名队员,并按身高排好序,现又招录一名新的队员,组成一只完整的足球队,并把重新排好序的队员按身高由高到低输出。24计算机工程学院2.编程分析为了把一个数按大小插入已排好序的数组中,则可把欲插入的数与数组中各数逐个比较,当找到第一个比插入数小的元素intI时,该元素之前即为插入位置。然后从数组最后一个元素开始到该元素为止,逐个后移一个单元。最后把插入数赋予元素intI即可。如果被插入数比所有的元素值都小则插入最后位置。25计算机工程学院3.编写源程序

/*EX3_4.C*/

#include<stdio.h>

voidmain()

{

intintI,intJ,intP,intS;

float

floatArr[11]={2.07f,2.03f,1.96f,1.94f,1.85f,1.78f,1.76f,1.70f,

1.69f,1.68f},floatQ,floatN;

for(intI=0;intI<10;intI++)

{

intP=intI;

26计算机工程学院floatQ=floatArr[intI];for(intJ=intI+1;intJ<10;intJ++)if(floatQ<floatArr[intJ]){intP=intJ;floatQ=floatArr[intJ];}if(intP!=intI){intS=floatArr[intI]; floatArr[intI]=floatArr[intP]; floatArr[intP]=intS;}27计算机工程学院printf("%8.2f",floatArr[intI]);}printf("\n输入新招录队员的身高\n");scanf("%f",&floatN);for(intI=0;intI<10;intI++)if(floatN>floatArr[intI])

{

for(intS=9;intS>=intI;intS--)

floatArr[intS+1]=floatArr[intS];

break;

}28计算机工程学院floatArr[intI]=floatN;printf("\n重新排好序的队员按身高由高到低输出\n");for(intI=0;intI<=10;intI++)

printf("%8.2f",floatArr[intI]);printf("\n");}29计算机工程学院4.运行结果如图3-4所示。图3-4案例4运行结果5.归纳分析

本程序首先对数组floatArr中的10个数从大到小排序并30计算机工程学院输出排序结果。然后输入要插入的身高floatN。再用一个for语句把floatN和数组元素逐个比较,如果发现有floatN>floatArr[intI]时,则由一个内循环把intI以下各元素值顺次后移一个单元。后移应从后向前进行(从floatArr[9]开始到floatArr[intI]为止)。后移结束跳出外循环。插入点为intI,把floatN赋予floatArr[intI]即可。如所有的元素均大于被插入数,则并未进行过后移工作。此时intI=10,结果是把n赋于floatArr[10]。最后一个循环输出插入数后的数组各元素值。程序运行时,输入数1.77。从结果中可以看出1.77已插入到1.78和1.76之间。31计算机工程学院1.一维数组的的引入

我们先看一个例子,理解引入数组的必要性。此例需要编程读入一系列学生的成绩,然后求最高分,最低分。首先写一串语句读入学生成绩,放到一系列变量中:

printf(“请输入成绩一\n”);scanf(“%d”,&grade1);printf(“请输入成绩二\n”);scanf(“%d”,&grade2);

3.1.2基础理论

32计算机工程学院

然后是求最高分最低分的过程,只要写一系列的if语句,比较输入的成绩值:

if(grade1>grade2)if(grade1>grade3)......只要有足够的耐心,最终会得出最高成绩和最低成绩。如果有10个学生的成绩需要处理,if

语句的个数和输入输出语句的个数必然超过十句。程序即使正确也非常复杂。我们如果用数组,情况就将不同。

33计算机工程学院在C语言中,我们可以定义一个名叫grades的变量,它不代表一个单一的成绩值,而是代表整个成绩组。组中的每一个元素都可以由一个被称为索引或者下标的数字来标明。在数学概念里,下标变量xi是指集合x的i个元素,在C语言中,等价表示为x[i]。同样grades[5]表示在grades的数组里的第五号元素。单独数组元素的使用方法和任何正常变量一样。比如我们可以将一个数组元素值赋给另一个变量:

34计算机工程学院

myg=grades[50]这一语句将grades数组中下标为50的元素的值赋给变量myg。如果再一般化一点,i是一个整型变量,那么语句

myg=grades[i];将数组中的第i号元素赋给myg。数组元素当然也可以放在等号左边。比如

grades[i]=myg;把myg的值存入到元素grades[i]。35计算机工程学院

用单一的数组代表有关数据项集合,使我们能开发简明而有效的程序。例如通过改变下标变量的值,我们可以非常容易地访问数组中所有元素。一组学生成绩可以用下面的语句来输入:

for(i=0;i<100;i++){printf(“请输入第%d个成绩:”,i);scanf(“%d”,&grades[i]);}

36计算机工程学院如果要求出所有学生的总成绩可以这样写:

for(i=0;i<100;i++)sum=sum+grades[i];这段代码顺序访问grades数组的前100个元素(0-99),并将每个元素值加到sum中。如果sum的初值为0,循环结束后sum中存放的就是前100个数组元素之和。由此可见,使用数组大大简化了处理同一数据集合的程序。下面将介绍数组的具体使用方法。

37计算机工程学院

数组是一些具有相同数据类型的数组元素的有序集合。数组中的每一个元素(即每个成员、也可称为下标变量)具有同一个名称,不同的下标,每个数组元素可以作为单个变量来使用。

数组可分为一维数组和多维数组(如二维数组、三维数组…)。数组的维数取决于数组元素的下标个数,即一维数组的每一个元素只有一个下标,二维数组的每一个元素均有二个下标,三维数组的每一个元素都有三个下标,以此类推。38计算机工程学院2.一维数组的说明、引用

(1)一维数组的定义在C语言中,变量必须先定义,后使用。数组也是如此,使用数组时必须先定义,后引用。定义一维数组的一般形式为:

类型标识符数组名[常量表达式];其中类型标识符是数组中数组元素的数据类型。39计算机工程学院数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。例如:

inta[10];

说明整型数组a,有10个元素。

floatb[10],c[20];

说明实型数组b,有10个元素,实型数组c,有20个元素。

charch[20];

说明字符数组ch,有20个元素。40计算机工程学院

(2)一维数组元素的引用数组不能整体使用,只能逐个引用数组元素。数组元素的一般引用形式为:

数组名[下标]下标可以是整型常数、整型变量和整型表达式,其起始值为0。例如a[2+1]表示数组a中的第四个元素,a[i+j]表示数组a中的第i+j+1个元素(i和j为整型变量)。在引用时应注意下标的值不要超过数组的范围。数组的下标的最大值为数组的长度-1。41计算机工程学院3.一维数组的初始化所谓数组的初始化,就是指在定义数组的同时对数组的各个元素赋初值。

(1)全部元素的初始化

格式:数据类型

数组名[数组长度]={数组元素值表}“数组元素值表”是用逗号分隔的各数组元素的初值。例如:

42计算机工程学院inta[6]={10,20,30,40,50,60};表示a数组共有6个数组元素。

floatr[]={12.5,-3.11,8.6};表示r数组共有3个实型元素。

(2)部分元素的初始化格式:数据类型

数组名[数组长度]={数组部分元素值表}例如:

intb[10]={1,2,3};表示b数组共有3个整型元素。43计算机工程学院(3)一维数组的存储任何一个一维数组在内存中都占用一段连续的空间,依次存储它的各元素的值。元素占用的字节数由数组的数据类型决定。例如int型数组a的每个元素占2字节,6个元素占12个字节。44计算机工程学院上述数组a的存储情况如图3-5所示图3-5数组a的存储情况数组a→10a[0]20a[1]30a[2]40a[3]50a[4]60a[5]45计算机工程学院我们通过一个实例来说明数组的存放形式和使用方法。如果有语句序列:

intvalues[10];values[0]=197;values[2]=-100;values[5]=350;values[3]=values[0]+values[5];values[9]=values[5]/10;--values[2];语句执行后,数组values[]的存储情况如表3-146计算机工程学院表3-1数组values[]执行代码前后的内容数组元素执行前的值执行前的值values[0]随机值197values[0]随机值随机值values[0]随机值-101values[0]随机值547values[0]随机值随机值values[0]随机值350values[0]随机值随机值values[0]随机值随机值values[0]随机值随机值values[0]随机值3547计算机工程学院从这段程序可以看出:数组元素和普通变量一样能使用单目运算符;说明一个数组后,如果不初始化,数组元素的值是随机值,存取未经初始化的数组元素是没有意义的。比如存取values[1]就没有意义。48计算机工程学院【实验3-1】对已知的十个元素,求其最大元素,并把最大元素和所在位置输出。(1)编程分析①假设首元素为最大值元素,用max标识。②将其余元素依次与max比较,并将大值保存在max中,将大值元素下标保存在m中。③输出max和m。

3.1.3技能训练

49计算机工程学院(2)编写源程序

/*EX3_5.C*/#include"stdio.h"#defineN10voidmain(){inta[N]={20,9,10,-16,-9,18,96,7,11,33};inti,max=a[0],m=0;for(i=1;i<N;i++)if(max<a[i])50计算机工程学院

{max=a[i];m=i;}printf("max=%d,为第%d个元素\n",max,m+1); }(3)在VC++集成环境中输入上述程序,文件存成EX3_5.C。如图3-6所示。图3-6运行结果51计算机工程学院【实验3-2】数据分类问题。定义一个长度是20的一维数组b,依次对数组a中元素进行扫描,将负数在b中由前到后存储,将其他数据在b中由后向前存储。最终b存储的是分类后的数据。(1)编程分析①定义一个长度为20的一维数组a。②用键盘向一维数组输入20个整数,并依次输出这20个数据。③对数据分类。④输出分类后的数据。

52计算机工程学院(2)编写源程序

/*EX3_6.C*/#include"stdio.h"#defineN20voidmain(){inta[N],b[N],i,j=0,k=N-1;printf("请输入数据:\n");for(i=0;i<N;i++)scanf("%d",&a[i]);53计算机工程学院

for(i=0;i<N;i++){printf("%d",a[i]);if(a[i]<0)b[j++]=a[i];/*将负数放在b的前部*/elseb[k--]=a[i];}/*将其他数放在b的后部*/printf("\n");for(i=0;i<N;i++)printf("%d",b[i]); }54计算机工程学院(3)在VC++集成环境中输入上述程序,文件存成EX3_6.C.如图3-7所示。①调试程序时通常先将N定义为一个小数值,当程序调试成功后再将N定义为常数20,这样可以提高程序的调试效率②在设计调试用数据时,应考虑各种数据情况,以便提高程序的可靠性。图3-7运行结果55计算机工程学院【练习】有15个数按由小到大顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则打印出“无此数”。

3.1.4拓展与练习

56计算机工程学院(1)编程分析折半查找是一种高效的查找方法,它必须在一个有序的数列中进行,基本原理如下:设数列已升序排序,存储在数组a中,对在查找范围内的数据设置3个特殊点,首位置为top,末位置为bot,中间位置为mid=(top+bot)/2,查找过程为:①比较x与a[mid],若x=a[mid],查找成功,结束;否则,若x>a[mid],则top=mid+1;若x<a[mid],则bot=mid-1。

57计算机工程学院②若top>bot,则查找失败,结束;否则转①。如下是在数列{3,6,7,8,21,23,36,38,67,69,80,82,85,88,96}中查找69时,top、bot、mid的变化情况:图3-8折半查找法

58计算机工程学院(2)编写源程序

/*EX3_7.C*/#include"stdio.h"#defineN15main(){inta[N],i,x,top,bot,mid;printf("输入从小到大排好序的15个数");for(i=0;i<N;i++)/*建立升序数组a,用于折半查找*/scanf("%d",&a[i]);printf("输入要查找的数");scanf("%d",&x);/*输入要查找的数值*/59计算机工程学院

top=0;/*设置初始查找边界*/bot=N-1;do{mid=(top+bot)/2;/*确定中间位置*/if(a[mid]==x)break;/*找到x后终止循环*/elseif(a[mid]<x)top=mid+1;/*确定后半段为下一次查找的范围*/elsebot=mid-1;/*确定前半段为下一次查找的范围*/60计算机工程学院}while(bop<top); if(bot<top) printf(“%d:无此数\n”,x); else printf(“成功查找到该数a[%d]是%d.\n”,mid,x);}计算机工程学院(3)在VC++集成环境中输入上述程序,文件存成EX3_7.程序运行结果如图3-9所示。图3-9运行结果62计算机工程学院1.编程规范

(1)数组名的书写规则应符合标识符的书写规定。数组名不能与其它变量名相同。

3.1.5编程规范与常见错误

63计算机工程学院例如:

main(){inta;floata[10];……}变量名与数组名重名是错误的。64计算机工程学院2.常见错误

(1)数组下标从0开始计算,如a[5]表示数组a有5个元素。分别为a[0],a[1],a[2],a[3],a[4]。(2)定义数组时,数组长度值不能为变量。例如:#defineFD5main(){inta[3+2],b[7+FD];……}是合法的。

65计算机工程学院

但是下述说明方式是错误的。

main(){intn=5;inta[n];……}

(3)允许在同一个类型说明中,说明多个数组和多个变量。

例如:

inta,b,c,d,k1[10],k2[20];66计算机工程学院数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。(4)C语言规定,在对数组进行定义或对数组元素进行引用时必须要用方括号(对二维数组或多维数组的每一维数据都必须分别用方括号括起来),例如以下写法都将造成编译时出错:inta(10);intb[5,4];

printf(″%d\n″,b[1+2,2]);

67计算机工程学院一维数组的说明、引用

一维数组的定义在C语言中,变量必须先定义,后使用。数组也是如此,使用数组时必须先定义,后引用。定义一维数组的一般形式为:

类型标识符数组名[常量表达式];其中类型标识符是数组中数组元素的数据类型。计算机工程学院

任务2二维数组

学习目标了解二维数组的基本概念、掌握数组类型变量的定义与引用、掌握数组元素的引用。69计算机工程学院案例一案例讲解

1.问题描述以矩阵格式输出一个二维数组,数组的主对角线上的元素赋值为l,其他元素赋初值为0。3.2.1案例讲解70计算机工程学院2.编程分析如果有一个一维数组,它的每一个元素是类型相同的一维数组时,就形成一个二维数组。我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。

例如:int

intArr[3][4];可以把a看作是一个一维数组,它有三个元素:intArr[0]、intArr[1]、intArr[2],每个元素又是一个包含4个元素的一维数组。可以把intArr[0]、intArr[1]、intArr[2]看作是一维数组的名字。71计算机工程学院3.编写源程序/*EX3_8.C*/voidmain(){intintArr[6][6],intI,intJ;for(intI=1;intI<6;intI++)for(intJ=1;intJ<6;intJ++)

intArr[intI][intJ]=(intI/intJ)*(intJ/intI);for(intI=1;intI<6;intI++){72计算机工程学院

for(intJ=1;intJ<6;intJ++)printf("%2d",intArr[intI][intJ]);printf("\n");}}4.运行结果如图3-10所示。73图3-10案例1运行结果计算机工程学院5.归纳分析

与一维数组元素引用相同,任何二维数组元素的引用都可以看成一个变量的使用,可以被赋值,可以参与组成表达式,也可输入输出。但要注意,其下标取值应限定在数组大小范围内,不能超界使用。74计算机工程学院案例二两个矩阵的和

1.问题描述有矩阵a和b如下图所示,求它们的和矩阵c两个M×N阶的矩阵a、b,其和矩阵也是一个M×N

阶的矩阵c。75计算机工程学院2.编程分析求和公式如下:

c[i][j]=a[i][j]+b[i][j]

3.编写源程序76计算机工程学院/*EX3_9.C*/#include<stdio.h>#defineM3#defineN2voidmain(){intintArra[M][N]={9,-16,6,21,25,18};/*数组a初始化*/intintArrb[M][N]={16,89,26,-27,36,81};/*数组b初始化*/intintI,intJ,intArrc[M][N];for(intI=0;intI<M;intI++)for(intJ=0;intJ<N;intJ++)77计算机工程学院intArrc[intI][intJ]=intArra[intI][intJ]+intArrb[intI][intJ];/*生成c数组*/for(intI=0;intI<M;intI++)/*输出a、b、c三个数组*/{for(intJ=0;intJ<N;intJ++)/*输出a数组的第intI行*/printf("%5d",intArra[intI][intJ]);printf("");for(intJ=0;intJ<N;intJ++)/*输出b数组的第intI行*/printf("%5d",intArrb[intI][intJ]);printf("");for(intJ=0;intJ<N;intJ++)/*输出c数组的第intI行*/printf("%5d",intArrc[intI][intJ]);printf("\n");}}78计算机工程学院4.运行结果如图3-11所示。79图3-11案例2运行结果计算机工程学院5.归纳分析 二维数组中的数组元素被排成行列形式的一组双下标变量,用一个统一的数组名和双下标变量来标识、第一个下标表示行,第二个下标表示列。下标也从0开始排列。二维数组通常是和双重循环相配合,对数组元素依次进行处理。80计算机工程学院1.二维数组的的说明、引用和存储

(1)二维数组的说明①语法类型标识符数组名[常量表达式1][常量表达式2];②说明常量表达式包含常量和符号常量,不能包含变量。

3.2.2基础理论

81计算机工程学院如果有一个一维数组,它的每一个元素是类型相同的一维数组时,就形成一个二维数组。我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。例如:float

a[3][4];可以把a看作是一个一维数组,它有三个元素:a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组。可以把a[0]、a[1]、a[2]看作是一维数组的名字。C语言中,二维数组中元素的排列顺序是:按行存放,即在内存中先顺序存放第一行的元素,82计算机工程学院再存放第二行的元素。数组a在内存中的存放顺序为:

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]通常形象的把第一个下标称为行下标,第二个下标称为列下标。例如intvar[i][j],i代表行下标j代表列下标;多维数组的定义方法与二维数组相仿:例如intvar[3][4][5],代表一个三维数组;83计算机工程学院(2)二维数组的引用①引用形式数组名[下标][下标]②说明例如:a[1][1]=3;a[2][1]=a[1][1];printf("%d\n",a[1][1]);数组不能整体使用,只能逐个引用数组元素。下标可以是整型常数、整型变量和整型表达式。84计算机工程学院(3)二维数组的存储对于m×n的二维数组a,各元素的存储次序如下:

a[0][0]、a[0][1]…a[0][n-1]、a[1][0]、a[1][1]…a[1][n-1]……a[m-1][0]、a[m-1][1]…a[m-1][n-1]

系统为其分配的存储单元数为m×n,每个元素占用的存储单元数取决于数组的数据类型。例如2×2数组example的存储情况如图3-12所示:

85计算机工程学院图3-12数组example的存储情况

example→example[0][0]example[0][1]example[1][0]example[1][1]86计算机工程学院2.二维数组的初始化

二维数组的初始化有以下几种:

(1)分组初始化

inta[2][5]={{1,3,5,7,9},{2,4,6,8,10}};这种赋值方法比较直观,把第一个花括号内的数据赋给第一行的元素,第二个花括号内的数据赋给第二行的元素。

87计算机工程学院(2)不分行初始化

inta[2][5]={1,3,5,7,9,2,4,6,8,10};可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。(3)部分行初始化inta[2][5]={{1,3,5},{2,4,6}};

赋初值后数组各元素值为:a[0][0]=1,a[0][1]=3,a[0][2]=5,a[0][3]=0,a[0][4]=0,a[1][0]=2,a[1][1]=4,a[1]2]=6,a[1][3]=0,a[1][4]=0,88计算机工程学院

(4)省略行数

inta[2][3]={1,3,5,7,9,11};

等价于:inta[][3]={1,3,5,7,9,11};

但不能写成:inta[2][]={1,3,5,7,9,11};

对数组中的全体元素都赋初值时,二维数组的定义中第一维的长度也可以省略,但二维的长度不能省略。89计算机工程学院

如:

在分行初始化时,由于给出的初值已清楚的表明了行数和各行中元素的个数,因此第一维的大小可以不定义。如:intb[][3]={{1},{0,2},{3,2,1}};显然这是一个三行三列的数组,其各元素的值为:

1 0 00 2 0

3 2 190计算机工程学院【实验3.2.1】产生一个M×N的随机数矩阵(数值范围在1~100之间),找出其中的最大值元素。3.2.3技能训练91计算机工程学院(1)编程分析

设矩阵数组为a,首先把第一个元素a[0][0]作为当前最大值max,然后把当前最大值max与每一个元素a[i][j]进行比较,若a[i][j]>max,把a[i][j]作为新的当前最大值,并记录下其下标i和j。当全部元素比较完后,max是整个矩阵全部元素的最大值。92计算机工程学院(2)编程源程序

/*EX3_10.C*/#include<stdio.h>#include"stdlib.h"#defineM3#defineN4voidmain()

{

inti,j,row=0,col=0,max;

inta[M][N];

printf("建立随机数数组\n");93计算机工程学院for(i=0;i<M;i++)/*建立随机数数组*/for(j=0;j<N;j++)a[i][j]=rand()%100;max=a[0][0];/*初始化最大值变量*/for(i=0;i<M;i++)/*遍历a数组的每一个元素,以确定最大值*/for(j=0;j<N;j++)if(a[i][j]>max)/*将一个更大的值保存在max变量中*/{max=a[i][j];

94计算机工程学院row=i; col=j;}for(i=0;i<M;i++)/*输出随机数数组*/{

for(j=0;j<N;j++)

printf("%5d",a[i][j]);

printf("\n"); }printf(“随机数矩阵中最大值元素a[%d][%d]=%d\n",row,col,max);/*输出结果*/}95计算机工程学院(3)在VC++集成环境中输入上述程序,文件存成EX3_10.C。如图3-13所示。图3-13运行结果96计算机工程学院【实验3.2.2】一个学习小组有5个人,每个人有三门课的考试成绩,如表3-2。求全组分科的平均成绩和各科总平均成绩。表3-2成绩表张王李赵周数学8061598576C语言7565638777数据结构927170908597计算机工程学院(1)编程分析可定义一个二维数组a[5][3]存放五个人三门课的成绩。再定义一个一维数组v[3]存放所求得各分科平均成绩,设变量average为全组各科总平均成绩。98计算机工程学院(2)编程源程序/*EX3_11.C*/#include<stdio.h>voidmain(){inti,j,s=0,average,v[3],a[5][3];printf("输入五个学生三门课的成绩\n");for(i=0;i<3;i++){for(j=0;j<5;j++)99计算机工程学院{scanf("%d",&a[j][i]);s=s+a[j][i];}v[i]=s/5;s=0; }average=(v[0]+v[1]+v[2])/3;printf("数学%d\nC语言%d\n数据结构%d\n",v[0],v[1],v[2]);printf("各科总平均成绩%d\n",average); }100计算机工程学院(3)在VC++集成环境中输入上述程序,文件存成EX3_11.C。如图3-14所示。图3-14运行结果101计算机工程学院【练习1】某年级共有3个班级,每班有N名学生,开设两门课程,要求分别对每个班级的学习成绩进行分等统计,并将统计结果保存在一个二维数组中。/*EX3_12.C*/#include<stdio.h>#defineM3/*定义班级数为3*/#defineN5/*班级人数为5*/main(){

3.2.4拓展与练习

102计算机工程学院floata,b;intave,i,j;staticintresult[M][5];/*定义保存统计结果的二维数组*/for(j=0;j<M;j++){for(i=1;i<=N;i++){printf("Class%dachievement%d(a,b):",j+1,i);scanf("%f,%f",&a,&b);/*输入一个学生的两门课成绩*/ave=(a+b)/2;

103计算机工程学院switch(ave/10)/*对第j的班级的学习成绩分等统计*/{case10:case9:result[j][0]++;break;/*j班优秀人数统计*/case8:result[j][1]++;break;/*j班良好人数统计*/case7:result[j][2]++;break;/*j班中等人数统计*/case6:result[j][3]++;break;/*j班及格人数统计*/default:result[j][4]++;}}104计算机工程学院}/*j班不及格人数统计*/for(j=0;j<M;j++){for(i=0;i<5;i++)printf("%5d",result[j][i]);printf("\n");}}105计算机工程学院

上机运行程序并分析结果106图3-15运行结果计算机工程学院1.常见错误

(1)常量表达式可以包含常量和符号常量,但不能包含变量。

例如:①inta[3][4];

②#defineM

3

#defineN

4

inta[M][N];

③inta[3][1+3];

3.2.5编程规范与常见错误

107计算机工程学院

都是定义了一个3*4的二维数组a

,但不允许有如下定义:

①intn=4,m=3;

inta[m][n]

②intb[3,4]

③intc(2)(3);108计算机工程学院

(2)二维数组可以看作一个特殊的一维数组,它的每个元素又是一个一维数组。例如上面定义二维数组a可以看作:数组a包含a[0]、a[1]、a[2]三个元素,而这三个元素均为一维数组。

a[0]包含a[0][0]、a[0][1]、a[0][2]、a[0][3]元素

a[1]包含a[1][1]、a[1][1]、a[1][2]、a[1][3]元素

a[0]包含a[0][0]、a[0][2]、a[0][2]、a[0][3]元素

109计算机工程学院矩阵乘法main(){ inti,j,k,intc[2][2]; inta[2][3]={1,2,3,4,5,6}; intb[3][2]={1,2,3,4,5,6}; for(i=0;i<2;i++) for(j=0;j<3;j++) { c[i][j]=0; for(k=0;k<3;k++) c[i][j]=a[i][k]*b[k][j]+c[i][j]; } for(i=0;i<2;i++) { for(j=0;j<3;j++) if(i==j) printf("%5d",c[i][j]); }}c[i][j]=a[i][k]*b[k][j]+c[i][j];计算机工程学院

任务3字符与字符串

学习目标掌握字符与字符串的区别,字符串的输入和输出,领会字符串操作函数。111计算机工程学院案例一字符统计

1.问题描述输入20个字符,分别统计其中的数字个数和其他字符的个数。2.编程分析字符数组中的每个元素均占一个字节,且以ASCII代码的形式来存放字符数据。

3.3.1案例讲解

112计算机工程学院3.编写源程序

/*EX3_13.C*/#include<stdio.h>voidmain(){charcharArrS[20];intintI,intNumber=0,intOther=0;printf("输入20个字符");for(intI=0;intI<20;intI++)/*建立有20个元素的字符数组charArrS*/scanf("%c",&charArrS[intI]);113计算机工程学院

for(intI=0;intI<20;intI++)/*对charArrS中的数字和其他字符进行分类统计*/

switch(charArrS[intI])

{case'0':

/*这10个连续的case用于判断数值型字符*/

case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':

114计算机工程学院case'9':

intNumber++;/*对数字字符计数*/

break;default:

intOther++;/*对数字以外的其他字符计数*/}printf("数字个数%d,其他字符的个数%d\n",intNumber,intOther); }115计算机工程学院4.运行结果如图3-16所示。图3-16案例1运行结果116计算机工程学院5.归纳分析字符串是一种常用的数据,处理人名,地址,文章等内容。单个字符(常量)放在一个字符变量中,字符串放在字符数组中。案例二字符的删除

1.问题描述由键盘任意输入一字符串和一个字符,要求从该串中删除所指定的字符。117计算机工程学院2.编程分析在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量时,已说明字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串的结束。

118计算机工程学院3.编写源程序/*EX3_14.C*/#include<stdio.h>main(){charcharx,charArrS[20];intintI,intJ;printf("输入一字符串");gets(charArrS);printf("要删除指定的字符\n");119计算机工程学院

scanf("%c",&charx);for(intI=intJ=0;charArrS[intI]!='\0';intI++)if(charArrS[intI]!=charx)charArrS[intJ++]=charArrS[intI];

charArrS[intJ]='\0';

printf("从该串中删除所指定的字符后新产生的新字符串\n");

puts(charArrS);}120计算机工程学院4.运行结果如图3-17所示。图3-17案例2运行结果121计算机工程学院5.归纳分析字符串结束符'\0'是由C编译系统自动加上的。由于采用了'\0'标志,所以在用字符串赋初值时一般无须指定数组的长度,而由系统自行处理。122计算机工程学院

字符数组是存放字符型数据的数组,其中每个数组元素存放的值均是单个字符。字符数组也有一维数组和多维数组之分。比较常用的是一维字符数组和二维字符数组。1.字符数组的说明、引用和初始化字符数组的定义、初始化及引用同前面介绍的一维数组、二维数组类似,只是类型说明符为char,对字符数组初始化或赋值时,数据

3.3.2基础理论

123计算机工程学院使用字符常量或相应的ASCII码值。例如:charc[10],str[5][10];

/*字符数组的定义*/

又如:charc[3]={'r','e','d'};/*字符数组的初始化*/

printf("%c%c%c\n",c[0],c[1],c[2]);/*

字符数组元素的引用*/一个字符串可以放在一个一维数组中。如果有多个字符串,可以用一个二维数组来存放。

124计算机工程学院(1)字符数组的定义 用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。例如:charstr[12];(2)字符数组的初始化

在定义一个字符数组的同时,可以给它指定初值。有两种初始化的方法:①逐个为数组中各元素赋初值。如:125计算机工程学院charstr[8]={'C','o','m','p','u','t','e','r'

};在对数组中的全体元素都赋初值时,字符数组的大小可以省略。

charstr[]={'C','o','m','p','u','t','e','r'

};②对一个字符数组指定一个字符串初值。例如

charstr[]={“Computer”};注意单个字符用单引号括起来,而字符串用双引号括起来,在指定字符串初值的情况下,将字符串中的各字符逐个地按顺序赋给数组中的各126计算机工程学院元素。注意:系统会自动在一个字符串的后面加一个“\0”字符,并把它一起存入字符数组中。因此,上面的数组虽未定义大小,但系统自动将它定义为str[9],而不是str[8];C语言允许在初始化一个一维字符数组时,省略字符串外面的花括号。如:charstr[]="Computer";

str的每个元素为char型,占1字节。

127计算机工程学院图3-18一组字符数组初始化数组str→Cstr[0]ostr[1]mstr[2]pstr[3]ustr[4]tstr[5]estr[6]rstr[7]128计算机工程学院(3)字符数组的引用。与普通数组相同。(4)字符串和字符串结束标志

C语言允许用字符串的方式对数组作初始化赋值。例如:charc[]={'c','','p','r','o','g','r','a','m'};

可写为:charc[]={"Cprogram"};

或去掉{

}写为:charc[]="Cprogram";用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志‘\0’。上面的数组c在内存中的实际存放情况为:

129计算机工程学院(5)字符串的输入输出

①用"%c"格式符输入输出字符。②用"%s"格式符输入输出字符串。例如:

charc[6];scanf("%s",c);printf("%s",c);说明:C语言中,数组名代表该数组的起始地址,cprogram'\0'130计算机工程学院因此,scanf()函数中数组名前不再

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论