C++学习一

写在前面
这里利用优快云记录C++代码,方便自己查看
本文参考书籍《C++程序设计》第二版 杨长兴

常错内容归纳

  1. 注意头文件不能缺,用到必须加
    #include这个是标准输入输出流cin、cout
    #include这个是用于输出格式调整的
    #include这个主要是用数学函数的
  2. 注意using namespace std;这一句不能少
  3. 注意要main()函数,若定义为void形式则可以没有return;若定义为其他类型一定要加return 0;千万别忘,会报错的。
  4. cout>>输入内容提示,如“请输入x值"之后别忘了用cin输入值x啊!
  5. cin>>输入某个数值时,千万别加endl换行,会报错
  6. cin>>之前注意要定义输入的值
  7. 定义数据类型时要三思。
    int型适用的范围较窄,用除法时不能保留小数位,通常使用float(输出时会显示3位小数,但是单精度浮点数在系统里面最多保留7位有效数字),也会用double(输出时会显示6位小数,但是双精度浮点数在系统中最多保留16位有效数字)
  8. 每个语句之后要加分号,声明头文件的时候不需要,定义宏的时候也不需要#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 ∣ &ThickSpace;&ThickSpace; ( x &lt; 0 ) e x c o s x &ThickSpace;&ThickSpace; ( 0 ≤ x &lt; 15 ) x 5 &ThickSpace;&ThickSpace; ( 15 ≤ x &lt; 30 ) ( 7 + 9 x ) l n x &ThickSpace;&ThickSpace; ( x ≥ 30 ) y=\left\{\begin{matrix} |x|\; \;&amp; (x&lt;0)\\ e^{x}cosx\; \; &amp;(0\leq x&lt;15)\\ x^{5}\; \; &amp;(15\leq x&lt;30)\\ (7+9x)lnx\; \; &amp;(x\geq 30) \end{matrix}\right. y=xexcosxx5(7+9x)lnx(x<0)(0x<15)(15x<30)(x30)

#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则直接结束。

  1. case只能是常量表达式,不能有计算
  2. 每条case后面必须要有break
  3. 每个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+...+n18的最小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=ni10+,注意是 n i ∗ 10 ni*10 ni10

#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;
	}
}

九九乘法表(左下)

控制转向语句

  1. break;语句:表示跳出循环,循环结束;若有多层循环则只能跳出一层;
  2. continue;语句:表示跳过循环体中未进行的内容,直接进行下一次循环;
  3. goto xx; xx: 语句:直接跳到想要的位置,主要用于跳出多层循环。

goto语句

题目: 找出a,b,c三个小于10的正整数,使得 a ∗ b ∗ c = 125 a*b*c=125 abc=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 AB/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)=1x3!x3+5!x5+...+(1)(n1)(2n1)!x2n1
前后两项的关系 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;
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值