230 likes | 346 Views
第四章 数组和字符串. 一维数组 二维数组 字符串 指针. 数组定义注意点. 数组名为合法的 C 标识符 下标总是从0开始 下标最大为(元素个数-1) 定义 int a[10]; 元素从 a[0] ~ a[9], a[10] 非法 变量 a[0] 与 a0 的区别 一维数组有一个下标, 多维数组有多个下标. 先输入 n 再输入 n 个 学生的成绩 设 n<=100. # define MAXN 100 main() { float s[MAXN], av; int i, n; scanf( “ %d ” , &n );
E N D
第四章 数组和字符串 一维数组 二维数组 字符串 指针
数组定义注意点 • 数组名为合法的C标识符 • 下标总是从0开始 • 下标最大为(元素个数-1) • 定义int a[10]; 元素从a[0] ~ a[9], a[10]非法 • 变量 a[0] 与a0 的区别 • 一维数组有一个下标, 多维数组有多个下标
先输入n 再输入n个 学生的成绩 设n<=100 #define MAXN 100 main() { float s[MAXN], av; int i, n; scanf( “%d”, &n ); if ( n>MAXN ){printf(“Error\n”);return –1;} for ( i = 0; i < n; i++ ) scanf( “%f”, &s[i] ); av = 0; for ( i = 0; i < n; i++ ) av += s[i]; av /= n; printf(“%6.1f\n”, av); } 举例:n个学生的成绩平均
练习:最大值/排序 • 输入5个数, 输出这10个数最大数的位置及其数值 • 输入5个数, 按从大到小的顺序输出 • 输入5个数, 按从大到小的顺序输出这5个数, 同时输出每一个数在原始输入中的位置. • 例输入: 10 99 71 80 50 • 则输出: 99(2) 80(4) 71(3) 50(5) 10(1)
用maxpos记录最大值所在下标 main() { int a[5], maxpos, i; for ( i=0; i<5; i++ ) scanf( “%d”,&a[i] ); maxpos = 0; for ( i=1; i<5; i++ ) if ( a[maxpos]<a[i] ) maxpos = i; printf( “a[%d]=%d\n”, maxpos, a[maxpos] ); } 最大值
选择法 输入5个数(0~4) 依次找出4个最大值 第i个最大值 j从i+1到4 最大值?交换 main() { int a[5], i, j, t; for ( i=0; i<5; i++ ) scanf( “%d”, &a[i] ); for ( i=0; i<=3; i++ ) { for ( j=i+1; j<=4; j++ ) if ( a[i]<a[j] ) { t=a[i]; a[i]=a[j]; a[j]=t; } } for ( i=0; i<5; i++ ) printf( “%d ”, a[i] ); printf( “\n” ); } 排序
输入5个数(0~4) 连续比较相邻两数并交换 main() { int a[5], i, j, t; for ( i=0; i<5; i++ ) scanf( “%d”, &a[i] ); for ( i=0; i<=3; i++ ) { for ( j=0; j<=3; j++ ) if ( a[j]<a[j+1] ) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } for ( i=0; i<5; i++ ) printf( “%d ”, a[i] ); printf( “\n” ); } 起泡法
程序片段 int a[10]; int *p; p = &a[2]; *p = 100; printf( “%d ”, a[2] ); a[2] += 200; printf( “%d\n”, *p ); 输出 = ? 数组与指针 a[] p
设 int a[]={0,10,20,30,40}; 设 int *p = &a[2]; 则以下表达式的值=? *(p+1) *(p-1) *p+1 *p-1 *(p++) *(p--) *(++p) *(--p) (*p)++ (*p)-- ++(*p) --(*p) 指针加减 a[] p
数组与指针:等价性 • 设定义 int a[10], *p; • 若p=a;(或等价p=&a[0])则 • a[2]、*(p+2)、p[2]、*(a+2)为同一个变量 • p+2、a+2为同一个地址(指针) • 若p=a+2;(或等价p=&a[2];)则 • a[5]、*(p+3)、p[3]、*(a+5)为同一个变量 • p+3、a+5为同一个地址(指针) • a[1]、*(p-1)、p[-1]、*(a+1)为同一个变量 • p-2、a为同一个地址(指针)
数组与指针:指针比较 • 例:输入10个数,并求和 main() { int a[10], *p, i, sum=0; for ( i=0; i<10; i++ ) scanf( “%d”, &a[i] ); for ( p=a; p<a+10; p++ ) sum += *p; printf( “sum=%d\n”, sum ); }
二维数组 • 形式(定义) • 数据类型 数组名[第一维个数][第二维个数] • int a[3][4]; 定义整型a[0][0] ~ a[2][3] • 共12个整型,分为三行四列 • 形式(引用) • 数组名[第一维下标] [第二维下标] • a[1][2]表示第二行第三列的元素
二维数组与内存 • 设 int a[3][4]; • 先列再行排列 • 二维数组a由三个一维数组a[0]、a[1]、a[2]构成。
二维数组的初始化 • 二维方法初始化 • int a[2][3] = { {8,4,1}, {5,0,3} }; • 一维方法初始化 • int a[2][3] = { 8,4,1, 5,0,3 }; • 字符串数组初始化 • char b[2][4] = { “sun”, “boy” }; • char b[2][4]={{‘s’,‘u’,‘n’,‘\0’},{‘b’,‘o’,‘y’,‘\0’}};
要求:矩阵转置 输入矩阵 int a[3][3]为 11 8 7 6 4 2 25 3 19 输出矩阵 int b[3][3]为 11 6 25 8 4 3 7 2 19 main() { int a[3][3] = { {11,8,7}, {6,4,2}, {25,3,19} }; int b[3][3], i, j; for ( i = 0; i < 3; i++ ) for ( j = 0; j < 3; j++ ) b[i][j] = a[j][i]; for ( i = 0; i < 3; i++ ) { for ( j = 0; j < 3; j++ ) printf( “%d\t”, b[i][j] ); printf( “\n” ); } } 二维数组程序举例
字符数组与字符串 • 字符数组(不一定是字符串) • char c[] = {‘C’ ,‘h’ ,‘i’ ,‘n’ ,‘a’}; • char c[] = {‘c’ ,‘h’ ,‘\0’ ,‘s’ ,‘t’ ,‘r’ ,‘\0’}; • 字符串(必定是字符数组) • 以‘\0’结尾的字符数组 • 字符串常量,字符后自动加‘\0’ • 等价性 • char c[] = “China”; • char c[] = { ‘C’ ,‘h’ ,‘i’ ,‘n’ ,‘a’ ,‘\0’};
字符指针的结果等价 char c[]=“China”; char *p = c; char *p = “China”; char *p; p = “China”; 例:用字符指针输出字符串 main() { char *p = “I am a …”; for ( ; *p!=‘\0’; p++ ) printf( “%c”, *p ); } 字符指针
字符串的输入与输出 • 字符串的输出 • 设定义 char c[] = “China”, *p = c; • printf( “%s”, c ); printf( “%s”, p ); • 在‘\0’结束符前所有字符(包括空格等)均输出 • 字符串的输入 • 设定义 char c[81], *p = c; • scanf( “%s”, c ); scanf( “%s”, p ); • 不允许:scanf( “%s”, &c ); • 输入以空格、TAB、回车为字符串结束标记
程序开头加 #include <stdio.h> puts( c ) 等价于 printf(“%s\n”,c); 输出字符串后再换行 gets( c ) 相当于 scanf(“%s”,c); 输入一行,以回车为字符串输入结束标记 例: 输入一行再输出 #include <stdio.h> main() { char a[81]; gets( a ); puts( a ); } 字符串输入输出函数
字符串程序举例 • 要求:输入一行字符串,将该行倒排输出 • 如输入:Hello Wang • 则输出:gnaW olleH • 设计思路: • 输入的行放在 char a[81];中,用gets函数 • 输出的行存在 char b[81];中,用puts函数 • 定位字符串a的最后一个字符,‘\0’符号前 • 从a的最后字符依次倒序拷贝到数组b中 • 数组b中加入‘\0’符号构成字符串
程序 定义空间 输入一行 求长度 转置 输出 #include <stdio.h> main() { char a[81], b[81]; int n,i,j; gets( a ); for (n=0;a[n]!=‘\0’;n++); for (i=n-1,j=0; i>=0; i--,j++ ) b[j] = a[i]; b[j] = ‘\0’; puts( b ); }
指针的数组 • 指针数组定义 • int *b[3], x, y, z; • b[0] = &x; b[1] = &y; b[2] = &z; • char *names[5]; • names[0] = “Wang”; • names[1] = “Li”; • 例:字符串排序 • 库函数 int strcmp(char *str1,char *str2); • 若str1>str2返回正数,相等返回0,<返回负数
指针的指针(多级指针) • 指针的指针 • 指向一个指针的指针 • int a, *p, **q; p=&a; q=&p; • 指向一个指针数组的指针 • int *b[3], x, y, z, **q; • b[0] = &x; b[1] = &y; b[2] = &z; • q = b; (或 q = &b[0]; ) • 多级指针 • int ***pp;