内容正文:
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;
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$