第8章 第6、7节:C语言趣味程序实例8、项目开发实例(练习)-《C语言程序设计》(电子工业出版社)上好课

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

内容正文:

8.6与8.7节:C语言趣味程序实例8、项目开发实例 一、单项选择题 1.已知int m=18; int *p=&m;,执行*p = *p / 3;,下面说法正确的是( ) A. p 中存储的值变为 6 B. 变量 m 的值变为 6 C. p 的内存地址发生改变 D. 代码存在语法错误 2.设有语句:char str[]="maple"; char *s=str; 执行s+=2; putchar(*s); 屏幕输出字符是() A. m B. a C. p D. l 3.设有以下代码片段,则程序的输出结果是() void func(int x){x=x+10;} int main(){int a=7; func(a); printf("%d",a);} A. 17 B. 7 C. 10 D. 随机值 4.设有语句:int arr[5]={3,6,9,12,15}; int *p=arr; 表达式*(p+1)+*(p+3)运算结果是() A. 15 B. 18 C. 21 D. 24 5.设有以下代码片段,则程序的输出结果是() void change(int *p){*p = *p - 4;} int main(){int x=15; change(&x); printf("%d",x/2);} A. 5 B. 6 C. 7 D. 11 6.设有语句:char buf[]="peach"; char *p=buf+3; *p 对应的字符 ASCII 码为() A. 99 B. 101 C. 104 D. 112 7.设有语句:int data[4]={2,5,7,1}; int *p=data; p++; printf("%d",*p+*(p+2)); 输出数字() A. 6 B. 8 C. 12 D. 14 8.设有以下代码片段,则程序的输出结果是() void f1(int a){a*=2;} void f2(int *b){*b*=2;} int main(){int x=4,y=4; f1(x); f2(&y); printf("%d",x+y);} A. 8 B. 12 C. 16 D. 24 9.设有语句:char str[]="x5g7k2"; char *p=str; int sum=0; while(*p){if(*p>='0'&&*p<='9') sum+=(*p-'0'); p++;} sum 最终值() A. 12 B. 14 C. 16 D. 18 10.设有语句:int arr[]={1,4,3,9,2}; int *p=arr; p+=2; printf("%d",*p - *(p-2)); 输出数值() A. 1 B. 2 C. 3 D. 5 二、填空题。 1.执行 int x=32; int *pt=&x; *pt -= 7; 后变量 x 最终数值为___________。 2.设有语句:int num[7]={11,13,15,17,19,21,23}; int *p=num+3; 表达式*p的数值是___________。 3.设有语句:char buf[]="orbit"; char *ptr=buf; ptr+=4; putchar(*ptr); 屏幕打印字符是___________。 4.遍历字符串的循环 while(*s) 能够正常终止,是因为字符串末尾存在结束字符___________。 5.设有语句:int data[5]={6,1,8,4,10}; int *p=data; p++; int res=*(p)+*(p+2); res 计算结果为___________。 三、阅读程序题。 1.写出下列程序段的输出结果:________________。 #include <stdio.h> void splitCalc(int num, int *oddSum, int *evenSum) { int temp = num; *oddSum = 0; *evenSum = 0; while(temp > 0) { int digit = temp % 10; if(digit % 2 == 1) *oddSum += digit; else *evenSum += digit; temp /= 10; } } void doubleNum(int x) { x *= 2; } int main() { int val = 469; int os, es; splitCalc(val, &os, &es); doubleNum(val); printf("%d", (es - os) * val); return 0; } 2.写出下列程序段的输出结果:________________。 #include <stdio.h> void pickRange(int *arr, int left, int right, int *resArr) { int *p = arr + left; int *write = resArr; while(p <= arr + right) { if(*p % 3 != 0) *write++ = *p; p++; } *write = -1; } int main() { int data[10] = {11, 6, 14, 18, 7, 21, 5, 12, 9, 16}; int out[20], sum = 0, *pt; pickRange(data, 2, 7, out); for(pt = out; *pt != -1; pt++) sum += *pt; printf("%d", sum); return 0; } 3.写出下列程序段的输出结果:________________。 #include <stdio.h> int countBackUpper(char *s) { int len = 0, cnt = 0; char *p = s; while(*p != '\0') { len++; p++; } p = s + len / 2; while(*p != '\0') { if(*p >= 'A' && *p <= 'Z') cnt++; p++; } return cnt; } int main() { char str[] = "k9RtM7sBqL2zX"; printf("%d", countBackUpper(str)); return 0; } 4.写出下列程序段的输出结果:________________。 #include <stdio.h> int mulDigitOnly(char *s) { char *p = s; int mul = 1; while(*p != '\0') { if(*p >= '0' && *p <= '9') mul *= (*p - '0'); p++; } return mul; } int main() { char buf[] = "D3h7F2m9"; printf("%d", mulDigitOnly(buf)); return 0; } 5.写出下列程序段的输出结果:________________。 #include <stdio.h> void addFiveOdd(int *arr, int len) { int *p = arr; int idx = 0; while(p < arr + len) { if(idx % 2 == 1) *p += 5; p++; idx++; } } int main() { int num[6] = {3, 8, 1, 10, 4, 6}; int sum = 0, *pt = num; addFiveOdd(num, 6); while(pt < num + 6) { sum += *pt; pt++; } printf("%.1f", (double)sum / 6); return 0; } 6.写出下列程序段的输出结果:________________。 #include <stdio.h> int findFirstOver(int *arr, int start, int limit) { int *p = arr + start; int idx = start; while(*p != '\0' + 0) { if(*p > limit) return idx; p++; idx++; } return -1; } int main() { int data[9] = {12, 5, 19, 7, 22, 4, 16, 3, 27}; printf("%d", findFirstOver(data, 3, 20)); return 0; } 7.写出下列程序段的输出结果:________________。 #include <stdio.h> int shiftCount(char *s) { char *p = s; int cnt = 0; while(*p != '\0') { if(*p >= 'a' && *p <= 'z') { char temp = *p + 3; if(temp > 'z') temp -= 26; if(temp == 'm') cnt++; } p++; } return cnt; } int main() { char str[] = "jzgpvda"; printf("%d", shiftCount(str)); return 0; } 8.写出下列程序段的输出结果:________________。 #include <stdio.h> void delSeven(int *arr, int len) { int *r = arr, *w = arr; while(r < arr + len) { if(*r % 7 != 0) *w++ = *r; r++; } *w = 1; } int main() { int num[7] = {7, 13, 14, 5, 21, 8, 9}; int mul = 1, *p = num; delSeven(num,7); while(*p != 1) { mul *= *p; p++; } printf("%d", mul); return 0; } 9.写出下列程序段的输出结果:________________。 #include <stdio.h> void getMaxMin(int *arr, int len, int *max, int *min) { int *p = arr; *max = *min = *p; p++; while(p < arr + len) { if(*p > *max) *max = *p; if(*p < *min) *min = *p; p++; } } int main() { int num[8] = {22, 4, 17, 29, 8, 13, 3, 25}; int mx, mi; getMaxMin(num, 8, &mx, &mi); printf("%d", mx - mi); return 0; } 10.写出下列程序段的输出结果:________________。 #include <stdio.h> int toUpperCount(char *s) { char *p = s; int cnt = 0; while(*p != '\0') { if(*p >= 'a' && *p <= 'z') { *p = *p - 32; cnt++; } p++; } return cnt; } int main() { char buf[] = "t5rG7bQ9k"; printf("%d", toUpperCount(buf)); return 0; } 11.写出下列程序段的输出结果:________________。 #include <stdio.h> void filterTen(int *arr, int len, int *cnt) { int *p = arr; *cnt = 0; while(p < arr + len) { int ten = *p / 10; if(ten > 5) (*cnt)++; p++; } } int main() { int data[7] = {14, 62, 38, 75, 51, 90, 22}; int count; filterTen(data, 7, &count); printf("%d", count); return 0; } 12.写出下列程序段的输出结果:________________。 #include <stdio.h> int countBackO(char *s) { int total = 0, len = 0,num; char *p = s; while(*p != '\0') { len++; p++; } p = s + (len + 1) / 2; num = 0; while(*p != '\0') { if(*p == 'o') num++; p++; } return num; } int main() { char str[] = "o9mo7kfo2zo"; printf("%d", countBackO(str)); return 0; } 13.写出下列程序段的输出结果:________________。 #include <stdio.h> int getMin(int *start, int *end) { int min = *start; int *p = start + 1; while(p <= end) { if(*p < min) min = *p; p++; } return min; } int main() { int arr[9] = {18, 4, 25, 7, 33, 11, 2, 16, 29}; int m1 = getMin(arr, arr + 3); int m2 = getMin(arr + 4, arr + 8); printf("%d", m1 + m2); return 0; } 14.写出下列程序段的输出结果:________________。 #include <stdio.h> int evenDigitSum(char *s) { char *p = s; int sum = 0; while(*p != '\0') { if(*p >= '0' && *p <= '9') { int d = *p - '0'; if(d % 2 == 0) sum += d; } p++; } return sum % 10; } int main() { char buf[] = "A6s2F8k4z1"; printf("%d", evenDigitSum(buf)); return 0; } 15.写出下列程序段的输出结果:________________。 #include <stdio.h> void splitNum(int n, int *sumOdd, int *mulEven) { int temp = n; *sumOdd = 0; *mulEven = 1; while(temp > 0) { int d = temp % 10; if(d % 2 == 1) *sumOdd += d; else *mulEven *= d; temp /= 10; } } int main() { int val = 7249; int s, m; splitNum(val, &s, &m); printf("%d", s - m); return 0; } 四、程序填空题(根据题意,将空缺的语句补上) 1.指针实现数字密码解码:自定义指针函数接收加密字符串指针与结果数组指针,加密规则:数字字符c真实值 = (c-'0'+4)%10,字母直接丢弃;函数仅用指针遍历提取解码后的数字存入目标数组,末尾标记 - 1;主函数输入密码串,调用后循环打印所有解密数字。 #include <stdio.h> void decodePwd(char *crypt, int *res) { char *read = crypt; int *write = res; while (*read != '\0') { if (___________①_________) { int num = ________②________ *write++ = num; } read++; } ________③________ } int main() { char input[100]; int out[100], *p; printf("输入加密密码(字母+数字混合):"); gets(input); decodePwd(input, out); printf("解密后的纯数字密码:"); for (p = out; *p != -1; p++) printf("%d", *p); return 0; } 2.指针实现幸运数筛选:幸运数定义:数字所有位平方和循环最终等于 1;子函数判断单个数字是否幸运;主处理函数接收数组指针,读写双指针原地过滤仅保留幸运数,末尾 0 作结束标记;主函数内置随机数字数组,调用后打印全部幸运数。 #include <stdio.h> int isLucky(int num) { int sum, temp = num; while (temp != 1 && temp != 4) { sum = 0; while (temp > 0) { int d = temp % 10; sum += ________①_______ temp /= 10; } temp = sum; } return __________②________ } void filterLucky(int *arr, int len) { int *r = arr, *w = arr; while (r < arr + len) { if (__________③________) *w++ = *r; r++; } *w = 0; } int main() { int data[9] = {7, 13, 10, 22, 19, 49, 2, 68, 1}; int *p; filterLucky(data, 9); printf("数组内幸运数:"); for (p = data; *p != 0; p++) printf("%d ", *p); return 0; } 3.指针实现数字转盘移位(环形左移 N 位):函数接收 int 数组指针、长度、移位步数,仅用指针自增 / 偏移完成环形左移;每次提取首指针元素,全体指针向前覆盖,末尾填入暂存数值;主函数给定数组,左移 4 位后打印全部元素。 #include <stdio.h> void wheelShiftLeft(int *arr, int len, int step) { int i, temp; int *p; step = _______①______ for (i = 0; i < step; i++) { temp = *arr; for (p = arr; p < arr + len - 1; p++) *(p) = _______②______; ________③_______= temp; } } int main() { int wheel[8] = {3, 1, 9, 5, 7, 2, 8, 4}; int *pt; wheelShiftLeft(wheel, 8, 4); printf("转盘左移4位结果:"); for (pt = wheel; pt < wheel + 8; pt++) printf("%d ", *pt); return 0; } 4.指针提取幸运数字组合:函数接收源 int 数组指针、长度、目标字符数组指针;指针遍历源数组,判断个位为 7 则转字符写入目标串;主函数内置数字数组,打印拼接后的幸运数字字符串。 #include <stdio.h> void pickSevenNum(int *src, int len, char *dst) { int *read = src; char *write = dst; while (read < src + len) { if (_______①_______) { *write = _______②______ write++; } read++; } ________③_______ } int main() { int num[7] = {17, 23, 47, 91, 67, 52, 30}; char luckStr[50]; pickSevenNum(num, 7, luckStr); printf("个位为7的幸运数字拼接串:%s", luckStr); return 0; } 5.指针星座分值计算:字符串指针遍历,数字字符分两类加权:1~5 权重 2,6~9 权重 3;函数通过 int 指针返回加权总分;主函数输入混合字符串,输出星座总分。 #include <stdio.h> void calcStarScore(char *s, int *total) { char *p = s; *total = 0; while (*p != '\0') { if (________①_______) { int d = _______②______ if (d <= 5) *total += d * 2; else *total += d * 3; } p++; } } int main() { char input[100]; int score; printf("输入星座测试串(字母数字混合):"); gets(input); _________③_________ printf("星座加权总分:%d", score); return 0; } 五、编程题。 1. 文字投票统计:设定投票字符 A/B/C,自定义函数接收投票字符串指针,搭配 3 个 int 一级指针分别记录三类票数,仅用字符指针遍历投票文本,区分三类字符完成计数;主函数输入一串投票文本,输出三人得票数量。 2.卡牌奇偶分区:函数接收卡牌数组指针与长度,定义读写双指针原地重排数组,先写入所有奇数,剩余位置存放偶数,全程无临时大数组;主函数输出重排后的卡牌序列。 3.积分淘汰筛选:函数接收积分数组指针、长度(8)、淘汰阈值(60)、两个一级指针;遍历数组统计留存人数与总分,通过指针带回两组数据;主函数计算并输出保留选手平均分(保留 1 位小数)。 4.数字迷宫定位:函数接收迷宫数组指针、起始检索位置(2)、临界数值(30),依靠指针偏移遍历,找到首个大于临界值的元素,返回对应下标;主函数输出迷宫目标位置编号。 5.指针统计句子实词数量:自定义指针函数接收英文句子字符串,仅依靠字符指针遍历,识别单词边界(空格分隔),只统计纯由大小写字母构成的实词,数字、符号组成的片段不计入;使用 int 一级指针带回实词总数,主函数输入句子并输出统计结果。 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $ 8.6与8.7节:C语言趣味程序实例8、项目开发实例 一、单项选择题 1.已知int m=18; int *p=&m;,执行*p = *p / 3;,下面说法正确的是( ) A. p 中存储的值变为 6 B. 变量 m 的值变为 6 C. p 的内存地址发生改变 D. 代码存在语法错误 【答案】B 【解析】p 存放 m 的地址,*p 等价直接操作变量 m 内存,运算后 m=6,指针 p 本身地址不变。 2.设有语句:char str[]="maple"; char *s=str; 执行s+=2; putchar(*s); 屏幕输出字符是( ) A. m B. a C. p D. l 【答案】C 【解析】字符串下标 0=m、1=a、2=p,指针偏移 2 指向 p。 3.设有以下代码片段,则程序的输出结果是( ) void func(int x){x=x+10;} int main(){int a=7; func(a); printf("%d",a);} A. 17 B. 7 C. 10 D. 随机值 【答案】B 【解析】普通变量值传递,函数仅修改局部副本,主函数 a 不变。 4.设有语句:int arr[5]={3,6,9,12,15}; int *p=arr; 表达式*(p+1)+*(p+3)运算结果是( ) A. 15 B. 18 C. 21 D. 24 【答案】B 【解析】p+1=6,p+3=12,6+12=18。 5.设有以下代码片段,则程序的输出结果是( ) void change(int *p){*p = *p - 4;} int main(){int x=15; change(&x); printf("%d",x/2);} A. 5 B. 6 C. 7 D. 11 【答案】A 【解析】地址传递 x=11,11/2 整数除法结果 5。 6.设有语句:char buf[]="peach"; char *p=buf+3; *p 对应的字符 ASCII 码为( ) A. 99 B. 101 C. 104 D. 112 【答案】A 【解析】p 指向下标 3 字符 c,c 的 ASCII 值 99。 7.设有语句:int data[4]={2,5,7,1}; int *p=data; p++; printf("%d",*p+*(p+2)); 输出数字( ) A. 6 B. 8 C. 12 D. 14 【答案】A 【解析】p初始指向data[0],p++后指向data[1](值为5),*(p+2)指向data[3](值为1),5+1=6,选A。 8.设有以下代码片段,则程序的输出结果是( ) void f1(int a){a*=2;} void f2(int *b){*b*=2;} int main(){int x=4,y=4; f1(x); f2(&y); printf("%d",x+y);} A. 8 B. 12 C. 16 D. 24 【答案】B 【解析】f1 值传递 x 不变 = 4;f2 地址传递 y=8;4+8=12。 9.设有语句:char str[]="x5g7k2"; char *p=str; int sum=0; while(*p){if(*p>='0'&&*p<='9') sum+=(*p-'0'); p++;} sum 最终值( ) A. 12 B. 14 C. 16 D. 18 【答案】B 【解析】数字 5、7、2,5+7+2=14。 10.设有语句:int arr[]={1,4,3,9,2}; int *p=arr; p+=2; printf("%d",*p - *(p-2)); 输出数值( ) A. 1 B. 2 C. 3 D. 5 【答案】B 【解析】p 偏移 2 指向 3,p-2 指向 1,3-1=2。 二、填空题。 1.执行 int x=32; int *pt=&x; *pt -= 7; 后变量 x 最终数值为___________。 【答案】25 【解析】指针解引用直接修改原变量内存,32-7=25。 2.设有语句:int num[7]={11,13,15,17,19,21,23}; int *p=num+3; 表达式*p的数值是___________。 【答案】17 【解析】p 偏移 3,指向数组下标 3 元素 17。 3.设有语句:char buf[]="orbit"; char *ptr=buf; ptr+=4; putchar(*ptr); 屏幕打印字符是___________。 【答案】t 【解析】o (0) r (1) b (2) i (3) t (4),偏移 4 指向字符 t。 4.遍历字符串的循环 while(*s) 能够正常终止,是因为字符串末尾存在结束字符___________。 【答案】'\0' 【解析】'\0'ASCII 值为 0,逻辑判定为假,循环结束。 5.设有语句:int data[5]={6,1,8,4,10}; int *p=data; p++; int res=*(p)+*(p+2); res 计算结果为___________。 【答案】5 【解析】p++ 指向 1,p+2 指向 4,1+4=5。 三、阅读程序题。 1.写出下列程序段的输出结果:________________。 #include <stdio.h> void splitCalc(int num, int *oddSum, int *evenSum) { int temp = num; *oddSum = 0; *evenSum = 0; while(temp > 0) { int digit = temp % 10; if(digit % 2 == 1) *oddSum += digit; else *evenSum += digit; temp /= 10; } } void doubleNum(int x) { x *= 2; } int main() { int val = 469; int os, es; splitCalc(val, &os, &es); doubleNum(val); printf("%d", (es - os) * val); return 0; } 【答案】469 2.写出下列程序段的输出结果:________________。 #include <stdio.h> void pickRange(int *arr, int left, int right, int *resArr) { int *p = arr + left; int *write = resArr; while(p <= arr + right) { if(*p % 3 != 0) *write++ = *p; p++; } *write = -1; } int main() { int data[10] = {11, 6, 14, 18, 7, 21, 5, 12, 9, 16}; int out[20], sum = 0, *pt; pickRange(data, 2, 7, out); for(pt = out; *pt != -1; pt++) sum += *pt; printf("%d", sum); return 0; } 【答案】26 3.写出下列程序段的输出结果:________________。 #include <stdio.h> int countBackUpper(char *s) { int len = 0, cnt = 0; char *p = s; while(*p != '\0') { len++; p++; } p = s + len / 2; while(*p != '\0') { if(*p >= 'A' && *p <= 'Z') cnt++; p++; } return cnt; } int main() { char str[] = "k9RtM7sBqL2zX"; printf("%d", countBackUpper(str)); return 0; } 【答案】3 4.写出下列程序段的输出结果:________________。 #include <stdio.h> int mulDigitOnly(char *s) { char *p = s; int mul = 1; while(*p != '\0') { if(*p >= '0' && *p <= '9') mul *= (*p - '0'); p++; } return mul; } int main() { char buf[] = "D3h7F2m9"; printf("%d", mulDigitOnly(buf)); return 0; } 【答案】378 5.写出下列程序段的输出结果:________________。 #include <stdio.h> void addFiveOdd(int *arr, int len) { int *p = arr; int idx = 0; while(p < arr + len) { if(idx % 2 == 1) *p += 5; p++; idx++; } } int main() { int num[6] = {3, 8, 1, 10, 4, 6}; int sum = 0, *pt = num; addFiveOdd(num, 6); while(pt < num + 6) { sum += *pt; pt++; } printf("%.1f", (double)sum / 6); return 0; } 【答案】7.8 6.写出下列程序段的输出结果:________________。 #include <stdio.h> int findFirstOver(int *arr, int start, int limit) { int *p = arr + start; int idx = start; while(*p != '\0' + 0) { if(*p > limit) return idx; p++; idx++; } return -1; } int main() { int data[9] = {12, 5, 19, 7, 22, 4, 16, 3, 27}; printf("%d", findFirstOver(data, 3, 20)); return 0; } 【答案】4 7.写出下列程序段的输出结果:________________。 #include <stdio.h> int shiftCount(char *s) { char *p = s; int cnt = 0; while(*p != '\0') { if(*p >= 'a' && *p <= 'z') { char temp = *p + 3; if(temp > 'z') temp -= 26; if(temp == 'm') cnt++; } p++; } return cnt; } int main() { char str[] = "jzgpvda"; printf("%d", shiftCount(str)); return 0; } 【答案】1 8.写出下列程序段的输出结果:________________。 #include <stdio.h> void delSeven(int *arr, int len) { int *r = arr, *w = arr; while(r < arr + len) { if(*r % 7 != 0) *w++ = *r; r++; } *w = 1; } int main() { int num[7] = {7, 13, 14, 5, 21, 8, 9}; int mul = 1, *p = num; delSeven(num,7); while(*p != 1) { mul *= *p; p++; } printf("%d", mul); return 0; } 【答案】4680 9.写出下列程序段的输出结果:________________。 #include <stdio.h> void getMaxMin(int *arr, int len, int *max, int *min) { int *p = arr; *max = *min = *p; p++; while(p < arr + len) { if(*p > *max) *max = *p; if(*p < *min) *min = *p; p++; } } int main() { int num[8] = {22, 4, 17, 29, 8, 13, 3, 25}; int mx, mi; getMaxMin(num, 8, &mx, &mi); printf("%d", mx - mi); return 0; } 【答案】26 10.写出下列程序段的输出结果:________________。 #include <stdio.h> int toUpperCount(char *s) { char *p = s; int cnt = 0; while(*p != '\0') { if(*p >= 'a' && *p <= 'z') { *p = *p - 32; cnt++; } p++; } return cnt; } int main() { char buf[] = "t5rG7bQ9k"; printf("%d", toUpperCount(buf)); return 0; } 【答案】4 11.写出下列程序段的输出结果:________________。 #include <stdio.h> void filterTen(int *arr, int len, int *cnt) { int *p = arr; *cnt = 0; while(p < arr + len) { int ten = *p / 10; if(ten > 5) (*cnt)++; p++; } } int main() { int data[7] = {14, 62, 38, 75, 51, 90, 22}; int count; filterTen(data, 7, &count); printf("%d", count); return 0; } 【答案】3 12.写出下列程序段的输出结果:________________。 #include <stdio.h> int countBackO(char *s) { int total = 0, len = 0,num; char *p = s; while(*p != '\0') { len++; p++; } p = s + (len + 1) / 2; num = 0; while(*p != '\0') { if(*p == 'o') num++; p++; } return num; } int main() { char str[] = "o9mo7kfo2zo"; printf("%d", countBackO(str)); return 0; } 【答案】2 13.写出下列程序段的输出结果:________________。 #include <stdio.h> int getMin(int *start, int *end) { int min = *start; int *p = start + 1; while(p <= end) { if(*p < min) min = *p; p++; } return min; } int main() { int arr[9] = {18, 4, 25, 7, 33, 11, 2, 16, 29}; int m1 = getMin(arr, arr + 3); int m2 = getMin(arr + 4, arr + 8); printf("%d", m1 + m2); return 0; } 【答案】6 14.写出下列程序段的输出结果:________________。 #include <stdio.h> int evenDigitSum(char *s) { char *p = s; int sum = 0; while(*p != '\0') { if(*p >= '0' && *p <= '9') { int d = *p - '0'; if(d % 2 == 0) sum += d; } p++; } return sum % 10; } int main() { char buf[] = "A6s2F8k4z1"; printf("%d", evenDigitSum(buf)); return 0; } 【答案】0 15.写出下列程序段的输出结果:________________。 #include <stdio.h> void splitNum(int n, int *sumOdd, int *mulEven) { int temp = n; *sumOdd = 0; *mulEven = 1; while(temp > 0) { int d = temp % 10; if(d % 2 == 1) *sumOdd += d; else *mulEven *= d; temp /= 10; } } int main() { int val = 7249; int s, m; splitNum(val, &s, &m); printf("%d", s - m); return 0; } 【答案】8 四、程序填空题(根据题意,将空缺的语句补上) 1.指针实现数字密码解码:自定义指针函数接收加密字符串指针与结果数组指针,加密规则:数字字符c真实值 = (c-'0'+4)%10,字母直接丢弃;函数仅用指针遍历提取解码后的数字存入目标数组,末尾标记 - 1;主函数输入密码串,调用后循环打印所有解密数字。 #include <stdio.h> void decodePwd(char *crypt, int *res) { char *read = crypt; int *write = res; while (*read != '\0') { if (___________①_________) { int num = ________②________ *write++ = num; } read++; } ________③________ } int main() { char input[100]; int out[100], *p; printf("输入加密密码(字母+数字混合):"); gets(input); decodePwd(input, out); printf("解密后的纯数字密码:"); for (p = out; *p != -1; p++) printf("%d", *p); return 0; } 【答案】①*read >= '0' && *read <= '9' ②(*read - '0' + 4) % 10; ③*write = -1; 2.指针实现幸运数筛选:幸运数定义:数字所有位平方和循环最终等于 1;子函数判断单个数字是否幸运;主处理函数接收数组指针,读写双指针原地过滤仅保留幸运数,末尾 0 作结束标记;主函数内置随机数字数组,调用后打印全部幸运数。 #include <stdio.h> int isLucky(int num) { int sum, temp = num; while (temp != 1 && temp != 4) { sum = 0; while (temp > 0) { int d = temp % 10; sum += ________①_______ temp /= 10; } temp = sum; } return __________②________ } void filterLucky(int *arr, int len) { int *r = arr, *w = arr; while (r < arr + len) { if (__________③________) *w++ = *r; r++; } *w = 0; } int main() { int data[9] = {7, 13, 10, 22, 19, 49, 2, 68, 1}; int *p; filterLucky(data, 9); printf("数组内幸运数:"); for (p = data; *p != 0; p++) printf("%d ", *p); return 0; } 【答案】①d * d; ②temp == 1 ? 1 : 0; ③isLucky(*r) 3.指针实现数字转盘移位(环形左移 N 位):函数接收 int 数组指针、长度、移位步数,仅用指针自增 / 偏移完成环形左移;每次提取首指针元素,全体指针向前覆盖,末尾填入暂存数值;主函数给定数组,左移 4 位后打印全部元素。 #include <stdio.h> void wheelShiftLeft(int *arr, int len, int step) { int i, temp; int *p; step = _______①______ for (i = 0; i < step; i++) { temp = *arr; for (p = arr; p < arr + len - 1; p++) *(p) = _______②______; ________③_______= temp; } } int main() { int wheel[8] = {3, 1, 9, 5, 7, 2, 8, 4}; int *pt; wheelShiftLeft(wheel, 8, 4); printf("转盘左移4位结果:"); for (pt = wheel; pt < wheel + 8; pt++) printf("%d ", *pt); return 0; } 【答案】①step % len; ②*(p + 1) ③*(arr + len - 1) 4.指针提取幸运数字组合:函数接收源 int 数组指针、长度、目标字符数组指针;指针遍历源数组,判断个位为 7 则转字符写入目标串;主函数内置数字数组,打印拼接后的幸运数字字符串。 #include <stdio.h> void pickSevenNum(int *src, int len, char *dst) { int *read = src; char *write = dst; while (read < src + len) { if (_______①_______) { *write = _______②______ write++; } read++; } ________③_______ } int main() { int num[7] = {17, 23, 47, 91, 67, 52, 30}; char luckStr[50]; pickSevenNum(num, 7, luckStr); printf("个位为7的幸运数字拼接串:%s", luckStr); return 0; } 【答案】①*read % 10 == 7 ②*read / 10 + '0'; ③*write = '\0'; 5.指针星座分值计算:字符串指针遍历,数字字符分两类加权:1~5 权重 2,6~9 权重 3;函数通过 int 指针返回加权总分;主函数输入混合字符串,输出星座总分。 #include <stdio.h> void calcStarScore(char *s, int *total) { char *p = s; *total = 0; while (*p != '\0') { if (________①_______) { int d = _______②______ if (d <= 5) *total += d * 2; else *total += d * 3; } p++; } } int main() { char input[100]; int score; printf("输入星座测试串(字母数字混合):"); gets(input); _________③_________ printf("星座加权总分:%d", score); return 0; } 【答案】①*p >= '0' && *p <= '9' ②*p - '0'; ③calcStarScore(input, &score); 五、编程题。 1. 文字投票统计:设定投票字符 A/B/C,自定义函数接收投票字符串指针,搭配 3 个 int 一级指针分别记录三类票数,仅用字符指针遍历投票文本,区分三类字符完成计数;主函数输入一串投票文本,输出三人得票数量。 【参考代码】 #include <stdio.h> void voteCount(char *voteStr, int *cntA, int *cntB, int *cntC) { char *p = voteStr; *cntA = *cntB = *cntC = 0; while (*p != '\0') { if (*p == 'A') (*cntA)++; else if (*p == 'B') (*cntB)++; else if (*p == 'C') (*cntC)++; p++; } } int main() { char text[100]; int a, b, c; printf("输入投票序列(仅含大写A/B/C):"); gets(text); voteCount(text, &a, &b, &c); printf("A票数:%d B票数:%d C票数:%d", a, b, c); return 0; } 2.卡牌奇偶分区:函数接收卡牌数组指针与长度,定义读写双指针原地重排数组,先写入所有奇数,剩余位置存放偶数,全程无临时大数组;主函数输出重排后的卡牌序列。 【参考代码】 #include <stdio.h> void cardSort(int *card, int len) { int *read = card, *write = card; while (read < card + len) { if (*read % 2 != 0) *write++ = *read; read++; } read = card; while (read < card + len) { if (*read % 2 == 0) *write++ = *read; read++; } } int main() { int cardData[9] = {14, 7, 3, 22, 9, 18, 5, 2, 11}; int *pt; cardSort(cardData, 9); printf("奇偶分区卡牌序列:"); for (pt = cardData; pt < cardData + 9; pt++) printf("%d ", *pt); return 0; } 3.积分淘汰筛选:函数接收积分数组指针、长度(8)、淘汰阈值(60)、两个一级指针;遍历数组统计留存人数与总分,通过指针带回两组数据;主函数计算并输出保留选手平均分(保留 1 位小数)。 【参考代码】 #include <stdio.h> void filterScore(int *score, int len, int limit, int *sum, int *count) { int *p = score; *sum = 0; *count = 0; while (p < score + len) { if (*p >= limit) { *sum += *p; (*count)++; } p++; } } int main() { int scoreArr[8] = {56, 88, 42, 91, 73, 39, 65, 81}; int total, cnt; double avg; filterScore(scoreArr, 8, 60, &total, &cnt); avg = (double)total / cnt; printf("晋级选手平均分:%.1f", avg); return 0; } 4.数字迷宫定位:函数接收迷宫数组指针、起始检索位置(2)、临界数值(30),依靠指针偏移遍历,找到首个大于临界值的元素,返回对应下标;主函数输出迷宫目标位置编号。 【参考代码】 #include <stdio.h> int findMazeTarget(int *maze, int startIdx, int threshold) { int *p = maze + startIdx; int idx = startIdx; while (1) { if (*p > threshold) return idx; p++; idx++; } } int main() { int mazeData[10] = {12, 25, 19, 33, 17, 41, 8, 29, 14, 36}; int pos = findMazeTarget(mazeData, 2, 30); printf("迷宫目标坐标下标:%d", pos); return 0; } 5.指针统计句子实词数量:自定义指针函数接收英文句子字符串,仅依靠字符指针遍历,识别单词边界(空格分隔),只统计纯由大小写字母构成的实词,数字、符号组成的片段不计入;使用 int 一级指针带回实词总数,主函数输入句子并输出统计结果。 【参考代码】 #include <stdio.h> void countWord(char *sentence, int *wordCnt) { char *p = sentence; int flag; *wordCnt = 0; while(*p != '\0') { flag = 1; while(*p == ' ' && *p != '\0') p++; if(*p == '\0') break; while(*p != ' ' && *p != '\0') { if(!((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z'))) flag = 0; p++; } if(flag == 1) (*wordCnt)++; } } int main() { char str[120]; int count; printf("输入英文混合句子:"); gets(str); countWord(str, &count); printf("纯字母实词数量:%d", count); return 0; } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

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