关于C++的语言部分(信息学奥赛一本通),我自己总结了一部分的知识。
因为过于基础,第一部分源代码的简介和使用我就不讲了。
我直接从第二章顺序结构程序设计开始讲。首先,我认为在这一章内只要理解一个因果关系后,这一章大部分都可以运用与理解。一个源代码,开头一个头文件,我比较喜欢用的是
#include<bits/stdc++.h>
using namespace std;
int main()
。其次便是定义,定义包括了整个源代码的常量和变量,我比较喜欢理解成数学中的未知数,但也不是全部相通。
我举个例子:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
cout<<a+b;
return 0;
}
上面的代码:是a+b问题;那代码的意思:定义a和b,输入a和b,输出a+b,然后结束语。(在下不解释头文件的作用范围);但要注意,若要定义字符,需用char,如:
#include<bits/stdc++.h>
using namespace std;
int main(){
char a;
cin>>a;
cout<<" "<<a<<" "<<endl;
cout<<a<<" "<<a<<endl;
cout<<a<<a<<a<<endl;
return 0;
}
这样就可以定义符号,要定义单精度浮点数要有float,双进度浮点数用double,需要float时大多可以double替代,但要用double时不可以用float,double作用范围更广,但如果题目要求单精度浮点数时,就最后用float,保险起见。
在第三章程序的控制结构中,主要讲if与switch。其实“if”可以理解为“如果”,而switch更像是在列选项。如:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int weekday;
cin>>weekday;
switch(weekday)
{
case 1:cout<<"Monday"<<endl;break;
case 2:cout<<"Tuesday"<<endl;break;
case 3:cout<<"Wednesday"<<endl;break;
case 4:cout<<"Thursday"<<endl;break;
case 5:cout<<"Friday"<<endl;break;
case 6:cout<<"Saturday"<<endl;break;
case 7:cout<<"Sunday"<<endl;break;
default:cout<<"input error!"<<endl;break;
return 0;
}
return 0;
}
在这程序中,你输入1,它就显示“Monday”,因为程序用switch列了7个选项,输入数字1——7,就会输出对应的星期的英文。
if的作用就是设置条件,如要判断输入的数范围:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
if(1<n&&n<100)
cout<<"yes";
}
上面代码意思十分简单:定义n,输入n,如果n>1且n<100,输出“yes”。这就是if用法。
在循环和数组的这两章中,知识变化比较大,大部分都用于规律性的重复运算,如中所包含的偶数:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
if(i%2==0) cout<<i<<" ";
return 0;
}
上面的程序意思是:定义n,输入n,在for循环中定义i=1,循环到n,i++,即自增1;如果你输入100,它就会输出:0,2,4,6,8,10,12.....,直到100。
进阶的就是使其复杂化,如一本通网站的1060——1090题,我举例1070人口增长:
1070:人口增长
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 43668 通过数: 29947
【题目描述】
我国现有x亿人口,按照每年0.1%的增长速度,n年后将有多少人?保留小数点后四位。
【输入】
一行,包含两个整数x和n,分别是人口基数和年数,以单个空格分隔。
【输出】
输出最后的人口数,以亿为单位,保留到小数点后四位。1<=x<=100,1<=n<=100。
【输入样例】
13 10
【输出样例】
13.1306
我的方法是这样:
#include<bits/stdc++.h>
using namespace std;
int main(){
double x,n;
int s;
cin>>x>>n;
for(s=1;s<=n;s++)
x=x*1.001;
printf("%.4lf",x);
return 0;
}
比一开始的题复杂一些,越往后越难。
数组用来表示多个数输出,如输出:A1,A2,A3,A4......A100;是不是很麻烦?没错,这时候可以用数组解决,直接输出A【100】就可以了。我举例一道题:
2035:【例5.2】平移数据
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 6315 通过数: 4209
【题目描述】
将a数组中第一个元素移到数组末尾,其余数据依次往前平移一个位置。
【输入】
第一行为数组a的元素个数;
第二行为n个小于1000的正整数。
【输出】
平移后的数组元素,每个数用一个空格隔开。
【输入样例】
10
1 2 3 4 5 6 7 8 9 10
【输出样例】
2 3 4 5 6 7 8 9 10 1
我的代码是:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a[1001];
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=2;i<=n;i++) cout<<a[i]<<" ";
cout<<a[1];
return 0;
}
可见,数组可以极大的帮助我们解决这一类问题,讲一下:虽然题目说最大1000,但避免某些“心地善良”的测试者,来个1001,直接爆空间或爆时间,保险起见最好设置比题目大一点的数。(数组若不明白可以搜教程来并用)
我后面会在发布循环及数组,函数部分。如有帮助可以帮忙推广一下。