为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

数组

2012-02-26 50页 ppt 3MB 21阅读

用户头像

is_610236

暂无简介

举报
数组nullnull第 6章 数组第 6章 数组null本章重点 一维数组 二维数组及多维数组 数组作为函数参数 字符数组与字符串6.1 数组的概念数 组6.1 数组的概念一个班学生的学习成绩 一行文字 一个矩阵 这些数据的特点是: 1.数据量较大,数据不止一个 2.具有相同的数据类型 3.使用过程中需要保留原始数据 C语言为这些数据,提供了一种构造数据类型:数组。所谓数组就是一组具有相同数据类型的数据的有序集合。 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据; 一个数组在内存占有...
数组
nullnull第 6章 数组第 6章 数组null本章重点 一维数组 二维数组及多维数组 数组作为函数参数 字符数组与字符串6.1 数组的概念数 组6.1 数组的概念一个班学生的学习成绩 一行文字 一个矩阵 这些数据的特点是: 1.数据量较大,数据不止一个 2.具有相同的数据类型 3.使用过程中需要保留原始数据 C语言为这些数据,提供了一种构造数据类型:数组。所谓数组就是一组具有相同数据类型的数据的有序集合。 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据; 一个数组在内存占有一片连续的存储区域; 数组名存储数组空间的首地址; 数组的每个元素用下标变量标识. 数组6.1怎样定义和引用一维数组6.1怎样定义和引用一维数组6.1.1 怎样定义一维数组 6.1.2 怎样引用一维数组元素 6.1.3 一维数组的初始化 6.1.4 一维数组程序举例6.1.1 怎样定义一维数组数 组6.1.1 怎样定义一维数组 一维数组是向量 一维数组的元素是基本类型(整型、字符型或者浮点型)、结构类型或类类型6.1.1 定义一维数组数 组6.1.1 定义一维数组一般格式: 数据类型 数组名[ 常量表达式 ];整型、字符型和浮点型等符合标识符命名规则整型常量或常变量、符号常量。数组的长度例 int a[6] ; char str[80]; const int M=30; //定义常变量M float num[M];null数 组例 int a[6]; 数组中有6个元素,占用一片连续的存储空间 每个元素的类型都是 int ,都占用4个字节 每个元素可以用数组名[下标]表示和访问,例如:a[2] 数组名代表数组中第一个元素的地址,也被称为数组首地址 a[2]地址为 a+2*46.1.2 引用一维数组中的元素数 组6.1.2 引用一维数组中的元素 数组名[表达式] 以下标方式访问数组 数组的地址整型表达式 地址偏移值例 int a[6]; 访问第三个元素:a[2]6.1.2 引用一维数组中的元素数 组例: int ary [ 10 ] , i = 3, j = 5 ; ary [ 0 ] = 1010ary [ i ] = 22ary [ j ] = ary [ i ]ary [ 2+j ] = 31312ary [ ary [ i ] ] = ary [ 0 ]10注意: C 不提供对数组的 下标范围检查 ary[10]=10;//编译不报错 6.1.2 引用一维数组中的元素null数 组6.1.3 一维数组的初始化与普通变量一样,可以在数组定义的同时,对数组元素赋初值例:int a1[ 5 ] = { 1, 3, 5, 7, 9 }; int a2[ 5 ] = { 0 } ; int a3[ 5 ] = { 1, 2, 3, } ; int a4[ ] = { 1, 2, 3, 4, 5, 6, 7 } ; int a5[ 5 ] = { 1, 2, 3, 4, 5, 6, 7 } ; // a3[3],a3[4]自动赋 0,后面的逗号可选// 自动定义数组长度为7 // 错误,初始化数据过多// 第一个元素初始化为0,其他元素使用默认值0// 各元素分别赋初始值null例: int a[10]={0,1,2,3,4};相当于 int a[10]={0,1,2,3,4,0,0,0,0,0}; int a[10]={0,0,0,0,0,0,0,0,0,0};相当于 int a[10]={0}; 若只有int a[10];其元素的值是多少呢? 是:不确定 int a[5]={1,2,3,4,5};可写为 int a[ ]={1,2,3,4,5}; int a5 [ 5 ] = { 1, 2, 3, 4, 5, 6, 7 } ; 错误6.1.4 一维数组程序举例数 组6.1.4 一维数组程序举例 访问数组中的所有元素例 int a[6];访问 a[0] 访问 a[1] 访问 a[2] 访问 a[3] 访问 a[4] 访问 a[5]访问 a[i] , i从0变化到5for ( i=0 ; i<6 ; i++) 访问 a[i];i作为循环控制变量以及下标访问:输出、运算、输入等操作i用作下标变量,值从0变化到最大值null 例6.1 对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。 解思路: 定义一个长度为10的数组,数组定义为整型int a[10] 要赋的值是从0到9,a[i]=i,可以用循环来赋值 用循环按下标从大到小输出这10个元素null#include int main() { int i,a[10]; for ( i=0; i<=9; i++) a[i]=i; for ( i=9; i>=0; i-- ) printf("%d ",a[i]); printf("\n"); return 0; }a[0]~a[9]赋值为0~9a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]按逆序输出a[9]~a[0]定义数组for ( i=起始值; i<终值6 ; i++) 访问 a[i];null引例:将上述数组元素的值交换存放 思路 a[0]和a[9]交换 a[1]和a[8]交换 ……a[i]和a[9-i]交换 for(i=0;i<=9;i++) { t=a[i]; a[i]=a[9-i]; a[9-i]=t; }9 8 7 6 5 4 3 2 1 0null 例6.2 用数组处理求Fibonacci数列问题 解题思路: 例5.8中用简单变量处理的,缺点不能在内存中保存这些数。假如想直接输出数列中第25个数,是很困难的。 如果用数组处理,每一个数组元素代表数列中的一个数,依次求出各数并存放在相应的数组元素中 Fibonacci 数列:1,1,2,3,5,8,13,21,34,…… f[0] = 1 f[1] = 1 f[i] = f[i-1] + f[i-2] ( i >= 2 ) (抽象的)null#include int main() { int i; int f[20]={1,1}; for(i=2;i<20;i++) f[i]=f[i-2]+f[i-1]; for(i=0;i<20;i++) { if(i%5==0) printf(“\n”); printf(“%12d”,f[i]); } printf("\n"); return 0; }例2:将一个整数插入到一有序的整数系列中使之仍然有序例2:将一个整数插入到一有序的整数系列中使之仍然有序分析: 10987null#include void main( ) { int a[11], t; int i; for ( i=0;i<10;i++) { a[i] = i*3; printf("%d ",a[i]);} printf("\n"); printf("请输入一个整数:" ); scanf("%d",&t); for( i=9;i>0;i--) if ( t <= a[i] ) a[i+1]=a[i]; else break; a[++i]=t; for( i=0;i<11;i++) printf("%d ",a[i]); printf("\n"); }// 为数组中的元素赋值并输出 0 3 6 9 12 15 18 21 . // 输入待插入的数据 // 将t写入 // 从后往前查找插入位置,并且移动数据 // 输出数组中的元素 练习练习 若要求定义具有10个int型元素的一维数组a,则以下定义语句中错误的是( )。 A)#define N 10 B)#define n 5 int a[N]; int a[2*n]; C)int a[5+5]; D)int n=10,a[n]; 若有定义语句:int m[ ]={5,4,3,2,1},i=4; 则下面对m数组元素的引用中错误的是( )。 A)m[--i] B)m[2*2] C) m[m[0]] D)m[m[i]] 练习练习 有以下程序 #include main() { int s[12]={1,2,3,4,4,3,2,1,1,1,2,3},c[5]={0},i; for(i=0;i<12;i++) c[s[i]]++; for(i=1;i<5;i++) printf(“%d”,c[i]); printf(“\n”); } 程序的运行结果是( )。 A)1 2 3 4 B)2 3 4 4 C)4 3 3 2 D)1 1 2 3 null 例6.3 有10个地区的面积,要求对它们按由小到大的顺序排列。(冒泡排序) 解题思路: 排序的规律有两种:一种是“升序”,从小到大;另一种是“降序”,从大到小 把题目抽象为:“对n个数按升序排序” 采用起泡法排序null回顾: 用起(冒)泡法对10个数按从小到大( 升序)排序排序过程: (1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上 (2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置 (3)重复上述过程,共经过n-1趟冒泡排序后,排序结束null—— 采用相邻元素比较的方法a[i]a[i+1]if (a[i] > a[i+1] ) 38499776139727975297分析:用起(冒)泡法对8个数按从小到大( 升序)排序第一趟起泡过程,7次比较for(i=1;i<8-1;i++) if(a[i]>a[i+1]) { t=a[i]; a[i]=a[i+1]; a[i+1]=t;} }null—— 采用相邻元素比较的方法76137627分析:用起(冒)泡法对8个数按从小到大( 升序)排序第二趟起泡过程,6次比较7652a[i]a[i+1]if (a[i] > a[i+1] ) for(i=1;i<8-2;i++) if(a[i]>a[i+1]) { t=a[i]; a[i]=a[i+1]; a[i+1]=t;} }null9 8 5 4 2 08 9 5 4 2 08 5 9 4 2 08 5 4 9 2 08 5 4 2 9 08 5 4 2 0 9大数沉淀,小数起泡a[0] a[1] a[2] a[3] a[4] a[5]for(i=0;i<5;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; }null8 5 4 2 0 95 8 4 2 0 95 4 8 2 0 95 4 2 8 0 95 4 2 0 8 9a[0] a[1] a[2] a[3] a[4] a[5]for(i=0;i<4;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; }null5 4 2 0 8 94 5 2 0 8 94 2 5 0 8 94 2 0 5 8 9a[0] a[1] a[2] a[3] a[4] a[5]for(i=0;i<3;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; }null4 2 0 5 8 92 4 0 5 8 92 0 4 5 8 9a[0] a[1] a[2] a[3] a[4] a[5]for(i=0;i<2;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; }null2 0 4 5 8 90 2 4 5 8 9a[0] a[1] a[2] a[3] a[4] a[5]for(i=0;i<1;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; }nullfor(i=0;i<5;i++) if (a[i]>a[i+1]) { ……}for(i=0;i<4;i++) if (a[i]>a[i+1]) { ……}for(i=0;i<1;i++) if (a[i]>a[i+1]) { ……}……for(i=0;i<5-j;i++) if (a[i]>a[i+1]) { ……}for(j=0;j<5;j++)nullint a[10]; int i,j,t; printf("input 10 numbers :\n"); for (i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); for(j=0;j<9;j++) for(i=0;i<9-j;i++) if (a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;} printf("the sorted numbers :\n"); for(i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); null例3 用选择排序法对10个数按从大到小( 降序)排序 选择排序的方法: (1)扫描整个线性表,从中找出最大的元素,与第一个元素交换; (2)除第一个元素,对剩下的子表采用相同的方法找出次大的数,与第二个数交换; (3)重复上述过程; (4)对于长度为n的线性表,选择排序需要对表扫描n-1遍。 (5)在最坏的情况下,选择排序需要比较n(n-1)/2次null65(下标2)例 用选择排序法对10个数按从大到小( 降序)排序97 (下标3)9749 t = 0 ; //最大数所在的下标保存在t ,初始值为0 for ( j = 1 ; j < = 4 ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; if( t!=0 ) 交换a[t]和a[0];第一趟选择排序null65(下标2)例 用选择排序法对10个数按从大到小( 降序)排序76 (下标4)7638 t = 1 ; //最大数所在的下标 for ( j = 2 ; j < = 4 ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; if( t!=1 ) 交换a[t]和a[1];第二趟选择排序null第一趟选择排序 t = 0 ; //最大数所在的下标保存在t ,初始值为0 for ( j = 1 ; j < = 4 ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; if( t!=0 ) 交换a[t]和a[0];第二趟选择排序 t = 1 ; //最大数所在的下标 for ( j = 2 ; j < = 4 ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; if( t!=1 ) 交换a[t]和a[1];……一共要做n-1次// n = 4for ( i=0 ; i a [ t ] ) t = j ; if( t!=i ) 交换a[t]和a[i]; }null#include #include #include void main() { int a [10],i ; srand ( time ( 0 ) ) ; //调用种子函数 for ( i = 0 ; i < 10 ; i ++ ) a[i] = rand() % 100 ; //用随机函数初始化数组 for ( i = 0 ; i < 10 ; i ++ ) printf(“%d ”, a[ i ]); //输出原始随机数序列 cout << endl ; //接下来是排序种子函数。要求一个无符号整型参数置随机数生成器的启动值。为使种子值可变,用系统时间做srand函数的参数。 时间函数,在time.h定义,用0作参数时,返回系统当前时间 。随机函数。返回0~32767的随机值,该函数没有参数。例 用选择排序法对10个数按从大到小( 降序)排序nullrand()%100结果是随机数除以100后所得的余数,即限定随机的范围是在0~99之间; 使用rand()函数需添加头文件:#include 1. rand()函数 功能:是一个可以生成随机数的函数随机数函数返回的随机数在0~RAND_MAX(32767)之间;2. srand()函数 功能:用来设置随机数的种子,一般与rand()结合使用。否则直接用rand()的话,每次运行程序的产生的随机数都相同。补充知识:null选择排序//选择排序 int max , t ; for ( i = 0 ; i < 10; i ++ ) { t = i ; for ( int j = i + 1 ; j < 10 ; j ++ ) //寻找最大元素 if ( a[j] > a[t] ) t = j ; if ( t != i ) { max = a[i] ; //交换数组元素 a[i] = a[t] ; a[t] = max ; } } //输出排序的结果 for ( i = 0 ; i < 10 ; i ++ ) printf(“%d ”,a[ i ]) ; cout << endl ; }例 用选择排序法对10个数按从大到小( 降序)排序交换a[t]和a[i]例4:随机输入十个整数,使之有序输出(插入排序)例4:随机输入十个整数,使之有序输出(插入排序)分析: i=3tnull分析: i=3t0null分析: i=3t0null分析: i=3t0null分析: i=3t010插入排序算法null#include int main( ) { int a[10],t; int i,j; printf("请输入十个整数:"); for ( i=0;i<10;i++) //数组赋值并打印 {scanf("%d",&a[i]);printf("%d ",a[i]);} printf("\n"); for (i=1;i<10;i++) //插入排序 { t=a[i]; for (j=i-1;j>=0;j--) if (t <= a[j]) a[j+1]=a[j]; else break; a[j+1]=t; } for( i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); return 0; }6.2 怎样定义和引用二维数组6.2.1怎样定义二维数组 6.2.2怎样引用二维数组的元素 6.2.3二维数组的初始化 6.2.4二维数组程序举例6.2 怎样定义和引用二维数组6.2.1 二维数组的定义和引用6.2.1 二维数组的定义和引用具有两个下标的数组称为二维数组 二维数组可以看成是一个表格 二维数组中的每一个元素是类型相同、长度相等的一维数组一维数组6.2.1 定义二维数组6.2.1 定义二维数组一般格式: 数据类型 数组名[ 常量表达式1 ] [ 常量表达式 2] ;整型、字符型和浮点型等符合标识符命名规则整型常量或常变量、符号常量。数组的长度例 int a[ 3 ][ 4 ]; // 二维数组,3 行4列3  4 =12个元素 float b[ 2 ][ 5 ]; // 二维数组,2行5列 int c[ 2 ][ 3 ][ 4 ]; // 多维数组,2  3  4 =24 个元素 int d[3,4]; ()null二维数组存储理解例 int a[3][4]; 每行元素a[i]由包含4个元素 的一维数组组成二维数组a是由3行元素组成存储空间内是一个一维数组6.2.2 二维数组元素的引用6.2.2 二维数组元素的引用 数组名 [ 表达式1 ] [ 表达式2 ] 以下标方式访问数组 例 int a[ 3 ][ 4 ]; 访问2行1列的元素:a[ 2] [ 1 ] 约定:行列值从0算起null6.2.3 一维数组的初始化与一维数组一样,可以在数组定义的同时,对二维数组中的元素赋初值例: int i [ 2 ] [ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } } ; // 数组初始化 int j [ 2 ] [ 3 ] = { 1, 2, 3, 4, 5, 6 } ; // 与 i 数组初始化方式等价 int a [ ] [ 4 ] = { 1, 2, 3, 4, 5, 6,7, 8 } ; //缺省第一维长度 int k [ ] [ 2 ] [ 3 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 } ; // 缺省第一维长度 int p [ ] [ 4 ] = { { 1 }, { 1 }, { 1 } } ; // 仅对第 0 列元素赋初 值{1,0,0,1,0,0,1,0,0} int m [ 3 ] [ ] = { 1, 2, 3, 4, 5, 6 } // 错误,不能省略第二维长度null访问二维数组中元素的方法 设有数组 a[m][n]; 1.访问某行上的所有元素: 例如:a[0][0], a[0][1], a[0][2]…… a[0][n-1] 或 for(j=0; j<=n-1; j++) 访问a[0][j] 2.访问某列上的所有元素: 例如 : a[0][0], a[1][0], a[2][0]…… a[n-1][0] for(j=0; j<=m-1; j++) 访问a[j][0]for( i=0 ; i #include #include #include void main() { int a[5][5]; int i,j; //调用种子函数 srand ( time ( 0 ) ) ; //用随机函数初始化数组 for ( i = 0 ; i < 5 ; i++) for ( j = 0; j < 5 ; j++) a [ i ][ j ] = rand() % 100 ; 例 为二维数组中所有元素提供值并输出//输出原始随机矩阵 for ( i = 0 ; i < 5 ; i++) { for ( j = 0; j < 5 ; j++) cout << setw(5)<< a[i][j] ; cout << endl ; } }null6.2.4 二维数组应用举例例6.4 将二维数组行列元素互换,存到另一个数组中解题思路: 定义两个数组:数组a为2行3列,存放指定的6个数 数组b为3行2列,开始时未赋值 将a数组中的元素a[i][j]存放到b数组中的b[j][i]元素中 用嵌套的for循环完成null#include int main() { int a[2][3]={{1,2,3},{4,5,6}}; int b[3][2],i,j; printf("array a:\n"); for (i=0;i<=1;i++) { for (j=0;j<=2;j++) { printf("%5d",a[i][j]); b[j][i]=a[i][j]; } printf("\n"); }处理a的一行中各元素处理a中某一列元素输出a的各元素a元素值赋给b相应元素null printf("array b:\n"); for (i=0;i<=2;i++) { for(j=0;j<=1;j++) printf("%5d",b[i][j]); printf("\n"); } return 0; } 输出b的各元素null 例6.5 有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。 解题思路:采用“打擂台算法” 先找出任一人站在台上,第2人上去与之比武,胜者留在台上 第3人与台上的人比武,胜者留台上,败者下台 以后每一个人都是与当时留在台上的人比武,直到所有人都上台比为止,最后留在台上的是冠军null 例6.5 有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。 解题思路:采用“打擂台算法” 定义二维数组,初始化 先把a[0][0]的值赋给变量max,max用来存放当前已知的最大值 a[0][1]与max比较,如果a[0][1]>max,则表示a[0][1]是已经比过的数据中值最大的,把它的值赋给max,取代了max的原值;接着a[0][2]、a[0][3],扫描完第一行 以后依此处理,扫描第二行,….最后max就是最大的值null第一行求最大值: 如果a[0][1]>max,则max=a[0][1] 如果a[0][2]>max,则max=a[0][2] 如果a[0][3]>max,则max=a[0][3]for( j=1; j<4; j++ ) if( a[0][j] > max ) max = a[ 0 ] [ j ];第二行求最大值: 如果a[1][0]>max,则max=a[1][0] 如果a[1][1]>max,则max=a[1][1] 如果a[2][2]>max,则max=a[1][2] 如果a[3][3]>max,则max=a[1][3]for( j=0; j<4; j++ ) if( a[1][j] > max ) max = a[ 1 ] [ j ];nullfor( j=0; j<4; j++ ) if( a[0][j] > max ) max = a[ 0 ] [ j ];for( j=0; j<4; j++ ) if( a[1][j] > max ) max = a[ 1 ] [ j ];for( j=0; j<4; j++ ) if( a[2][j] > max ) max = a[ 2 ] [ j ];max=a[0][0]; for(i=0;i<3;i++) for( j=0; j<4; j++ ) if( a[ i ][ j ] > max ) max = a[ i ] [ j ];为了找出重复语句,第一行的第一个元素A[0][0]虽然已经预设为了最大,但是也再比较一次nullnull记行号…… int i,j,row=0,colum=0,max; int a[3][4]={{1,2,3,4},{9,8,7,6}, {-10,10,-5,2}}; max=a[0][0]; for (i=0;i<=2;i++) for (j=0;j<=3;j++) if (a[i][j]>max) { max=a[i][j]; row=i; colum=j; } printf("max=%d\nrow=%d\n colum=%d\n",max,row,colum); ……记最大值记列号练习练习1.以下错误的定义语句是( )。 A)int x[][3]={{0},{1},{1,2,3}}; B)int x[4][3]={{1,2,3},{1,2,3},{1,2,3},{1,2,3}}; C)int x[4][]={{1,2,3},{1,2,3},{1,2,3},{1,2,3}}; D)int x[][3]={1,2,3,4}; 2.若有定义:int a[2][3];,以下选项中对a数组元素正确引用的是 ( )。 A)a[2][!1] B)a[2][3] C)a[0][3] D)a[1>2][ !1] 练习练习 3.有以下程序 main() {int a[4][4]={{1,4,3,2},{8,6,5,7},{3,7,2,5},{4,8,6,1}}; int i,k,t;   for(i=0;i<3;i++)   for(k=i+i;k<4;k++) if(a[i][i] int main() { char c[15]={'I',' ','a','m',' ','a', ' ','s','t','u','d','e','n','t','.'}; int i; for(i=0;i<15;i++) printf( "%c", c[i] ) ; printf("\n"); return 0; } 6.3.3 怎样引用字符数组中的元素和普通数组中元素的访问一样null#include int main() { char c[]={'I',' ','a','m',' ','a', ' ','s','t','u','d','e','n','t','.'}; int i; for( i=0; i int main() { char c[20]="I am a student." ; int i; for( i = 0 ; c[i]!='\0' ; i++) printf( "%c",c[i] ); printf( "\n" ); return 0; } 如果数组中有空白区域,用’\0’可以提前结束程序,不需要访问到空白区域6.3.3怎样引用字符数组中的元素例6.7 输出一个菱形图。 解题思路: 定义一个字符型的二维数组,用“初始化列表”进行初始化 用嵌套的for循环输出字符数组中的所有元素。6.3.3怎样引用字符数组中的元素null#include int main() { char diamond[][5]={{' ',' ','*'}, {' ','*',' ','*'},{'*',' ',' ',' ','*'}, {' ','*',' ','*'},{' ',' ','*'}}; int i,j; for (i=0;i<5;i++) {for (j=0;j<5;j++) printf("%c",diamond[i][j]); printf("\n"); } return 0; }6.3.4字符串和字符串结束标志在C语言中,是将字符串作为字符数组来处理的 关心的是字符串的有效长度而不是字符数组的长度 为了测定字符串的实际长度,C语言规定了字符串结束标志’\0’6.3.4字符串和字符串结束标志6.3.4字符串和字符串结束标志 ’\0’代表ASCII码为0的字符 从ASCII码表可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做 用它作为字符串结束标志不会产生附加的操作或增加有效字符,只是一个供辨别的标志6.3.4字符串和字符串结束标志6.3.4字符串和字符串结束标志char c[10]={”China”};//定义字符数组 可写成 char c[10]=”China”; 从c[5]开始,元素值均为\0 6.3.4字符串和字符串结束标志nullC语言将字符串作为字符数组来处理。 字符串常量:“CHINA”,在机内被处理成一个无名的字符型一维数组。‘\0’作为字符串的结束标志,它占内存空间,但不计入串长度。有了结束标志‘\0’后,程序往往依据它判断字符串是否结束,而不是根据定义时设定的长度。null#include int main() { char c[ ] = "I am a student." ; for ( int i = 0 ; c[i] != '\0' ; i ++ ) printf( "%c" , c[i] ); printf( "\n" ); return 0; }例:用结束标志’\0’控制字符串输出null字符串与字符数组的区别:char a[ ]={‘C’,’H’,’I’,’N’,’A’};char c[ ]=“CHINA”; 字符数组字符串串尾结束标记null可以用字符串的形式为字符数组赋初值char c[ ]={“I am a boy”}; /*长度11,以‘\0’结尾 */char a[ ]={‘I’, ‘ ’, ‘a’, ‘m’, ‘ ’, ‘a’, ‘ ’ , ‘b’, ‘o’, ‘y’}; /* 长度10字节 */如果数组定义的长度大于字符串的长度,后面均为‘\0’。char c[10]=“CHINA”; ‘\0’的ASCII为0,而‘ ’(空格)的ASCII为32。nullchar w[ ]={‘T’, ‘u’, ‘r’, ‘b’, ‘o’, ‘\0’};char w[ ]={“Turbo\0”};char w[ ]=“Turbo\0”;char w[ ]=‘Turbo\0’;非法nullchar a[2][5]={“abcd”, “ABCD”};str为字符数组在内存中存储的地址,一经定义,便成为常量,不可再赋值。char str[12]=“The String”;非法,在语句中赋值定义数组,开辟空间时赋初值null利用字符串结束标记处理字符数组char c[10]=“CHINA”; 例:对字符串进行加密,#include int main() { char c[10]="CHINA"; //将字符串存放于数组 int i=0; while(c[i]!='\0') //加密 { c[i]=c[i]+4; i++; } for(i=0;i<=10;i++) //输出字符串 if(c[i]!='\0') printf("%c",c[i]); else break; printf("\n"); return 0; }更适合对字符串的处理访问字符串的程序段: while(c[i]!='\0') 访问 c[i]; 6.3.5 字符数组的输入输出字符数组的输入输出可以有两种方法: 逐个字符输入输出(%c) 整个字符串一次输入输出(%s) 输出的字符中不包括结束符’\0’ 用%s输出字符串时,printf函数中的输出项是字符数组名,不是数组元素名 如果一个字符数组中包含多个’\0’,则遇第一个’\0’时输出就结束 6.3.5 字符数组的输入输出6.3.5 字符数组的输入输出可以用scanf函数输入一个字符串 scanf函数中的输入项是已定义的字符数组名,输入时字符串应短于已定义的字符数组的长度6.3.5 字符数组的输入输出6.3.5 字符数组的输入输出char c[6]; scanf(”%s”,c); China↙ 系统自动在China后面加一个’\0’ 若超过6个字符会怎样? char c[6]; scanf(”%s”,c); Chinese↙ printf(”%s”,c); Chinese 6.3.5 字符数组的输入输出6.3.5 字符数组的输入输出char str1[5],str2[5],str3[5]; scanf(”%s%s%s”,str1,str2,str3); How are you? ↙ 多个字符串同时输入,以空格作为间隔6.3.5 字符数组的输入输出str1str2str3null#include int main() { char c[10]; scanf("%s",c); //整体输入 printf("%s\n",c); //整体输出 return 0; }对字符数组进行整体输入和输出nullchar c[15]="I am a student"; ① for(i=0;i<15;i++) printf("%c",c[i]); ② for(i=0;i总结
对字符数组的几种输出方法6.3.6 善于使用字符串处理函数在C函数库中提供了一些用来专门处理字符串的函数,使用方便 使用字符串函数时,在程序开头用#include 6.3.6 善于使用字符串处理函数6.3.6 善于使用字符串处理函数1.puts函数----输出字符串的函数 其一般形式为: puts (字符数组) 作用是将一个字符串输出到终端 char str[20]=”China”; puts(str); 输出China6.3.6 善于使用字符串处理函数6.3.6 善于使用字符串处理函数2. gets函数----输入字符串的函数 其一般形式为: gets(字符数组) 作用是输入一个字符串到字符数组 char str[20]; gets(str); Computer↙6.3.6 善于使用字符串处理函数6.3.6 善于使用字符串处理函数3. strcpy和strncpy函数-字符串复制 字符串可以象单个变量一样进行赋值吗?#include void main( ) { char st1[]="abc", st2[4]; st2=st1; × cout<<"st2:"< void ma
/
本文档为【数组】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索