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