欢迎光临
我们一直在努力

sse哈工大C语言编程练习38

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';
    }

    原代码中的错误:

  • #define ARR_SIZE 80; → 宏定义不应加分号
  • char s[], t[]; → 未指定数组长度
  • MyStrcat(s,t); → 参数顺序错误,应该是将 s 连接到 t
  • for(;srcStr[i]!='\\0';i++,j++) → 应该遍历 srcStr[j]
  • dstStr[j] = srcStr[i]; → 下标错误
  • dstStr[j]='\\0'; → 应该用 dstStr[i]
  • 改正后的代码:

    #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[h1][0] = 1; // 每行第一个元素为 1

    // 计算中间元素:等于上一行相邻两元素之和
    for(int i = 1; i < h; i++){
    arr[h1][i] = arr[h2][i1] + arr[h2][i];
    }

    // 输出当前行
    for(int i = 0; i < h; i++){
    printf("%4d", arr[h1][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 < h1; i++){
    a[i] = arr[i1] + arr[i]; // 等于上一行相邻两元素之和
    }

    // 更新 arr 并输出
    for(int i = 0; i < h1; 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
    }

    赞(0)
    未经允许不得转载:171主机测评 » sse哈工大C语言编程练习38
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址