以下为个人学习笔记和习题整理
课程:计算机程序设计(C++)- 西安交通大学 @ 中国大学 MOOC
https://www.icourse163.org/course/XJTU-46006
# 课堂笔记
# 计算机语言的分类
“翻译” 的两种方式:
编译型语言:
一次将编写的整个程序 "翻译" 成机器语言的指令,保存成文件,以后执行不再 “翻译”,只要执行翻译过的文件就行了。
如:Fortran、C、C++、Pascal 等。解释型语言:
翻译一句执行一句,直到执行完所有命令,或遇到错误。
如:Basic、ASP、PHP、Python、Java 等。
编译型语言编程的步骤:
graph LR | |
subgraph 1 | |
A | |
E | |
end | |
subgraph 2 | |
B | |
F | |
end | |
subgraph 3 | |
C | |
G | |
end | |
A --> B | |
B --> C | |
E --> F | |
F --> G | |
G["可执行文件.exe"] | |
F["目标文件.obj"] | |
E["源文件.cpp"] | |
C["连接"] | |
B["编译"] | |
A["编辑"] |
# C++ 程序的结构
#include<iostream> // 编译预处理 包含基本输入输出库头文件 | |
using namespace std; // 使用标准库名字空间 | |
int main() /* 主函数 */ | |
{ | |
cout<<"Hello World"; | |
cout<<"Hello C++"<<endl; | |
return 0; | |
} |
# 实例
# 输入输出字符串
- 实例:生日贺卡
#include<iostream> | |
using namespace std; | |
int main() | |
{ | |
char name1[50],name2[50]; | |
cin.getline(name1,50); | |
cin.getline(name2,50); | |
cout<<"######################################"<<endl; | |
cout<<name1<<endl; | |
cout<<endl; | |
cout<<"Happy birthday to you!"<<endl; | |
cout<<endl; | |
cout<<" sincerely yours "<<name2<<endl; | |
cout<<"######################################"<<endl; | |
return 0; | |
} |
要点总结
- 显示字符串常量
cout<<"***************"; |
- 用符号表示字符串
char str[50]; | |
//str 可以表示长度不超过 50 的一串字符 |
第 2 章,将知道 str 称为字符数组
- 输入字符串
cin>>str; // 输入一个词 | |
cin.getline(str,50); // 输入一行 |
- 输出字符串
cout<<str; |
# 变量声明和四则运算
- 实例:加法计算器
编写程序,计算两个整数的和。
#include<iostream> | |
using namespace std; | |
int main() | |
{ | |
int a,b,c; // 说明用分别 a | |
//int a,b; //× 变量不能重复声明 | |
cin>>a>>b; // 输入 a,b 的值 | |
c=a+b; // 计算 a,b 的和 | |
cout<<c<<endl;// 显示结果 c 的值 | |
return 0; | |
} |
要点总结
- 变量的声明
int a,b,c; // 声明整型变量 | |
double da, db, dc; // 声明双精度变量 | |
int d; | |
int e; |
C++ 中一个符号只能说明一次,而且先声明,后使用。
- 输入 cin
cin>>a>>b; | |
cin>>a; | |
cin>>b; |
- 运算
加法+
,减法-
, 乘法*
,除法/
,求余%
c=128%10; // 百分号两边的数必须是整数 |
# 数学函数和 while 循环
- 实例:计算存款本息
编写程序,计算银行存款本息。
用户输入存款金额money
, 存款期years
和年利率rate
,根据公式
计算到期存款本息。
#include<iostream> | |
#include<cmath> // 数学函数包含在头文件 cmath 中 | |
using namespace std; | |
int main() { | |
double money,years,rate,sum;// 声明变量 | |
cout<< "请输入本金、存款年限和利息,用空格隔开 "<<endl;// 输入提示 | |
cin>>money>>years>>rate;// 输入 | |
while(money>0) | |
{ | |
sum=money*pow((1+rate),years);// 计算 | |
cout<< "本息共 ";// 输出提示 | |
cout<<sum<<endl;// 显示 | |
cout<< "请输入本金、存款年限和利息,用空格隔开 "<<endl;// 再次输入提示 | |
cin>>money>>years>>rate;// 再次输入 | |
} | |
return 0; | |
} |
要点总结
- 数学函数的使用
#include<cmath> |
乘方: pow(x,y)
正弦: sin(x)
余弦: cos (x)
正切: tan (x)
, 三角函数的角度单位 x 均为弧度
: exp(x)
: log(x)
e 为底
: log10(x)
10 为底
平方根: sqrt(x)
绝对值: fabs(x)
函数名字母均小写
自变量均为双精度实数, 结果也是双精度实数
- 循环,有条件地重复执行一段程序
while(<条件>) | |
{ | |
<循环体> | |
} |
- 编程的好习惯:给用户提示
# C++ 程序的基本要素
# 标识符
- 标识符:程序中变量、类型、函数和标号的名称。
a,b,name,int, char,main,void 等 - 关键字:系统已有的标识符
常见关键字:- using, namespace, void, return
- int, float, double, char, bool, signed, unsigned, long, short ,const , true, false, sizeof
- if, else, for, do, while, switch, case, continue, break
- class, struct, private, public, this, new, delete
- 自定义标识符:自己给变量、函数等起的名字。
命名规则:- 由字母、数字和下划线组成
- 第 1 个符号不能是数字
- 长度:不同编译器规定不同,但至少识别前 6 个
字符,有的长度可达 32 个字符,甚至更长。 - 区分大小写(大小写敏感)
int a,b,c; | |
int A,B,C; | |
double a1,b2,c3; | |
double table_width, table_height; | |
char _name[40], _address[100]; | |
int 1a,2b,3c; //× 不合法的标识符 |
# 变量和常量
- 变量:表示的数据可以改变的符号。
int a; | |
char name[40]; | |
a=5; | |
cout<<a<<endl; | |
a=a+5; | |
cout<<a<<endl; | |
cin>>name; | |
cout<<name<<endl; |
- 常量:直接写出的数据,以及表示的数据不能改变的符号。
cout<<"Hello world"<<endl; | |
cout<<5+3<<endl; |
# 运算符和表达式
- 运算符:表示运算的符号
- 算术运算符
+
-
*
/
%
- 比较运算符
>
<
>=
<=
- 算术运算符
- 表达式:表示运算的式子
- 可以是一个变量、一个常量
a
b
5
- 也可以是用运算符将变量、常量连接起来
3+5
a+b
a>b
- 还可以是用运算符将表达式连接起来的式子
(a+b)*(a-b)
- 表达式中使用圆括号可以改变运算的优先级。括号中的运算比括号外的优先计算。
- 可以是一个变量、一个常量
# 语句
- 语句是一个表达完整的命令
- C++ 中,语句的标志就是分号
;
,而不是等号。一个式子后面写上分号,就是一条语句。
int a,b,c;// 这是一个说明语句,说明用 a,b 表示整数 | |
a+b // 这是一个表达式,虽然能表达求和运算,但运算结果并没有说明如何处理 | |
c=a+b; // 语句,计算 a 和 b 的和,将结果存入 c 中 | |
a+b; // 在 C++ 中也是语句,但这个语句没什么作用 | |
a; // 也是语句,也没什么作用 | |
;;; // 这是 3 条语句,什么也没有,什么也不做,空语句 | |
c=a+b // 虽然有等号,但没有分号,也不是语句 |
- 等号也是运算符,等号连接起来的式子是表达式,如
c=a+b
- 只有加上分号,才是语句
c=a+b;
- 等号的左边必须是变量
5=3
(a+b)=c+d
×a+(b=c+d)
a+(b=c)+d
√
# 输入和输出
- 输入
cin
cin>>v1>>V2>>V3>>V4;//cin 输入流对象 >> 提取运算符 | |
int a,b,c; | |
cin>>a; | |
cin>>b; | |
cin>>c; | |
cin>>a>>b>>c; |
- 输出
cout
cout<<v1<<v2<<v3<<v4;//cout 输出流对象 << 插入运算符 | |
cout<<a; | |
cout<<" "<<b<<" "<<c<<"<<" sum:"<<a+b+c<<endl; |
# 函数
能完成一定功能的有名的程序序列,是组成 C++ 程序的基本单位。
- main 函数
int main() | |
{ | |
int a,b; | |
cin>>a>>b; cout<<a+b<<endl; return 0; | |
} |
系统函数
sin(x)
,cos(x)
,exp(x)
,sqrt(x)
自定义函数
# 课堂讨论
- 自然语言和计算机语言有哪些相似和不同之处?
机器语言与自然语言一样,都具有一定的语法,文法,逻辑规则等。
不同点有:
- 自然语言是人与人交流的工具,它具有多义性,模糊性,依托人的常识。
- 机器语言是计算机能理解的语言,它使计算机按一定的模式工作,依托处理器所支持的指令。
比起自然语言,计算机要求更加精准的语法与逻辑规则。
错误的输入,如笔误或缺失或多出某些字是不可行的,或者会使得计算机执行的结果错误。
- 编译型语言执行效率高还是解释型语言执行效率高?
编译型语言的源代码编译成的机器语言会被保存下来,下次执行时就不需要再编译一次,而是直接执行保存的机器语言,执行效率更高。
解释型语言则翻译一句执行一句,直到命令全部执行完或出现错误,不具有高效性,但是利于人理解。
- 为什么 C++ 的 main 函数要唯一?
main 函数是主函数,是程序执行的起点。作为程序的执行入口,如果不唯一,那么程序就找不到执行的入口来运行程序,多入口程序不仅会导致程序混乱,而且还会增加内存负担。
- 为什么使用
cin.getline()
输入的时候每输入一个数据要回车?而使用cin>>
输入可以一行数据多个数据?
cin.getline()
,可以理解为按行输入,以回车为输入的分界符,当输入完一个数据时需要回车。cin>>
,可以理解为按词输入,以空格、回车或 tab 键作为分界符,输入完一个数据以空格分开就行,可以输入在一行。
# 随堂测验
C++ 是一种 计算机语言。
编写 C++ 程序的一般步骤依次是 。
下列哪行程序的作用是在屏幕上显示 “Hello world” 这句话。
C++ 中的 main () 函数有且只能有一个。
main 函数的书写中,main 后面紧跟一对圆括号,里面可以什么都不写,再后面是一对大括号,其中写程序。
设在程序中用 address 表示通信地址,说明为
char address[100];
若想输入象 "No.28, Xian Ning Xi Road" 这样(单词间有空格)的地址,应该使用下列哪个语句?若想用 width 和 height 表示屏幕的宽度和高度(单位:像素,整数),在 C++ 中使用下列哪个语句来声明?
C++ 中使用数学函数,需要包含的头文件是 。
C++ 中的每一条语句后面都必须写分号。
C++ 中使用变量,必须先声明,后使用。
# 单元测试
下列哪项不是 C++ 的语句?
语句末尾必须有分号。常量、变量、表达式末尾加分号也是语句。
直接一个分号也是语句 —— 空语句。空语句可以增加程序的可读性,可以作为待写的函数体、循环体、语句块。设整型变量 a,b,c 已经声明,下列哪项语句的顺序是正确的?
一般计算的顺序是输入、计算、输出。
下列哪个符号不是 C++ 的关键字?
语言已经规定其意义的符号,一般是关键字。其他的都见过,有特殊意义了。
下列哪个不是 C++ 合法的标识符?
表示符必须以字母或下划线开始,由字母、数字和下划线组成。
C++ 程序中
cout<<endl;
的作用是 。实际是用符号表示数据,是换行符。
英文单词 terminating 的含义是 。
虽不是英语课,编程不免遇到英文,遇到不会的词及时查一查,一学英语,二解问题,以后遇到,不再困惑。
C++ 中变量的名字只能用一个字母表示。
数学中的变量习惯上是一个字母,而程序中的变量可是一串字符,只要符合标识符的命名规则。就是用符号代替数据,是一个代号,不限一个,甚至可以比较长,如 6-32 个等。
一行程序中,如果连续写了两个分号,编译时会出错。
连续写两个分号,第 2 个分号就是一条空语句,空语句实际是什么也不做,语法是正确的,编译不会出错。
空语句可以增加程序的可读性,可以作为待写的函数体、循环体、语句块。所以,空语句是可以有用的。C++ 中使用变量,必须先声明。
这是语法规定
C++ 中的输入可以使用 cin,一个 cin 可以输入多项数据,每项前面加两个大于号。
cin>>a>>b;
就是一例。
# 编程作业
# 题目 1. 我爱 C++(20 分)
题目内容
在屏幕上显示下列两句话Hello C++.
I like programming.提示:本题与 helloworld 类似,只是显示多行信息。
输入格式
无输出格式
两行,单词间一个空格,行末标点为英文句点,每行末尾均有句点,前面没有空格,大小写严格按给出的写,均为英文符号。输入样例
输出样例
Hello C++.
I like programming.
# 解题代码
#include<iostream> | |
using namespace std; | |
int main() | |
{ | |
cout<<"Hello C++."<<endl; | |
cout<<"I like programming."<<endl; | |
return 0; | |
} |
# 题目 2. 来自系统的问候(20 分)
题目内容
编写程序,输入一个人的名字,系统显示Hello ***.
。
人名中间可能会有空格。程序运行结果如下:
Zhang Wei
Hello Zhang Wei.提示:输入带空格的字符串,用
cin.getline()
。输入格式
一个字符串,中间可能有空格。输出格式
Hello ***.
注意:单词间一个空格,行末紧跟一个英文句点。输入样例
Zhang Wei输出样例
Hello Zhang Wei.
# 解题代码
#include<iostream> | |
using namespace std; | |
int main() | |
{ | |
char name[50]; | |
cin.getline(name,50); | |
cout<<"Hello "<<name<<"."<<endl; | |
return 0; | |
} |
# 题目 3. 乘法计算器(20 分)
题目内容
编写一个乘法计算器程序。用户输入两个数,计算它们的乘积并显示。程序运行结果如下:
3.4 72
244.8提示:声明三个 double 类型的变量,乘法用 * 号。
输入格式
两个实数,中间用空格隔开。输出格式
计算结果,实数。输入样例
3.4 72输出样例
244.8
# 解题代码
#include<iostream> | |
using namespace std; | |
int main() | |
{ | |
double a, b; | |
cin>>a>>b; | |
cout<<a*b<<endl; | |
return 0; | |
} |
# 题目 4. 单位换算(20 分)
题目内容
编写一个程序,将英寸换算为厘米。输入英寸,输出厘米。
换算关系:1inch=2.54cm
程序运行结果如下:
14
14inch=35.56cm提示:显示:输入的数、"inch="、换算结果和 "cm"。
输入格式
一个实数。输出格式
换算式,单位为小写英文字母,等号为英文等号,单位和数字之间没有空格,如:
14inch=35.56cm输入样例
14输出样例
14inch=35.56cm
# 解题代码
#include<iostream> | |
using namespace std; | |
int main() | |
{ | |
int inch; | |
cin>>inch; | |
cout<<inch<<"inch="<<inch*2.54<<"cm"<<endl; | |
return 0; | |
} |
# 题目 5. 平方根计算器(20 分)
题目内容
编写程序,计算一个正数的平方根。用户输入一个正数(可能为实数),输出它的平方根。程序运行结果如下:
2
1.41421提示:开平方使用函数
sqrt(x)
,x 是双精度型,需要包含头文件cmath
。输入格式
一个正数输出格式
平方根输入样例
2输出样例
1.41421
# 解题代码
#include<iostream> | |
#include<cmath> | |
using namespace std; | |
int main() | |
{ | |
double num; | |
cin>>num; | |
cout<<sqrt(num)<<endl; | |
return 0; | |
} |
# 基础练习
太简单了,再见
# 中级练习
# 题目 1. 计算公式的值 (对数)(10 分)
题目内容
输入 x、a,计算以 a 为底x+sqrt(x*x+1))
的对数 (a>0,a 不等于 1)的函数值。提示:C++ 中没有以任意数 a 为底的对数函数,但可以使用换底公式(请自己查)
输入格式
实数 x,a,之间用空格分隔输出格式
计算出的结果输入样例
3 10输出样例
0.789741
# 解题代码
换底公式
#include<iostream> | |
#include<cmath> | |
using namespace std; | |
int main() | |
{ | |
double x, a; | |
cin>>x>>a; | |
cout<<log(x+sqrt(x*x+1))/log(a)<<endl; | |
return 0; | |
} |
# 题目 2. e 的近似值(10 分)
- 题目内容
输入 n,计算y=(1+1/n)^n
其中^
表示乘方。 - 输入格式
输入整数 n - 输出格式
输出 y 的值 - 输入样例
100 - 输出样例
2.70481
# 解题代码
#include<iostream> | |
#include<cmath> | |
using namespace std; | |
int main() | |
{ | |
int n; | |
cin>>n; | |
cout<<pow((1+1.0/n),n)<<endl; // 1.0 而不是 1/n 的目的是强制 double | |
return 0; | |
} |
# 题目 3. 计算公式的值(三角等)(10 分)
- 题目内容
输入大于 0 的数 x (double),计算的函数值。
- 输入格式
大于 0 的数 x - 输出格式
计算出来的 y - 输入样例
1 - 输出样例
- 3.15853
# 解题代码
#include<iostream> | |
#include<cmath> | |
using namespace std; | |
int main() | |
{ | |
double x; | |
cin>>x; | |
cout<<sin(x)-log(x)+sqrt(x)-5<<endl; | |
return 0; | |
} |
# 题目 4. 计算公式的值(开方)(10 分)
题目内容
输入 x,计算的函数值。
提示:x 的平方通过 xx 来计算,3x 写成表达式时不能省略乘法运算符。
输入格式
实数 x (x>2, 或者 x<1)输出格式
计算出的 y输入样例
5输出样例
1.44338
# 解题代码
#include<iostream> | |
#include<cmath> | |
using namespace std; | |
int main() | |
{ | |
double x; | |
cin>>x; | |
cout<<x/sqrt(x*x-3*x+2)<<endl; | |
return 0; | |
} |