2026年3月10日
收获:
1.函数指针的定义:返回值类型 (*指针变量名)(参数类型列表);列表中不用具体指明变量,调用的时候要传入具体函数的名称,尽量在具体函数中实现所要求的功能和输出。
2. 拼接字符串可将一个字符串下标移至结尾,从这个下标开始将另一个字符串复制过来。
3. 杨辉三角前两行元素均为 1,从第三行开始每个元素都是前一行对应两个元素的和。
1. 求数列和(函数指针)(Q617)
题目描述:
编写一个函数,输入大于 1 的整数,输入 n 为偶数时,调用函数求 1/2+1/4+…+1/n,当输入 n 为奇数时,调用函数求 1/1+1/3+…+1/n(要求利用函数指针编程)
输入格式: "%d"
偶数输出: "Even=%f"
奇数输出: "Odd=%f"
程序运行示例 1:
10
Even=1.141667
程序运行示例 2:
9
Odd=1.787302
使用函数指针的实现:
#include <stdio.h>
// 偶数情况:计算 1/2+1/4+…+1/n
void Even(int n){
int i = 2;
float sum = 0;
while(i <= n){
sum += 1.0 / i;
i += 2;
}
printf("Even=%f", sum);
return;
}
// 奇数情况:计算 1/1+1/3+…+1/n
void Odd(int n){
int i = 1;
float sum = 0;
while(i <= n){
sum += 1.0 / i;
i += 2;
}
printf("Odd=%f", sum);
return;
}
// 函数指针调用的通用函数
int sumFun(int n, void (*Func)(int)){
Func(n); // 通过函数指针调用对应的函数
return 0;
}
int main()
{
int n;
scanf("%d", &n);
// 根据奇偶性,通过函数指针调用不同的函数
if(n % 2 == 0){
sumFun(n, Even); // 传入 Even 函数指针
} else {
sumFun(n, Odd); // 传入 Odd 函数指针
}
return 0;
}
未使用函数指针的实现:
#include <stdio.h>
int main()
{
int n, i = 1;
float sum = 0;
scanf("%d", &n);
// 判断奇偶性,确定起始值
if(n % 2 == 0){
i = 2; // 偶数从 2 开始
}
// 累加数列:每次增加 2
while(i <= n){
sum += 1.0 / i;
i += 2;
}
// 根据奇偶性输出不同格式
if(n % 2 == 0){
printf("Even=%f", sum);
} else {
printf("Odd=%f", sum);
}
return 0;
}
2. 打印三角形图案(Q1739)
题目描述:
编程打印以下图案:
*
***
*****
*******
#include <stdio.h>
int main()
{
int n = 1;
// 循环打印 4 行,每行星号数分别为 1,3,5,7
while(n < 8){
// 打印 n 个星号
for(int i = 0; i < n; i++){
printf("*");
}
printf("\\n"); // 换行
n += 2; // 每次增加 2 个星号
}
return 0;
}
3. 字符串连接函数改错(Q2133)
题目描述:
下面函数 MyStrcat 实现 strcat 的功能,即:将两个字符串连接的功能,将源字符串 srcStr 连接到目的字符串 dstStr 的尾部。
注意:
运行示例:
Please enter source string:1234
Please enter destination string:abcd
The concatenate string is:
abcd1234
#include <stdio.h>
#define ARR_SIZE 80;
void MyStrcat(char dstStr[], char srcStr[]);
main()
{
char s[], t[];//未指定数组长度
printf("Please enter source string:\\n");
gets(s);
printf("Please enter destination string:\\n");
gets(t);
MyStrcat(s,t);
printf("The concatenate string is:\\n");
puts(t);
}
void MyStrcat(char dstStr[], char srcStr[])
{
int i = 0, j = 0;
while (dstStr[i]!='\\0')
{
i++;
}
for(;srcStr[i]!='\\0';i++,j++)
{
dstStr[j] = srcStr[i];
}
dstStr[j]='\\0';
}
原代码中的错误:
改正后的代码:
#include <stdio.h>
#define ARR_SIZE 80
void MyStrcat(char dstStr[], char srcStr[]);
int main()
{
char s[ARR_SIZE], t[ARR_SIZE]; // 修正:指定数组长度
printf("Please enter source string:\\n");
gets(s);
printf("Please enter destination string:\\n");
gets(t);
MyStrcat(t, s); // 修正:将 s 连接到 t
printf("The concatenate string is:\\n");
puts(t);
return 0;
}
void MyStrcat(char dstStr[], char srcStr[])
{
int i = 0, j = 0;
// 找到 dstStr 的末尾
while (dstStr[i] != '\\0')
{
i++;
}
// 将 srcStr 复制到 dstStr 末尾
for(; srcStr[j] != '\\0'; i++, j++) // 修正:遍历 srcStr[j]
{
dstStr[i] = srcStr[j]; // 修正:正确赋值
}
dstStr[i] = '\\0'; // 修正:添加字符串结束符
}
4. 杨辉三角形(Q191)
题目描述:
用二维数组编程计算并输出 n(n<20) 行杨辉三角形。
输入提示信息要求: "Input n(n<20):\\n"
输入格式: "%d"
输出要求: "%4d",每输出一行后就换行
注: 不能使用指针、结构体、共用体、文件、goto、枚举类型进行编程。
解法一:使用二维数组
#include <stdio.h>
int main()
{
int n, h = 0, arr[20][20] = {{1}, {1, 1}};
printf("Input n(n<20):\\n");
scanf("%d", &n);
// 逐行计算并输出杨辉三角
while(h++ < n){
arr[h–1][0] = 1; // 每行第一个元素为 1
// 计算中间元素:等于上一行相邻两元素之和
for(int i = 1; i < h; i++){
arr[h–1][i] = arr[h–2][i–1] + arr[h–2][i];
}
// 输出当前行
for(int i = 0; i < h; i++){
printf("%4d", arr[h–1][i]);
}
printf("\\n");
}
return 0;
}
解法二:使用两个一维数组
#include <stdio.h>
int main()
{
int n, h = 1, arr[20] = {1};
printf("Input n(n<20):\\n");
scanf("%d", &n);
while(h++ <= n){
int a[20] = {1}; // 临时数组存储当前行
// 计算当前行的值
for(int i = 1; i < h–1; i++){
a[i] = arr[i–1] + arr[i]; // 等于上一行相邻两元素之和
}
// 更新 arr 并输出
for(int i = 0; i < h–1; i++){
arr[i] = a[i];
printf("%4d", arr[i]);
}
printf("\\n");
}
return 0;
}
5. 结构体数组查找(Q6591)
题目描述:
假设有以下定义:
#define N 5
struct Employee
{
int id;
char name[20];
int salary;
};
请编写函数完成按姓名进行查找。再在主函数调用这个函数。
输入提示: "please input id,name,salary:\\n"(只提示一次)
输入格式: "%d%s%d"
输入提示: "please input name to search:\\n"
输入格式: "%s"
输出格式: "%d,%s,%d\\n"(找到时输出),"NOT FOUND!"(没找到时输出)
程序运行示例 1:
please input id,name,salary:↙
201 zhang 18000
202 li 10800
203 zhao 12000
204 wang 15000
205 sun 17000
please input name to search:↙
Wang
NOT FOUND!
程序运行示例 2:
please input id,name,salary:↙
201 zhang 18000
202 li 10800
203 zhao 12000
204 wang 15000
205 sun 17000
please input name to search:↙
li
202,li,10800
#include <stdio.h>
#include <string.h>
#define N 5
// 定义员工结构体
struct Employee
{
int id;
char name[20];
int salary;
};
// 函数声明:查找员工
int find(struct Employee x[], char name[20]);
int main(){
struct Employee arr[N];
// 输入员工信息
printf("please input id,name,salary:\\n");
for(int i = 0; i < N; i++){
scanf("%d %s %d", &arr[i].id, arr[i].name, &arr[i].salary);
}
// 输入要查找的姓名
char name[20];
printf("please input name to search:\\n");
scanf("%s", name);
// 调用查找函数
int f = find(arr, name);
// 输出结果
if(f != –1){
printf("%d,%s,%d\\n", arr[f].id, arr[f].name, arr[f].salary);
} else {
printf("NOT FOUND!");
}
return 0;
}
// 查找函数:按姓名查找员工
int find(struct Employee arr[], char name[]){
for(int i = 0; i < N; i++){
// 使用 strcmp 比较字符串,相等返回 0
if(strcmp(arr[i].name, name) == 0){
return i; // 找到返回下标
}
}
return –1; // 未找到返回 -1
}





