学习方向: C++ / 数据结构基础
今日主题: for 循环、嵌套循环、累加、数组与指针
一、偶数统计与求和
今天的第一道练习是计算 1 到 n 之间所有偶数的个数与总和。
最初想到直接让循环变量每次增加 2,以遍历偶数。
#include <iostream>
using namespace std;
int main()
{
int n;
int count = 0;
int sum = 0;
cin >> n;
for (int i = 2; i <= n; i += 2)
{
count++;
sum += i;
}
cout << "偶数个数:" << count << endl;
cout << "偶数总和:" << sum << endl;
return 0;
}
遇到的问题:
最开始将累加语句写成了 sum = +;,这是不完整的表达式。同时,把变量名放在双引号内,导致输出的是文本,而不是变量的值。
理解与收获:
sum += i 等价于 sum = sum + i。累加的本质是读取旧值、计算新值,再将结果保存回变量。
二、嵌套循环:数字三角形
第二道练习要求输出如下数字三角形:
1
12
123
1234
12345
正确实现:
for (int i = 1; i <= n; i++)
{
for (int k = 1; k <= i; k++)
{
cout << k;
}
cout << '\n';
}
遇到的问题:
最开始没有理解两层循环变量之间的关系,误把内层循环的判断变量写成了外层的 i。
理解与收获:
外层循环控制行数,内层循环控制每一行的输出次数。
关键是 k <= i。外层每执行一次,内层就会从 k = 1 重新开始执行。
换行语句必须放在内层循环结束之后。
三、指针遍历数组与累加
第三道练习使用指针读取数组元素,并计算总和。
int arr[5] = {10, 20, 30, 40, 50};
int* p = arr;
int sum = 0;
for (int i = 0; i < 5; i++)
{
cout << *(p + i) << " ";
sum += *(p + i);
}
cout << "\n总和:" << sum;
输出总和为 150。
遇到的问题:
最开始将循环写成:
for (int i = 1; i <= 5; i++)
这会跳过数组第一个元素,并在最后一次循环中越界。
理解与收获:
p保存内存地址。*p读取指针指向位置的值。p + i计算偏移后的地址。*(p + i)读取偏移位置的元素。
对于具有 n 个元素的数组,有效下标是 0 到 n - 1。
四、移动指针寻找最大值
第四道练习要求使用 p++ 遍历数组,找出最大值。
#include <iostream>
using namespace std;
int main()
{
int arr[5] = {3, 7, 2, 9, 5};
int* p = arr;
int maxValue = *p;
for (int i = 0; i < 5; i++)
{
if (*p > maxValue)
{
maxValue = *p;
}
p++;
}
cout << "最大值:" << maxValue;
return 0;
}
输出:
最大值:9
遇到的问题:
再次使用了 i <= 5,导致循环执行六次,在最后一次比较中越界读取。
理解与收获:
p++ 会使指针移动到下一个整数元素,而 *(p + i) 只是计算偏移位置并读取,不会改变 p 本身。
对于当前写法,需要先读取 *p,完成比较,再执行 p++。
五、今日总结
今天主要解决了三个理解上的问题。
1. 累加与赋值的区别
sum = i 会覆盖原有值,而 sum += i 会在原值上增加 i。
2. 循环边界
今天两次出现数组越界,说明还需要强化循环次数和数组下标的对应关系。
3. 指针与内存地址
逐步理解了 &、*、指针偏移和 p++,开始能够将指针应用到实际的数组遍历中。
相比单纯阅读概念,独立编写代码更容易暴露理解中的问题。今天四道题都经历了不同程度的修改,也让我意识到,看懂代码与能够独立写出代码仍然存在差距。
六、下一阶段计划
继续强化循环与指针的组合使用,重点练习边界判断、变量更新和数组遍历。之后进入单链表,学习节点创建、next 指针与链表遍历,并尝试独立实现基础链表操作。
学习原则:理解原理 → 独立编写 → 调试纠错 → 总结记录。