cpp编程基础:
信息学奥赛选择题:https://www.bilibili.com/video/BV1vM4y1G7bt
信息学奥赛一本通在线评测网站:http://ybt.ssoier.cn:8088/
冒泡排序动画1:https://www.bilibili.com/video/BV1Zz4y1D7ZE
冒泡排序动画2: https://www.bilibili.com/video/BV1kq4y1R7ez
排序方法比较:https://www.bilibili.com/video/BV1ex411e7eb
一、程序基本结构:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 6 return 0; 7 }
解释说明:
1行是万能头,万能头会增加编译的时间(智能编译的时间),编译完成之后,程序才会运行,所以不会增加运行的时间,不会增加运行的内存(复赛编程后,判分时,限制运行时间和运行内存不能超某大小)。 baidu有说法是不建议用万能头,理由是不利于理解c++,老师建议是使用万能头,理由是可以简化学习难度。避免入门就打击学习兴趣。初学,重基础(变量类型,基本语句),头文件,不是基础。
头文件的分类使用,目的是为了简化难度和减小最终程序的体积,如设计的游戏程序,必须用游戏头文件,游戏头文件可能很大。而非游戏的程序,可能就没必要用游戏的头文件。编译过程是智能的,会自动判断需要万能头中的哪些头文件。现状:我们的复赛,支持使用万能头。
2行是启用命名空间“std”,c++功能超级强大,为了避免复杂程序的可能性冲突,启动了“std”,个人自定义的空间都放入“std”中,虽然我们现在用不了以后的可能性冲突,程序为了避免,已经这样定义了,我们不启用“std”,就不能自定义空间。明白吗?不明白的话,提意见,我再修改这行的描述。
4行,几乎所有编程软件都会定义main()函数,一个程序启动后,都会去找入口函数,如入口main(),并运行main()。main()是程序运行后的入口函数。 linux操作系统程序结束后,需要返回 int 型值 0,才能正常退出。我们的评分是运行在linux中的,所以,我们在windows系统中编程写程序的时候,也得用 int 声明 main()函数的返回值类型,声明写前面,就写成了 int mian() 。 并且 main()函数的程序体 { },{ }结束时,使用 return 0;语句结束。 明白吗?不明白的话,提意见,我再修改这行的描述。
6、7行的解释,在4行中解释中。
另:语句体 { } 中写程序的具体语句。if 和for等都可以用{ } ,需要注意{ } 的开始和结束位置,必须配对使用。
二、加法
#include<bits/stdc++.h> using namespace std; int main(){ int a,b,c; cin>>a>>b; c=a+b; cout<<c; return 0; }
5行,int 声明整数类型,a,b,c 语句结束用;
a和b和c,老师习惯说成房间名,他们是变量名。int的声明让它们中只能存放整数。
6行,c控制,in 入,cin控制输入,输入默认从键盘输入, >> 数据流的方向,cin>>a 控制“数据流”从键盘流向a,
8行,c控制,out出,cout控制输出,输出默认输出到屏幕,<<数据流的方向,cout<<c 控制“数据流”c流向屏幕。
这里每一行的结束,都用英文分号结束。
三、小数(保留2位小数)
#include<bits/stdc++.h> using namespace std; #define PI 3.1415926 int main(){ const double pi=3.1415926; double r,s; cin>>r; s=pi*r*r; printf("%.2f",s); return 0; }
注意:只要用到小数的地方,尽量声明为double,并且,计算的时候,计算1+2 的时候,用1.0+2,明白吗?做多了题,你可能会碰到,1*a不对,1.0*a就对了。
define 与 const 定义固定值。编程可以不用。初赛笔试会有这样的语句。
四、字符(ASCII码)
#include<bits/stdc++.h> using namespace std; int main(){ char a; int b; cin>>a; b=a; cout<<b; return 0; }
ASCII码(美国标准信息交换码):单引号'a'、'A'是整数97、65。单引号'b'、'B'是整数98、66。键盘的任何一个按键都会对应一个ASCII的整数。ascii的范围大于键盘按键数量。ascii共128个,足够英文使用。
一个字节占8位,8位2进制能表示0-255,ascii只用了0-127
学习二进制。 学习链家以后补充。
二进制加法、减法。十进制减法会转化为二进制加法,乘法和除法也会转化为加法,这样简化了计算机的制造,只需要制造加法器就可以,为此,数学家设计了二进制的补码(反码再得到补码)实现只用加法器实现十进制的四则运算。
计算机科学家首先是数学科学家。数学科学家不一定是计算机科学家。很会计算机的,不一定语文很好。出的计算机题,误解多多,木办法。
五、字符串
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 char a[101]="hello"; 6 string b; 7 b="china"; 8 cout<<a<<" "<<b; 9 10 return 0; 11 }
计算机还不够智能,不能代替人。
计算机是从最低级发展过来的,会越来越智能。
向前兼容,会让以前的程序也能正常运行。
1+2==3和“hello”+“word”==“helloword”,
所以又出了个“1”+"2"=="12" ,自己理解吧。
以前的计算机科学家为了让计算机速度能更快,1+1和1.0+1 ,前面说过不同?自己理解吧。可以百度学习一下运算符重载。
如有更正确的理解,欢迎反馈给老师,谢谢。
常用的字符类型:整型,双精度浮点型,字符型,字符串。等等。
以后再学个数组。数组不是数据类型。
六、判断闰年
普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。
世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。
#include<bits/stdc++.h> using namespace std; int main(){ int a; cin>>a; if(a%400==0 or (a%4==0 and a%100!=0)){ cout<<a<<"年,是闰年"; }else{ cout<<a<<"年,不是闰年"; } return 0; }
if 与 eles ,不难理解。配套的 { } 可以嵌套,注意以后去理解{ }的嵌套。
与0或1,异或异1,0是假,1是真,这是老师总结的顺口溜。
and与,or或,xor异或,&&与,||或, not非,!非。
%取余数,c++ 没有乘方运算, 二进制的异或把那个符号^占用了。
c和c++的优点是也能操作硬件,编译后的程序速度会快很多,所以操作系统一般都用c写的,c++是c的发展。
安卓用java写的,但是安卓的底层是linux,linux是用c写的。
编程语言:二进制(低级语言)、汇编语言(低级语言?)、c语言等(高级语言)。也有说法把c当中级语言,老师还是认为c是高级语言,老师认为高级低级的区别是能否让让英语母语的人容易看懂。
(道可道,非常道;名可名,非常名。无名,天地之始,有名,万物之母。概念都是后人定义的,老师不喜欢考察定义,老师也喜欢用定义去解释某些东西,迷茫加矛盾,自己悟)
七、循环
输入3行,第一行1个数字,控制第2行数字的个数,第3行1个数字。输出一个数字,第3行数字在第2行中出现的次数。
所有数字x都满足0 ≤x ≤100。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 int a,b[101],c,d; 6 d=0; 7 cin>>a; 8 for(int i=1;i<=a;i++){ 9 cin>>b[i]; 10 } 11 cin>>c; 12 for(int i=1;i<=a;i++){ 13 if(c==b[i]){ 14 d++; 15 } 16 } 17 cout<<d; 18 19 return 0; 20 }
{ } 的嵌套使用出现了。
学习 for( ) 的规则,注意()中只使用了2个分号。 for(初值;终值;步长变化)
这里用了数组,数组的下标从0开始。声明语句 int a[3] 后,可以用a[0],a[1],a[2],这三个;不能用a[3]和3以后的数字下标。
八、最大余数
除数a,b≤被除数 ≤c,依次输入a,b,c三个数,输出最大的余数。
数据范围:2≤a≤b≤c≤e9
#include<bits/stdc++.h> using namespace std; int main(){ int a,b,c; cin>>a>>b>>c; cout<<a-1; return 0; }
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 int a,b,c,d,s,t; 6 s=0; 7 cin>>a>>b>>c; 8 d=c-b; 9 if(d>=a){ 10 cout<<a-1; 11 return 0; 12 } 13 for(int i=0;i<=d;i++){ 14 t=c%a; 15 if(t>s){ 16 s=t; 17 } 18 c--; 19 } 20 cout<<s; 21 22 return 0; 23 }
#include<bits/stdc++.h> using namespace std; int main(){ int a,b,c,d,m2,m3; cin>>a>>b>>c; d=c-b; if(d>=a){ cout<<a-1; return 0; } m2=c%a; m3=b%a; if(m2<m3){ cout<<a-1; }else{ cout<<m2; } return 0; }
九、统计字符个数
输入1行字符串,包含大小写字母、数字、空格。统计字母和数字的个数。输出这个数。
1 #include<bits/stdc++.h> 2 using namespace std; 3 string n; 4 5 int main(){ 6 int s; 7 getline(cin,n); 8 for(int i=0;i<=4;i++){ 9 if(n[i]>='0' and n[i]<='9'){ 10 s++; 11 } 12 if(n[i]>='A' and n[i]<='Z'){ 13 s++; 14 } 15 if(n[i]>='a' and n[i]<='z'){ 16 s++; 17 } 18 } 19 cout<<s; 20 return 0; 21 }