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

C++新手求助:温度计程序编写报错及对齐问题解决

问题解决:C++温度计程序的错误修复与对齐实现

一、修复“表达式必须是可修改的左值”错误

你遇到的第13行左值错误,通常是以下两种新手常见问题导致的(和Python的语法逻辑差异很大):

  • 误将值赋值给不可修改对象:比如试图给字符串字面量(如"|")赋值,或者给const修饰的变量赋值——这些都是不可修改的常量,不能作为赋值操作的左值(赋值目标)。
  • 误用指针算术代替字符串拼接:Python里可以直接用"|" + "*"*5拼接字符串,但C++里"|"是const char*类型,和整数相加会被当作指针偏移(比如"|" + 5是把指针向后移动5个字节),不是字符串拼接,这会触发编译错误或非法内存访问。

修复方案

用std::string对象存储和拼接内容,确保赋值目标是可修改的变量:

  • 不要直接操作字符串字面量,先把字面量转为std::string对象(比如std::string pipe = "|";)
  • 用std::string::append(n, char)方法快速生成指定数量的重复字符,替代Python式的"*"*n逻辑

二、实现0的|对齐逻辑

要让所有行的|严格对齐,核心是先计算左侧需要预留的空格数:

  1. 遍历温度数组,找出最小的负温度值(最负的数),取它的绝对值作为max_neg_abs——这个值是所有行左侧的基础空格数,保证最负的数的*能顶到最左边,其他行通过补空格让|对齐。
  2. 针对不同温度值生成对应行:
    • 正数:左侧补max_neg_abs个空格 → 输出| → 输出对应数量的*
    • 负数:左侧补max_neg_abs - abs(temp)个空格 → 输出对应数量的* → 输出|
    • 0:左侧补max_neg_abs个空格 → 输出|
    • no_value(-999):直接复用上一次生成的有效行内容

三、完整可运行代码

#include <iostream>
#include <vector>
#include <string>

int main() {
    // 示例温度数组,可替换为你的作业数据
    std::vector<int> temps = {3, -5, 0, -999, 2, -3, -999};
    int max_neg_abs = 0;
    std::string prev_valid_line;

    // 第一步:计算最大负数值的绝对值,用于对齐
    for (int temp : temps) {
        if (temp == -999) continue;
        if (temp < 0) {
            int abs_temp = -temp;
            if (abs_temp > max_neg_abs) {
                max_neg_abs = abs_temp;
            }
        }
    }

    // 第二步:遍历生成每行内容
    for (int temp : temps) {
        std::string current_line;
        if (temp == -999) {
            // 复用前一行的有效内容
            current_line = prev_valid_line;
        } else {
            if (temp > 0) {
                current_line.append(max_neg_abs, ' ');
                current_line += "|";
                current_line.append(temp, '*');
            } else if (temp < 0) {
                int abs_temp = -temp;
                current_line.append(max_neg_abs - abs_temp, ' ');
                current_line.append(abs_temp, '*');
                current_line += "|";
            } else { // temp == 0
                current_line.append(max_neg_abs, ' ');
                current_line += "|";
            }
            // 更新前一行的有效内容
            prev_valid_line = current_line;
        }
        std::cout << current_line << std::endl;
    }

    return 0;
}

代码关键细节解释

  1. 对齐逻辑:max_neg_abs确保所有行的|处于同一列——比如示例中最负的数是-5,max_neg_abs=5,正数和0的左侧会补5个空格,负数则根据自身绝对值补5 - abs(temp)个空格,最终所有|都对齐。
  2. no_value处理:用prev_valid_line存储上一次的有效行内容,遇到-999直接复用,无需重复计算。
  3. 字符串操作:append(n, char)是C中生成重复字符的高效方式,避免了手动循环拼接的冗余代码,也规避了Python式拼接在C中的语法错误。

示例输出

对于示例数组,输出结果如下(所有|严格对齐):

|***
*****|
     |
     |
     |**
  ***|
  ***|

内容的提问来源于stack exchange,提问作者tma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:27:22