写在前面
这里利用优快云记录C++代码,方便自己查看
本文参考书籍《C++程序设计》第二版 杨长兴
文章目录
常错内容归纳
- 注意头文件不能缺,用到必须加
#include这个是标准输入输出流cin、cout
#include这个是用于输出格式调整的
#include这个主要是用数学函数的 - 注意using namespace std;这一句不能少
- 注意要main()函数,若定义为void形式则可以没有return;若定义为其他类型一定要加return 0;千万别忘,会报错的。
- cout>>输入内容提示,如“请输入x值"之后别忘了用cin输入值x啊!
- cin>>输入某个数值时,千万别加endl换行,会报错
- cin>>之前注意要定义输入的值
- 定义数据类型时要三思。
int型适用的范围较窄,用除法时不能保留小数位,通常使用float(输出时会显示3位小数,但是单精度浮点数在系统里面最多保留7位有效数字),也会用double(输出时会显示6位小数,但是双精度浮点数在系统中最多保留16位有效数字) - 每个语句之后要加分号,声明头文件的时候不需要,定义宏的时候也不需要#define PI 3.14这种宏。
字母的大小写切换
#include<iostream>
using namespace std;
float main()
{
//单个字符大小写切换问题
char y='m'-('a'-'A');//ASCII表中A排在前面
cout<<y<<endl;
cout<<"请输入一列字符串(最多10个字符):"<<endl;
//字符串大小写切换问题
char a[10];
cin>>a;
for(int i=0;i<10;i++)
{
if(a[i]>='a'&&a[i]<='z')
{
a[i]-=32;
}else if(a[i]>='A'&&a[i]<='Z')
{
a[i]+=32;
}
}
cout<<a<<endl;
return 0;
}
选择结构
if语句(从小到大排序)
#include<iostream>
using namespace std;
//选择语句if语句,实现大小排序(按从小到大)
int main()
{
int a,b;
cout<<"请输入两个值";
cin>>a>>b;
if(a>b)
{
int t=b;
b=a;
a=t;
}
cout<<"按从小到大输出"<<a<<'\t'<<b<<endl;
return 0;
}
if…else语句(闰年?)
题目:输入年份year,判断是否为闰年
关键:闰年的条件
①是4的倍数但不是100的倍数;
②可以是400的倍数
#include<iostream>
using namespace std;
int main()
{
int year;
cout<<"请输入年份:";
cin>>year;//在运算中%的优先级比==要高
if((year%4==0&&year%100!=0)||(year%400==0))
{
cout<<year<<"年是闰年"<<endl;
}else{
cout<<year<<"年不是闰年"<<endl;
}
return 0;
}
if…else if语句(分段函数)
计算该分段函数的值。
y
=
{
∣
x
∣
    
(
x
<
0
)
e
x
c
o
s
x
    
(
0
≤
x
<
15
)
x
5
    
(
15
≤
x
<
30
)
(
7
+
9
x
)
l
n
x
    
(
x
≥
30
)
y=\left\{\begin{matrix} |x|\; \;& (x<0)\\ e^{x}cosx\; \; &(0\leq x<15)\\ x^{5}\; \; &(15\leq x<30)\\ (7+9x)lnx\; \; &(x\geq 30) \end{matrix}\right.
y=⎩⎪⎪⎨⎪⎪⎧∣x∣excosxx5(7+9x)lnx(x<0)(0≤x<15)(15≤x<30)(x≥30)
#include<iostream>
#include<cmath>
using namespace std;
float main()
{
float x,y;
cout<<"请输入x的值:";
//注意输出了提示语句之后要有输入啊,别忘了
cin>>x;
if(x<0)
{
y=fabs(x);
}else if(0<=x&&x<15)
{
y=exp(x)*cos(x);
}else if(15<=x&&x<30)
{
y=pow(x,5);
}else{
y=(7+9*x)*log(x);
}
cout<<"y的值是"<<y<<endl;
return 0;
}
switch语句(成绩分段)
关于switch语句:
原理:计算是在switch(计算),case是可能的计算值。程序只判断一次case,当case xx成立,则一直向下执行直到遇到break,下面的case不再判断,直接执行。若所有case都不成立,则执行default:后面的语句,若没有default则直接结束。
- case只能是常量表达式,不能有计算
- 每条case后面必须要有break
- 每个case分支可以有很多条语句,不需要{}括起来;但是总的switch需要{}
#include<iostream>
using namespace std;
float main()
{
float score;
cout<<"请输入成绩";
cin>>score;//注意绝对不能加endl换行
if(score>=0&&score<=100)
{
switch(int(score)/10)
{
//注意这里采用了int(score)保证了计算的值为整数
case 10:
case 9: cout<<"优秀"<<endl;
break;
case 8:cout<<"良好"<<endl;
break;
case 7:cout<<"中等"<<endl;
break;
case 6:cout<<"及格"<<endl;
break;
default: cout<<"不及格"<<endl;
}
}
return 0;
}
循环结构
重点:关于循环结构如何选择。
一般来说,若知道了循环的次数,则采用for(int i=1;i<100;i++) 类似循环
若未知次数通常多用while(){…}
若即使不满足条件也要运行一次的话就用do{}();
注意:在使用while循环与do…while循环的时候要注意i++,避免出现死循环;并且注意在do…while循环的末尾()之后要有分号,注意注意!!!
while语句(自然数1-100求和)(不等式成立n)
题目: 自然数0-1001求和
#include<iostream>
using namespace std;
int main()
{
int sum=0;
int i=1;
while(i<=100)
{
sum+=i;
i++;//注意写循环的时候一定要有i++类似
}
cout<<"0-100自然数求和为"<<sum<<endl;
return 0;
}
题目:求满足不等式
1
+
1
2
+
1
3
+
.
.
.
+
1
n
≥
8
1+\frac{1}{2}+\frac{1}{3}+...+\frac{1}{n}\geq 8
1+21+31+...+n1≥8的最小n值。
关键:一定要注意数据的类型1/2在计算机中值为0
#include<iostream>
using namespace std;
float main()
{
int i=0;
float s=0;
while(s<8)
{
i++;
s+=float(1)/i;//也可以用法double(1)或者1.0
}
cout<<"使不等式成立的最小n为"<<i<<endl;
return 0;
}
do…while语句(自然数的逆序)
**题目:**将自然数的每一个数字按反序输出,如输入12340,输出04321。
#include<iostream>
using namespace std;
int main()
{
int a,b;
cout<<"请输入一个自然数"<<endl;
cin>>a;
cout<<"自然数的逆序为:"<<endl;
do{
b=a%10;
a=a/10;
cout<<b;
}while(a>0);
cout<<endl;
return 0;
}
题目: 若逆序时对于10980逆序为8901
关键: 注意这里末尾有0,中间也有0,要正确处理
思路: 首先数输入的自然数的位数;然后用
n
i
=
n
i
∗
10
+
余
数
ni=ni*10+余数
ni=ni∗10+余数,注意是
n
i
∗
10
ni*10
ni∗10
#include<iostream>
using namespace std;
int main()
{
int a;
int len=0;
cout<<"输入任意自然数:";
cin>>a;
cout<<"自然数的逆序为:";
//首先数一下自然数的位数len
int A=a;
do
{
A=A/10;
len++;
}while(A>0);//这里特别注意验证0,个位数,10,100,等等
//接下来进行逆序
int ni=0;
for(int i=1;i<=len;i++)
{
A=a%10;
a=a/10;
ni=ni*10+A;//注意这里是ni本身乘10
}
cout<<ni<<endl;
return 0;
}
for语句(小球反弹问题)
题目: 一个小球从100米地方落下,每次落地反弹原高度的一半,再落下;在第10次落地走过的路程?第10次反弹高度?若反弹高度小于1e-4认为静止,则反弹多少次会静止。
关键: 小球落地关注从i=2开始。
#include<iostream>
using namespace std;
float main()
{
float s=100.0;
float h=s/2;
for(int i=2;i<=10;i++)//从i=2开始,第二次反弹
{
s=s+h*2;//第i次落地已走路程
h=h/2;//第i次弹起的高度
}
cout<<"第10次落地已走路程为"<<s<<endl;
cout<<"第10次弹起高度为"<<h<<endl;
//假设反弹高度小于1e-4,则认为小球静止
int Tan=1;
h=100.0/2;
while(h>1e-4)
{
Tan++;
h=h/2;
}
cout<<"最多反弹次数"<<Tan<<endl;
return 0;
}
多重循环(九九乘法表)
完整的九九乘法表
#include<iostream>
using namespace std;
void main()
{
cout<<"\t\t\t九九乘法表"<<endl;
cout<<"\t\t\t..........."<<endl;
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
cout<<i<<"*"<<j<<"="<<i*j<<'\t';
}
cout<<endl;
}
}
左下九九乘法表
#include<iostream>
using namespace std;
void main()
{
cout<<"\t\t\t九九乘法表(左下)"<<endl;
cout<<"\t\t\t................"<<endl;//这里\t是水平制表符,用于对齐
for(int i=1;i<=9;i++)
{
for(int j=1;j<=i;j++)
{
cout<<i<<"*"<<j<<"="<<i*j<<'\t';
}
for(int m=i+1;m<=9;m++)//注意三层嵌套不能使用同一个字符
{
cout<<" "<<'\t';//这里用了输出空格
}
cout<<endl;
}
}
控制转向语句
- break;语句:表示跳出循环,循环结束;若有多层循环则只能跳出一层;
- continue;语句:表示跳过循环体中未进行的内容,直接进行下一次循环;
- goto xx; xx: 语句:直接跳到想要的位置,主要用于跳出多层循环。
goto语句
题目: 找出a,b,c三个小于10的正整数,使得 a ∗ b ∗ c = 125 a*b*c=125 a∗b∗c=125
#include<iostream>
using namespace std;
int main()
{
for(int i=1;i<=10;i++)
{
for(int j=1;j<=10;j++)
{
for(int m=1;m<=10;m++)
{
int s=i*j*m;
if(s==125)
{
cout<<i<<"*"<<j<<"*"<<m;
goto end;
}
}
}
}
end: cout<<endl;
//end与冒号之间无空格,若end后面没有语句可以在冒号后换行
return 0;
}
程序控制结构(程序实例)
最大公约数和最小公倍数
关键: 求最大公约数利用“辗转相除法”,A=x*B+y,则最大公约数(A,B)=(B,y)
求最小公倍数是基于最大公约数
A
∗
B
/
g
A*B/g
A∗B/g(其中g=(A,B),即最大公约数)。
#include<iostream>
using namespace std;
int main()
{
int A,B;
cout<<"请输入两个正整数";
cin>>A>>B;
//首先比较大小,确定A较大
if(A<B)
{
int t=B;
B=A;
A=t;
}
//辗转相除法
int m=1;
int a=A;
int b=B;//保留原数据
while(m!=0)
{
m=A%B;
A=B;
B=m;
}
cout<<"最大公约数为"<<A<<endl;
cout<<"最大公倍数为"<<a*b/A<<endl;
return 0;
}
输出3-100之间的素数
关键: 判断某个数A是否为素数,采用A除以2,3,4,,,A-1;
输出3-100之间的素数时不考虑偶数。
这里序列可以改为3,4,5,A-1;近一步将序列改为3,4,5,6,,
A
\sqrt{A}
A.
重要: 注意是输出所有都不能整除的数!!!别弄反了
中间引用了一个变量ret,初始取值为ret=1,只要能被整除就让ret=0,即不是素数
#include<iostream>
#include<cmath>
using namespace std;
void main()
{
int sum=0;
cout<<"3-100之间的素数有:"<<endl;
for(int i=3;i<=100;i+=2)
{
int ret=1;
for(int j=2;j<=sqrt(i);j++)
{
if(i%j==0)
{
ret=0;
break;
}
}
if(ret==1)
{cout<<i<<'\t';
sum+=i;
}
}
cout<<endl;
cout<<"3-100之间素数之和为"<<sum<<endl;
}
计算部分级数和
关键: 这里会涉及到阶乘的问题,为了不单独算阶乘,巧妙利用前后两项之间的关系。对于前后两项的关系
a
n
+
1
a_{n+1}
an+1与
a
n
a_{n}
an是改变的,但是式子里面的
x
2
x^{2}
x2每次都是乘固定的数,注意区别,千万别写一样的。
题目:
s
i
n
(
x
)
=
x
1
−
x
3
3
!
+
x
5
5
!
+
.
.
.
+
(
−
1
)
(
n
−
1
)
x
2
n
−
1
(
2
n
−
1
)
!
sin(x)=\frac{x}{1}-\frac{x^{3}}{3!}+\frac{x^{5}}{5!}+...+(-1)^{(n-1)}\frac{x^{2n-1}}{(2n-1)!}
sin(x)=1x−3!x3+5!x5+...+(−1)(n−1)(2n−1)!x2n−1
前后两项的关系
a
n
+
1
=
(
−
1
)
x
2
(
2
n
)
(
2
n
+
1
)
a
n
a_{n+1}=(-1)\frac{x^{2}}{(2n)(2n+1)}a_{n}
an+1=(−1)(2n)(2n+1)x2an
#include<iostream>
#include<cmath>
using namespace std;
float main()
{
float sum=0;
float t;
int i=1;
cout<<"请输入t的值";
cin>>t;
float x=t;
while(fabs(t)>=1e-6)
{
sum+=t;
t=-t*(x*x)/(2*i)/(2*i+1);//注意这里t与x的差别每次都乘两个固定x值
i++;
}
cout<<"部分级数和为"<<sum<<endl;
return 0;
}
水仙花数
题目: 水仙花数指的是三位正整数,各个位上的数的立方和与它本身相等,即 153 = 1 3 + 5 3 + 3 3 153=1^{3}+5^{3}+3^{3} 153=13+53+33则153即为一个水仙花数
#include<iostream>
using namespace std;
int main()
{
int a,b,c,s;
cout<<"所有的水仙数为:"<<endl;
for(int i=100;i<=999;i++)
{
a=i%10;
b=(i/10)%10;
c=i/100;
s=a*a*a+b*b*b+c*c*c;
if(s==i)
{cout<<i<<'\t';
}
}
cout<<endl;
return 0;
}
百元买百鸡
题目: 已知公鸡5元1只,母鸡3元1只,小鸡1元3只;现有100元钱,恰好买100只鸡,且每种鸡都买。
关键: 解一元三次方程组,首先列出方程组,根据方程组来求解,采用枚举法列出所有可能的情况。
设公鸡、母鸡、小鸡分别为x,y,z只,列方程组:
{
x
+
y
+
z
=
100
5
x
+
3
y
+
z
/
3
=
100
\left\{\begin{matrix} x+y+z=100\\ 5x+3y+z/3=100 \end{matrix}\right.
{x+y+z=1005x+3y+z/3=100
#include<iostream>
using namespace std;
void main()
{
int x,y,z;
cout<<"公鸡"<<'\t'<<"母鸡"<<'\t'<<"小鸡"<<endl;
for(z=3;z<=(100-5-3)*3;z+=3)
{
for(y=1;y<=(100-1-5)/3;y++)
{
x=100-y-z;
if(x*5+y*3+z/3==100&&x>0)
{
cout<<x<<'\t'<<y<<'\t'<<z<<endl;
}
}
}
}