第 14讲二维数组二维数组做函数参数
2
练习
删除字符串中的某一字符 x。
void Delete(char a[],char x)
{
判断 a串中每一个字符是不是 x,
是的话删除。
}
int i;
for(i=0;a[i]!=?\0?;i++)
{if(a[i]==x)
删除 a[i](从 a[i]开始的每一个字符向前挪动一个位置 );
}
{for(j=i; a[j]!=?\0?;j++)
{a[j]= a[j+1];
}
i--;
}
为什么?
因为当前的字符已经是后边挪过来的,所以要再判断一下 a[i]是不是 x
3
练习答案
#include <stdio.h>
void main()
{ int i,l;
char a[20],ch;
printf("Input a string,");
gets(a);
getchar();
printf("Input a character to delete,");
ch=getchar();
Delete(a,ch);
printf(“after deleting:%s\n”,a);
}
为什么?
吸收掉前一次输入后的结束符
,回车,。
4
或者
/*函数功能:删除从 地址 a开始的字符串 中的某一字符 x */
void Delete(char *a,char x)
{
int i;
for(i=0;*(a+i)!=?\0?;i++)
{if(*(a+i)==x) /*找到 x,删除 */
{for(j=i; *(a+j)!=?\0?;j++)
{*(a+j) = *(a+j+1);
}
i--;
}
}
}
#include <stdio.h>
void main()
{ int i,l;
char a[20],ch,*p=a;
printf("Input a string,");
gets(a);
getchar();
printf("Input a character to delete,");
ch=getchar();
Delete(p,ch);
printf(“after deleting:%s\n”,a);
}
5
再或者
/*函数功能:将从 地址 a开始的字符串 中除了字符 x以外,全部写到 b数组中 */
void Delete(char *a,char x,char *b)
{
int i,j;
for(i=0,j=0;*(a+i)!=?\0?;i++)
{ /*只要不是 x,就复制过去 */
if(*(a+i)!=x)
{
*(b+j)=*(a+i);
j++;/*复制一个字符,下标加一次 */
}
}
*(b+j)=?\0?; /*末尾加上 \0*/
}
#include <stdio.h>
void main()
{ int i,l;
char a[20],b[20],ch,*p=a;
printf("Input a string,");
gets(a);
getchar();
printf("Input a character to delete,");
ch=getchar();
Delete(p,ch,b);
printf(“after deleting:%s\n”,b);
}
6
读程序,函数功能?
void SQUEEZE(char *s,char x)
{ int i,j;
for(i=0,j=0; *(s+i)!='\0'; i++)
{ if(*(s+i)!=x)
{
*(s+j) = *(s+i);
j++;
}
}
*(s+j) =?\0?;
}
答:在指针 s指向的字符串中删除某一字符 ch。
分析:将删除 ch后的数组仍然写在原数组中。
7
例 6-29:求矩阵 a的转置 a?
a= 1 2 3 a?= 1 4
4 5 6 2 5
3 6
算法:
定义变量存储矩阵的元素
输入矩阵 a中所有元素
求矩阵 a的转置 a?
输出矩阵 a?
8
1、定义变量
/*定义一个数组用于存储 2行 3列的矩阵 */
int a[2][3];
语法,数据类型 数组名 [行数 ][列数 ]
a为 2× 3( 2行 3列)的数组,注意 下标范围
a[0]----
a[1]----
a
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
行列
9
二维数组的内存分配:
按行存放(先行后列)
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
a[0]
a[1]
a合法的初始化形式:int a[2][3]={{1,2,3},{5,6,7}}
int a[2][3]={1,2,3,5,6,7}
int a[2][3]={{1},{5}}
int a[ ][3]={1,2,3,5,6,7}
int a[ ][3]={{1},{5}}
/*列长度是必须指定出来的,
为什么? */
10
输入数组元素
/*要输入每一个 a[i][j]*/
for (i=0;i<2;i++) /*行下标从 0到 1*/
for(j=0;j<3;j++) /*列下标从 0到 2 */
scanf(“%d”,&a[i][j]);
11
求 a?
1,/*在求 a?之间,也同样要定义一个二维数组用于存储 a?,如何定义? */
int trans_a[3][2]; /*3行 2列 */
2,/*求 a?,即 trans_a[i][j] = a[j][i]*/
for (i=0; i<3; i++) /*行下标从 0到 2*/
{ for(j=0; j<2; j++) /*列下标从 0到 1 */
{ trans_a[i][j] = a[j][i];
}
}
12
输出 a?
/*要输出每一个 trans_a[i][j]*/
for (i=0;i<3;i++) /*行下标从 0到 2*/
for(j=0;j<2;j++) /*列下标从 0到 1 */
printf(“%3d”,&trans_a[i][j]);
输出结果? /*按矩阵格式输出 */
for (i=0;i<3;i++)
{ for(j=0;j<2;j++)
printf(“%d”,&trans_a[i][j]);
putchar(?\n?);
}
13
#include<stdio.h>
#define M 2
#define N 3
void main()
{int a[M][N],trans_a[N][M],i,j; /*数组定义 */
for (i=0;i<M;i++) /*输入数组元素 */
for(j=0;j<N;j++)
scanf(“%d”,&a[i][j]);
for (i=0; i<N; i++) /*计算转置 */
{ for(j=0; j<M; j++)
{ trans_a[i][j] = a[j][i];
}
}
for (i=0;i<N;i++) /*输出转置结果 */
{ for(j=0;j<M;j++)
printf(“%d”,trans_a[i][j]);
putchar(?\n?);
}
完整程序
14
将求 a?写成函数
void Trans_matrix(int a[M][N],int
trans_a[N][M])
{int i,j;
for (i=0; i<N; i++)
{ for(j=0; j<M; j++)
{ trans_a[i][j] = a[j][i];
}
}
}
为什么给参数
trans_a[M][N]?
不仅需要矩阵 a,
还需要一个空矩阵用于存储转置结果。
#include<stdio.h>
#define M 2
#define N 3
void Trans_matrix(int a[M][N],int trans_a[N][M])
void main()
{int a[M][N],trans_a[N][M],i,j; /*数组定义 */
for (i=0;i<M;i++) /*输入数组元素 */
for(j=0;j<N;j++)
scanf(“%d”,&a[i][j]);
Trans_matrix(a,trans_a);
/*调用函数计算转置,结果就保存在 trans_a里 */
for (i=0;i<N;i++) /*输出转置结果 */
{ for(j=0;j<M;j++)
printf(“%d”,trans_a[i][j]);
putchar(?\n?);
}
15
例 6- 31求最小字符串
s t u d e n t \0 …
T e a c h e r \0 …
b l a c k b o a r d \0 …
c l a s s r o o m \0 …
16
#include <stdio.h>
#include <string.h>
#define ARRA_SIZE 80
main()
{ int i,num;
char str[ARRA_SIZE],min[ARRA_SIZE];
printf("Please enter five names:\n");
gets(str);
strcpy(min,str);
for (i=1; i<5; i++)
{ gets(str);
if (strcmp(str,min) < 0)
{ strcpy(min,str);
}
}
printf("The min is:");
puts(min);
}
用一维数组
17
#include <stdio.h>
#include <string.h>
#define ARRA_SIZE 80
main()
{ int i;
char str [5][ARRA_SIZE],min[ARRA_SIZE];
for (i=0;i<5;i++)
{ printf("Please enter next name:\n");
gets(str[i]);
}
strcpy(min,str[0]);
for (n=1; n<5; n++)
{ if (strcmp(str[i],min) < 0)
{ strcpy(min,str[i]);
}
}
printf("The min is:");
puts(min);
}
用二维数组
18

1,编程实现 n行杨辉三角的计算
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1



1...2]][1[]1][1[]][[
1...01]0][[
1...01]][[
nijiajiajia
niia
niiia
19
计算 n行的杨辉三角
/*函数功能,计算 n行的 杨辉三角形,并存入数组 a中 */
void YHTriangle(int a[][ARR_SIZE],int n)
{ int i,j ;
/*置第一列和对角线为 1*/
for (i=0; i<n; i++)
{ a[i][1] = 1;
a[i][i] = 1;
}
/*计算其它矩阵元素 */
for (i=2; i<n; i++)
{ for (j=1; j<=i-1; j++)
{ a[i][j] = a[i-1][j-1] + a[i-1][j];
}
}
}
注意 2,要分情况求解,因为下标的变化范围不同。
注意 1,二维数组做参数时,列长度必须指定
20
输出 n行的杨辉三角
/* 函数功能,输出 n行的杨辉三角形 */
void PrintYHTriangle(int a[][ARR_SIZE],int n)
{ int i,j ;
for (i=1; i<n; i++)
{ for (j=1; j<=i; j++) /*只输出左下部分 */
{
printf("%4d",a[i][j]);
}
printf("\n");
}
}
注意 3,输出下三角矩阵
21
主函数
#include<stdio.h>
#define ARR_SIZE 11
void YHTriangle(int a[][ARR_SIZE],int n);
void PrintYHTriangle(int a[][ARR_SIZE],int n);
main()
{ int a[ARR_SIZE][ARR_SIZE],n;
printf("input n (n<=10):");
scanf("%d",&n); /*根据要求输入杨辉三角形的行数 */
YHTriangle(a,n); /*调用函数求 n行的杨辉三角,存入 a*/
PrintYHTriangle(a,n); /*调用函数输出 n行的杨辉三角 a*/
}
注意 4,调用时只给数组名注意 5,定义时必须指明行、
列长度,而且必须是常量
22
小结
复习指针
二维数组
二维数组的定义、内存分配
二维数组元素的引用
二维数组做函数参数
下节课继续讲二维数组与指针
(第八章),请提前预习
23
作业 1
自学 P204页例 6.5.4问题的实现,学习
,插入一个数到有序数组,。
24
作业 2:班级成绩管理高数英语
C
语言
001 78 87 95
002 98 69 98

030 86 73 96
编写函数统计 每门课 的总分和平均分编写函数排名 第一 的同学的 总分 是多少?
i
j
学号课程 编写函数统计 每个学生的总分和平均分