å˜é‡ã€å—ç¬¦ä¸²ã€æ•°å—ã€å¸ƒå°”与基本è¿ç®—
è¿™ä¸€å‘¨æ˜¯è¯æ³•基础的起点。é‡ç‚¹ä¸æ˜¯èƒŒå®šä¹‰ï¼Œè€Œæ˜¯ä¼šé€‰å¯¹æ•°æ®ç±»åž‹ã€å†™å‡ºå¯è¯»è¡¨è¾¾å¼ï¼Œå¹¶é¿å…低级è¿ç®—错误。
å¦å®Œè¿™å‘¨ï¼Œä½ 应该能写出完整的“输入 -> 计算 -> 输出â€ç¨‹åºï¼Œå¹¶èƒ½è§£é‡Šæ¯ä¸ªå˜é‡ä¸ºä»€ä¹ˆè¿™æ ·è®¾è®¡ã€‚
4.1 本周å¦ä¹ 路线
建议顺åºï¼šå˜é‡ä¸Žç±»åž‹ -> å—ç¬¦ä¸²å’Œæ•°å—æ··åˆå¤„ç† -> å¸ƒå°”è¡¨è¾¾å¼ -> è¿ç®—综åˆç»ƒä¹ 。按这æ¡è·¯å¾„å¦ï¼Œé”™è¯¯ä¼šæ›´å°‘。
4.2 å˜é‡ä¸Žç±»åž‹
å˜é‡æ˜¯æ•°æ®å®¹å™¨ï¼Œç±»åž‹å†³å®šå®¹å™¨è§„则。整数计数用 `int`ï¼Œå°æ•°è¿ç®—用 `double`,真å‡çжæ€ç”¨ `bool`,文本用 `string`。类型选错会直接影å“结果。
#include <iostream>
#include <string>
using namespace std;
int main() {
string playerName = "Leo";
int level = 4;
double hp = 98.5;
bool isOnline = true;
cout << playerName << " Lv." << level << " HP=" << hp << "\n";
cout << "在线状æ€: " << isOnline << "\n";
return 0;
}
4.3 基本è¿ç®—与表达å¼
写è¿ç®—时优先ä¿è¯å¯è¯»æ€§ã€‚夿‚表达å¼å°½é‡åŠ æ‹¬å·ï¼Œå¹¶æŠŠå…³é”®ä¸é—´ç»“果拆æˆå˜é‡ï¼Œè°ƒè¯•时会éžå¸¸çœæ—¶é—´ã€‚
double chinese = 86.5;
double math = 91.0;
double english = 78.5;
double total = chinese + math + english;
double average = total / 3.0;
cout << "总分: " << total << "\n";
cout << "å¹³å‡åˆ†: " << average << "\n";
4.4 布尔与比较
`bool` åªæœ‰çœŸå’Œå‡ï¼Œä½†å®ƒæ˜¯åˆ¤æ–é€»è¾‘çš„æ ¸å¿ƒã€‚æ¯å†™ä¸€ä¸ªæ¡ä»¶éƒ½å£å¤´è¯»ä¸€é,å¯ä»¥å¿«é€Ÿå‘现方å‘写åå’Œè¾¹ç•Œé—æ¼ã€‚
double finalAtk = 162.5;
int critRate = 42;
bool isReady = (finalAtk >= 150.0) && (critRate >= 40);
cout << "是å¦è¾¾åˆ°æŽ¨è门槛: " << isReady << "\n";
4.5 深度讲解:类型转æ¢ã€ç²¾åº¦ä¸Žè¾“å…¥æ ¡éªŒ
很多åŒå¦åœ¨è¿™ä¸€å‘¨æœ€å¤§çš„困惑是:“我明明写的是åŒä¸€ä¸ªå…¬å¼ï¼Œä¸ºä»€ä¹ˆç»“果和计算器ä¸ä¸€æ ·ï¼Ÿâ€ç”案通常ä¸åœ¨å…¬å¼æœ¬èº«ï¼Œè€Œåœ¨æ•°æ®ç±»åž‹ã€‚æ¯”å¦‚ä½ å†™ `5 / 2`,如果两个数都是 `int`,结果是 `2`ï¼›å¦‚æžœä½ å†™æˆ `5.0 / 2`ï¼Œç»“æžœæ‰æ˜¯ `2.5`。这就是类型å‚与è¿ç®—时的规则差异。å¦ä¹ C++ çš„å…³é”®ä¸æ˜¯æŠŠè¯æ³•背熟,而是形æˆâ€œå…ˆåˆ¤æ–æ•°æ®ç±»åž‹ï¼Œå†å†™è¡¨è¾¾å¼â€çš„ä¹ æƒ¯ã€‚ä½ å¯ä»¥åœ¨è‰ç¨¿ä¸Šå…ˆå†™ï¼šè¾“入是什么类型ã€ä¸é—´å€¼æ˜¯ä»€ä¹ˆç±»åž‹ã€æœ€åŽè¾“å‡ºæ˜¯ä»€ä¹ˆç±»åž‹ï¼Œè¿™æ ·ä¼šå‡å°‘大é‡éšè”½é”™è¯¯ã€‚
类型转æ¢è¿˜ä¼šå½±å“精度。比如 `double price = 19.99; int x = price;`,`x` ä¼šå˜æˆ `19`ï¼Œå°æ•°è¢«æˆªæ–ã€‚è¿™ä¸ªè¡Œä¸ºä¸æ˜¯ bug,而是è¯è¨€è§„åˆ™ã€‚å¦‚æžœä½ å¸Œæœ›å››èˆäº”å…¥ï¼Œéœ€è¦æ˜¾å¼å¤„ç†ï¼Œè€Œä¸æ˜¯æŒ‡æœ›ç¨‹åºâ€œçŒœåˆ°ä½ çš„æ„图â€ã€‚åŒç†ï¼Œ`bool` 和数å—也能相互转æ¢ï¼š`0` 通常是 `false`ï¼Œéž 0 是 `true`。很多新手在æ¡ä»¶é‡Œè¯¯æŠŠæ•°å—å˜é‡å½“布尔值,导致分支触å‘和预期ä¸ä¸€è‡´ã€‚å»ºè®®ä½ æ¯æ¬¡å†™ `if` æ¡ä»¶æ—¶ï¼Œéƒ½æ˜Žç¡®å†™å‡ºæ¯”较关系,例如 `if (hp > 0)`ï¼Œè€Œä¸æ˜¯å†™æˆ `if (hp)`。代ç å¯è¯»æ€§æé«˜åŽï¼ŒæŽ’错会容易很多。
è¾“å…¥æ ¡éªŒæ˜¯æœ¬å‘¨å¿…é¡»å»ºç«‹çš„å·¥ç¨‹ä¹ æƒ¯ã€‚ç”¨æˆ·è¾“å…¥ä¸ä¸€å®šæŒ‰ä½ çš„ç†æƒ³æƒ…况æ¥ï¼Œå¯èƒ½è¾“入负数ã€è¶…范围值ã€ç”šè‡³æ ¼å¼é”™è¯¯ã€‚如果程åºå®Œå…¨ä¸æ ¡éªŒï¼ŒåŽé¢çš„计算和输出就ä¸å¯ä¿¡ã€‚比如“暴击率â€åº”当在 0 到 100 之间;“ç‰çº§â€ä¸åº”为负;“折扣率â€ä¸åº”超过 1ã€‚ä½ ä¸éœ€è¦ä¸€æ¥åšåˆ°å¤æ‚容错,但至少è¦åšåˆ°â€œå‘现异常 -> æç¤ºåŽŸå› -> ç»ˆæ¢æˆ–é‡è¾“â€ã€‚åªè¦ä½ 建立这个æ„识,åŽç»åšé¡¹ç›®æ—¶ç¨³å®šæ€§ä¼šæ˜Žæ˜¾æå‡ã€‚写完程åºåŽï¼Œè¯·ä¸»åŠ¨ç”¨ä¸‰ç±»è¾“å…¥æµ‹è¯•ï¼šæ£å¸¸è¾“å…¥ã€è¾¹ç•Œè¾“å…¥ã€é”™è¯¯è¾“å…¥ã€‚åªæœ‰ä¸‰ç±»éƒ½è¿‡äº†ï¼Œç¨‹åºæ‰ç®—真æ£å¯ç”¨ã€‚
#include <iostream>
using namespace std;
int main() {
double originalPrice = 0.0;
double discountRate = 0.0;
cout << "请输入原价和折扣率(0~1): ";
cin >> originalPrice >> discountRate;
if (originalPrice < 0) {
cout << "原价ä¸èƒ½ä¸ºè´Ÿæ•°ã€‚\n";
return 0;
}
if (discountRate < 0 || discountRate > 1) {
cout << "折扣率必须在 0 到 1 之间。\n";
return 0;
}
double finalPrice = originalPrice * (1.0 - discountRate);
cout << "折åŽä»·: " << finalPrice << "\n";
return 0;
}
4.6 å¦ä¹ 方法:把“会åšé¢˜â€å‡çº§æˆâ€œä¼šå»ºæ¨¡â€
è¿™ä¸€å‘¨ä½ å¯ä»¥å¼€å§‹è®ç»ƒä¸€ä¸ªçœŸæ£èƒ½é•¿æœŸå—益的方法:先建模,å†ç¼–ç ã€‚æ‰€è°“å»ºæ¨¡ï¼Œä¸æ˜¯å¤æ‚æ•°å¦ï¼Œè€Œæ˜¯æŠŠé—®é¢˜æ‹†æˆä¸‰ä¸ªæ¸…晰部分:输入ã€å¤„ç†ã€è¾“出。比如“è´ç‰©æ€»ä»·è®¡ç®—器â€ï¼Œè¾“入是商å“å•ä»·ã€æ•°é‡ã€æŠ˜æ‰£çŽ‡ï¼›å¤„ç†æ˜¯å…ˆç®—原价,å†ç®—折åŽä»·ï¼Œå†åŠ ç¨Žï¼›è¾“å‡ºæ˜¯æœ€ç»ˆåº”ä»˜é‡‘é¢ã€‚åªè¦ä½ 先写出这三行,代ç å°±ä¸ä¼šä¹±ã€‚å过æ¥ï¼Œå¦‚果一上æ¥ç›´æŽ¥æ•²ä»£ç ,常常写到一åŠå‘现å˜é‡ä¸å¤Ÿã€é€»è¾‘冲çªã€ç»“果异常,最åŽåªèƒ½åå¤é‡å†™ã€‚
å»ºè®®ä½ æ¯ä¸ªå°é¢˜éƒ½å›ºå®šç”¨åŒä¸€æµç¨‹ï¼šç¬¬ä¸€æ¥ï¼Œå†™å˜é‡è¡¨ï¼ˆå˜é‡åã€ç±»åž‹ã€å«ä¹‰ã€åˆå§‹å€¼ï¼‰ï¼›ç¬¬äºŒæ¥ï¼Œå†™ä¼ªä»£ç (自然è¯è¨€æ¥éª¤ï¼‰ï¼›ç¬¬ä¸‰æ¥ï¼Œå†ç¿»è¯‘æˆ C++。这个æµç¨‹çœ‹èµ·æ¥æ…¢ï¼Œä½†å®ƒä¼šæžå¤§é™ä½Žè¿”工率。尤其是当题目ç¨å¤æ‚时,结构化æ¥éª¤ä¼šè®©ä½ ä¿æŒæ¸…æ™°ã€‚ä½ è¿˜å¯ä»¥åœ¨æ¯ä¸ªå…³é”®æ¥éª¤åŽç«‹åˆ»æ‰“å°ä¸é—´å€¼ï¼Œæ£€æŸ¥ç¨‹åºæ˜¯å¦æŒ‰é¢„期推进。ä¸è¦æŠŠâ€œæ‰“å°è°ƒè¯•â€çœ‹æˆåˆå¦è€…手段,它其实是éžå¸¸ä¸“业ã€éžå¸¸é«˜æ•ˆçš„éªŒè¯æ–¹å¼ã€‚
æœ€åŽæ˜¯å¤ç›˜ã€‚æ¯æ¬¡å†™å®Œç»ƒä¹ ,花 5 分钟回ç”三个问题:我这次最容易错在哪?我下次如何æå‰é¿å…?我能å¦ç”¨æ›´æ¸…æ™°çš„å˜é‡åé‡å†™ä¸€æ¬¡ï¼Ÿè¿™ä¸ªå°å¤ç›˜ä¼šè®©ä½ è¿›æ¥é€Ÿåº¦è¿œè¶…“åªåˆ·é¢˜ä¸æ€»ç»“â€ã€‚编程å¦ä¹ 䏿˜¯ä¸€æ¬¡æ€§è®°å¿†ï¼Œè€Œæ˜¯ä¸æ–把ç»éªŒæ²‰æ·€æˆä¹ 惯。第二阶段第4å‘¨çœ‹ä¼¼åŸºç¡€ï¼Œä½†å®ƒå†³å®šäº†ä½ åŽé¢å†™å¾ªçޝã€å†™å‡½æ•°ã€å†™å®¹å™¨æ—¶æ˜¯å¦ç¨³å®šã€‚å¦‚æžœä½ çŽ°åœ¨å°±æŠŠç±»åž‹æ„è¯†ã€æ ¡éªŒæ„识ã€å¯è¯»æ€§æ„识建立起æ¥ï¼ŒåŽé¢çš„å¦ä¹ 会轻æ¾å¾ˆå¤šã€‚
4.7 è¯¾å ‚é—®ç”与进阶练ä¹
问:为什么我把 `int` æ”¹æˆ `double` åŽï¼Œç»“果更“åƒäººè¯â€äº†ï¼Ÿ å› ä¸º `int` åªä¿å˜æ•´æ•°ï¼Œå‚与è¿ç®—时会截æ–å°æ•°ï¼›`double` æ‰èƒ½è¡¨è¾¾å°æ•°ç²¾åº¦ã€‚很多“结果差一点â€çš„问题,本质都æ¥è‡ªç±»åž‹ä¸åŒ¹é…ã€‚ä½ å¯ä»¥æŠŠç±»åž‹å½“æˆâ€œç²¾åº¦è®¸å¯â€ï¼š`int` åªè®¸å¯æ•´æ•°ï¼Œ`double` 许å¯å°æ•°ã€‚
问:什么时候应该用 `bool` å˜é‡ï¼Œè€Œä¸æ˜¯æŠŠæ¡ä»¶ç›´æŽ¥å†™è¿› `if`? 当æ¡ä»¶æ¯”较长ã€ä¼šé‡å¤ä½¿ç”¨ã€æˆ–è€…ä½ æƒ³æå‡å¯è¯»æ€§æ—¶ï¼Œå°±è¯¥ç”¨ `bool` ä¸é—´å˜é‡ã€‚例如 `bool isInputValid = age >= 1 && age <= 120;` è¿™å¥æœ¬èº«å°±æ˜¯å¯è¯»æ³¨é‡Šã€‚ä½ åŽé¢å†™ `if (isInputValid)`,代ç 会更清晰,也更容易调试。
é—®ï¼šä¸ºä»€ä¹ˆæˆ‘æ¯æ¬¡éƒ½èƒ½â€œè·‘通â€ï¼Œä½†ä¸€æ¢æ•°æ®å°±é”™ï¼Ÿ è¿™æ˜¯å› ä¸ºä½ åªæµ‹äº†ç†æƒ³è¾“å…¥ï¼Œæ²¡æœ‰æµ‹è¾¹ç•Œå’Œå¼‚å¸¸è¾“å…¥ã€‚å»ºè®®ä½ ä»ŽçŽ°åœ¨å¼€å§‹å›ºå®šä¸‰ç±»æµ‹è¯•ï¼šæ£å¸¸å€¼ã€ä¸´ç•Œå€¼ã€é”™è¯¯å€¼ã€‚比如折扣率题目ä¸ï¼Œè‡³å°‘测试 `0`ã€`1`ã€`-0.1`ã€`1.1`。如果程åºåœ¨è¿™å››ç±»è¾“入都行为å¯è§£é‡Šï¼Œå¯é 性就会大幅æå‡ã€‚
è¿›é˜¶ç»ƒä¹ å»ºè®®ï¼šå†™ä¸€ä¸ªâ€œä½“èƒ½è¯„åˆ†è®¡ç®—å™¨â€ã€‚è¾“å…¥è·‘æ¥æˆç»©ã€ä»°å§èµ·åæ•°é‡å’Œé™„åŠ åŠ åˆ†ï¼Œè¾“å‡ºæ€»åˆ†ä¸Žç‰çº§ã€‚è¦æ±‚: 第一,所有输入都åšèŒƒå›´æ ¡éªŒï¼›ç¬¬äºŒï¼Œæ‰€æœ‰ä¸é—´ç»“果都拆æˆå˜é‡å¹¶æ‰“å°ï¼›ç¬¬ä¸‰ï¼Œè‡³å°‘准备 8 ç»„æµ‹è¯•ï¼Œå…¶ä¸ 3 组为异常输入。完æˆåŽå†åšä¸€æ¬¡é‡æž„ï¼šæŠŠâ€œæ ¡éªŒé€»è¾‘â€å•独å°è£…æˆå‡½æ•°ï¼Œæå‰ä¸ºç¬¬6周函数å¦ä¹ åšé“ºåž«ã€‚
å¦‚æžœä½ æƒ³æ›´è¿›ä¸€æ¥ï¼Œå¯ä»¥ç»™ç¨‹åºå¢žåŠ â€œæ‰¹é‡è¾“入模å¼â€ï¼šè¿žç»å½•å…¥ 5 ååŒå¦æ•°æ®ï¼Œè¾“出æ¯äººçš„æ€»åˆ†ï¼Œå¹¶ç»Ÿè®¡å¹³å‡åˆ†ã€‚è¿™ä¸ªæŒ‘æˆ˜ä¼šè®©ä½ æŠŠæœ¬å‘¨çŸ¥è¯†å’Œä¸‹å‘¨æŽ§åˆ¶æµçŸ¥è¯†è¿žæŽ¥èµ·æ¥ï¼Œå½¢æˆè¿žç»å¦ä¹ é“¾è·¯ã€‚ä½ ä¼šä½“ä¼šåˆ°ï¼šç¼–ç¨‹èƒ½åŠ›ä¸æ˜¯ä¸€èŠ‚è¯¾çªç„¶å¦ä¼šï¼Œè€Œæ˜¯æ¯å‘¨æŠŠä¸€ä¸ªå°èƒ½åŠ›åŽ‹å®žã€‚
4.8 æœ¬å‘¨ç»ƒä¹ ä¸Žè‡ªæµ‹æ¸…å•
本周练ä¹
- 完æˆâ€œè§’色属性计算器â€ï¼ˆåŸºç¡€æ”»å‡»åŠ› + åŠ æˆ + 门槛判æ–)。
- å†å†™ä¸€ä¸ªâ€œè´ç‰©æ€»ä»·è®¡ç®—器â€ï¼ˆæŠ˜æ‰£ + 税率)。
- æ¯ä¸ªç¨‹åºè‡³å°‘测试 5 组输入。
自测清å•
- å˜é‡ç±»åž‹æ˜¯å¦é€‰æ‹©åˆç†ã€‚
- è¡¨è¾¾å¼æ˜¯å¦æ¸…晰易读。
- 是å¦è¦†ç›–æ£å¸¸å€¼ã€è¾¹ç•Œå€¼ã€å¼‚常值。
- 我能讲清程åºè®¡ç®—过程。
补充å¤ç›˜å»ºè®®ï¼šæŠŠä½ 本周最常è§çš„ 3 个错误写æˆâ€œä¸ªäººæŽ’错清å•â€ï¼Œä¸‹æ¬¡å¼€å†™å‰å…ˆå¯¹ç…§ä¸€é。这个动作会显著é™ä½Žé‡å¤çŠ¯é”™æ¦‚çŽ‡ã€‚