C语言程序设计-进阶篇:第6章 二维数组和字符数组_第1页
C语言程序设计-进阶篇:第6章 二维数组和字符数组_第2页
C语言程序设计-进阶篇:第6章 二维数组和字符数组_第3页
C语言程序设计-进阶篇:第6章 二维数组和字符数组_第4页
C语言程序设计-进阶篇:第6章 二维数组和字符数组_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

第6章二维数组和字符数组

C语言程序设计

—进阶篇内容概述1.二维数组的定义、引用、初始化、在计算机中的存储及其使用方法。2.字符串的输入输出操作及常用的字符串操作函数。教学目标1.掌握二维数组的定义、初始化及其使用方法。2.了解二维数组在计算机中的存储结构并对数据进行存储和管理。3.掌握字符串的输入输出方法,熟悉常用的字符串操作函数。4.学会使用数组解决实际问题的基本方法,能用一维数组和二维数组解决简单的实际问题。6.1.1二维数组的定义一般形式:

类型说明符数组名[常量表达式1][常量表达式2]其中常量表达式1表示第一维下标的长度,常量表达式2表示第二维下标的长度。例如:

inta[3][4];说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。

6.1二维数组

在一维线性内存空间中,如何在一维存储器中存放二维数组?一种是按行排列,即放完一行之后顺次放入第二行。另一种是按列排列,即放完一列之后再顺次放入第二列。在C语言中,二维数组是按行排列的。

上例中先存放a[0]行,再存放a[1]行,最后存放a[2]行。

6.1.2二维数组元素的引用

二维数组的元素也称为双下标变量,其表示的形式为:

数组名[下标][下标]

其中下标应为整型常量或整型表达式。其值是某一维的长度,即可取下标的最大值。

输入数组的12个元素……for(i=0;i<3;i++)

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

scanf("%d",&a[i][j]);……例如有定义:inta[3][4];输出数组的12个元素for(i=0;i<3;i++)

for(j=0;j<4;j++){printf("%5d",a[i][j]);

printf("\n");}6.1.3二维数组的初始化按行分段赋值可写为:

inta[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};按行连续赋值可写为:

inta[5][3]={80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};

这两种赋初值的结果是完全相同的。对于二维数组初始化赋值还有以下说明:可以只对部分元素赋初值,未赋初值的元素自动取0值。例如:

inta[3][3]={{1},{2},{3}};如对全部元素赋初值,则第一维的长度可以不给出,但第二维的长度不能省略。例如:

inta[3][3]={1,2,3,4,5,6,7,8,9};

可以写为:

inta[][3]={1,2,3,4,5,6,7,8,9};【例6.1】编程求一个4行4列矩阵的转置。矩阵的转置是指矩阵的a[i][j]与a[j][i]元素进行交换,即以对角线为轴的翻转:

1234159135678261014910111237111513141516481216

原始数据转置后数据#include“stdio.h”voidmain(){inti,j,t,a[4][4];

printf("pleaseenter16numbers:\n");

for(i=0;i<4;i++)

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

scanf("%d",&a[i][j]);

printf("Beforechange:\n");

for(i=0;i<4;i++){for(j=0;j<4;j++)

printf("%3d",a[i][j]);printf("\n");

}

for(i=0;i<4;i++)/*转置*/

for(j=i;j<4;j++){t=a[i][j];

a[i][j]=a[j][i];

a[j][i]=t;}

printf(“Afterchange:\n”);/*输出转置后矩阵*/

for(i=0;i<4;i++){for(j=0;j<4;j++)

printf("%3d",a[i][j]);printf("\n");

}

}该程序算法可描述为:

for(i=0;i<3;i++){找第i行的最大值max;

b[i]=max;

}而第i行是一个一维数组,该问题即演化为求一维数组最大值的问题。【例6.2】在二维数组a的各行中选出最大的元素组成一个一维数组b。#include“stdio.h”voidmain(){

inta[3][4]={{3,16,87,65},{4,32,11,108},{10,25,12,27}};

intb[3],i,j,max;

for(i=0;i<3;i++)

/*求每行的最大元素*/{

max=a[i][0];////

b[i]=max;

}for(j=1;j<4;j++)

if(a[i][j]>max)max=a[i][j];

printf("\narraya:\n");

for(i=0;i<3;i++){

for(j=0;j<4;j++)printf("%5d",a[i][j]);

printf("\n");}

printf("\narrayb:\n");

for(i=0;i<3;i++)printf("%5d",b[i]);

printf("\n");}【例6.3】设某班有M个学生,每个学生有N门课程的成绩,求每门课程的平均成绩和每个学生的平均成绩。

程序分析:

数组每行的各个元素是每个学生的N门课程的成绩,每列的各个元素是同一门课程里不同学生的成绩。所以,计算每门课程的平均成绩,即计算每列里各行元素的平均值,即第j列课程的平均成绩是(a[0][j]+a[1][j]+…+a[i1][j])/i;同理,计算每个学生的平均成绩,即计算每行里各列元素的平均值,即第i行学生的平均成绩是a[i][0]+a[i][1]+…+a[i][j1])/j;可设一个二维数组a[M+1][N+1]存放M个学生、N门课程的成绩。#include“stdio.h”#defineM3#defineN4voidmain(){

int

i,j,sum=0,l,a[M+1][N+1];

printf("pleaseinputstudents'score\n");

for(i=0;i<3;i++)/*给数组a赋初值*/{

for(j=0;j<4;j++)scanf("%4d",&a[i][j]);

printf("\n");}for(i=0;i<3;i++){

for(j=0;j<4;j++)sum=sum+a[i][j];

a[i][N]=sum/N;/*求每个学生的平均成绩*/sum=0;}for(j=0;j<4;j++){

for(i=0;i<3;i++)sum=sum+a[i][j];

a[M][j]=sum/M;/*求每门课程的平均成绩*/sum=0;}a[M][N]=0;/*给末知值的数组元素a[M][N]赋0*/

for(i=0;i<=3;i++){

for(j=0;j<=4;j++)printf("%4d",a[i][j]);

printf("\n");}}6.2字符数组

在C语言里没有字符串变量(数据类型),是用字符数组来表示字符串的。字符串总是以'\0'作为串的结束符,因此当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。实际上,字符串就是一种以'\0'结尾的字符数组。cprogram\0例如charc[15]=“cprogram”;1.字符数组的定义一维字符数组:

char数组名[整型常量表达式];

例如:charc[10];

二维字符数组:

char数组名[整型常量表达式1][整型常量表达式2];

例如:charc[5][20];6.2.1字符数组的定义及初始化2.字符数组的初始化直接赋值字符

例如

charc[10]={'c','','p','r','o','g','r','a','m'};

用字符串常量直接初始化.

例如

charc[]=“cprogram”;

字符数组允许在类型说明时初始化赋值.6.2.2字符串的输入与输出

可使用循环语句逐个地输入输出字符数组中的每个字符,但通常使用printf()函数和scanf()函数一次性输出输入一个字符数组中的字符串。main(){charst[15];

printf("inputstring:\n");

scanf(“%s”,st);/*字符数组名是字符数组首地址*/

printf("%s\n",st);}输出字符不包含'\0'。用“%s”格式符时,输出项是数组名,而不是数组元素,下面写法是错误的:

printf("%s",c[]);×

printf("%s",&c);×当数组长度大于字符串实际长度,也只输出到'\0'结束。例如,

charc[10]={"well"};

printf("%s",c);当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。对字符数组输入/输出的几点说明:6.2.3常用字符串处理函数

1.字符串输出函数puts()

格式:puts(字符数组名)

功能:把字符数组中的字符串输出到显示器。即在屏幕上显示该字符串。例如:#include"stdio.h"voidmain(){charc[]="BASIC\ndBASE";

puts(c);}2.

字符串输入函数gets()

格式:gets(字符数组名)

功能:从标准输入设备键盘上输入一个字符串。本函数得到一个函数值,即为该字符数组的首地址。例如:

#include"stdio.h"voidmain(){charst[15];

printf("inputstring:\n");

gets(st);

puts(st);}3.字符串连接函数strcat()

格式:strcat(字符数组名1,字符数组名2)

功能:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志’\0’。本函数返回值是字符数组1的首地址。例如:#include"string.h"voidmain(){charst1[30]="Yournameis";

intst2[10];

printf("inputyourname:\n");

gets(st2);

strcat(st1,st2);

puts(st1);}4.字符串拷贝函数strcpy()

格式:strcpy(字符数组名1,字符数组名2)

功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志‘\0’也一同拷贝。字符数名2也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。例如:#include"string.h"voidmain(){charst1[15],st2[]="CLanguage";

strcpy(st1,st2);

puts(st1);

printf("\n");}5.字符串比较函数strcmp()格式:strcmp(字符数组名1,字符数组名2)功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。

字符串1=字符串2,返回值=0; 字符串2〉字符串2,返回值〉0; 字符串1〈字符串2,返回值〈0。

本函数也可用于比较两个字符串常量,或比较数组和字符串常量。例如:#include"string.h"main(){

intk;charst1[15],st2[]="CLanguage";

printf("inputastring:\n");gets(st1);k=strcmp(st1,st2);

if(k==0) printf("st1=st2\n");

if(k>0) printf("st1>st2\n");

if(k<0) printf("st1<st2\n");}6.

测字符串长度函数strlen()

格式:strlen(字符数组名)

功能:测字符串的实际长度(不含字符串结束标志‘\0’)并作为函数返回值。例如:#include"string.h"main(){

intk; charst[]="Clanguage";k=strlen(st);

printf("The

lenthofthestringis%d\n",k);}定义3个辅助变量m、n、k,分别存放字符串中数字字符、小写字符和大写字符的个数,初值置为0。用gets()函数输入一个字符串ch,然后遍历字符串中的每一个元素,判断其为哪种字符即可。循环结束条件是ch[i]为'\0',即遇到字符串结束标志。6.2.4程序举例【例6.11】编程统计一个字符串中数字字符、小写字符和大写字符的个数。#include<stdio.h>voidmain(){charch[80];

inti=0,m=0,n=0,k=0;

printf("请输入字符串:");

gets(ch);

while(ch[i]!='\0'){if(ch[i]>='0'&&ch[i]<='9')m++;

if(ch[i]>='a'&&ch[i]<='z')n++;

if(ch[i]>='A'&&ch[i]<='Z')k++;i++;}

printf("数字字符数:%d,小写字符数:%d,大写字符数%d:\n",m,n,k);}【例6.12】输入五个国家的名称按字母顺序排列输出。本题编程思路如下:五个国家名应由一个二维字符数组来处理。然而C语言规定可以把一个二维数组当成多个一维数组处理。因此本题又可以按五个一维数组处理,而每一个一维数组就是一个国家名字符串。用字符串比较函数比较各一维数组的大小,并排序,输出结果即可。#include“stdio.h”#include“string.h”voidmain(){charst[20],cs[5][20];

inti,j,p;

printf("pleaseinputcountry'sname:\n");for(i=0;i<5;i++)

gets(cs[i]);

printf("\n");

printf("\nthecountry'snameissorted\n");

for(i=0;i<5;i++){p=i;

strcpy(st,cs[i]);for(j=i+1;j<5;j++)

if(strcmp(cs[j],st)<0){p=j;strcpy(st,cs[j]);}if(p!=i){

strcpy(st,cs[i]);

strcpy(cs[i],cs[p]);

strcpy(cs[p],st);}

puts(cs[i]);}}【例6.13】编程实现一个学生管理系统的登录界面。要求:进入系统时,需输入用户名和密码,若用户名和密码都正确,则提示欢迎信息,若用户名或密码错,则提示错误信息,并要求重新输入,若输入3次仍然错误,则退出系统。#include"stdio.h"#include"string.h"voidmain(){

intcount=1;charuser[]="usts";/*初始设定的用户名*/charpass[]="123456";/*初始设定的密码*/charusername[20];/*要求输入的用户名*/charpassword[10];/*要求输入的密码*/printf("请输入用户名:",username);gets(username);while(strcmp(user,username)!=0&&count<3){ count++;

printf("用户名错误,请重新输入!\n");

printf("请输入用户名:",username);

gets(username);}if(count==3){

printf("您的输入已达到3次!"); exit(0);}

count=1;

printf("请输入密码:",password);

gets(password);

while(strcmp(pass,password)!=0&&count<3) {count++;

printf("密码错误,请重新输入!\n");

printf("请输入密码:",password);

gets(password); }

if(count==3) { printf("您的输入已达到3次!"); exit(0); }

printf("欢迎进入学生管理系统\n");}main(){inta[][3]={9,7,5,3,1,2,4,6,8};

inti,j,s1=0,s2=0;

for(i=0;i<3;i++)

for(j=0;j<3;j++){if(i==j) s1=s1+a[i][j];

if(i+j==2) s2=s2+a[i][j];}printf("%d\n%d\n",s1,s2);}课堂练习1.下面程序的运行结果为

__________运行结果:1810课堂练习2:

下列程序的功能是输出一5X5矩阵,使得上三角元素为1,其余元素为0,请在空格处填写适当语句。main(){inta[5][5],i,j;

for(i=0;i<5;i++)

for(j=0;j<5;j++)if(

)a[i][j]=0;else

温馨提示

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

评论

0/150

提交评论