武平一中信息学奥林匹克竞赛校本课程
C++编程
第一课时:认识C++程序和DEV-C++集成开发环境
一.学习目标:
1.认识C++程序结构;
2.掌握编程基本步骤;
3.记住“保存”、“编译”和“运行”的快捷键(ctrl+s、F9、F10)
二.学习内容与步骤:
1.双击桌面图标,启动DEV-C++集成开发环境,单击“文件”菜单下的“新建——>源代码”命令,在程序编辑区输入下面程序:
#include
#include
using namespace std;
int main()
{
cout<<"hello";
system("pause");
return 0;
}
2.输入完毕,单击“文件”菜单下的保存命令。在弹出的“保存文件”对话框中保存位置选择“桌面”,文件名为“ex1”,文件类型为c++不必修改,单击保存。
3.单击“运行”菜单下的“编译”命令,窗口出现红色条时说明程序有错误,请对照修改,直到正确为止。
4.单击“运行”菜单下的“运行”命令;弹出新窗口,观察新窗口中内容,按一下键盘任意键(通常按空格键),返回编辑界面。
5.单击“文件”菜单“退出”命令,结束。
6.观察桌面的ex1.cpp和ex1.exe两个文件,双击“ex1.exe”试试,ex1.cpp 称为源程序,ex1.exe称为可执行程序,虽然这个程序简单了一点,但是电脑中的程序就是这样设计出来的。
7.参考以上步骤,输入下面这个程序:
#include
using namespace std;
int main()
{
int a,b,c;
cin>>a>>b;
c=a+b;
cout< return 0; } 程序运行之后,需要输入2个整数,输完第一个数按一下空格键,输完第二个数按一下Enter(回车键)。观察程序运行结果,说说这个程序的作用是什么?三.参考书: 《全国青少年信息学奥林匹克竞赛教程信息学奥赛一本通(C++版) 第二版》,(董永建舒春平等主编,科学技术文献出版社出版),同学们可以到图书馆借阅。 第二课时:C++编程体验 一.学习目标: 1.巩固C++程序结构,记住“保存”、“编译”和“运行”的快捷键(ctrl+s、F9、F10); 2.了解C++数据类型(int和float); 3.掌握整除和求余运算(整除/ 求余%); 4.学习编写顺序结构的C++程序。 二.学习内容: 1.计算票价 已知每张门票价格为50元,输入游客人数,计算并输出票价。 #include using namespace std; int main () { int n,k; cin>>n; k=n*50; cout< return 0; } 2.计算梯形面积 输入梯形上底、下底和高,计算并输出梯形面积。 #include using namespace std; int main () { float a,b,h,s; cin>>a>>b>>h; s=(a+b)*h/2; cout< return 0; } 3.输入一个三位数,反序输出,比如输入:789,输出:987。 #include using namespace std; int main() { int a,b,c,n; cin>>n; a=n % 10; b=(n /10)%10; c=n/100; cout< return 0; } 第三课时:C++选择语句 一.学习目标: 1.学习if单分支和双分支结构语句; 2.学习switch语句,; 3.学习复合语句; 二.学习内容: 1.票价打折 已知每张门票价格50元,5人以上的团体票为45元,输入游客人数,计算并输出票价。 #include using namespace std; int main() { int n,k; cin>>n; if (n>4) { k=n*45; } else { k=n*50; } cout< } 思考:如果题目改为:5人以上打9.5折,程序是否需要修改? 2.计算2017年各月天数 输入2017年的月份,计算并输出该月的天数。 #include using namespace std; int main() { int month,day; cin>>month; switch(month) { case 4:day=30;break; case 6:day=30;break; case 9:day=30;break; case 11:day=30;break; case 2:day=28;break; default:day=31;break; } cout< return 0; } 思考:本题也可以用if语句实现,请试试。 第四课时:C++循环语句(1) 一.上节课思考题: 1.票价打折 已知每张门票价格50元,5人以上打9.5折,输入游客人数,计算并输出票价。#include using namespace std; int main() { int n; float k; cin>>n; if (n>4) k=n*50*0.95; else k=n*50; cout< return 0; } 提示:因为9.5折是实数,所以金额的变量类型应修改为float。 2.计算2017年各月天数 输入2017年的月份,计算并输出该月的天数(if语句实现)。 #include using namespace std; int main() { int month,day; cin>>month; day=31; //先把天数统一设置为31天 if (month==2) //如果是2月份,把day变量修改为28天 day=28; if ((month==4)||(month==6)||(month==9)||(month==11)) //如果是4月或6或9或11月, day=30; //把day变量修改为30天cout< return 0; } 提示:||是逻辑运算符,“或”的意思。 二、循环语句 1导游购票1 已知每张门票价格50元,5人以上打9.5折。售票处有10个导游在排队,因为每个旅游团人数一般都不相同,所以每个导游希望购买的门票张数也不一定相同。 现在要求你编写一个程序,输入10个导游需要的门票张数,计算并输出各自的总价。 解题重点: 本题和原题的最主要区别是“10个导游在买票”,本质上就是把原来的那个程序运行10遍。 相同的事情重复多遍,这在计算机领域叫“循环”。本题明确规定10遍,属于“已知次数的循环”。要用for语句。 参考程序: #include using namespace std; int main() { int n; float k; for (int i=1;i<=10;i++) { cin>>n; if (n>4) k=n*50*0.95; else k=n*50; cout< } return 0; } 2导游购票2 已知每张门票价格50元,5人以上打9.5折。售票处有多个导游在排队,因为每个旅游团人数一般都不相同,所以每个导游希望购买的门票张数也不一定相同。 现在要求你编写一个程序,输入每一个导游需要的门票张数,计算并输出各自的总价。当输入的门票张数为0时,程序结束。 已知导游人数不超过100,每个导游购买的门票不超过1000张。 解题重点: 本题和上一题的最主要区别是“导游人数不确定”,也就是重复执行的次数不确定了。这属于“未知次数的循环”。要用while语句。 参考程序: #include using namespace std; int main() { int n; float k; cin>>n; while (n!=0) //当输入的门票张数不等于0的时候,就计算。 { if (n>4) k=n*50*0.95; else k=n*50; cout< cin>>n; } return 0; } 思考:今天的两道“循环”练习题,都是输入一张数,输出一个票价。再输入一个张数,又输出一个票价。如果题目要求“连续输入全部导游需要的门票张数,再连续输出相应的总票价”该如何实现? 第五课时:C++循环语句(2) 学习要点: 1.复习自增自减运算符,i++与++i的区别; 2.For 循环、循环嵌套; 练习题: 1.计算1+2+3+……+100的和; 参考程序: #include using namespace std; int main() { int s=0; for (int i=1;i<=100;++i) s=s+i; cout< return 0; } 2.计算1*2*3*……*20的积; 参考程序: #include using namespace std; int main() { int long long s=1; for (int i=1;i<=20;++i) s=s*i; cout< return 0; } 3.计算1!+2!+3!+……+20!的和; 参考程序: #include using namespace std; int main() { int long long s=0; for (int i=1;i<=20;++i) { int m=1; for (int j=1;j<=i;++j) m=m*j; s=s+m; } cout< return 0; } 思考题: 1.对n!和的改进; 2.输出水仙花数; 第6课时数组 一.学习目标: 1.掌握“数组”这一数据类型的使用场合; 2.掌握“数组”的定义、应用; 3.学习排序算法。 二.学习内容: 1.输入一个正整数n(不超过100),再输入n个整数,按相反的顺序将n 个整数输出。 分析与探索: 输入n个整数,需要等到全部输入完毕,才可以从最后一个开始逆序输出, 所以这n个整数需要事先保存起来,这n个数的类型相同,彼此之间有一定的关系,所以用一种新的数据类型——数组来定义:Int a[101]就定义了一个有100个元素的整型数组。 参考程序: #include using namespace std; int a[101],n; int main() { cin>>n; for (int i=0;i cin>>a[i]; for (int i=n-1;i>=0;--i) cout< return 0; } 2.输入一个正整数n(不超过100),再输入n个整数,按从小到大的顺序将n个整数输出。 #include using namespace std; int a[101],n; int main() { freopen("sort.in","r",stdin); freopen("sort.out","w",stdout); cin>>n; for (int i=1;i<=n;++i) cin>>a[i]; for (int i=1;i for (int j=i+1;j<=n;++j) if (a[i]>a[j]) { int k=a[i];a[i]=a[j];a[j]=k; } for (int i=1;i<=n;++i) cout< return 0; } 3.作业p70例5.4约瑟夫问题 4.作业p76例5.8矩阵的行列交换 第7课时函数 一.学习目标: 1.掌握函数的声明、定义、调用; 2.掌握函数参数类型和作用范围; 3.学习递归算法。 二.学习内容: 先看p107两题作业: 1.编程求5!+7!+9!+11!的值。 2.编程求c(n,m)=n!/(m!*(n-m)!) (n>0,m>0) 这两道题需要反复计算某一个数的阶乘,假如存在类似sin(x)这样的函数js(x),那么问题就轻松解决了,但c++的标准函数库中并没有这样的js(x)函数,需要我们自己定义。 函数需要先声明、定义,才可以调用,下面是第1题作业的参考程序:#include using namespace std; int js(int); //声明函数 int main() { cout< return 0; } int js(int x) //定义函数 { int s=1; for(int i=1;i<=x;++i) s=s*i; return s; } 声明函数与定义函数的区别是:声明时括号内可以只写参数类型,不写具体名称,语句末尾带一个“;”号。 第8课时c++文件操作 到目前为止,我们写的程序都是从键盘输入数据,程序运行之后的结果也都是从显示器显示,在竞赛中,程序的输入、输出都需要使用文件。 使用freopen重定向输入、输出流。格式如下: freopen("sum.in","r",stdin); //以只读方式打开sum.in文件 freopen("sum.out","w",stdout); //以写入方式打开sum.out文件 这样,程序就从sum.in文件中读取输入数据,运行结果也保存到输出文件sum.out中。 第1题:计算a+b(文件名sum) 输入输出样例: sum.in 25 30 sum.out 55 数据规模:a和b均不超过230 参考程序: #include using namespace std; int main () { int a,b; freopen("sum.in","r",stdin); freopen("sum.out","w",stdout); cin>>a>>b;