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的|对齐逻辑
要让所有行的|严格对齐,核心是先计算左侧需要预留的空格数:
- 遍历温度数组,找出最小的负温度值(最负的数),取它的绝对值作为
max_neg_abs——这个值是所有行左侧的基础空格数,保证最负的数的*能顶到最左边,其他行通过补空格让|对齐。 - 针对不同温度值生成对应行:
- 正数:左侧补
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; }
代码关键细节解释
- 对齐逻辑:
max_neg_abs确保所有行的|处于同一列——比如示例中最负的数是-5,max_neg_abs=5,正数和0的左侧会补5个空格,负数则根据自身绝对值补5 - abs(temp)个空格,最终所有|都对齐。 - no_value处理:用
prev_valid_line存储上一次的有效行内容,遇到-999直接复用,无需重复计算。 - 字符串操作:
append(n, char)是C中生成重复字符的高效方式,避免了手动循环拼接的冗余代码,也规避了Python式拼接在C中的语法错误。
示例输出
对于示例数组,输出结果如下(所有|严格对齐):
|*** *****| | | |** ***| ***|
内容的提问来源于stack exchange,提问作者tma
相关产品推荐
相关产品推荐

