20251120 141414 小学生C编程课堂笔记

1. 程序基本概念

🌈学习目标

  • 理解程序的基本组成部分
  • 学会命名常量和变量
  • 了解头文件和名字空间的作用
  • 掌握编写程序的基本步骤

1.1 基本概念解释

标识符:就像我们的名字,用来给变量、常量起名

int myAge = 10;        // myAge就是标识符
string myName = "小明"; // myName也是标识符

关键字:C++语言预留的特殊单词,就像"爸爸"、"妈妈"这样的称呼

int if = 5; // 错误!if是关键字,不能当变量名

常量:不会改变的值,就像我们的生日

const double PI = 3.14; // PI是常量,永远都是3.14

变量:可以改变的值,就像存钱罐里的钱

int pocketMoney = 20; // 今天有20元零花钱
pocketMoney = 25;     // 明天变成25元

字符串:一串文字,就像一句话

string greeting = "你好,世界!";

表达式:能计算出结果的式子

int result = 5 + 3 * 2; // 5+3×2就是一个表达式

1.2 常量与变量

命名规则儿歌

字母数字下划线,开头不能是数字
关键字不能使用,大小写要区分清
见名知意最重要,编程习惯要养好

定义格式

// 变量定义
数据类型 变量名 = 初始值;
int age = 10;
double height = 1.45;

// 常量定义
const 数据类型 常量名 = 值;
const int MAX_SCORE = 100;

1.3 头文件与名字空间

头文件:就像工具箱

#include <iostream>  // 输入输出工具箱
#include <cmath>     // 数学工具箱

名字空间:就像名字牌

using namespace std; // 使用标准名字空间
// 这样就不用每次都写std::cout,直接写cout就行

1.4 编程步骤类比

写作文写代码 检查错别字编译 朗读作文解释执行 修改作文调试

#include <iostream>
using namespace std;

int main() {
    cout << "我的第一个程序!" << endl;
    return 0;
}

🧩小试牛刀

选择题: 1. 下面哪个是合法的变量名? A. 2score B. my-score C. my_score D. int

  1. 常量的特点是: A. 会变化 B. 不会变化 C. 有时变化 D. 颜色会变

  2. #include <iostream>的作用是: A. 画画 B. 输入输出 C. 玩游戏 D. 听音乐

编程填空题: 1. 定义一个整数变量age,值为10 ______ age = 10;

  1. 定义一个常量PI,值为3.14 ______ double PI = 3.14;

2. 基本数据类型

🌈学习目标

  • 认识C++中的基本数据类型
  • 了解每种类型的用途和大小
  • 学会选择合适的数据类型

2.1 整数型(int, long long)

int:普通整数,像日常计数

int apples = 5;        // 有5个苹果
int students = 30;     // 30个学生

long long:超大整数,像银行账户余额

long long distance = 384400000;  // 地球到月球的距离

2.2 实数型(float, double)

float:单精度小数,像体重测量

float weight = 45.5f;  // 体重45.5公斤

double:双精度小数,更精确

double pi = 3.1415926; // 圆周率

2.3 字符型(char)

char:单个字符,像字母、数字、符号

char grade = 'A';      // 成绩等级
char symbol = '+';     // 加号

2.4 布尔型(bool)

bool:只有两个值,真或假

bool isSunny = true;   // 今天是晴天
bool isRaining = false; // 没有下雨

📦数据类型储物盒对比

数据类型 储物盒大小 能装什么 例子
int 4个格子 -21亿到21亿 int age = 10;
long long 8个格子 非常大 long long big = 1234567890;
float 4个格子 小数 float price = 9.99f;
double 8个格子 更精确小数 double score = 98.5;
char 1个格子 单个字符 char letter = 'A';
bool 1个格子 true/false bool pass = true;

🧩小试牛刀

选择题: 1. 存储学生年龄应该用: A. int B. double C. char D. bool

  1. 存储圆周率最好用: A. int B. float C. double D. char

  2. 布尔型有几个可能的值? A. 1个 B. 2个 C. 10个 D. 无数个

编程填空题: 1. 定义一个布尔变量isHappy ______ isHappy = true;

  1. 定义一个双精度变量temperature ______ temperature = 36.5;

3. 程序基本语句

🌈学习目标

  • 掌握输入输出语句
  • 理解赋值语句
  • 学会使用分支和循环结构

3.1 输入输出语句

C++风格(更简单):

#include <iostream>
using namespace std;

int main() {
    int age;
    cout << "请输入你的年龄:";  // 输出
    cin >> age;                  // 输入
    cout << "你今年" << age << "岁" << endl;
    return 0;
}

C风格(更复杂但更快):

#include <cstdio>
int main() {
    int score;
    printf("请输入分数:");  // 输出
    scanf("%d", &score);    // 输入
    printf("你的分数是:%d\n", score);
    return 0;
}

3.2 赋值语句

给盒子装东西的类比:

int money;          // 找一个空盒子
money = 50;         // 往盒子里放50元
money = money + 10; // 从盒子里取出钱,加10元,再放回去

3.3 分支结构

if语句(二选一):

int score = 85;
if (score >= 60) {
    cout << "及格了!" << endl;
} else {
    cout << "要加油了!" << endl;
}

switch语句(多选一):

int day = 3;
switch (day) {
    case 1: cout << "星期一"; break;
    case 2: cout << "星期二"; break;
    case 3: cout << "星期三"; break;
    default: cout << "其他天";
}

3.4 循环结构

for循环(固定次数):

// 打印1到5的数字
for (int i = 1; i <= 5; i++) {
    cout << i << " ";
}
// 输出:1 2 3 4 5

while循环(条件满足):

int count = 1;
while (count <= 3) {
    cout << "第" << count << "次循环" << endl;
    count++;
}

do-while循环(至少一次):

int number;
do {
    cout << "请输入正数:";
    cin >> number;
} while (number <= 0);

🔄多层循环(俄罗斯套娃)

for (int i = 1; i <= 3; i++) {      // 外层:大套娃
    for (int j = 1; j <= 2; j++) {  // 内层:小套娃
        cout << "i=" << i << ", j=" << j << endl;
    }
}

执行流程图

开始循环 i=1
  ↓
开始循环 j=1 → 输出 i=1,j=1
  ↓
j=2 → 输出 i=1,j=2
  ↓
j循环结束
  ↓
i=2 → 重新开始j循环...

🧩小试牛刀

选择题: 1. 要重复10次操作,最好用: A. if B. for C. switch D. cout

  1. 至少执行一次的循环是: A. for B. while C. do-while D. if

  2. cin >> age; 的作用是: A. 输出年龄 B. 输入年龄 C. 计算年龄 D. 删除年龄

编程填空题: 1. 用for循环输出1到3 for (int i = 1; i <= 3; i++) { cout << i << " "; }

  1. 判断分数是否及格 if (score >= 60) { cout << "及格"; } else { cout << "不及格"; }

4. 基本运算

🌈学习目标

  • 掌握各种运算符的使用
  • 理解运算符的优先级
  • 学会在程序中进行计算

4.1 算术运算

超市购物场景

int apples = 5;     // 买5个苹果
int price = 3;      // 每个3元
int total = apples * price;  // 总价 = 5 × 3
int change = 20 - total;     // 找零 = 20 - 15
int half = apples / 2;       // 分一半 = 5 ÷ 2
int remainder = 7 % 3;       // 7除以3余1

4.2 关系运算

身高比较场景

int myHeight = 150;
int friendHeight = 145;

bool isTaller = myHeight > friendHeight;    // true
bool isShorter = myHeight < friendHeight;   // false  
bool isSame = myHeight == friendHeight;     // false
bool isDifferent = myHeight != friendHeight; // true

4.3 逻辑运算

闯关条件类比

bool hasKey = true;      // 有钥匙
bool hasMap = false;     // 没有地图

// 与(&&):两个条件都要满足
bool canOpenDoor = hasKey && hasMap;  // false

// 或(||):至少满足一个条件
bool canExplore = hasKey || hasMap;   // true

// 非(!):取反
bool isLocked = !hasKey;  // false

4.4 自增自减运算

上台阶/下台阶类比:

int steps = 10;
steps++;  // 上一步台阶,现在steps=11
steps--;  // 下一步台阶,现在steps=10

int a = 5;
int b = a++;  // b=5, 然后a变成6
int c = ++a;  // a先变成7, 然后c=7

4.5 三目运算

如果...就...否则...句式:

int score = 85;
string result = (score >= 60) ? "及格" : "不及格";
// 相当于:如果score>=60就"及格",否则"不及格"

4.6 位运算

开关灯游戏类比:

int lights = 5;  // 二进制:101(第1和第3盏灯亮)

lights = lights << 1;  // 左移:变成1010(十进制10)
lights = lights >> 2;  // 右移:变成0010(十进制2)

🧩小试牛刀

选择题: 1. 10 % 3 的结果是: A. 1 B. 3 C. 0 D. 10

  1. 逻辑与运算符是: A. || B. && C. ! D. ==

  2. int x = 5; x++; 之后x的值是: A. 5 B. 6 C. 4 D. 0

编程填空题: 1. 判断年龄是否在10到20之间 if (age >= 10 ______ age <= 20)

  1. 用三目运算判断正负数 string type = (num > 0) ______ "正数" : "负数";

5. 数学库常用函数

🌈学习目标

  • 学会使用常用的数学函数
  • 理解函数参数和返回值
  • 掌握数学计算技巧

5.1 基础数学函数

计算器操作类比:

#include <cmath>  // 数学工具箱
#include <cstdlib> // 标准工具箱

int main() {
    // 绝对值
    int negative = -5;
    int positive = abs(negative);  // 5

    // 四舍五入
    double num1 = 3.4;
    double round1 = round(num1);   // 3.0

    double num2 = 3.6;
    double round2 = round(num2);   // 4.0

    // 取整
    double num3 = 3.7;
    double ceilNum = ceil(num3);   // 4.0(向上取整)
    double floorNum = floor(num3); // 3.0(向下取整)

    // 平方根
    double squareRoot = sqrt(16);  // 4.0

    // 幂运算
    double power = pow(2, 3);      // 8.0(2的3次方)

    return 0;
}

5.2 进阶数学函数

// 三角函数(角度要转成弧度)
double angle = 30;
double radians = angle * 3.14159 / 180;
double sinValue = sin(radians);   // 正弦
double cosValue = cos(radians);   // 余弦
double tanValue = tan(radians);   // 正切

// 对数和指数
double logValue = log(10);        // 自然对数
double expValue = exp(1);         // e的1次方

📋数学函数速查表

函数 作用 例子 结果
abs(x) 绝对值 abs(-5) 5
round(x) 四舍五入 round(3.6) 4.0
ceil(x) 向上取整 ceil(3.2) 4.0
floor(x) 向下取整 floor(3.8) 3.0
sqrt(x) 平方根 sqrt(16) 4.0
pow(x,y) x的y次方 pow(2,3) 8.0

⚠️注意事项

  1. 使用数学函数前要 #include <cmath>
  2. 三角函数参数是弧度,不是角度
  3. 不能对负数开平方根

🧩小试牛刀

选择题: 1. abs(-8) 的结果是: A. -8 B. 8 C. 0 D. 16

  1. 计算平方根的函数是: A. pow() B. sqrt() C. abs() D. round()

  2. ceil(2.1) 的结果是: A. 2.0 B. 2.1 C. 3.0 D. 2.5

编程填空题: 1. 计算9的平方根 double result = ______(9);

  1. 计算2的10次方 double power = ______(2, 10);

6. 结构化程序设计

🌈学习目标

  • 理解三种基本程序结构
  • 学会模块化设计方法
  • 掌握流程图的绘制

6.1 三大基本结构

顺序结构:按部就班,一步接一步

// 就像做作业的步骤
cout << "1. 打开作业本" << endl;
cout << "2. 写名字" << endl;
cout << "3. 开始做题" << endl;
cout << "4. 检查答案" << endl;

分支结构:选择路径,像岔路口

// 就像选择吃什么
if (time == "早上") {
    cout << "吃早餐" << endl;
} else if (time == "中午") {
    cout << "吃午餐" << endl;
} else {
    cout << "吃晚餐" << endl;
}

循环结构:重复操作,像跳绳计数

// 就像跳绳计数
for (int i = 1; i <= 10; i++) {
    cout << "跳了第" << i << "下" << endl;
}

6.2 模块化程序设计

拆拼图类比:大问题拆成小问题

// 大问题:组织生日派对
void prepareFood();     // 准备食物
void decorateRoom();    // 装饰房间
void inviteFriends();   // 邀请朋友

int main() {
    prepareFood();
    decorateRoom(); 
    inviteFriends();
    cout << "派对开始!" << endl;
    return 0;
}

6.3 流程图绘制

基本符号

椭圆形:开始/结束
矩形:处理步骤
菱形:判断选择
箭头线:执行方向
平行四边形:输入输出

绘制规则: 1. 从上到下,从左到右 2. 箭头表示执行方向 3. 判断框有两个出口(是/否) 4. 只有一个开始,一个结束

示例流程图文字描述

[开始]
  ↓
[输入成绩]
  ↓
<成绩>=60?>
  ↓是         否
[输出"及格"] [输出"不及格"]
  ↓
[结束]

🧩小试牛刀

选择题: 1. 程序的三种基本结构不包括: A. 顺序 B. 分支 C. 循环 D. 跳跃

  1. 流程图中的判断框是什么形状? A. 矩形 B. 菱形 C. 椭圆形 D. 平行四边形

  2. 模块化设计就像: A. 拆拼图 B. 吃蛋糕 C. 看电视 D. 跑步

编程填空题: 1. 程序的基本结构是顺序、______和循环

  1. 流程图开始和结束用______形

7. 数组

🌈学习目标

  • 理解数组的概念和用途
  • 学会使用一维和二维数组
  • 掌握数组的遍历和操作

7.1 数组定义与下标

储物柜类比:

// 定义一个能放5个整数的数组(像5个连着的储物柜)
int scores[5]; 

// 给每个"柜子"放东西
scores[0] = 95;  // 第1个柜子放95分
scores[1] = 87;  // 第2个柜子放87分
scores[2] = 92;  // 第3个柜子放92分
scores[3] = 78;  // 第4个柜子放78分  
scores[4] = 85;  // 第5个柜子放85分

重要提醒:数组下标从0开始!

7.2 数组的读入与输出

遍历:逐个访问每个元素

#include <iostream>
using namespace std;

int main() {
    int numbers[5];

    // 输入数组
    cout << "请输入5个数字:" << endl;
    for (int i = 0; i < 5; i++) {
        cin >> numbers[i];
    }

    // 输出数组
    cout << "你输入的数字是:" << endl;
    for (int i = 0; i < 5; i++) {
        cout << numbers[i] << " ";
    }

    return 0;
}

7.3 一维数组综合应用

成绩统计场景

int scores[10] = {95, 87, 92, 78, 85, 90, 88, 76, 94, 82};
int sum = 0, maxScore = scores[0], minScore = scores[0];

// 计算总分和找最高分最低分
for (int i = 0; i < 10; i++) {
    sum += scores[i];
    if (scores[i] > maxScore) maxScore = scores[i];
    if (scores[i] < minScore) minScore = scores[i];
}

double average = sum / 10.0;
cout << "平均分:" << average << endl;
cout << "最高分:" << maxScore << endl;
cout << "最低分:" << minScore << endl;

7.4 二维数组与多维数组

表格类比:

// 3行4列的二维数组,像成绩表
int grade[3][4] = {
    {85, 92, 78, 90},  // 第1个学生的4科成绩
    {88, 76, 95, 82},  // 第2个学生
    {79, 85, 88, 91}   // 第3个学生
};

// 访问第2个学生的第3科成绩
cout << grade[1][2];  // 输出95

魔方类比(三维数组):

int rubiksCube[3][3][3];  // 3×3×3的魔方

🧩小试牛刀

选择题: 1. 数组 int arr[5] 的下标范围是: A. 1-5 B. 0-4 C. 0-5 D. 1-4

  1. arr[0] 表示: A. 最后一个元素 B. 第一个元素 C. 数组大小 D. 第二个元素

  2. 二维数组像: A. 直线 B. 表格 C. 点 D. 圆圈

编程填空题: 1. 定义长度为10的整数数组 int numbers[______];

  1. 遍历数组的for循环 for (int i = 0; i < 10; ______)

8. 字符串的处理

🌈学习目标

  • 理解字符数组和string类的区别
  • 掌握字符串的基本操作
  • 学会字符串的常用处理函数

8.1 字符数组与字符串

字母项链类比:

// 字符数组 - 像一串字母珠子
char name1[10] = "小明"; 

// 逐个字符赋值
char name2[10];
name2[0] = '小';
name2[1] = '明';
name2[2] = '\0';  // 字符串结束标志

8.2 字符数组操作

#include <cstring>  // 字符串函数工具箱

int main() {
    char str1[20] = "Hello";
    char str2[20] = "World";

    // 字符串长度
    int len = strlen(str1);  // 5

    // 字符串复制
    strcpy(str1, str2);  // 现在str1也是"World"

    // 字符串连接
    strcat(str1, "!");   // 现在str1是"World!"

    // 字符串比较
    if (strcmp(str1, str2) == 0) {
        cout << "两个字符串相等" << endl;
    }

    return 0;
}

8.3 string类

文字积木类比:更容易拼接和修改

#include <string>   // string类工具箱
using namespace std;

int main() {
    // 定义和赋值
    string name = "小明";
    string greeting = "你好";

    // 字符串拼接
    string message = greeting + "," + name + "!";
    cout << message;  // 输出:你好,小明!

    // 字符串长度
    int length = name.length();  // 2(中文字符算1个)

    // 字符串比较
    if (name == "小明") {
        cout << "名字正确" << endl;
    }

    return 0;
}

8.4 string类综合应用

#include <iostream>
#include <string>
using namespace std;

int main() {
    string text = "我喜欢学习C++编程";

    // 查找子串
    int pos = text.find("C++");
    if (pos != string::npos) {
        cout << "找到C++在位置:" << pos << endl;
    }

    // 截取子串
    string part = text.substr(5, 6);  // 从第5个开始截取6个字符
    cout << part << endl;  // 输出:C++编程

    // 替换子串
    text.replace(5, 3, "Python");  // 把C++替换成Python
    cout << text << endl;  // 输出:我喜欢学习Python编程

    return 0;
}

🧩小试牛刀

选择题: 1. 字符串结束标志是: A. '\n' B. '\0' C. '0' D. 'end'

  1. string类需要包含哪个头文件? A. B. C. D.

  2. str1 + str2 的作用是: A. 比较 B. 复制 C. 连接 D. 查找

编程填空题: 1. 使用string类定义字符串 ______ name = "小红";

  1. 获取字符串长度 int len = text.______();

9. 函数与递归

🌈学习目标

  • 理解函数的概念和作用
  • 学会定义和调用函数
  • 理解递归的原理

9.1 函数定义与调用

魔法盒子类比:输入→处理→输出

#include <iostream>
using namespace std;

// 定义函数:做一个加法魔法盒
int add(int a, int b) {    // a和b是输入
    int result = a + b;    // 魔法处理
    return result;         // 输出结果
}

int main() {
    // 使用魔法盒
    int sum1 = add(3, 5);   // 输出8
    int sum2 = add(10, 20); // 输出30

    cout << "3+5=" << sum1 << endl;
    cout << "10+20=" << sum2 << endl;

    return 0;
}

9.2 形参与实参

寄快递类比:

// 形参:像收货人信息
void sendMessage(string receiver, string message) {
    cout << "给" << receiver << "发送:" << message << endl;
}

int main() {
    // 实参:像实际填写的快递单
    sendMessage("妈妈", "我放学了");     // 实际参数
    sendMessage("爸爸", "晚上吃什么");   // 实际参数
    return 0;
}

9.3 传值 vs 传引用

复印文件 vs 共享文件

// 传值:复印一份(修改复印件不影响原件)
void changeValue(int x) {
    x = 100;  // 只修改复印件
}

// 传引用:共享原件(修改会影响原件)
void changeReference(int &x) {
    x = 100;  // 修改原件
}

int main() {
    int num = 50;

    changeValue(num);
    cout << num << endl;  // 输出50(原件没变)

    changeReference(num); 
    cout << num << endl;  // 输出100(原件变了)

    return 0;
}

9.4 变量作用范围

班级物品 vs 学校物品

int schoolComputer = 10;  // 全局变量:全校共用

void classActivity() {
    int classChalk = 5;   // 局部变量:只有这个函数能用
    cout << "班级有" << classChalk << "支粉笔" << endl;
    cout << "学校有" << schoolComputer << "台电脑" << endl;
}

void anotherClass() {
    // cout << classChalk << endl;  // 错误!不能访问其他班的粉笔
    cout << schoolComputer << endl; // 可以!全校电脑都能用
}

9.5 递归函数

俄罗斯套娃镜子反射类比:

// 计算n的阶乘:n! = n × (n-1) × ... × 1
int factorial(int n) {
    if (n == 1) {          // 基础情况:最小的套娃
        return 1;
    } else {               // 递归情况:打开套娃
        return n * factorial(n - 1);
    }
}

int main() {
    int result = factorial(5);  // 5! = 5×4×3×2×1 = 120
    cout << "5的阶乘是:" << result << endl;
    return 0;
}

递归执行过程

factorial(5)
= 5 × factorial(4)
= 5 × 4 × factorial(3)  
= 5 × 4 × 3 × factorial(2)
= 5 × 4 × 3 × 2 × factorial(1)
= 5 × 4 × 3 × 2 × 1
= 120

🧩小试牛刀

选择题: 1. 函数返回值的类型在: A. 函数名前面 B. 参数列表 C. 函数体内 D. 不需要

  1. 递归函数必须有: A. 多个参数 B. 基础情况 C. 循环 D. 数组

  2. 局部变量只能在: A. 整个程序 B. 定义它的函数 C. main函数 D. 所有函数

编程填空题: 1. 定义计算平方的函数 int square(int x) { return x ______ x; }

  1. 递归计算1+2+...+n int sum(int n) { if(n==1) return 1; else return n + ______(n-1); }

10. 结构体类型

🌈学习目标

  • 理解结构体的概念
  • 学会定义和使用结构体
  • 掌握结构体数组的应用

10.1 结构体定义与成员访问

学生档案卡类比:

#include <iostream>
#include <string>
using namespace std;

// 定义学生结构体:像设计档案卡片模板
struct Student {
    string name;     // 姓名
    int age;         // 年龄  
    double score;    // 成绩
    string className; // 班级
};

int main() {
    // 创建学生档案
    Student stu1;
    stu1.name = "小明";
    stu1.age = 10;
    stu1.score = 95.5;
    stu1.className = "五年级一班";

    // 访问学生信息
    cout << "姓名:" << stu1.name << endl;
    cout << "年龄:" << stu1.age << endl;
    cout << "成绩:" << stu1.score << endl;
    cout << "班级:" << stu1.className << endl;

    return 0;
}

10.2 结构体数组的定义与应用

班级花名册类比:

// 继续使用上面的Student结构体

int main() {
    // 创建班级花名册(结构体数组)
    Student class1[3] = {
        {"小明", 10, 95.5, "五1班"},
        {"小红", 10, 88.0, "五1班"}, 
        {"小刚", 11, 92.5, "五1班"}
    };

    // 计算班级平均分
    double totalScore = 0;
    for (int i = 0; i < 3; i++) {
        cout << class1[i].name << ":" << class1[i].score << "分" << endl;
        totalScore += class1[i].score;
    }

    double average = totalScore / 3;
    cout << "班级平均分:" << average << endl;

    return 0;
}

结构体的优势

  1. 组织相关数据:把学生信息打包在一起
  2. 代码更清晰stu.scorescores[0] 更易懂
  3. 易于维护:修改学生信息时只需要改一个地方

🧩小试牛刀

选择题: 1. 结构体用于: A. 组织相关数据 B. 循环 C. 计算 D. 输入输出

  1. 访问结构体成员用: A. . B. -> C. , D. ;

  2. 结构体数组像: A. 单个卡片 B. 花名册 C. 数字 D. 字符

编程填空题: 1. 定义点的结构体 struct Point { int x; int ______; };

  1. 访问结构体成员 stu1.______ = "小明";

11. 指针类型(简化版)

🌈学习目标

  • 理解指针的基本概念
  • 了解地址和值的关系
  • 知道指针的简单用法

11.1 指针基本概念

门牌号类比:

#include <iostream>
using namespace std;

int main() {
    int number = 42;      // 变量:像一栋房子
    int *pointer;         // 指针:像门牌号

    pointer = &number;    // &取地址:获得房子的门牌号

    cout << "房子的值:" << number << endl;        // 输出42
    cout << "门牌号:" << pointer << endl;         // 输出地址
    cout << "通过门牌号找到的值:" << *pointer << endl; // *解引用:输出42

    return 0;
}

11.2 指针与数组的关系

储物柜总钥匙类比:

int main() {
    int numbers[5] = {10, 20, 30, 40, 50};
    int *ptr = numbers;   // 数组名就是第一个元素的地址

    cout << "第一个元素:" << *ptr << endl;        // 10
    cout << "第二个元素:" << *(ptr + 1) << endl;  // 20
    cout << "第三个元素:" << *(ptr + 2) << endl;  // 30

    return 0;
}

11.3 字符指针与string类

int main() {
    // 字符指针(C风格字符串)
    const char *name1 = "小明";

    // string类(C++风格字符串)
    string name2 = "小红";

    cout << name1 << endl;  // 输出:小明
    cout << name2 << endl;  // 输出:小红

    // string类更安全更方便!
    return 0;
}

⚠️指针注意事项

  1. 指针必须初始化后才能使用
  2. 不要使用空指针或野指针
  3. 对于初学者,尽量使用string类而不是字符指针

🧩小试牛刀

选择题: 1. 指针存储的是: A. 数值 B. 地址 C. 字符 D. 函数

  1. 取地址运算符是: A. * B. & C. # D. @

  2. 对于字符串,推荐使用: A. 字符指针 B. string类 C. 数组 D. 数字

编程填空题: 1. 定义整数指针 int *ptr = ______number;

  1. 通过指针访问值 cout << ______ptr << endl;

12. 文件及基本读写

🌈学习目标

  • 理解文件的基本概念
  • 学会文件的打开、读写和关闭
  • 掌握文件重定向的简单应用

12.1 文件基本概念

记事本 vs 压缩包类比:

#include <fstream>  // 文件操作工具箱
using namespace std;

// 文本文件:像记事本,内容可读
// 二进制文件:像压缩包,计算机才能读懂

12.2 文件打开、关闭、读写操作

打开笔记本-写字-合上类比:

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    // 打开笔记本(创建输出文件流)
    ofstream outFile("diary.txt");

    // 检查是否成功打开
    if (!outFile) {
        cout << "打开文件失败!" << endl;
        return 1;
    }

    // 写日记
    outFile << "2024年3月20日" << endl;
    outFile << "今天学习了C++文件操作。" << endl;
    outFile << "感觉很有趣!" << endl;

    // 合上笔记本(关闭文件)
    outFile.close();

    cout << "日记保存成功!" << endl;

    // 读取日记
    ifstream inFile("diary.txt");
    string line;

    cout << "读取日记内容:" << endl;
    while (getline(inFile, line)) {
        cout << line << endl;
    }

    inFile.close();

    return 0;
}

12.3 文件重定向的简单应用

#include <iostream>
using namespace std;

int main() {
    int a, b;

    // 正常情况下从键盘输入
    cin >> a >> b;
    cout << "和是:" << a + b << endl;

    return 0;
}

重定向用法(在命令行中):

// 从input.txt读取输入,输出到output.txt
program.exe < input.txt > output.txt

📋文件打开模式

模式 说明 例子
ios::in 读取文件 ifstream file("a.txt");
ios::out 写入文件 ofstream file("a.txt");
ios::app 追加内容 ofstream file("a.txt", ios::app);

🧩小试牛刀

选择题: 1. 文件操作需要包含: A. B. C. D.

  1. 写入文件用: A. ifstream B. ofstream C. cin D. cout

  2. 关闭文件用: A. close() B. end() C. stop() D. finish()

编程填空题: 1. 创建输出文件流 ______ outFile("data.txt");

  1. 写入文件 outFile ______ "Hello";

13. STL模板应用(入门版)

🌈学习目标

  • 了解STL的基本概念
  • 学会使用sort函数排序
  • 认识常用容器

13.1 algorithm库:sort函数

整理玩具类比:

#include <iostream>
#include <algorithm>  // 算法工具箱
using namespace std;

int main() {
    int numbers[5] = {5, 2, 8, 1, 9};

    cout << "排序前:";
    for (int i = 0; i < 5; i++) {
        cout << numbers[i] << " ";
    }
    cout << endl;

    // 排序:像把玩具从小到大排列
    sort(numbers, numbers + 5);

    cout << "排序后:";
    for (int i = 0; i < 5; i++) {
        cout << numbers[i] << " ";
    }
    cout << endl;

    return 0;
}

13.2 常用容器简介

向量(vector):可伸缩的书包

#include <vector>

int main() {
    // 创建一个整数向量(像可伸缩的书包)
    vector<int> scores;

    // 往书包里放东西
    scores.push_back(95);  // 在末尾添加
    scores.push_back(87);
    scores.push_back(92);

    // 查看书包里有多少东西
    cout << "有" << scores.size() << "个成绩" << endl;

    // 访问书包里的东西
    for (int i = 0; i < scores.size(); i++) {
        cout << scores[i] << " ";
    }

    return 0;
}

栈(stack):羽毛球筒(后进先出)

#include <stack>

int main() {
    stack<string> books;

    // 往筒里放羽毛球(压栈)
    books.push("数学书");
    books.push("语文书"); 
    books.push("英语书");

    // 从筒里取羽毛球(弹栈)
    while (!books.empty()) {
        cout << "取出:" << books.top() << endl;
        books.pop();  // 移除最上面的
    }

    return 0;
}

队列(queue):排队买东西(先进先出)

#include <queue>

int main() {
    queue<string> line;

    // 排队
    line.push("小明");
    line.push("小红");
    line.push("小刚");

    // 按排队顺序服务
    while (!line.empty()) {
        cout << "正在服务:" << line.front() << endl;
        line.pop();  // 服务完离开队列
    }

    return 0;
}

🎯STL容器对比

容器 特点 像什么 用途
vector 动态数组 可伸缩书包 需要随机访问
stack 后进先出 羽毛球筒 撤销操作、递归
queue 先进先出 排队 消息处理、任务调度

🧩小试牛刀

选择题: 1. sort函数在哪个头文件? A. B. C. D.

  1. 后进先出的容器是: A. vector B. queue C. stack D. array

  2. push_back() 用于: A. vector B. stack C. queue D. 所有容器

编程填空题: 1. 对数组排序 sort(arr, arr + ______);

  1. 向向量添加元素 scores.______(100);

🎉恭喜完成C++入门学习!

📚学习总结

通过这13个模块的学习,你已经掌握了: - ✅ C++程序的基本结构 - ✅ 各种数据类型和运算 - ✅ 程序流程控制 - ✅ 数组和字符串处理 - ✅ 函数和结构体 - ✅ 文件和STL基础

🚀继续前进的建议

  1. 多练习:编程就像学游泳,要多写代码
  2. 从小项目开始:制作计算器、猜数字游戏等
  3. 不要怕错误:调试是学习的重要部分
  4. 保持好奇心:尝试修改代码看看会发生什么

🌟编程小贴士

编程就像搭积木,一步一步来
错误是好朋友,帮我们学得更好
多动手实践,技能自然提高
快乐编程,创造无限可能!

祝你编程之旅愉快! 🎊