第8章 第5节:用数组名作函数参数(练习)-《C语言程序设计》(电子工业出版社)上好课

2026-06-29
| 2份
| 47页
| 32人阅读
| 0人下载

内容正文:

8.5节:用数组名作函数参数 一、单项选择题 1.以下关于数组名本质描述正确的是( ) A. 数组名是普通变量,可执行自增 arr++ B. 数组名代表数组首元素的地址常量 C. 数组名存储数组全部元素的值 D. 数组名等价于普通 int 指针变量 2.定义函数void swap(int *x,int *y),想要交换主函数变量 a、b 的值,正确调用语句是() A. swap (a,b); B. swap (&a,&b); C. swap (*a,*b); D. swap (int a,int b); 3.数组名作为函数实参传递给函数时,实际传递的内容是() A. 数组中全部元素的数值 B. 数组首元素的地址 C. 数组定义的长度数字 D. 数组所有元素的地址 4.地址传递与值传递最大区别是() A. 值传递只能传数字,地址传递只能传数组 B. 地址传递函数内修改形参会同步改变实参原始数据 C. 值传递运行速度更快 D. 地址传递会复制全部数据,占用更多内存 5.数组名作函数参数时,以下说法错误的是() A. 不会复制数组所有元素,节省内存 B. 函数内通过指针修改数组元素,主函数数组同步变化 C. 形参数组可以自动获取原始数组长度 D. 形参可写 int arr [] 或 int *arr 两种形式 6.执行以下代码段的输出结果是() #include <stdio.h> void swap(int *x,int *y){ int *t=x;x=y;y=t;} int main(){ int a=10,b=20; swap(&a,&b); printf("%d %d",a,b); } A. 20 10 B. 10 20 C. 0 0 D. 随机数字 7.执行以下代码段的输出结果是() #include <stdio.h> void show(int *p) { printf("%d",*(p+3));} int main() { int arr[]={2,4,6,8,10}; show(arr); return 0; } A. 6 B. 8 C. 10 D. 4 8.执行以下代码段的输出结果是() #include <stdio.h> void change(int x) { x=x*2;} int main() { int a=9; change(a); printf("%d",a); return 0; } A. 18 B. 9 C. 0 D. 2 9.执行以下代码段的输出结果是() #include <stdio.h> void lenCalc(char *s) { int cnt=0; while(*s!='\0') { cnt++; s++;} printf("%d",cnt); } int main() { char str[]="pear"; lenCalc(str); return 0; } A. 4 B. 5 C. 6 D. 0 10.执行以下代码段的输出结果是() #include <stdio.h> void modify(int *p) { *(p+1)=9;} int main() { int num[]={1,2,3}; modify(num); printf("%d",num[0]+num[1]+num[2]); return 0; } A. 6 B. 13 C. 12 D. 14 二、填空题。 1.普通 int 变量作为实参直接传给函数,属于________传递,函数内部修改形参不会影响主函数原始变量。 2.函数形参为int *p,主函数数组int num[6]={2,4,6,8,10,12}调用test(num),函数内执行*(p+3),取出的数字是___________。 3.定义void add(int *x){*x = *x + 7;},主函数int m=13; add(&m);,执行后 m 的数值为___________。 4.函数接收字符指针char *s="daisy",执行s += 3后,*s对应字符的 ASCII 十进制数值为___________。 5.int arr[]={1,3,5,7,9}传入函数void calc(int *p),函数执行printf("%d",*(p+1)+*(p+3));,输出数字为___________。 6.函数void add5(int *p){*p = *p + 5;},主函数int num=14; add5(&num);,执行结束后变量 num 的值为___________。 7.定义void calc(int *p){printf("%d",*(p+2)+*(p+4));},主函数数组int arr[]={2,5,1,9,3}调用 calc (arr),屏幕输出数字为___________。 8.主函数数组int data[]={6,2,8,1}传入void change(int *p){*(p+1)=10;},修改后数组全部元素累加和为___________。 9.void move(int arr[]){arr += 3; printf("%d",*arr);},主函数int num[]={9,2,5,7,4}调用 move (num),输出数字是___________。 10.主函数int m=7; void doubleNum(int x){x=x*2;}调用 doubleNum (m),执行完毕 m 的值为___________。 三、阅读程序题。 1.写出下列程序段的输出结果:________________。 #include <stdio.h> #include <stdio.h> void fun1(int x) { x = x + 8; } void fun2(int *p) { *p = *p + 8; } int main() { int a = 5, b = 5; fun1(a); fun2(&b); printf("%d", a * b); return 0; } 2.写出下列程序段的输出结果:________________。 #include <stdio.h> void calc(int *arr) { int i, sum = 0; arr += 1; for (i = 0; i < 3; i++) { if (*arr % 2 == 1) sum = sum + *arr; arr++; } printf("%d", sum); } int main() { int num[] = {2, 3, 6, 9, 1}; calc(num); return 0; } 3.写出下列程序段的输出结果:________________。 #include <stdio.h> void mul(int *arr) { int res = 1; arr++; while (*arr != 1) { res = res * (*arr); arr++; } printf("%d", res); } int main() { int num[] = {0, 2, 3, 5, 1}; mul(num); return 0; } 4.写出下列程序段的输出结果:________________。 #include <stdio.h> void edit(int *p, int len) { int i; for (i = 0; i < len; i++) { if (i % 2 == 0) *(p + i) = *(p + i) * 2; } } int main() { int arr[] = {3, 2, 4, 1}; edit(arr, 4); printf("%d", arr[0] + arr[1] + arr[2] + arr[3]); return 0; } 5.写出下列程序段的输出结果:________________。 #include <stdio.h> void countNoE(char *s) { int cnt = 0; while (*s != '\0') { if (*s != 'e') cnt++; s++; } printf("%d", cnt); } int main() { char s[] = "elephant"; countNoE(s); return 0; } 6.写出下列程序段的输出结果:________________。 #include <stdio.h> void addOne(int *p) { *(p + 1) += 1; } void mulTwo(int arr[], int n) { int i; for(i=0;i<n;i+=2) *(arr+i) *= 2; } int main() { int a[] = {2,4,6,8},sum=0,i; mulTwo(a,4); addOne(a); for(i=0;i<4;i++) sum += a[i]; printf("%d",sum); return 0; } 7.写出下列程序段的输出结果:________________。 #include <stdio.h> int getEvenDigit(char *s) { int idx=0,sum=0; while(*s) { if(idx%2==0 && *s>='0'&&*s<='9') sum += (*s-'0'); s++; idx++; } return sum; } int main() { char buf[] = "9s3k7p2"; printf("%d",getEvenDigit(buf)); return 0; } 8.写出下列程序段的输出结果:________________。 #include <stdio.h> void subOne(int *p) { *(p + 3) = *(p + 1) - *(p + 2); } void mulOdd(int arr[], int len) { int i; for(i = 0; i < len; i++) { if(i % 2 == 1) *(arr + i) = *(arr + i) * 3; } } int main() { int num[] = {5, 2, 4, 9, 1},total = 0, i; mulOdd(num, 5); subOne(num); for(i = 0; i < 5; i++) total += num[i]; printf("%d", total); return 0; } 9.写出下列程序段的输出结果:________________。 #include <stdio.h> void compress(int *p, int len) { int *write = p; int i; for(i = 0; i < len; i++) { if(*(p+i) % 3 != 0) { *write = *(p+i); write++; } } *write = 0; } int main() { int arr[6] = {3, 5, 9, 2, 12, 7},s = 0; compress(arr, 6); while(arr[s] != 0) { printf("%d", arr[s]); s++; } return 0; } 10.写出下列程序段的输出结果:________________。 #include <stdio.h> void reverseArr(int *p, int len) { int *left = p; int *right = p + len - 1; int t; while(left < right) { t = *left; *left = *right; *right = t; left++; right--; } } int main() { int data[5] = {2, 6, 1, 8, 4}; reverseArr(data, 5); printf("%d%d%d%d%d", data[0], data[1], data[2], data[3], data[4]); return 0; } 四、程序填空题(根据题意,将空缺的语句补上) 1.下列程序的功能是:自定义函数形参为int *arr,全程只用指针自增 / 偏移完成数组左移,不数组下标;每次把首指针元素暂存,全体指针向后覆盖,末尾填入暂存值;主函数传数组名(首地址)调用。 #include <stdio.h> void leftShift(int *arr, int len, int n) { int i, temp; int *p; n = n % len; for (i = 0; i < n; i++) { temp = *arr; for (p = arr; p < _______①_____; p++) { *(p) = _______②______ } *(arr + len - 1) = _____③____ } } int main() { int data[7] = {2,5,8,1,7,3,9}; int *p = data; leftShift(data,7,3); printf("平移结果:"); for(p = data; p < data + 7; p++) printf("%d ",*p); return 0; } 2.下列程序的功能是:函数形参char *src, char *letter, char *num,仅用指针自增遍历原字符串,分别向两个目标指针写入字符;再独立指针函数反转数字串,指针操作无下标。 #include <stdio.h> void splitStr(char *src, char *letter, char *num) { char *p = src, *l = letter, *n = num; while (*p != '\0') { if(__________①________) *l++ = *p; else if(*p >= '0' && *p <= '9') _______②_______ p++; } *l = '\0'; *n = '\0'; } void reverseStr(char *s) { char *end = s; char temp; while (_______③______) end++; end--; while(s < end) { temp = *s; *s = *end; *end = temp; s++; end--; } } int main() { char input[100],letter[100],num[100]; printf("输入混合字符串:"); gets(input); splitStr(input,letter,num); reverseStr(num); printf("输出:%s%s",letter,num); return 0; } 3.下列程序的功能是:函数void calcPrime(int *arr, int len, int *sum, int *cnt),数组遍历依靠指针偏移;用两个 int 指针形参修改主函数外部变量,实现多结果带回,全程指针操作。 #include <stdio.h> int isPrime(int num) { int i; if(num < 2) return 0; for(i=2;i*i<=num;i++) if(num%i==0) return 0; return 1; } void calcPrime(int *arr, int len, int *sum, int *cnt) { int *p = arr; *sum = 0; *cnt = 0; while(p < arr + len) { if(_______①______) { *sum += *p; ______②_____ } p++; } } int main() { int num[8] = {4,7,11,15,2,19,9,5}; int sum,cnt; calcPrime(num,8,&sum,&cnt); if(cnt == 0) printf("无素数"); else printf("素数均值:%.1f",______③______); return 0; } 4.下列程序的功能是:双有序数组指针归并,函数void merge(int *a, int la, int *b, int lb, int *res),指针 p1、p2 分别遍历两个源数组,比较指针指向数值,写入结果指针。 #include <stdio.h> void merge(int *a, int la, int *b, int lb, int *res) { int *p1 = a, *p2 = b, *p = res; while(p1 < a + la && ______①_____) { if(*p1 < *p2) *p++ = *p1++; else _______②______ } while(p1 < a + la) *p++ = *p1++; while(________③_______) *p++ = *p2++; } int main() { int arr1[4] = {1,3,5,9}; int arr2[5] = {2,4,7,8,10}; int out[20]; int *p = out; merge(arr1,4,arr2,5,out); printf("合并有序数组:"); for(p = out; p < out + 9; p++) printf("%d ",*p); return 0; } 5.下列程序的功能是:字符指针遍历,统计连续元音最大长度,函数int maxVowel(char *s),单一指针遍历字符串,解引用判断元音字符,用局部变量记录连续长度。 #include <stdio.h> int maxVowel(char *s) { char *p = s; int cur = 0, maxLen = 0; while(*p != '\0') { if(___________①_________) { cur++; if(cur > maxLen) _______②______ } else cur = 0; _______③_______ } return maxLen; } int main() { char str[] = "aaabeeeiixopuuuu"; printf("最长连续元音:%d",maxVowel(str)); return 0; } 五、编程题。 1. 读写双 int 指针原地过滤数组偶数,仅保留奇数:函数void filterOdd(int *arr, int len),读指针遍历全部元素,写指针仅保存奇数,末尾指针写入标记值。 2.指针提取数字字符,双指针判断数字串是否回文:拆分两个指针函数:1. 指针遍历提取数字存入临时数组;2. 首尾指针判断回文,全部形参为 char * 指针。 3.指针筛选数组完全数存入新数组,编写要求如下: ①子函数用循环判断数字是否为完全数; ②主函数接收源数组指针、长度、目标数组指针,双指针遍历源数组,把完全数写入目标数组,末尾标记 - 1; ③主函数传内置数组调用,指针遍历输出所有完全数,全程不用下标[]。 4.字符指针统计四类字符数量,指针带回计数,编写要求如下: ①函数接收字符串指针与 4 个 int 指针,指针遍历字符串,区分大写、小写、数字、符号四类字符计数; ②主函数传入混合字符数组,打印四类统计结果,仅用指针读写字符。 5.双指针对撞,反转数组指定区间元素,编写要求如下: ①函数接收数组指针、反转起止下标,左右指针定位区间首尾; ②双指针向内靠拢交换元素,左 >= 右结束; ③主函数调用后指针遍历打印完整数组,全程无下标。 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $ 8.5节:用数组名作函数参数 一、单项选择题 1.以下关于数组名本质描述正确的是( ) A. 数组名是普通变量,可执行自增 arr++ B. 数组名代表数组首元素的地址常量 C. 数组名存储数组全部元素的值 D. 数组名等价于普通 int 指针变量 【答案】B 【解析】数组名是首元素地址常量,地址不可修改,不能做 arr++、arr=xxx 操作。 2.定义函数void swap(int *x,int *y),想要交换主函数变量 a、b 的值,正确调用语句是( ) A. swap (a,b); B. swap (&a,&b); C. swap (*a,*b); D. swap (int a,int b); 【答案】B 【解析】形参是 int 指针,实参必须传入变量地址,&a、&b 取出变量内存地址传给指针形参。 3.数组名作为函数实参传递给函数时,实际传递的内容是( ) A. 数组中全部元素的数值 B. 数组首元素的地址 C. 数组定义的长度数字 D. 数组所有元素的地址 【答案】B 【解析】数组名传参属于地址传递,仅把数组首地址传给形参,不会复制整个数组。 4.地址传递与值传递最大区别是( ) A. 值传递只能传数字,地址传递只能传数组 B. 地址传递函数内修改形参会同步改变实参原始数据 C. 值传递运行速度更快 D. 地址传递会复制全部数据,占用更多内存 【答案】B 【解析】地址传递共享同一块内存空间,函数内通过指针修改内容,主函数实参同步变化;值传递是副本互不影响。 5.数组名作函数参数时,以下说法错误的是( ) A. 不会复制数组所有元素,节省内存 B. 函数内通过指针修改数组元素,主函数数组同步变化 C. 形参数组可以自动获取原始数组长度 D. 形参可写 int arr [] 或 int *arr 两种形式 【答案】C 【解析】形参只是指针,丢失原数组长度信息,无法直接获取原始数组大小,需要额外传长度参数。 6.执行以下代码段的输出结果是( ) #include <stdio.h> void swap(int *x,int *y){ int *t=x;x=y;y=t;} int main(){ int a=10,b=20; swap(&a,&b); printf("%d %d",a,b); } A. 20 10 B. 10 20 C. 0 0 D. 随机数字 【答案】B 【解析】仅交换指针副本 x、y,没有操作a、b 对应的内存空间,原始数值保持不变。 7.执行以下代码段的输出结果是( ) #include <stdio.h> void show(int *p) { printf("%d",*(p+3));} int main() { int arr[]={2,4,6,8,10}; show(arr); return 0; } A. 6 B. 8 C. 10 D. 4 【答案】B 【解析】数组首地址传给指针 p,p+3 偏移 3 个 int 单位,对应下标 3 元素 8。 8.执行以下代码段的输出结果是( ) #include <stdio.h> void change(int x) { x=x*2;} int main() { int a=9; change(a); printf("%d",a); return 0; } A. 18 B. 9 C. 0 D. 2 【答案】B 【解析】普通变量值传递,函数内修改的是副本 x,主函数 a 数值不变,仍为 9。 9.执行以下代码段的输出结果是( ) #include <stdio.h> void lenCalc(char *s) { int cnt=0; while(*s!='\0') { cnt++; s++;} printf("%d",cnt); } int main() { char str[]="pear"; lenCalc(str); return 0; } A. 4 B. 5 C. 6 D. 0 【答案】A 【解析】pear 包含 4 个有效字母,结束符不计入计数,cnt 最终等于 4。 10.执行以下代码段的输出结果是( ) #include <stdio.h> void modify(int *p) { *(p+1)=9;} int main() { int num[]={1,2,3}; modify(num); printf("%d",num[0]+num[1]+num[2]); return 0; } A. 6 B. 13 C. 12 D. 14 【答案】B 【解析】函数修改下标 1 元素为 9,数组变为 {1,9,3},1+9+3=13。 二、填空题。 1.普通 int 变量作为实参直接传给函数,属于________传递,函数内部修改形参不会影响主函数原始变量。 【答案】值 【解析】值传递开辟独立内存副本,副本修改不作用于实参。 2.函数形参为int *p,主函数数组int num[6]={2,4,6,8,10,12}调用test(num),函数内执行*(p+3),取出的数字是___________。 【答案】8 【解析】p 指向下标 0,p+3 偏移 3 位,对应数组下标 3 元素 8。 3.定义void add(int *x){*x = *x + 7;},主函数int m=13; add(&m);,执行后 m 的数值为___________。 【答案】20 【解析】*x 修改 m 原值,13+7=20。 4.函数接收字符指针char *s="daisy",执行s += 3后,*s对应字符的 ASCII 十进制数值为___________。 【答案】115 【解析】d (0),a (1),i (2),s (3),字符 s 的 ASCII 码为 115。 5.int arr[]={1,3,5,7,9}传入函数void calc(int *p),函数执行printf("%d",*(p+1)+*(p+3));,输出数字为___________。 【答案】10 【解析】(p+1)=3,(p+3)=7,3+7=10。 6.函数void add5(int *p){*p = *p + 5;},主函数int num=14; add5(&num);,执行结束后变量 num 的值为___________。 【答案】19 【解析】地址传递直接修改原变量,14+5=19。 7.定义void calc(int *p){printf("%d",*(p+2)+*(p+4));},主函数数组int arr[]={2,5,1,9,3}调用 calc (arr),屏幕输出数字为___________。 【答案】4 【解析】(p+2)=1,(p+4)=3,1+3=4。 8.主函数数组int data[]={6,2,8,1}传入void change(int *p){*(p+1)=10;},修改后数组全部元素累加和为___________。 【答案】25 【解析】修改后数组 {6,10,8,1},6+10+8+1=25。 9.void move(int arr[]){arr += 3; printf("%d",*arr);},主函数int num[]={9,2,5,7,4}调用 move (num),输出数字是___________。 【答案】7 【解析】形参 arr 是指针变量,向后偏移 3 位,指向下标 3 元素 7。 10.主函数int m=7; void doubleNum(int x){x=x*2;}调用 doubleNum (m),执行完毕 m 的值为___________。 【答案】7 【解析】值传递仅修改形参副本,原变量 m 保持原值不变。 三、阅读程序题。 1.写出下列程序段的输出结果:________________。 #include <stdio.h> #include <stdio.h> void fun1(int x) { x = x + 8; } void fun2(int *p) { *p = *p + 8; } int main() { int a = 5, b = 5; fun1(a); fun2(&b); printf("%d", a * b); return 0; } 【答案】65 2.写出下列程序段的输出结果:________________。 #include <stdio.h> void calc(int *arr) { int i, sum = 0; arr += 1; for (i = 0; i < 3; i++) { if (*arr % 2 == 1) sum = sum + *arr; arr++; } printf("%d", sum); } int main() { int num[] = {2, 3, 6, 9, 1}; calc(num); return 0; } 【答案】12 3.写出下列程序段的输出结果:________________。 #include <stdio.h> void mul(int *arr) { int res = 1; arr++; while (*arr != 1) { res = res * (*arr); arr++; } printf("%d", res); } int main() { int num[] = {0, 2, 3, 5, 1}; mul(num); return 0; } 【答案】30 4.写出下列程序段的输出结果:________________。 #include <stdio.h> void edit(int *p, int len) { int i; for (i = 0; i < len; i++) { if (i % 2 == 0) *(p + i) = *(p + i) * 2; } } int main() { int arr[] = {3, 2, 4, 1}; edit(arr, 4); printf("%d", arr[0] + arr[1] + arr[2] + arr[3]); return 0; } 【答案】17 5.写出下列程序段的输出结果:________________。 #include <stdio.h> void countNoE(char *s) { int cnt = 0; while (*s != '\0') { if (*s != 'e') cnt++; s++; } printf("%d", cnt); } int main() { char s[] = "elephant"; countNoE(s); return 0; } 【答案】6 6.写出下列程序段的输出结果:________________。 #include <stdio.h> void addOne(int *p) { *(p + 1) += 1; } void mulTwo(int arr[], int n) { int i; for(i=0;i<n;i+=2) *(arr+i) *= 2; } int main() { int a[] = {2,4,6,8},sum=0,i; mulTwo(a,4); addOne(a); for(i=0;i<4;i++) sum += a[i]; printf("%d",sum); return 0; } 【答案】29 7.写出下列程序段的输出结果:________________。 #include <stdio.h> int getEvenDigit(char *s) { int idx=0,sum=0; while(*s) { if(idx%2==0 && *s>='0'&&*s<='9') sum += (*s-'0'); s++; idx++; } return sum; } int main() { char buf[] = "9s3k7p2"; printf("%d",getEvenDigit(buf)); return 0; } 【答案】21 8.写出下列程序段的输出结果:________________。 #include <stdio.h> void subOne(int *p) { *(p + 3) = *(p + 1) - *(p + 2); } void mulOdd(int arr[], int len) { int i; for(i = 0; i < len; i++) { if(i % 2 == 1) *(arr + i) = *(arr + i) * 3; } } int main() { int num[] = {5, 2, 4, 9, 1},total = 0, i; mulOdd(num, 5); subOne(num); for(i = 0; i < 5; i++) total += num[i]; printf("%d", total); return 0; } 【答案】18 9.写出下列程序段的输出结果:________________。 #include <stdio.h> void compress(int *p, int len) { int *write = p; int i; for(i = 0; i < len; i++) { if(*(p+i) % 3 != 0) { *write = *(p+i); write++; } } *write = 0; } int main() { int arr[6] = {3, 5, 9, 2, 12, 7},s = 0; compress(arr, 6); while(arr[s] != 0) { printf("%d", arr[s]); s++; } return 0; } 【答案】527 10.写出下列程序段的输出结果:________________。 #include <stdio.h> void reverseArr(int *p, int len) { int *left = p; int *right = p + len - 1; int t; while(left < right) { t = *left; *left = *right; *right = t; left++; right--; } } int main() { int data[5] = {2, 6, 1, 8, 4}; reverseArr(data, 5); printf("%d%d%d%d%d", data[0], data[1], data[2], data[3], data[4]); return 0; } 【答案】48162 四、程序填空题(根据题意,将空缺的语句补上) 1.下列程序的功能是:自定义函数形参为int *arr,全程只用指针自增 / 偏移完成数组左移,不数组下标;每次把首指针元素暂存,全体指针向后覆盖,末尾填入暂存值;主函数传数组名(首地址)调用。 #include <stdio.h> void leftShift(int *arr, int len, int n) { int i, temp; int *p; n = n % len; for (i = 0; i < n; i++) { temp = *arr; for (p = arr; p < _______①_____; p++) { *(p) = _______②______ } *(arr + len - 1) = _____③____ } } int main() { int data[7] = {2,5,8,1,7,3,9}; int *p = data; leftShift(data,7,3); printf("平移结果:"); for(p = data; p < data + 7; p++) printf("%d ",*p); return 0; } 【答案】①arr + len - 1 ②*(p + 1); ③temp; 2.下列程序的功能是:函数形参char *src, char *letter, char *num,仅用指针自增遍历原字符串,分别向两个目标指针写入字符;再独立指针函数反转数字串,指针操作无下标。 #include <stdio.h> void splitStr(char *src, char *letter, char *num) { char *p = src, *l = letter, *n = num; while (*p != '\0') { if(__________①________) *l++ = *p; else if(*p >= '0' && *p <= '9') _______②_______ p++; } *l = '\0'; *n = '\0'; } void reverseStr(char *s) { char *end = s; char temp; while (_______③______) end++; end--; while(s < end) { temp = *s; *s = *end; *end = temp; s++; end--; } } int main() { char input[100],letter[100],num[100]; printf("输入混合字符串:"); gets(input); splitStr(input,letter,num); reverseStr(num); printf("输出:%s%s",letter,num); return 0; } 【答案】①(*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z') ②*n++ = *p; ③*end != '\0' 3.下列程序的功能是:函数void calcPrime(int *arr, int len, int *sum, int *cnt),数组遍历依靠指针偏移;用两个 int 指针形参修改主函数外部变量,实现多结果带回,全程指针操作。 #include <stdio.h> int isPrime(int num) { int i; if(num < 2) return 0; for(i=2;i*i<=num;i++) if(num%i==0) return 0; return 1; } void calcPrime(int *arr, int len, int *sum, int *cnt) { int *p = arr; *sum = 0; *cnt = 0; while(p < arr + len) { if(_______①______) { *sum += *p; ______②_____ } p++; } } int main() { int num[8] = {4,7,11,15,2,19,9,5}; int sum,cnt; calcPrime(num,8,&sum,&cnt); if(cnt == 0) printf("无素数"); else printf("素数均值:%.1f",______③______); return 0; } 【答案】①isPrime(*p) ②(*cnt)++; ③(double)sum/cnt 4.下列程序的功能是:双有序数组指针归并,函数void merge(int *a, int la, int *b, int lb, int *res),指针 p1、p2 分别遍历两个源数组,比较指针指向数值,写入结果指针。 #include <stdio.h> void merge(int *a, int la, int *b, int lb, int *res) { int *p1 = a, *p2 = b, *p = res; while(p1 < a + la && ______①_____) { if(*p1 < *p2) *p++ = *p1++; else _______②______ } while(p1 < a + la) *p++ = *p1++; while(________③_______) *p++ = *p2++; } int main() { int arr1[4] = {1,3,5,9}; int arr2[5] = {2,4,7,8,10}; int out[20]; int *p = out; merge(arr1,4,arr2,5,out); printf("合并有序数组:"); for(p = out; p < out + 9; p++) printf("%d ",*p); return 0; } 【答案】①p2 < b + lb ②*p++ = *p2++; ③p2 < b + lb 5.下列程序的功能是:字符指针遍历,统计连续元音最大长度,函数int maxVowel(char *s),单一指针遍历字符串,解引用判断元音字符,用局部变量记录连续长度。 #include <stdio.h> int maxVowel(char *s) { char *p = s; int cur = 0, maxLen = 0; while(*p != '\0') { if(___________①_________) { cur++; if(cur > maxLen) _______②______ } else cur = 0; _______③_______ } return maxLen; } int main() { char str[] = "aaabeeeiixopuuuu"; printf("最长连续元音:%d",maxVowel(str)); return 0; } 【答案】①*p=='a'||*p=='e'||*p=='i'||*p=='o'||*p=='u' ②maxLen = cur; ③p++; 五、编程题。 1. 读写双 int 指针原地过滤数组偶数,仅保留奇数:函数void filterOdd(int *arr, int len),读指针遍历全部元素,写指针仅保存奇数,末尾指针写入标记值。 【参考代码】 #include <stdio.h> void filterOdd(int *arr, int len) { int *read = arr, *write = arr; while(read < arr + len) { if(*read % 2 != 0) { *write = *read; write++; } read++; } *write = -1; } int main() { int num[9] = {3,6,9,2,7,10,1,15,4}; int *p = num; filterOdd(num,9); printf("过滤偶数:"); while(*p != -1) { printf("%d ",*p); p++; } return 0; } 2.指针提取数字字符,双指针判断数字串是否回文:拆分两个指针函数:1. 指针遍历提取数字存入临时数组;2. 首尾指针判断回文,全部形参为 char * 指针。 【参考代码】 #include <stdio.h> int getDigit(char *src, char *digit) { char *p = src, *d = digit; while(*p != '\0') { if(*p >= '0' && *p <= '9') *d++ = *p; p++; } *d = '\0'; return d - digit; } int isPalindrome(char *s) { char *left = s; char *right = s; while(*right != '\0') right++; right--; while(left < right) { if(*left != *right) return 0; left++; right--; } return 1; } int main() { char input[100],dig[100]; int len; printf("输入混合字符串:"); gets(input); len = getDigit(input,dig); if(len == 0) printf("无数字"); else if(isPalindrome(dig)) printf("数字是回文"); else printf("数字非回文"); return 0; } 3.指针筛选数组完全数存入新数组,编写要求如下: ①子函数用循环判断数字是否为完全数; ②主函数接收源数组指针、长度、目标数组指针,双指针遍历源数组,把完全数写入目标数组,末尾标记 - 1; ③主函数传内置数组调用,指针遍历输出所有完全数,全程不用下标[]。 【参考代码】 #include <stdio.h> int isPerfect(int num) { int i, sum = 0; if(num < 2) return 0; for(i = 1; i < num; i++) if(num % i == 0) sum += i; return sum == num ? 1 : 0; } void pickPerfect(int *src, int len, int *dest) { int *read = src, *write = dest; while(read < src + len) { if(isPerfect(*read)) *write++ = *read; read++; } *write = -1; } int main() { int source[10] = {6, 12, 28, 9, 15, 496, 33, 8, 1, 20}; int res[100], *p; pickPerfect(source, 10, res); printf("完全数:"); for(p = res; *p != -1; p++) printf("%d ", *p); return 0; } 4.字符指针统计四类字符数量,指针带回计数,编写要求如下: ①函数接收字符串指针与 4 个 int 指针,指针遍历字符串,区分大写、小写、数字、符号四类字符计数; ②主函数传入混合字符数组,打印四类统计结果,仅用指针读写字符。 【参考代码】 #include <stdio.h> void statAllChar(char *str, int *cntUp, int *cntLow, int *cntNum, int *cntSym) { char *p = str; *cntUp = *cntLow = *cntNum = *cntSym = 0; while(*p != '\0') { if(*p >= 'A' && *p <= 'Z') (*cntUp)++; else if(*p >= 'a' && *p <= 'z') (*cntLow)++; else if(*p >= '0' && *p <= '9') (*cntNum)++; else (*cntSym)++; p++; } } int main() { char buf[] = "Pro#GrAm78!s9t@r"; int upper, lower, number, symbol; statAllChar(buf, &upper, &lower, &number, &symbol); printf("大写:%d 小写:%d 数字:%d 符号:%d", upper, lower, number, symbol); return 0; } 5.双指针对撞,反转数组指定区间元素,编写要求如下: ①函数接收数组指针、反转起止下标,左右指针定位区间首尾; ②双指针向内靠拢交换元素,左 >= 右结束; ③主函数调用后指针遍历打印完整数组,全程无下标。 【参考代码】 #include <stdio.h> void reversePart(int *arr, int start, int end) { int *left = arr + start, *right = arr + end, temp; while(left < right) { temp = *left; *left = *right; *right = temp; left++; right--; } } int main() { int data[8] = {1, 3, 5, 7, 9, 11, 13, 15}, *p; reversePart(data, 2, 6); printf("分段反转数组:"); for(p = data; p < data + 8; p++) printf("%d ", *p); return 0; } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

第8章 第5节:用数组名作函数参数(练习)-《C语言程序设计》(电子工业出版社)上好课
1
第8章 第5节:用数组名作函数参数(练习)-《C语言程序设计》(电子工业出版社)上好课
2
第8章 第5节:用数组名作函数参数(练习)-《C语言程序设计》(电子工业出版社)上好课
3
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。