1 / 23

第四章 数组和字符串

第四章 数组和字符串. 一维数组 二维数组 字符串 指针. 数组定义注意点. 数组名为合法的 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 );

dympna
Télécharger la présentation

第四章 数组和字符串

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 数组和字符串 一维数组 二维数组 字符串 指针

  2. 数组定义注意点 • 数组名为合法的C标识符 • 下标总是从0开始 • 下标最大为(元素个数-1) • 定义int a[10]; 元素从a[0] ~ a[9], a[10]非法 • 变量 a[0] 与a0 的区别 • 一维数组有一个下标, 多维数组有多个下标

  3. 先输入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个学生的成绩平均

  4. 练习:最大值/排序 • 输入5个数, 输出这10个数最大数的位置及其数值 • 输入5个数, 按从大到小的顺序输出 • 输入5个数, 按从大到小的顺序输出这5个数, 同时输出每一个数在原始输入中的位置. • 例输入: 10 99 71 80 50 • 则输出: 99(2) 80(4) 71(3) 50(5) 10(1)

  5. 用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] ); } 最大值

  6. 选择法 输入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” ); } 排序

  7. 输入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” ); } 起泡法

  8. 程序片段 int a[10]; int *p; p = &a[2]; *p = 100; printf( “%d ”, a[2] ); a[2] += 200; printf( “%d\n”, *p ); 输出 = ? 数组与指针 a[] p

  9. 设 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

  10. 数组与指针:等价性 • 设定义 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为同一个地址(指针)

  11. 数组与指针:指针比较 • 例:输入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 ); }

  12. 二维数组 • 形式(定义) • 数据类型 数组名[第一维个数][第二维个数] • int a[3][4]; 定义整型a[0][0] ~ a[2][3] • 共12个整型,分为三行四列 • 形式(引用) • 数组名[第一维下标] [第二维下标] • a[1][2]表示第二行第三列的元素

  13. 二维数组与内存 • 设 int a[3][4]; • 先列再行排列 • 二维数组a由三个一维数组a[0]、a[1]、a[2]构成。

  14. 二维数组的初始化 • 二维方法初始化 • 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’}};

  15. 要求:矩阵转置 输入矩阵 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” ); } } 二维数组程序举例

  16. 字符数组与字符串 • 字符数组(不一定是字符串) • 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’};

  17. 字符指针的结果等价 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 ); } 字符指针

  18. 字符串的输入与输出 • 字符串的输出 • 设定义 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、回车为字符串结束标记

  19. 程序开头加 #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 ); } 字符串输入输出函数

  20. 字符串程序举例 • 要求:输入一行字符串,将该行倒排输出 • 如输入:Hello Wang • 则输出:gnaW olleH • 设计思路: • 输入的行放在 char a[81];中,用gets函数 • 输出的行存在 char b[81];中,用puts函数 • 定位字符串a的最后一个字符,‘\0’符号前 • 从a的最后字符依次倒序拷贝到数组b中 • 数组b中加入‘\0’符号构成字符串

  21. 程序 定义空间 输入一行 求长度 转置 输出 #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 ); }

  22. 指针的数组 • 指针数组定义 • 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,<返回负数

  23. 指针的指针(多级指针) • 指针的指针 • 指向一个指针的指针 • 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;

More Related