You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++程序自定义函数报undefined reference错误,求问题排查

你的C++图形面积计算程序的问题分析

看起来你遇到了链接错误和一堆运行逻辑问题,我帮你逐个拆解:

1. 核心链接错误:函数只有声明,没有实现

你只写了函数的原型(比如float circ(float pi, float radio);),但完全没有编写这些函数的具体实现代码!链接器找不到这些函数的实际定义,所以才会弹出undefined reference错误。比如circ函数,你需要补上:

float circ(float pi, float radio) {
    return pi * radio * radio;
}

同理,cuad、rect、triang都需要编写对应的函数体,实现各自的面积计算逻辑。

2. scanf的两处致命错误

你所有的scanf都犯了两个低级错误:

  • 格式字符串用错了:你写的是"&f",正确的应该是"%f"(用百分号,不是&)。
  • 没有传递变量的地址:scanf需要接收变量的内存地址,所以应该写scanf("%f", &radio);,而不是scanf("%f", radio);(少了&符号)。
    这两个错误会导致程序读取输入时崩溃或者得到垃圾值。

3. switch语句缺少break

每个case执行完后都没有加break;,这会导致程序执行完当前case后,继续往下执行后续所有case的代码。比如你选了1计算圆面积,程序会接着执行正方形、长方形、三角形的输入和计算逻辑,完全不符合预期。每个case末尾都要加上break;:

case '1':
    // ... 你的代码
    system("pause");
    break; // 加上这个终止当前case的执行

4. 循环逻辑完全错误

  • 首先,opc是char类型,你输入的是字符'1'、'2'等,而while(opc !=4)里的4是整数,字符'4'的ASCII码是52,和整数4完全不相等,所以这个循环条件永远为真,会无限循环。
  • 其次,循环内部没有重新读取opc的值,用户选完一次后,程序会一直重复执行同一个case的代码,根本不会回到菜单选择。
  • 还有,while(opc !=4)的条件会导致case4永远不会被执行到,因为循环在opc等于4时就退出了。

正确的做法是把菜单和输入opc的逻辑放到循环内部,并且用字符比较:

int main() {
    float pi=3.14;
    char opc;
    do {
        printf("Introduce 1 para circulo\n");
        printf("2 para cuadrado\n");
        printf("3 para rectangulo\n");
        printf("4 para triangulo\n");
        printf("5 para salir\n"); // 新增退出选项
        scanf(" %c", &opc); // 前面加空格跳过输入时的空白字符
        switch(opc) {
            case '1': // 用字符'1'而非整数1
                // ... 圆面积计算代码
                break;
            // 其他case同理用'2'、'3'、'4'
            case '5':
                printf("Saliendo...\n");
                break;
            default:
                printf("Opcion invalida!\n");
        }
    } while(opc != '5'); // 用字符'5'判断退出
}

5. 菜单提示信息没有换行

你所有的printf都没有加\n,导致所有提示文字挤在一行,用户根本看不清选项。比如改成:

printf("Introduce 1 para circulo\n");
printf("2 para cuadrado\n");
printf("3 para rectangulo\n");
printf("4 para triangulo\n");

6. 缺少必要的头文件

你用了printf、scanf和system,需要在代码开头包含对应的头文件:

#include <stdio.h> // 用于printf、scanf
#include <stdlib.h> // 用于system("pause")

7. case块内变量声明的潜在问题

在C++中,虽然允许在case块内声明变量,但最好用{}把case的代码包起来,避免变量作用域混乱。比如:

case '1': {
    float radio;
    printf("Introduce el valor del radio: ");
    scanf("%f", &radio);
    printf("El area del circulo es: %f\n", circ(pi, radio));
    system("pause");
    break;
}

内容的提问来源于stack exchange,提问作者Álvaro Cabo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:05:54