CSP-J教程——第一阶段——第三课:基本的输入与输出
课程目标
- 掌握使用
cin从键盘读取输入 - 掌握使用
cout输出数据到屏幕 - 学习格式化输出技巧
- 能够编写交互式程序
- 理解输入输出中的常见问题及解决方法

第一部分:输出流cout(复习与加深)
1.1 基本输出回顾
我们已经知道使用cout和<<运算符可以输出数据
#include <iostream>
using namespace std;int main() {cout << "Hello, World!" << endl;cout << "This is a number: " << 42 << endl;return 0;
}
1.2 输出多个数据
可以在一行中输出多个数据,用<<连接
int age = 12;
double height = 1.65;
cout << "Age: " << age << ", Height: " << height << " meters" << endl;
1.3 特殊字符的输出
有些字符需要特殊方式输出
cout << "引号: \"Hello\"" << endl; // 输出:引号: "Hello"
cout << "反斜杠: C:\\Program Files" << endl; // 输出:反斜杠: C:\Program Files
cout << "换行符: 第一行\n第二行" << endl; // \n 也用于换行
cout << "制表符: 姓名\t年龄\t成绩" << endl; // \t 用于对齐
第二部分:输入流cin
2.1 基本输入
使用cin和>>运算符从键盘读取数据
#include <iostream>
using namespace std;int main() {int age;cout << "请输入你的年龄: ";cin >> age;cout << "你的年龄是: " << age << endl;return 0;
}
2.2 读取多个数据
可以连续使用>>读取多个数据
#include <iostream>
using namespace std;int main() {int a, b;cout << "请输入两个整数,用空格隔开: ";cin >> a >> b;cout << "你输入的两个数是: " << a << " 和 " << b << endl;cout << "它们的和是: " << a + b << endl;return 0;
}
2.3 读取不同类型的数据
cin会根据变量的类型自动转换输入数据
#include <iostream>
using namespace std;int main() {int age;double height;char grade;string name;cout << "请输入姓名、年龄、身高和等级: ";cin >> name >> age >> height >> grade;cout << "=== 学生信息 ===" << endl;cout << "姓名: " << name << endl;cout << "年龄: " << age << endl;cout << "身高: " << height << endl;cout << "等级: " << grade << endl;return 0;
}
2.4 字符串输入的特殊性
cin读取字符串时以空格为分隔符
#include <iostream>
#include <string>
using namespace std;int main() {string firstName, lastName;cout << "请输入姓和名(用空格分开): ";cin >> firstName >> lastName;cout << "你的全名是: " << firstName << " " << lastName << endl;return 0;
}
第三部分:格式化输出
3.1 使用iomanip头文件
需要包含<iomanip>头文件来使用格式化功能
#include <iostream>
#include <iomanip> // 格式化输出所需的头文件
using namespace std;
3.2 设置输出宽度(setw)
setw(n)设置下一个输出项的宽度为n个字符
#include <iostream>
#include <iomanip>
using namespace std;int main() {cout << "默认输出:" << endl;cout << "Apple" << 5 << endl;cout << "Banana" << 3 << endl;cout << "\n设置宽度后:" << endl;cout << setw(10) << "Apple" << setw(5) << 5 << endl;cout << setw(10) << "Banana" << setw(5) << 3 << endl;return 0;
}
3.3 设置对齐方式
left:左对齐right:右对齐(默认)
#include <iostream>
#include <iomanip>
using namespace std;int main() {cout << "左对齐:" << endl;cout << left << setw(10) << "Apple" << setw(5) << 5 << endl;cout << left << setw(10) << "Banana" << setw(5) << 3 << endl;cout << "\n右对齐:" << endl;cout << right << setw(10) << "Apple" << setw(5) << 5 << endl;cout << right << setw(10) << "Banana" << setw(5) << 3 << endl;return 0;
}
3.4 设置浮点数精度(setprecision)
setprecision(n)设置浮点数输出的精度
#include <iostream>
#include <iomanip>
using namespace std;int main() {double pi = 3.1415926535;double price = 19.99;cout << "默认精度:" << endl;cout << "π = " << pi << endl;cout << "价格 = " << price << endl;cout << "\n设置精度为4:" << endl;cout << fixed << setprecision(4);cout << "π = " << pi << endl;cout << "价格 = " << price << endl;return 0;
}
3.5 设置填充字符(setfill)
setfill(char)设置填充字符
#include <iostream>
#include <iomanip>
using namespace std;int main() {int num = 123;cout << "默认填充(空格):" << endl;cout << "[" << setw(10) << num << "]" << endl;cout << "用*填充:" << endl;cout << "[" << setw(10) << setfill('*') << num << "]" << endl;cout << "用-填充并左对齐:" << endl;cout << left << setw(10) << setfill('-') << num << endl;return 0;
}
第四部分:综合应用示例
4.1 学生成绩管理系统
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;int main() {string name;int chinese, math, english;// 输入学生信息cout << "=== 学生成绩录入系统 ===" << endl;cout << "请输入学生姓名: ";cin >> name;cout << "请输入语文成绩: ";cin >> chinese;cout << "请输入数学成绩: ";cin >> math;cout << "请输入英语成绩: ";cin >> english;// 计算总分和平均分int total = chinese + math + english;double average = total / 3.0;// 格式化输出成绩单cout << "\n=== 成绩单 ===" << endl;cout << fixed << setprecision(2);cout << left << setw(8) << "姓名" << ": " << name << endl;cout << left << setw(8) << "语文" << ": " << chinese << "分" << endl;cout << left << setw(8) << "数学" << ": " << math << "分" << endl;cout << left << setw(8) << "英语" << ": " << english << "分" << endl;cout << left << setw(8) << "总分" << ": " << total << "分" << endl;cout << left << setw(8) << "平均分" << ": " << average << "分" << endl;return 0;
}
4.2 购物小票打印
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;int main() {string item1, item2;double price1, price2;int quantity1, quantity2;// 输入商品信息cout << "请输入第一种商品名称: ";cin >> item1;cout << "请输入" << item1 << "的价格: ";cin >> price1;cout << "请输入" << item1 << "的数量: ";cin >> quantity1;cout << "请输入第二种商品名称: ";cin >> item2;cout << "请输入" << item2 << "的价格: ";cin >> price2;cout << "请输入" << item2 << "的数量: ";cin >> quantity2;// 计算金额double total1 = price1 * quantity1;double total2 = price2 * quantity2;double grandTotal = total1 + total2;// 打印小票cout << "\n" << string(40, '=') << endl;cout << " 购物小票" << endl;cout << string(40, '=') << endl;cout << fixed << setprecision(2);cout << left << setw(15) << "商品名称" << setw(8) << "单价" << setw(8) << "数量" << setw(10) << "小计" << endl;cout << string(40, '-') << endl;cout << left << setw(15) << item1<< "¥" << setw(7) << price1<< setw(8) << quantity1<< "¥" << setw(7) << total1 << endl;cout << left << setw(15) << item2<< "¥" << setw(7) << price2<< setw(8) << quantity2<< "¥" << setw(7) << total2 << endl;cout << string(40, '-') << endl;cout << left << setw(31) << "总计" << "¥" << grandTotal << endl;cout << string(40, '=') << endl;return 0;
}
第五部分:常见问题与调试
5.1 输入缓冲区问题
问题: 混合输入数字和字符串时可能出现问题
#include <iostream>
#include <string>
using namespace std;int main() {int age;string name;cout << "请输入年龄: ";cin >> age;// 这里可能会有问题!cout << "请输入姓名: ";cin >> name; // 可能会直接跳过输入cout << "年龄: " << age << ", 姓名: " << name << endl;return 0;
}
解决方法: 使用cin.ignore()清除缓冲区
cout << "请输入年龄: ";
cin >> age;cin.ignore(); // 清除缓冲区中的换行符cout << "请输入姓名: ";
getline(cin, name); // 可以读取包含空格的字符串
5.2 输入类型不匹配
问题: 输入的数据类型与变量类型不匹配
int number;
cout << "请输入一个整数: ";
cin >> number; // 如果输入字母,会导致错误
解决方法: 检查输入是否成功
int number;
cout << "请输入一个整数: ";
if (cin >> number) {cout << "输入成功: " << number << endl;
} else {cout << "输入错误!" << endl;cin.clear(); // 清除错误状态cin.ignore(1000, '\n'); // 忽略错误的输入
}
练习与作业
基础练习(必做)
练习1:个人信息收集器
编写程序收集用户的个人信息并格式化输出:
- 姓名
- 年龄
- 身高
- 体重
- 喜欢的颜色
要求输出时对齐,数字保留合适的小数位数。
练习2:简单计算器
编写一个交互式计算器:
- 用户输入两个数字
- 程序计算并输出它们的和、差、积、商
- 商要保留2位小数
练习3:成绩转换器
编写程序将百分制成绩转换为等级:
- 90-100: A
- 80-89: B
- 70-79: C
- 60-69: D
- 0-59: E
要求用户输入成绩,程序输出对应的等级。
挑战练习(选做)
挑战1:BMI计算器
编写程序计算身体质量指数(BMI):
- 公式:BMI = 体重(kg) / 身高(m)²
- 根据BMI值给出健康建议
- 输出格式要美观
挑战2:时间转换器
编写程序进行时间单位转换:
- 将秒转换为时:分:秒格式
- 用户输入总秒数
- 程序输出格式如:3723秒 = 1小时2分3秒
挑战3:格式化表格输出
编写程序输出乘法表,要求:
- 使用格式化输出使表格对齐
- 输出9×9乘法表
- 表格要有边框线
实验任务
任务1:输入缓冲区实验
测试以下情况,记录结果:
- 输入数字后立即输入字符串
- 使用
cin.ignore()后的效果 - 混合使用
cin >>和getline()
任务2:格式化输出实验
尝试不同的格式化组合:
- 不同宽度和对齐方式的组合
- 不同精度设置
- 不同填充字符
任务3:错误处理实验
故意输入错误的数据类型,观察程序行为,并测试错误处理代码的效果。
学习总结
今天学到了:
- ✅ 使用
cin从键盘读取各种类型的数据 - ✅ 使用
cout进行格式化输出 - ✅ 设置输出宽度、对齐方式、精度和填充字符
- ✅ 处理输入输出中的常见问题
- ✅ 编写交互式程序
关键技能:
- 基本输入:
cin >> 变量 - 基本输出:
cout << 数据 - 格式化输出:
setw,setprecision,left/right,setfill - 特殊字符:
\n,\t,\",\\ - 错误处理:
cin.ignore(),cin.clear()
下一课预告:
下一节课我们将学习算术与逻辑运算,包括各种运算符和表达式,让程序能够进行复杂的计算和逻辑判断!
