第11讲 数组与指针 ①感觉越来越难的原因是对前面的知识没有及时理解和掌握 看懂、听懂并不等于会用 课堂上时间有限,大家一定要及时预习和复习 复习时注意只需要把我课上讲的几个例题理解透彻并掌握即 可。 编程步骤: 分析→程序框架(粗算法)→细算法→程序→调试 另:贵班某些人的学习情况令人担忧!
第11讲 数组与指针 感觉越来越难的原因是对前面的知识没有及时理解和掌握。 看懂、听懂并不等于会用。 课堂上时间有限,大家一定要及时预习和复习。 复习时注意只需要把我课上讲的几个例题理解透彻并掌握即 可。 •编程步骤: •分析→程序框架(粗算法)→细算法→程序→调试 另:贵班某些人的学习情况令人担忧!
统计将“求一个数组所有元素 之和”写成函数,怎样 n算法: 写? n输入# include<stih *define N 30 统计 void maino 计算ntaN 输入 float sum=o, ave uts("please input %d score: 2, N); for(i=O: i< N: i++) scanf( %d &a[D sum+=a0: 输入并统计总分 ave=sum/N S4 printf"Sum=%.1f, Average=%.1f.\n", sum, ave)
2 统计总分和平均分 ▪ 算法: ▪ 输入全班学生的成绩 ▪ 统计总分 ▪ 计算平均分 ▪ 输入总分和平均分 #include #define N 30 void main() {int a[N],i; float sum=0,ave; puts(“please input %d score:”,N); for(i=0;i<N;i++) { scanf("%d",&a[i]); sum+=a[i]; }/*输入并统计总分*/ ave=sum/N; printf(" Sum=%.1f, Average=%.1f.\n", sum,ave); } •将“求一个数组所有元素 之和” 写成函数,怎样 写?
写成多函重点:数组名做函 Include 数参数 *definen 30 /函数功能:求一个长度为如中所右云素的性和 float Sum(float ad, in 调用过程? int l, void m float sum=0: int score[ni, i: for(i=0; i<n: i++)float sum=0, ave sum+=a[i]: puts("please input %d score: N) }/统计总分*/for(=0;i<N;i++) return sum scanf(%d5, score[iD) /*输入*/ sum=Sum(score, N: 函数调用,注意实参的格式*/ printf("Sum=%.1f, Average=%.1f. \n sum, sum/N);
3 写成多函数形式 #include #define N 30 /*函数功能:求一个长度为n的数组中所有元素的总和*/ float Sum(float a[], int n) {int i; float sum=0; for(i=0;i<n;i++) { sum+=a[i]; }/*统计总分*/ return sum; } void main() {int score[N],i; float sum=0,ave; puts(“please input %d score:”,N); for(i=0;i<N;i++) { scanf("%d",& score[i]); }/*输入*/ sum=Sum(score,N); /*函数调用,注意实参的格式*/ printf("Sum=%.1f, Average=%.1f.\n", sum,sum/N); } 重点:数组名做函 数参数 •调用过程?
难点:函数调用过程 实参数组 Score 6000 67 78 主函数
4 难点:函数调用过程 形参数组a sum函数 参数传递 传过来的是数组首地址 实参数组与形参数组共占内存 即两者是同一个数组 只是名称和作用域各不相同 6000 实参数组score 主函数 67 78 97 79 6000 67 78 … 79 97 实参数组score 主函数
涉及语法 数组名作函数参数 传递整个数组到另一个函数内,只是将数组 的首地址作为参数传过去 用数组名作为函数参数 只拷贝一个地址自然比拷贝全部数据效率高 由于首地址相同,故实参数组与形参数组占用同 段内存 这样,在该函数内,不仅可以读这个数组的元素, 还可以修改它们 普通变量做参数,形参另占一个存储空间,存储由实参传递过来 的数值。 数组做参数,形参另占一个存储空间,存储由实参传递过来 的地址
5 涉及语法 -数组名作函数参数 ▪ 传递整个数组到另一个函数内,只是将数组 的首地址作为参数传过去 ▪ 用数组名作为函数参数 ▪ 只拷贝一个地址自然比拷贝全部数据效率高 ▪ 由于首地址相同,故实参数组与形参数组占用同 一段内存 ▪ 这样,在该函数内,不仅可以读这个数组的元素, 还可以修改它们 ▪普通变量做参数,形参另占一个存储空间,存储由实参传递过来 的数值。 ▪ 数组做参数,形参另占一个存储空间,存储由实参传递过来 的地址
写函数,计算字符串长度 #include unsigned int My_ strlen (char an 函数功能:求一个字符串中字符个数/ unsigned int My_strlen(char aD [int i, number=o for(i=0: a[0=C. [number++ void maino return numbe char str[50]: int n uts(" please input a string"); scanf( %s"S My- strlen(s) printf"strlen(\"%s\")=yd. \n",s,n)
6 写函数,计算字符串长度 ▪ 算法: ▪ 输入字符串 ▪ 计算其中的字符个数 ▪ 从第一个字符数起,只要不到末尾,就加1 ▪ 输出 #include unsigned int My_strlen(char a[]); /*函数功能:求一个字符串中字符个数*/ unsigned int My_strlen(char a[]) {int i,number=0; for(i=0;a[i]!=0;i++) {number++; } return number; /*直接返回i(不用number)即可*/ } void main() { char str[50]; int n; puts(“please input a string”); scanf("%s",s); n=My_strlen(s); printf("strlen(\" %s\")=%d.\n",s,n); }
写函数,比较字符串大小 include int My_strew void main 函数功能: 0 int My strc [char str1 [50], str2[50] [int i; int minus fori=; a[ printf( please input two strings: 找第一个 scanf( %5%s", str1, str2); mInus= return alo if(n>o) My- strcmp(str1, str2) printf" %s>%s. \n", str1, str2) else if(n<O) printf( %5<%5. \n", str1, str2) else printf" %s=%s \n", str1, str2)
7 写函数,比较字符串大小 ▪ 算法: ▪ 输入两个字符串a,b ▪ 比较字符串a,b的大小 ▪ 从第一对字符比起,当两个对应的字符不相等 或者字符串结束时,循环结束,并计算两者之 差,否则继续比较。 ▪ 输出 z h a n g l i n g \0 \0 z h a n g y u \0 \0 \0 \0 #include int My_strcmp(char a[],char b[]); /*函数功能:比较两个字符串的大小,返回它们的差*/ int My_strcmp(char a[] ,char b[]) {int i; for(i=0; a[i]==b[i]&&(a[i]!=‘\0’||b[i] !=‘\0’);i++); /*找第一个不相等的字符*/ return a[i]-b[i]; /*返回它们的差*/ } void main() {char str1[50],str2[50]; int minus; printf(" please input two strings: "); scanf("%s%s",str1,str2); minus=My_strcmp(str1,str2); if(n>0) printf(" %s>%s.\n",str1,str2); else if(n<0) printf(" %s<%s.\n",str1,str2); else printf(" %s=%s.\n",str1,str2); }
写函数,连接两个字符串鼠 include void My_strcat(char a., char b) 函数功能:将两个字符串连接后存在a中 void My_strcat(char a[, char bD) [int i; for(=0:a[="oi+-) 陕指向a串最后一个字符的下一个位置,这句也可直接改为 i=strlen (a): */void maino for(j=0: b]l=[ a[i+j]=bLi]: char str1[100], str2 [50] /*将b串中的字itn; q[+j]=0 printf( please input two strings: ) /在a串中写入- scanf("%s%s",str1,str2) My_strcat(str1, str2) printf The result: %s \n", str1)
8 写函数,连接两个字符串 ▪ 算法: ▪ 输入两个字符串a,b ▪ 连接字符串a,b ▪ 找到第一个字符串的末尾 ▪ 将第二个字符串接入 ▪ 输出 h e l l o \0 l i \0 #include void My_strcat(char a[],char b[]); /*函数功能:将两个字符串连接后存在a中*/ void My_strcat(char a[] ,char b[]) {int i; for(i=0; a[i]!=‘\0’;i++); /*i指向a串最后一个字符的下一个位置,这句也可直接改为 i=strlen(a);*/ for(j=0; b[j] !=‘\0’;j++) a[i+j]=b[j]; /*将b串中的字符一个一个接入*/ a[i+j]=‘\0’; /*在a串中写入一个结束标记*/ } void main() { char str1[100],str2[50]; int n; printf(" please input two strings: "); scanf("%s%s",str1,str2); My_strcat(str1,str2); printf("The result:%s.\n",str1); }
调用过程 实参数组str1 HE 6000 实参数组str2 6200 主函数 更多例题请参数例6-14至6-17
9 调用过程 形参数组a My_strcat函数 参数传递 传过来的是数组首地址 实参数组与形参数组共占内存 6000 67 78 97 79 l l o h e l i …… 实参数组str1 主函数 实参数组str2 形参数组b 6200 H E L l o l i 6000 6200 实参数组str1 主函数 实参数组str2 •更多例题请参数例6-14至6-17
新的概念:指针( Pointer) 指针也是一种数据类型 种特殊的数据类型,这种类型存储的是地 址 c/c++的特色 有些复杂但很实用 指针变量与指针常量 指针变量 专门存放地址数据的变量 指针常量 !一个固定的地址,例如:数组名 10
10 新的概念:指针(Pointer) ▪ 指针也是一种数据类型 ▪ 一种特殊的数据类型,这种类型存储的是地 址 ▪ C/c++的特色 ▪ 有些复杂但很实用 ▪ 指针变量与指针常量 ▪ 指针变量 ▪ 专门存放地址数据的变量 ▪ 指针常量 ▪ 指一个固定的地址,例如:数组名