1、算法竞赛入门,第1讲 程序设计入门,,基本内容,算术表达式 变量及其输入 顺序结构程序设计 分支结构程序设计 数据类型实验 scanf输入格式实验 printf输出格式实验 测测你的实践能力 小结 上机练习,算术表达式,程序1.1 计算并输出1+2的值实验1,修改程序1.1,输出3-4的结果 实验2,修改程序1.1,输出56的结果 实验3,修改程序1.1,输出84的结果 实验4,修改程序1.1,输出85的结果,算术表达式,程序1.2 计算并输出85的值,保留小数点后一位实验5:把%.1lf中的1改成2,会怎样? 实验6:去掉数字,只用%lf会怎样? 实验7: %.1lf不变,8.0/5.0改为
2、8/5会怎样? 实验8: %.1lf改为%d, 8.0/5.0不变会怎样?提示1.1:整数值用%d输出,实数用%lf输出 提示1.2:整数/整数=整数,浮点数/浮点数=浮点数,算术表达式,程序1-3 复杂的表达式计算问题1: 5-0.1的值是什么? 问题2: #include的作用?,变量及其输入,程序1-4 A+B问题提示1-3:scanf中的占位符和变量的数据类型要一一对应,且每个变量前需加&,变量及其输入,例题1-1 圆柱体的表面积 输入底面半径r和高h,输出圆柱体表面积,保留3位小数,格式见样例 样例输入:3.5 9 样例输出:Area=274.889程序1-5 圆柱体的表面积,变量及
3、其输入,提示1-4:在算法竞赛中,输入前不要打印提示信息。输出完毕后应立即终止程序,不要等待用户按键,因为输入输出过程都是自动的,没有人工干预。 提示1-5:在算法竞赛中不要使用头文件conio.h ,包括getch()、clrscr()等函数 提示1-6:在算法竞赛中,每行输出均应以回车符结束,包括最后一行。除非特别说明,每行行首不要有空格,但行末可以有空格。输出的每两个数或字符串之间应以单个空格隔开。算法竞赛的程序只做三件事:读入数据、计算结果、打印输出。,变量及其输入,提示1-7:尽量用const关键字声明常数。 提示1-8:赋值是个动作,先计算右边的值,再赋给左边的变量,覆盖它原来的值
4、。 提示1-9:printf格式字符串中可以包含其他可打印符号,打印时照原样输出。,顺序结构程序设计,例题1-2 三位数反转 输入一个三位数,分离出它的百位、十位、个位上的数字,反转后输出。 样例输入:127 样例输出:721程序1-6 三位数反转(1)提示1-10:算法竞赛的题目应当是严密的,各种情况下的输出均应有严格的规定。如果在比赛中发现题目有漏洞,应向相关人员询问,而尽量不要自己随意假定。程序1-7 三位数反转(2),顺序结构程序设计,例题1-3 交换变量 输入两个整数a和b,交换二者的值,然后输出 样例输入:824 16 样例输出:16 824程序1-8 变量交换(1)提示1-11:
5、赋值a=b后,a的值被覆盖,b的值不变,顺序结构程序设计,程序1-9 变量交换(2)提示1-12:交换两个变量的三变量法应用范围广,推荐使用。程序1-10变量交换(3)提示1-13:算法竞赛是在比谁能更好地解决问题,而不是在比谁写的程序看上去更高级。,分支结构程序设计,例题1-4 鸡兔同笼 已知鸡和兔的总数为n,总腿数为m。输入m和n,依次输出鸡的数目和兔的数目。如果无解,则输出“No answer”(不要引号) 样例输入:14 32 样例输出:12 2 样例输入:10 16 样例输出:No answer,分支结构程序设计,提示1-14:if语句的基本格式为:if(条件)语句1;else 语句
6、2; 提示1-15:if语句的条件是一个逻辑表达式,它的值可能真,也可能假 提示1-16:C语言中的逻辑运算符都是短路运算符。一旦能够确定整个表达式的值,就不再继续计算。三目运算符:逻辑表达式?表达式1:表达式2;,分支结构程序设计,例题1-5 三整数排序 输入3个整数,从小到大排序后输出。 样例输入:20 7 33 样例输出:7 20 33 程序1-12 三整数排序(1)(错误)提示1-17:算法竞赛的目标是编程对任意输入均得到正确的结果,而不仅是样例数据。,分支结构程序设计,程序1-13 三整数排序(2)提示1-18:如果有多个并列、情况不交叉的条件需要一一处理,可以用else if语句。
7、程序1-14 三整数排序(3)提示1-19:可以用花括号把一些语句组合成一个整体。这些语句仍然按顺序执行。程序1-15 三整数排序(4)提示1-20:在难以一次性求出最后结果时,可以用变量存储“临时结果”,从而逐步更新。,数据类型实验,实验A1:表达式11111*11111的值是多少?把5个1改为6个1呢?9个1呢? 实验A2:把实验A1中的所有数换成浮点数,结果如何? 实验A3:表达式sqrt(-10)的值是多少?尝试用各种方法输出。在计算的过程中系统会报错吗? 实验A4:表达式1.0/0.0、0.0/0.0的值是多少?尝试用各种方法输出。在计算的过程中系统会报错吗? 实验A5:表达式1/0
8、的值是多少?在计算的过程中系统会报错吗? 你不必解释背后的原因,但需要注意现象。,scanf输入格式实验,如果用语句scanf(“%d%d”,&a,&b)来输入两个数,那么这两个数应以怎样的格式输入呢?(提示:输入后可以用printf打印出来,看看打印的结果和输入的结果是否一致) 实验B1:在同一行输入12和2,并以空格分隔,是否得到了预期的效果? 实验B2:在不同的行输入12和2,是否得到了预期的效果? 实验B3:在实验B1和B2中,在12和2的前面和后面加入大量的空格或水平制表符(tab),甚至插入一些空行。 实验B4:把2换成字符s,重复实验B1B3。 你不必解释背后的原因,但需要注意现
9、象。,printf语句输出实验,和上面的实验不同,除了注意现象外,你还需要找到问题的解决方案。 实验C1:仅用一条printf语句,打印1+2和3+4的值,用两个空行隔开。 实验C2:试着把%d中的两个字符(百分号和小写字母d)输出到屏幕。 实验C3:试着把n中的两个字符(反斜杠和字母n)输出到屏幕。 实验C4:象实验C2,C3那样也需要“特殊方法”才能输出的东西还有哪些?哪些是printf函数引起的?哪些不是?,测测你的实践能力,如何用实验方法确定下面问题的答案?注意不要查书,也不要在网上搜索答案,必须亲手尝试实践精神是极其重要的。 问题1:int型整数的最小值和最大值是多少?需要精确值。
10、问题2:double型浮点数能精确到多少位小数?或者,这个问题本身值得商榷? 问题3:double型浮点数最大正数值和最小正数值分别是多少?不必特别精确。 问题4:逻辑运算符else y+的确切含义是什么?这个else和哪个if配套?有没有办法明确表达出配套方法,以避免初学者为之困惑?,初学者的策略,重视实验。哪怕不理解背后的道理,至少要清楚现象。 学会模仿。把学习实验的焦点集中在最有趣的地方。 如果直观的解决方案行得通,就不必追究其背后的机理。 如果对一个东西不理解,就不要对它修改;如果非改不可,则应根据自己的直觉和猜测尝试各种改法,而不必过多考虑“为什么要这样”。 当有一定的自学和研究能力后,再寻找更多的资料进一步学习一些重要的概念和原理。 要想把事情做好,必须学的透彻-但没有必要操之过急。,上机练习,10.60.11.101/JudgeOnline 算法竞赛入门练习一,