版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章数组5.1一维数组二维数组5.2字符数组和字符串5.3本章内容导读本章主要介绍一维数组和二维数组的定义、初始化和数组元素的引用方法,同时介绍字符数组和字符串的处理方法。通过学习本章,读者应掌握以下内容:掌握一维数组、二维数组、字符数组的定义、初始化和数组元素的引用方法;掌握字符串的存储和处理方法;掌握常用的处理字符、字符串的库函数的使用方法。数组是一种数据结构,处于这种结构中的变量具有相同的性质,并按一定的顺序排列。数组的定义:
数据类型数组名[数组长度];
a[0]0145a[1]a[2]a[3]a[4]a[5]23a数组元素(下标变量)数组中的每个分量,用下标来表示其所处位置,各分量排列有序且数据类型相同。数组元素的表示:数组名[下标]
数组名表示数组存储区域的首地址,数组的首地址也就是第一个元素的地址,是一个地址常量,不能向它赋值。例如:a或&a[0]下标用来表示该数组元素在数组中相对位置,是整型常量,最小值为0,最大值为数组长度-1。例如a[3]中的下标35.1一维数组定义
一维数组是只有一个下标的数组,数组同变量一样,也必须先定义后使用。例如inta[6];
数据类型符数组名1[长度1],数组名2[长度2],…;说明(1)“数据类型符”是指数组元素的数据类型,数据类型可以是任何基本类型。(2)数组名,与变量名一样,必须遵循标识符命名规则。(3)数组长度是用常量表达式来表示数组元素的个数,它是一个整型值,其中可以包含常数和符号常量,但不能出现变量。(4)数组名中存放的是一个地址常量,它代表整个数组的首地址。同一数组中的所有元素,按其下标的顺序占用一段连续的存储单元。(5)数组元素的下标,是元素相对于数组首地址或起始地址的偏移量,所以从0开始顺序编号。(6)一个数组定义语句中可以只定义一个数组,也可以定义多个数组,还可以同时定义数组和变量。
1、一维数组的定义5.1一维数组引用形式数组名[下标表达式]说明(1)“下标表达式”可以是一个整型常量、整型变量或整型表达式,取值范围是0至(元素个数-1)。
注意:在运行C语言程序时,系统不自动检验数组元素的下标是否越界。因此在编写程序时,保证数组下标不越界十分重要。(2)一个数组元素,实质上是一个变量,它具有和相同类型单个变量一样的属性,可以进行赋值和参与各种运算。(3)C语言中,数组作为一个整体,不能参加数据运算,只能对单个的元素进行处理。2、一维数组元素的引用5.1一维数组格式数据类型符数组名[长度]={初值表},…;说明(1)如果对数组的全部元素赋以初值,定义时可以不指定数组长度(系统根据初值个数自动确定)。如果被定义数组的长度,与初值个数不同,则数组长度不能省略。(2)“初值表”中的初值个数,可以少于元素个数,即允许只给部分元素赋初值。若只对数组的前若干个元素赋初值,则没有给出初值的元素均有默认的初值。对于数值型数组默认的初值为0;对于字符型数组,默认的初值为空字符'\0'(ASCII码值为0)。3、一维数组的初始化5.1一维数组给一维数组的全部元素赋初值给一维数组的部分元素赋初值初值的个数不能超过一维数组元素的个数给一维数组的全部元素赋初值时允许省略数组长度的说明注意:①数组长度可省略,赋初值时系统自动分配。②花括号中的常量个数小于数组长度,相应赋值后,其余赋0。③若数组长度小于初值个数,则编译错误。
inta[]={0,1,2,3,4,5,6,7,8,9};inta[10]={0,1,2,3,4,5,6,7,8,9};inta[10]={0,1,2,3,4};inta[4]={1,2,3,4,5};【例5-1】利用冒泡排序法对一维数组的n个整数从小到大排序。基本思想:通过相邻两个数之间的比较和交换,使数值较小的数据逐渐从底部移向顶部,数值较大的数逐渐从顶部移向底部。就像水底的气泡一样逐渐向上冒,故而得名。排序过程:设有n个数据,存放到a[1]到a[n]的n个数组元素中。(1)从a[1]到a[n],依次把两个相邻元素两两比较,即a[1]与a[2]比,a[2]与a[3]比,…,a[n-1]与a[n]比;(2)每次两相邻元素比较后,若前一个元素值比后一个元素值大,则交换两元素值;否则,不交换。(3)重复上述算法,把a[1]到a[n]中的最大值换到a[n],再把a[1]到a[n-1]中最大值换到a[n-1],……最后把a[1]到a[2]中最大值换到a[2]中,即完成排序。#include<stdio.h>intmain(void){int
i,j,k,n,temp,a[200];
printf("Inputnumbers:\n");
scanf("%d",&n);/*从键盘输入待排序的数据个数n<200*/for(k=1;k<=n;k++)
scanf("%d",&a[k]);/*利用for循环依次从键盘输入待排序的数据*/for(i=1;i<=n-1;i++)/*外层循环,变量i控制排序总共进行n-1轮*/
for(j=n;j>=i+1;j--)/*内层循环,变量j控制每轮进行比较的次数是n-i*/
if(a[j]<a[j-1])
{temp=a[j];a[j]=a[j-1];a[j-1]=temp;}/*相邻两个元素比较,若前大后小则交换*/for(k=1;k<=n;k++)
printf("%d",a[k]);/*利用for循环依次输出排序结果*/return0;}【例5-2】利用选择排序法对一维数组的n个整数从小到大排序。基本思路:在每一轮比较中不是每当a[i]<a[j]时就交换,而是用一个变量k记下其中值较小的元素的下标值,在a[i]与a[i+1]到a[n]全部进行比较后,只将a[i]与a[i+1]到a[n]中值最小的那个元素进行交换,为此每一轮只需将a[i]与a[k]的值交换即可。#include<stdio.h>intmain(void){
int
i,j,temp,k,n,a[200];
printf("Inputnumbers:\n");
scanf("%d",&n);/*从键盘输入待排序的数据个数n<200*/for(i=0;i<n;i++)
scanf("%d",&a[i]);/*利用for循环依次从键盘输入待排序的数据*/for(i=0;i<n-1;i++)/*外层循环,变量i控制排序总共进行n-1轮*/{k=i;
for(j=i+1;j<n;j++)/*内层循环,变量j控制每轮进行比较的次数*/
if(a[j]<a[k])k=j;/*k记录每轮比较中的最小数的下标*/
if(k!=i)
{temp=a[i];a[i]=a[k];a[k]=temp;}/*将第i轮的最小数与a[i]交换*/}
printf("thesortednumbers:\n");for(i=0;i<n;i++)printf("%d",a[i]);/*利用for循环依次输出排序结果*/return0;}定义格式
数据类型符数组名[行长度][列长度];例:inta[3][4];
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]014523a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[0][0]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[1][2]67101189a[0]a[1]a[2]第0行第1行第2行存储结构:以行为主序方式存放。二维数组长度=行长度*列长度
逻辑结构
第0列第1列第2列第3列5.2二维数组1、二维数组的定义
引用形式数组名[行下标][列下标]
行号列号说明(1)“行下标”和“列下标”可以是整型常量、整型变量、整型表达式或符号常量。(2)“行下标”和“列下标”的值,都应在已定义数组大小的范围内。例如数组x[3][4],则可用的行下标范围为0~2,列下标范围为0~3。2、二维数组元素的引用5.2二维数组直述型:将所有常量写在一个花括号内,各个常量之间用逗号分开,按数组元素存储的顺序对各元素赋初值。inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};分列型:用花括号嵌套,即每一组一维数组的初值数据再用一对花括号括起。注意:若对全部元素都赋初值,第一维长度可省略,但第二维长度不能省。inta[3][4]={{1},{5},{9}};inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};3、二维数组的初始化5.2二维数组【例5-3】输入一个3*3的数组,将其行和列互换。#include<stdio.h>intmain(void){
int
i,j,b[3][3];staticinta[3][3]={{1,2,3},{4,5,6},{7,8,9}};for(i=0;i<=2;i++)for(j=0;j<=2;j++)b[j][i]=a[i][j];for(i=0;i<=2;i++){for(j=0;j<=2;j++)
printf("%d",b[i][j]);
printf("\n");}return0;}47258369【例5-4】求矩阵A与B乘积C。#include<stdio.h>intmain(void){int
i,j,k,m=2,n=3,p=2;staticinta[2][3]={{6,8,7},{3,4,5}};staticintb[3][2]={{1,2},{2,1},{-1,0}};staticintc[2][2]={{0,0},{0,0}};for(i=0;i<m;i++)for(j=0;j<p;j++){c[i][j]=0;for(k=0;k<n;k++)c[i][j]=c[i][j]+a[i][k]*b[k][j];}for(i=0;i<m;i++){for(j=0;j<p;j++)
printf("%d",c[i][j]);
printf("\n");}return0;}1520610一维字符数组的定义
char数组名[数组长度]={初值表};charc[10];二维字符数组的定义char数组名[行长度][列长度]={{初值表},{初值表},…,{初值表}};5.3字符数组和字符串1、字符数组的定义和初始化用字符常量对字符数组进行初始化charstr[8]={'p','r','o','g','r','a','m','\0'};charstr[8]={112,114,111,103,114,97,109,0};用字符的ASCII码值对字符数组进行初始化用字符串对字符数组进行初始化charstr[]="program";charstr[]={"program"};
注意:只能在定义时赋初值,不能在语句中直接将一个字符串赋给一个字符数组,可用strcpy()实现将一个字符串赋给另一个字符数组。
int
qus[19];qus[]="What'syourname?";1、字符数组的定义和初始化5.3字符数组和字符串字符数组的输入除了可以通过初始化使字符数组各元素获得初值外,也可使用getchar()或scanf()函数输入字符。例如charstr[10];
for(i=0;i<10;i++)
scanf("%c",&str[i]);2、字符数组的输入和输出5.3字符数组和字符串字符数组的输出字符数组的输出,可以用putchar()或printf()函数。例如charstr[10]="clanguage";
for(i=0;i<10;i++)printf("%c",str[i]);
printf("\n");
注意:逐个字符输入、输出时需要给出元素的下标,而且使用%c格式符。另外,从键盘上输入字符时,无需输入字符的定界符──单引号;输出时,系统也不输出字符的定界符。2、字符数组的输入和输出5.3字符数组和字符串逐个字符的输入和输出scanf("%c",&ch);printf("%c",ch);ch=getchar();putchar(ch);
3、字符串5.3字符数组和字符串【例5-5】逐个字符输入输出。#include<stdio.h>intmain(void){inti;charstr[10];for(i=0;i<9;i++)scanf("%c",&str[i]);
str[i]='\0';for(i=0;i<9;i++)printf("%c",str[i]);return0;}123456789123456789str[i]=getchar();putchar(str[i]);字符串的整体输入和输出scanf("%s",字符数组名);注意:输入时自动加'\0'。printf("%s",字符数组名);charc[]={"China"};printf("%s",c);输出:Chinacharc[]={"China"};printf("%s",c[0]);charstr[13];scanf("%s",str);输入:Howareyou<CR>charstr[13];scanf("%s",&str);charstr1[5],str2[5],str3[5];scanf("%s%s%s",str1,str2,str3);输入:Howareyou<CR>整行输入和输出gets(str);注意:读入由键盘输入的字符(包括空格),直至换行符为止(换行符不存入)。puts(str);注意:把字符串的内容显示在屏幕上。charstr[]={"China\nBeijing"};puts(str);输出:ChinaBeijing3、字符串5.3字符数组和字符串在使用以下字符串处理的库函数时应在源程序中包含头文件“string.h”。字符串输入函数gets()调用格式
gets(字符数组名)功能:从标准输入设备即键盘上读取一个字符串(可以包含空格,仅以回车换行符作为结束标志),并将其存储到指定的字符数组中。说明(1)gets()函数读取的字符串的长度没有限制,编程者应保证字符数组有足够大的空间,存放输入的字符串。(2)gets()函数和使用%s格式的scanf()函数都可以从键盘输入字符串,但两者是有区别的。对于scanf()函数,回车换行符和空格符都看成是输入字符串的结束标志;对于gets()函数输入的字符串中允许包含空格,只有回车换行符才看作是输入字符串的结束标志。4、字符串处理的常用库函数5.3字符数组和字符串字符串输出函数puts()调用格式puts(字符数组名)功能:把字符数组中所存放的字符串,输出到标准输出设备中去,并用'\n'取代字符串的结束标志'\0'。所以用puts()函数输出字符串时,不要求另加换行符。说明(1)字符串中允许包含转义字符,输出时产生一个控制操作。(2)puts()函数和使用%s格式的printf()函数都可以输出字符串,但两者是有区别的。对于printf()函数,不输出字符串结束标志符;对于puts()函数,字符串结束标志符转换为回车换行符输出。此外,puts()函数一次只能输出一个字符串,而printf()函数用来输出字符串时一次可以输出多个。4、字符串处理的常用库函数5.3字符数组和字符串字符串比函数strcmp()调用格式
strcmp(字符串1,字符串2)参数:“字符串1”和“字符串2”可以是字符串常量,也可以是已经存放字符串的字符数组名。功能:比较两个字符串的大小。
如果字符串1=字符串2,函数返回值是0;
如果字符串1<字符串2,函数返回值是负整数;
如果字符串1>字符串2,函数返回值是正整数。说明(1)如果一个字符串是另一个字符串从头开始的子串,则母串为大。(2)不能使用关系运算符==比较两个字符串,只能用strcmp()函数处理。4、字符串处理的常用库函数5.3字符数组和字符串strcmp(str1,str2);strcmp("China","Korea");strcmp(str1,"Beijing");字符串复制函数strcpy()调用格式
strcpy(字符数组名,字符串[,整型表达式])参数:字符数组”是已经定义的字符数组名;“字符串”可以是字符串常量,也可以是已经存放字符串的字符数组名;“整型表达式”可以是任何整型表达式,这一参数也可以省略。功能:将“字符串”的前“整型表达式”个字符组成新的字符串复制到“字符数组”中。若省略“整型表达式”,则将“字符串”完整地复制到“字符数组”中,字符数组的原有内容被覆盖。说明(1)字符数组必须定义得足够大,以便容纳复制过来的字符串。复制时,连同结束标志'0'一起复制。(2)不能用赋值运算符=将一个字符串直接赋值给一个字符数组,只能用strcpy()函数处理。4、字符串处理的常用库函数5.3字符数组和字符串charstr1[10],str2[]={"China"};strcpy(str1,str2);字符串连接函数strcat()调用格式
strcat(字符数组名,字符串)功能:把“字符串”连接到“字符数组”中字符串的尾端(最后一个有效字符的后面),组成新的字符串并存储到“字符数组”。“字符数组”中原来的结束标志,被“字符串”的第一个字符覆盖,而“字符串”在操作中未被修改。返回值:字符数组的首地址。说明(1)由于没有边界检查,编程者要注意“字符数组”定义得足够大,以便容纳连接后的目标字符串;否则会因长度不够而产生问题。(2)连接前两个字符串都有结束标志'0',连接后“字符数组”中存储的字符串的结束标志'0'被舍弃,只在目标串的最后保留一个'0'。4、字符串处理的常用库函数5.3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《DLT 5480-2022火力发电厂烟气脱硝系统设计规程》(2026年)合规红线与避坑实操手册
- 2026年食品企业豆制品包装品牌授权合同协议
- 2026.5.7 智能拆垛装车生产线
- 某省市安全生产条例培训
- 安全施工管理实战课
- 建筑材料行业市场前景及投资研究报告:“城市更新”大时代地下管网
- 脑梗死护理专项考核试题(80分合格含答案解析)
- 2026 五年级上册《Unit1 同步精讲课件》课件
- 医院电子化审批制度
- 医院采购专管员制度
- 2024版建设工程质量常见多发问题防治措施汇编(房建篇)
- 供应室骨科器械处理流程
- 车商渠道的经营和管理
- 《广州市建设工程涉及消防的建筑材料、建筑构配件和设备质量进场检验参考指南》2024
- 签证委托书范本(共14篇)
- 【MOOC】中医与诊断-学做自己的医生-暨南大学 中国大学慕课MOOC答案
- 脑血管后遗症护理查房课件
- 电力施工道路施工方案
- 走向成熟(青春期男生性教育)
- 武汉英中国际学校高中入学考试试题
- 冒顶片帮事故预防培训课件
评论
0/150
提交评论