C语言程序设计(第四版)(微课版)ch06 数组_第1页
C语言程序设计(第四版)(微课版)ch06 数组_第2页
C语言程序设计(第四版)(微课版)ch06 数组_第3页
C语言程序设计(第四版)(微课版)ch06 数组_第4页
C语言程序设计(第四版)(微课版)ch06 数组_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

6.1一维数组6.2二维数组6.3字符数组与字符串一、数组的引入为了便于处理一批类型相同的数据,引入了数组类型.

假设现在要保存每个学生的成绩,那就需要40个变量,但这样一来输入、输出、计算都会变得繁琐。

在这种情况下,我们可以使用数组类型,声明一个含有40个元素的数组,每个数组元素存放一个成绩,成绩的输入、输出、计算都可通过循环来实现。例:某班有40名学生,求该班成绩的平均分#include<stdio.h>main(){intj,sum,s;floatave;sum=0;

for(j=1;j<=40;j++)

{scanf(“%d”,&s);sum=sum+s;

}ave=sum/40;printf(“ave=%f”,ave);}二、数组的概念构造数据类型之一1.数组:由具有相同类型的有序数据的集合。用数组名标识。#include<stdio.h>main(){intj,sum,s[40];

floatave;

sum=0;

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

{scanf(“%d”,&s[j]);sum=sum+s[j];

}ave=sum/40;printf(“ave=%f”,ave);}2.数组元素:每一个数组元素都是一个变量,为了与一般的变量相区别,我们称数组元素为下标变量3.下标变量在数组中的位置序号称下标,c语言中下标

从0开始

6.1一维数组6.1.1一维数组的定义

定义方式:数据类型数组名[常量表达式];

合法标识符表示元素个数下标从0开始例

inta[10];数组名表示数组所在内存首地址也是a[0]的地址,是地址常量84:668095a[0]a[1]a[2]:a[9]a6.1.2数组元素的引用数组必须先定义,后使用下标可以是常量或整型表达式如:a[1],a[2*3]只能逐个引用数组元素,不能一次引用整个数组下标不要超范围(越界)区分:数组定义:inta[10],数组元素引用t=a[6];例inta[10];printf(“%d”,a);(

)必须

for(j=0;j<10;j++)printf(“%d\t”,a[j]);(

)引用形式:数组名[下标]

例intdata[5];data[5]=10;(

)

//C语言对数组不作越界检查,使用时要注意6.1.3数组元素的初始化与赋值在定义数组时,为数组元素赋初值(在编译阶段使之得到初值)inta[5]={1,2,3,4,5};等价于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;说明:

数组不初始化,其元素值为随机数

对static数组元素不赋初值,系统会自动赋以0值

当全部数组元素赋初值时,可不指定数组长度

可以只给部分数组元素赋初值

一维数组的赋值是指数组已经定义完毕,对数组元素作动态赋值。例如:

inta[5]; /*定义一维数组a,每个元素的值是不确定的*/a[0]=1;a[1]=2;a[2]=3; /*逐个赋值*/3.inta[5];a={1,2,3,4,5};×4.inta[10];floati=3;a[i]=10;×1.charname[0];×floatweight[10.3];×intarray[-100];×6.inti,a[5];for(i=0;i<5;i++)scanf(“%d”,&a[i]);for(i=0;i<5;i++)printf(“%d”,a[i]);√2.inti=5;inta[i]={1,2,3,4,5};×5.inta[5];scanf(“%d”,&a);printf(“%d”,a);×讨论:以下几种用法是否正确?一维数组的赋值【例6.1】编程,输入10个整数,计算最大值并输出。源程序:#include<stdio.h>main(){ inti,max,a[10]; printf("Input10numbers:\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=%d\n",max);}控制输入10个数据核心算法语句【例6.2】用冒泡排序法对N个数进行排序(从小到大),用6个演示冒泡排序方法:依次比较相邻的两个数,将小数放前面,大数放后面.经过第1轮(共5次比较与交换)后最大的数9已“沉底”。再对余下的前面5个数进行第二轮比较,次大的数又被安置。n个数排序需要进行n-1轮比较,从第1轮到第n-1轮,各轮的比较次数依次为:n-1次、n-2次…1次,第i轮比较中要进行n-i次两两比较。972541a[0]a[1]a[2]a[3]a[4]a[5]72541

927754712541794515241

5

7921

4

5

7

914129725419999972541初始状态第1轮第2轮第3轮第4轮第5轮76.2二维数组姓名高等数学大学英语C程序设计王青808286陈丹788980赵乐767281李磊536770罗鹏878291该表共有15个数值,我们可以把它看作是由5行3列组成的矩阵。在数学中,我们使用双下标变量来表示矩阵中的某个值,其中一个变量表示行,另一个变量表示列。在C语言中可以使用二维数组来定义这样的表。该表在C中可以这样来定义:intv[5][3];/*v是二维数组名称,5表示行数,3表示列数,int表示元素类型*/6.2.1二维数组的定义定义形式:

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

如:inta[3][4];

6.2.2二维数组的引用

数组元素的表示形式:

数组名[下标][下标]

注意:(1)每个下标都要用[]括起来,如a[2][1]不能写成a[2,1](2)下标从0开始,且不要超过定义的范围6.2.3二维数组的初始化与赋值1.分行初始化

inta[3][4]={

{1,2,3,4},{5,6,7,8},{9,10,11,12}};

此方法较直观,第一对{}内的数据赋给第一行数组元素,依次类推2.按数据的排列顺序对数组元素赋初值

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

将数据依次赋给元素a[0][0],a[0][1]……a[2][3]123456789101112注意:此方法数据无明显的界限,当数据较多时容易出错3.对数组的部分元素赋初值,未赋值元素自动取0

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

inta[3][4]={1,2,3,4,5,6};1200300045601234560000004.对数组的全部元素赋初值时可以省略第一维的长度(行下标),

系统会根据数据的个数和第二维的长度自动求出第一维长度,

但第二维下标不可省.

intb[][2]={1,2,3,4,5,6,7,8};数组a第一维长度为3

数组b第一维长度为4

如仅对部分元素赋初值,要想省略数组的行数,则必须分行赋值。

inta[][4]={{1,2},{0,3,4},{5}};【例6.3】求一个4×4矩阵的主对角线上各元素之和。#include<stdio.h>main(){ inta[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; inti,j,sum=0; for(i=0;i<4;i++) for(j=0;j<4;j++)

if(i==j) sum=sum+a[i][j]; printf("sum=%d",sum);}方阵主对角线上元素的特征是:行标值等于列标值。6.3字符数组与字符串一、字符数组1.定义 例charc[10],ch[3][4];

例charch[5];ch[0]=‘H’;ch[1]=‘e’;ch[2]=‘l’;ch[3]=‘l’;ch[4]=‘o’;ch[0]Hello逐个字符赋值ch[1]ch[2]ch[3]ch[4]注意{}

例charch[5]={‘H’,’e’,’l’,’l’,’o’};ch[0]Hello逐个字符赋值ch[1]ch[2]ch[3]ch[4]

例charch[5]={‘B’,’o’,’y’};ch[0]Boy\0\0逐个字符赋值ch[1]ch[2]ch[3]ch[4]

例charch[5]=“Boy”;ch[0]Boy\0\0用字符串常量ch[1]ch[2]ch[3]ch[4]

例charch[6]={“Hello”};charch[6]=“Hello”;charch[]=“Hello”;用字符串常量ch[0]Helloch[1]ch[2]ch[3]ch[4]\0ch[5]

例chardiamond[][5]={{'.','.','*'},{'.','*','.','*'}, {'*','.','.','.','*'},{'.','*','.','*'},{'.','.','*'}};二维字符数组初始化..*\0\0.*.*\0*...*.*.*\0..*\0\0diamond[0]diamond[1]diamond[2]diamond[3]diamond[4]

例charfruit[][7]={“Apple”,”Orange”,”Grape”,”Pear”,”Peach”};二维字符数组初始化fruit[0]fruit[1]fruit[2]fruit[3]fruit[4]Apple\0\0Orange\0Grape\0\0Pear\0\0\0Peach\0\0例输出一个字符数组#include<stdio.h>main(){charc[10]={'I','','a','m','','a','','b','o','y'};inti;for(i=0;i<10;i++)printf("%c",c[i]);printf("\n");}Iamaboy0123456789二、字符串1、字符串存放及其结束标志无字符串变量,用字符数组处理字符串字符串结束标志:‘\0’例“hello”共5个字符,在内存占6个字节字符串长度5

'h'

'e'

'l'

'l'

'o'

'\0'

1041011081081110内存存放字符ASCII码等价于:chars1[]={'C','h','i','n','a','\0'};chars2[10]={'C','h','i','n','a'};chars1[]=“China”

chars2[10]="China"

;字符串在字符数组中的存放s2[4]s2[5]s2[7]s2[6]s2[8]s2s2[0]s2[2]s2[1]s2[3]10个字节'C''i''n''a''h''\0's2[9]'\0'

'\0'

'\0'

'\0''\0's3[5]s1s3[0]s3[2]s3[1]s3[3]6个字节s3[4]'C''i''n''a''h'

数组名:字符数组(字符串)在内存的首地址。

作为字符串进行存储时,字符串与字符数组的长度可以不等,系统自动加‘\0’为结束标志。ss1[0]s1[2]s1[1]s1[3]5个字节s1[4]'C''i''n''a''h''\0's3[5]s1s3[0]s3[2]s3[1]s3[3]6个字节s3[4]'C''i''n''a''h'字符串在字符数组中的存放不等价于:chars[5]={'C','h','i','n','a'};chars1[]=“China”

不能写成:chars1[5]="China"

用字符串作初值时,数组的长度应足够大以便能容纳全部字符和‘\0’。2、字符串的输入输出逐个字符I/O:%c整个字符串I/O:%s例用%cmain(){charstr[5];inti;for(i=0;i<5;i++)scanf(“%c”,&str[i]);for(i=0;i<5;i++)printf(“%c”,str[i]);}例用%smain(){charstr[5];scanf(“%s”,str);printf(“%s”,str);}main(){chara[5]={‘H’,’e’,’l’,’l’,’o’};printf(“%s”,a);}main(){chara[]=“Hello”;printf(“%s”,a);}结果:因为没有‘\0’结束符,输出Hello,后面的字符不确定。结果:Helloprintf的%s输出字符串main(){chara[]={'h','e','l','\0','l','o','\0'};printf("%s",a);}输出:hel

hel\0lo\0数组中有多个‘\0’时,遇第一个结束用“%s”输出时,遇‘\0’结束hello02314main(){inti;chara[5];scanf("%s",a);for(i=0;i<5;i++)printf("%d,",a[i]);}运行情况:(1)若输入hel,正常(2)若输入hell,正常(3)若输入hello,用%s输出时,会出现问题输入字符串长度<数组维数scanf的%s输入字符串

hel\0

hell\0

helloscanf的%s输入字符串#include<stdio.h>main(){chara[15],b[5],c[5];

scanf("%s%s%s",a,b,c);printf("a=%s\nb=%s\nc=%s\n",a,b,c);

scanf("%s",a);printf("a=%s\n",a);}运行情况:输入:Howareyou?输出:a=Howb=arec=you?输入:Howareyou?输出:a=Howscanf中%s输入时,遇空格或回车结束

How\0

are\0

you?\0

3、常用的字符串处理函数除puts和gets外,包含在头文件string.h(1)字符串输出函数puts格式:puts(字符数组)功能:向显示器输出字符串(输出完,换行)说明:字符数组必须以‘\0’结束(2)字符串输入函数gets格式:gets(字符数组)功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加‘\0’说明:输入串长度应小于字符数组维数例#include<stdio.h>main(){charstring[80];printf(“Inputastring:”);gets(string);puts(string);}输入:Howareyou?输出:Howareyou?

#include<stdio.h>main(){chara[15],b[5],c[5];scanf("%s",a);printf("a=%s\n",a);}运行情况:输入:Howareyou?输出:a=How#include<stdio.h>main(){chara[15],b[5],c[5];gets(a);printf("a=%s\n",a);}

使用scanf()的%s整体输入,空格或回车结束使用gets()函数,只以回车键结束输入运行情况:输入:Howareyou?输出:a=Howareyou?讨论:scanf()的%s与gets()函数的区别?(3)字符串连接函数strcat格式:strcat(字符

温馨提示

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

评论

0/150

提交评论