C语言基础-已识别_第1页
C语言基础-已识别_第2页
C语言基础-已识别_第3页
C语言基础-已识别_第4页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一周辅导2013年4月I9日星期五ー、 程序设计的基本方法学习计算机语言的目的是:利用该语言工具设计岀可供计算机的运行的程序。完整的程序设计应该是:数据结构+算法+程序设计方法+语言工具。ー个程序应包括两方的内容:(1)对数据的描述:数据结构(2)对操作的描述:算法在拿到一个需要解决的实际问题之后,■■・般操作步骤如下:分析问喇^定数学模型ワ数据结拗~~设计算闺酶写程用幅序编译调试并运行【例1】己知半径求圆面积问题。(1)分析问题:根据半径求圆面积公式,可以借助数学公式完成。(2)确定数学模型与数据结构①数学模型:使用求面积公式S=iTr2②数据结构:本问题可以设计ー个变空间r存储半径的值,ー个变量空间S存储面积的值。(3)设计算法:算法是指解决ー个问题所采取的具体步骤和方法。也就是给定初始状或输入数据,经过计算机程序的有限次运算,能够得出所要求或期望的终止状态或输出数据。求面积算法设计如下:①输入半径r;②依据圆面积公式求圆面枳S;③输出圆面枳S。编写程序:用计算机语方描述算法的过程,这ー步常称为“编码”,程序的质量主要是由算法决定。程序编译调试和运行:通过编译调试和运行程序,获得正确的编码和正确的结果。二、算法程序设计中最关键的ー步就是设计算法,程序设计能力水平的高低在于能否设计出优秀的算法。算法是解决问题方法的精确描述,解决ー个问题的过程就是实现ー个算法的过程。算法的特点:(1)输入:ー个算法可以有零个或多个输入量。(2)输出:ー个算法必须有一个或多个输出量,输出量是算法设计的结果。没有输出的算法是毫无意义的。(3)确定性:算法的描述必须无歧义,以保证算法的执行结果是确定的。(4)有穷性:算法必须在有限步骤内实现。(5)有效性:以称可行性,算法中的每ー步骤都应该能有效地执行,执行算法最后应该得到确定的结果。对于确定的算法,可以把ー个算法看作是ー个“黑箱子”,根据输入得到确定的输出。r 求半径为r的面积恆面积算法J三、算法描述为了描述ー个算法,可以采用不同的方法,常用的有:自然语言、流程图、N-S流程、伪代码。第二节顺序结构程序设计顺序结构、选择结构、循环结构是三种基本程序设计。“顺序结构”就是按顺序完成事情的步骤。比如:起床——穿衣——洗漱——吃早点——上学。本周我们先学习顺序结构程序设计用到的最基本的输入、输出、赋值语句的语法格式和使用方法,从具体的问题出发,分析解决问题的顺序结构,进而编写出解决实际问题的顺序结构程序。1、问题引导【问题1】鸡和兔子关在ー个笼子里,可以看到共有12个头、40只脚,求鸡和兔子名有多少只?【问题2】已知旅行的距离和汽车平均速度,每公升汽汕可以行驶的公里数以及每公升汽油的价格,求驾驶汽车旅游所花费的时间和购买汽油的钱数。2、问题分析【问题1分析】鸡兔同笼是ー个古老的数学问题。求解方法很多,这里不妨直接应用结论。用chick和rabbit分别表示鸡和兔子的只数,那么:rabbit=(40-2*12)/2chick=40-rabbit【算法描述】(1)计算兔子的只数rabbit=(40-2*12)/2;(2)计算鸡的只数chick=40-rabbit;(3)输出鸡和兔子的只数chick和rabbit的值。【问题2分析】设旅行的距离为s,汽车平均速度为V,每公升汽油可以维持的公里数为k,每公升汽油价格为p。贝リ:(1)汽车行驶时间=s/v;(2)所用汽油公升数liter=s/k;(3)旅行总共花费total=liter*p。【算法描述】(1)输入距离、汽车平均速度、每公升汽油可以维持的公里数、每公升汽油价格的值;(2)计算汽车行驶时间;(3)计算所用汽油公升数;(4)计算旅行总共花费;(5)输出汽车所花费的时间和钱;(6)算法结束。3、解决方案程序设计就是用各种程序设计语言将算法转化成可被计算机执行的代码的过程。从上述问题的算法描述中,可以看到解决问题的过程一步ー步由上至下,这种有序的过程称为顺序结构,顺序结构程序设计完成的是用顺序结构思想设计的算法编制程序的过程。通过上面对问题的分析,可以归纳出顺序结构程序设计一般由三部分组成。(1)输入部分;确定己知变量的值;(2)处理部分:按顺序进行求解。(3)输出部分:给出结果。结构化程序设计语言提供了输入、赋值、输出语句,用来实现上述三部分最基本的描述。.2常量、变量及其数据类型C语言中数据有常量和变量之分。在程序运行的过程中,其值保持不变的量,称常量,而其值可以改变的量,称变量。1、常量常量是用ー个标识符来代表一个常量,称为符号常量。符号常量在使用之前要先定义,定义格式:#defineく符号常量名X常量〉如:#definePI3.14159265将符号PI定义为3.14159265。在程序中应用圆周率的时侯,就可以直接写PL而不必写3.14159265。这里的标识符实际上就是ー个名字。C语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须是字母或下划线。在程序中自己定义标识符时,应注意:C语言中预先定义了一些具有特殊含义的标识符,称为标准标识符,例如:main,int,defing,include等等。自己定义的标识符不能使用标准标识符,否则,将引起混乱。(2)定义时选用的标识符注意遵循“见名知义”的原则,即用ー些有意义的单词作为标识符。(3)在C语言中,大写字母和小定字母被认为是两个不同的字符。习惯上,符号常量使用大写字母表示,而一般变量用小写字母,以示区别。在程序中采用符号常量优点:(1)书写方便(2)修改方便(3)可读性强2、变量与符号常量类似,变量也都有自己的名字。例如:求圆的周长和面积的程序中,r可以存储任何从键盘输入的数据,并将该数据人作为半径值,进行后续的操作。变量有变量名、变量类型、变量值三个要素。变量名用于标识存放数据的存储单元。变量名也称变量标识符。变量类型用于规定存放数据的大小与形状,变量类型在使用之前必须给予定义说明。变量值是存放在变量名指向的存储单元中的具体值。 ーーC< 变量值 « 存储单元变址必须先声明再使用。声明变量时,要告诉编译器这个变量的名称和其代表的数据类型。声明变量的同时,编译器根据这个变量的类型为它分配了相应的内存空间。声明变量的格式如下:变量类型变量名例如:intx: 〃声明x为ー个整数类型的变量doubley〃声明y为,ー个双精度实数类型的变量charz 〃声明z为ー个字符类型的变量3、数据据类型数据类型不仅确定该类型数据据的表示形式和取值范围,而且还确定了对它所能进行的各种运算。编译器根据这个数据类型给它分配足够的内存空间。C语言基本类型(整型、实型、字符型、枚举型)、构造类型(数组类型、结构体类型、共用体类型)、指针类型、空类型等。其中经常使用的是字符型(char)、整型(int)和浮点型(float/double).定义基本类型变量时,可以使用符号属性signde、unsigned(对应char、int)和长度属性short、10ng(对应int、double)对变量的取值区间和精度进行说明。.4赋值语句一、赋值语句的格式与应用在变量声明过后,可以用赋值语句给变量赋予一个值。在c语言中,赋值语句的格式如下:变量=表达式;功能:将“="右边的表达式的运算结果赋给“=”左边的变量。例如:x=100;〃把100这个值赋给ax=34*(34/234)+3432甲 〃把表达式的运算结果值赋给xy=x+l 〃先计算x+1的值,然后把这个值再赋给y说明:(1)只有确定值的变量才能在表达式中使用。有些变量虽然被定义了,如果没有被赋值或衩赋初值,则是无意义。(2)使用赋值语句将一个数值给ー个变量,同时,将这个变量己有值改变为新赋的值,直到下次再被赋予新值为止。例如:比+1;〃先计算X+1的值,然后再赋给X如果X的初值是1,那么经过这个语句之后,x的值就为成了2。(3)在C语言中,给变量赋值除了使用赋值语句,还可用赋初值的办法。即在定义或说明变量时,将ー个数值送给变量,使变量被定义后便有了该值,直到被改变为止。例:写出下面程序运行后,a和b的结果。//exam2_l#include<stdio.h>#include<stdlib.h>main()(inta=3: 〃声明a为整形变量,并赋初值3intb=2; 〃声明a为整形变量,并赋初值2a=a+b; 〃计算a的值b=a-b; 〃计算b的值a=a-b; 〃计算a的值printf("%d%d",a,b);〃输出ab的值return0;system("pause");〃停屏看结果)#include<stdio.h>/进行有关预处理操作。Include称为文件包含命令;尖括号中的内容,称之为首文件main()函数是ー个程序的入口部分。每ー个程序都要有一个main函数,程序都是从mani函数头开始执行的,然后进入main函数中,执行者main函数的内容。{}内是函数体。该程序运行之后,a和b的结果为2和3,该程序实现了两个变量的交换。同学们想想还有没有其它方法,同样可以实现这个功能。#include<stdio.h>#include<stdlib.h>main()(inta=3i 〃声明a为整形变量,并赋初值3intb=2; 〃声明a为整形变量,并赋初值2intc; 〃声明c为整型c=a; 〃将a的值赋给ca=b; 〃将b的值赋给ab=c: 〃将c的值赋给bprintf("%d%d",a,b);system("pause");第二周辅导2013年5月3日ー、整型变量定义:int变量名;例:inta;〃定义ー个整型变量。如果定义多个整型变量,可以按照这样的格式定义int变量名!.变量名2,……”例:inta,b,c; 这个语句等价于:*nta,intb;intc;当我们定义ー个变量时,计算机会为这个变量分配ー个大小合适的内个子单元。因此这个变量是有值的,它的值是对应内存单元的值。这个值我们无法预知的。如果要确保变量在定义时就具有特定的值,我们需要在定义变量时,为变量赋初值。具体方法是在变量名后面增加“=数值"。如:inta,b=21,c;在此例中,b给赋了初值21.二、整形变量的分类整形变量的基本类型符是intoc语言还有两个类型修饰符可以用在整型变量定义时用。signed(有符号)和unsigned(无符号);作用:控制变量是否有符号。long和short作用:控制整形变量的值域范围。如:unsignedlonginta;int型取值范围ー32767〜32767之间。unsignedint取值范围是〇〜65535(占两个字节16位)等价于unsignedshortintlongint取值范围是ー2コし2コ1也就是ー2147483648〜2147483647之间unsignedlongint取值范围是:。〜23し1也就是0至4294967295之间三、整形常量的分类(1)如果整形常量的值位于ー32768至リ32767之间,就认为是int型常量。(2)如果整形常量的值位于ー2147483648〜2147483647,就认为为long型常量。(3)常量无unsigned类型四、实数变量的分类和定义(1)单精度实型,数据类型符是float,占4个字节(32位)取值范围10,7〜1037定义方法:floatf=2.14,f;,(2)双精度实型,数据类型符是double,占8个字节(64)位内存,取值范围是10ー3。7~103。8定义方法:doublex,y;(3)长双精度实型,数据类型符longdouble,占16个字节(128位),取值范围是10收"〜]04932定义方法:longdoublex,y以上三种类型中,float型精度最低,longdouble精度最高实型变量的精度类型精确表示的数字个数float7〜8位double7〜16位longdouble17〜18位例:实型变量的精度main(){floata: 〃定义a为float型(单精度实型)a=123.456789; //a的初值!23.456789printf("a=%f\n”,a);〃调用pfintf函数显示变量a的值。这里printf函数的第1个参数中没有包} 含%d,而是包含了%f,这是因为a是float型变量。在显示float型变量的

值时printf第一个参数的字符串要包含%f,/n表示换行运行结果:a=123.456787/由于float型变量最多只能精确表示8个数字,因此,在显示a的值时,没有精确显示123.456789,而成了123.456787五、数据的简单输出C没有用于输出的语句,必须调用标准库函数来完成数据的输出任务。库函数的调用格式很简单:函数名(参数列表);printf(''variablea=%d",a) ;tttt函数名参数 参数分号我们要学会如何利用printf函数一次输出ー个变量的值。printf('Howareyou!");〃显示Howareyou!此例告诉我们,printf函数将第一个参数的字符串原样显示。如果想让屏幕显示:varableais326。其中326是程序中int型变量的值。那么,就必须这样调用printf函数:printf("variableais%d",a);其中,“variableais”会原样输出,%d的位置上会显示a的值。实际上,%在是一种格式控制字符,它不能原样显示,在它的位置上会显示第二个参数的值。函数printf在显示不同类型数据的值时使用不同的格式控制字符。显示int型数据使用%d,显示unsignedint型数据使用%u,显示float型数据使用%f,显示char型数据使用%c,显示字符串数据使用%s。下面的例子演示了各种变量的输出方法。#include<stdio.h>#include<stdlib.h>main(){inta,b;〃定义a,b为整型变量unsignedintu;〃定义u为无符号整型变量取值范围0〜65535charch;〃定义ch为字符型变量floatf;〃定义f为单精度实型a=100;//100赋值给ab=Oxffff;〃〇xffff是-1的反码,u=b;//b为int整型所以输出b的值为・Lu为unsigned所以输出65535ch=,A,;f=32.17;printf(Ma=%d\t'\a);//13%d输整数a的值:\t向右移ー个制表位printf(Mb=%d\n\b);//14%d输整数b的值;\n换行printf(Mu=%u\tH,u);//15%u输出unsigned型u的值,\t向右移ー个制表位printf(,,f=%f\n,\f);//16%f输出float型f的值小换行,光标移到下一行printf(Mchis%c",ch);//17%ch输出ch型的值 \n换行printf(Mandvalueis%d\n",ch);//18printf(HIlovethisprogram.\ryouM);//19 \r回车符,光标移到当前行的行首system(npauseM);)cヾFハC小程序、shuchu.exepl00 b=65535u=65535£=32.169998chisAandualueis65you请按任意键继续・・・程序解释:>第13和15行的prind"函数调用没有输出Xn,因此,光标没有换行,所以第14、16行printf函数的输出分别与第13、15行printf函数的输出位于同一行。>之所以b=-!和f=32.169998对得齐是因为在第13行和第15行的printf函数的调用中输出了制表符、3它使光标位于同・个制表位上。>\n表示换行,在屏幕上显示时,它的作用不但包括换行(移到下一行同一列的位置),而且会使光标回到行首。>B的值是否ー1,当它赋值给u时,u的值是Oxff仟,由于u是无符号数,因此,u的值是65535。但要注意,一定要用%U输出U。> 由于ch是字符型变量,因此,它也是一种整数,当用%d输出字符时,输出的是字符的ASCH码值。>为什么没有输出‘'Ilovethisprogram."呢?因为第!9行的printf函数的第一个参数的字符串中有个回车符'r。当显示到'r时,光标又回到了行首,后面的“you”继续显示,覆盖了“I”以及后面的2个空格。>第19行的〃是注释符。〃后面的文本是注释信息。但注释〃只能用来注释ー行文本,如果有多行注释文本,每一行注释文本的前面都要有〃。练习:写出下列程序的运结果。你需要知道:printf(''variableais%d”,a);其中,“variableais”会原样输出,%d的位置上会显示a的值。实际上,%在是一种格式控制字符,它不能原样显示,在它的位置上会显示第二个参数的值。#include<stdio.h>#include<stdlib.h>main()(inta=202;doubleb=2323.34345;printf("a=%d\n",a);printf("2*a=%d\n",2*a);printf("a=%d\n",a);printf(n%31f\nH,b);printf(M%-20.21f\nM,b);printf(H%-20.21f\nn,b);printf(,,%.21f\n,,,b);system("pause*');}

格式输出:Printf(格式控制,输出列表)功能:将输出列表中的数据按照格式控制中指定的格式输出。说明:(1)“格式控制”是用双引号括起来的字符串,包括格式说明和普通字符两部分。Printf格式字符格式字符说明d,i将整数按照带符号的十进制形式输出(正数不输出+号)0将整数按照ハ进制无符号形式输出(不输出前导符0)X,x将整数按照十六进制无符号形式输出(不输出前导符。),格式字符用X时,则输出十六进制数的a-f,以小写形式输出;用X时,则以大写字母输出u将整数按照无符号十进制形式输出c以字符形式输出,只输出ー个字符s输出字符串f按照小数形式输出单、双精度数,默认情况输出6位小数e,E以指数形输出实数g,G选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的。,格式符号用G时,如果以指数形式输出,则指数用大写表示。除了X、E、G(用大写字母字母表示)タト,其他格式字符必须用小写字母。(2)“格式控制”字符串内可以包含转义字符。(3)如果想输出字符“%”,则应该在“格式控制”中使用两个连续的%。(4)“输出列表”由逗号分隔的若干个输出数据组成,输出数据也可以是表达式。(5)在“格式控制”中,还可以出现附加格式说明符号,用来指定输出数据宽度。printf的附加格式说明字符附加格式字符说明例子字母“ド用在d,〇,X,U前面,用于输出长整形数longa=123456;printf(44%ld,,,a);ー个正整数m指定输出数据段的宽度,如果数据的位数小于m,则左端填充空格;若大于m,则按实际位数输出。longa=123456;printf(<4%81dM,a);输出口ロ123456(前面空两格)ー个正整数n对于实数(如%m.nf)表示输M的数据共占m位,其中有n位小数;对于字符串(如%m.ns)表示输出占m列,但只截取字符串左端的n个字符,这n个字符右对齐printfC%7.2f;123.456);输出口123.46prinlf("%7.2s“Jhello");输出口口ロロDhe(前面空5格)字符“一”输出的数字或字符在向左对齐,右边补充空格printfC%-7.2f\123.456);输出123.46ロ

3、3、输入语句2013-5-31【复习前面知识】1、定义整形变量:2、格式输出语句:若i=123,c='a',贝リpintf("i=%d,ch=%c\n",i,ch);的输出结果是:3.字符输出格式:putchar(c);功能:向终端输出ー个字符。说明:(1)其中C可以是字符型变量、整形变量;例如,当x是字符型变量,并且被赋值为’1'时,下面的语句都是合法的:putchar('A');putchar(x);⑵运用putchar函数还可以输出控制字符,如换页、换行等。例如:putchar(へn') 〃输出换行符。putchar(へ”); 〃输出字符单引号putchar(AlOr); 〃输出字符’A,[新课讲授]前面我们给ー个变量给值,利用赋值语句,今天我们学习输入语句,作用就是给变量赋值。C语言中的输入语句与输出语句ー样,都是调用函数实现的。因此在有输入语句的程序开头,要加上预编译命令#include<stdio.h>或#include<stdio.h>。在c语言中常用的输入函数有字符输入函数getchar。和格式输入函数scanf().ー、字符输入格式:getchar();或变量名=getchar();功能:从输入设备输入ー个字符,对于第二种格式,变量将获得这个字符的值。说明:(1)getchar()函数没有参数,即括号中不写任何内容;getchar()只能接收一个字符;(3)特殊情况,getchar()也可以作为表达式出现,例如:putchar(getcharO);等价于:c=getchar();putchar(c);二、格式输入格式:scanf(格式控制,地址列表);说明:scanf中的“格式控制”与printf中的一致。“地址列表”由逗号分隔的若干个地址组成。地址由&后跟变量名组成。例:&a是指a在内存中的地址。(3)输入数据时,两个数据之间以ー个或多个空格分隔,也可以用回车键或イTab>键分隔。(4)在“格式控制”中除格式说明外出现了其他字符,那么在输入数据时,对应的位置必须输入相应的字符。例:scanf("%d:%d”,&a,&b);从键盘正确的输入格式是:3:4丙个数据据之间必须出现格式说明中的“:”。【例】写出下面程序的运动结果。#include<stdio.h>#include<stdlib.h>main()(inta;doubleb;charc;scanf("%c%d,%lf*,&c,&a,&b);〃从键盘输入cab的值printf("resultis\n"); 〃输出resultis后回车printf("%c%d%.21f",c,a,b); //输出c,a,b的值system("pause");return0;}输入:e23,123.34输出:【练习】【问题2】已知旅行的距离和汽车平均速度,每公升汽油可以行驶的公里数以及每公升汽汕的价格,求驾驶汽车旅游所花费的时间和购买汽油的钱数。【问题2分析】设旅行的距离为s,汽车平均速度为v,每公升汽油可以维持的公里数为k,每公升汽油价格为p。贝リ:(1)汽车行驶时间=s/v;(2)所用汽油公升数liter=s/k;(3)旅行总共花费total=liter*p。【算法描述】(1)输入距离、汽车平均速度、每公升汽油可以维持的公里数、每公升汽油价格的值:(2)计算汽车行驶时间;(3)计算所用汽汕公升数;(4)计算旅行总共花费:(5)输出汽车所花费的时间和钱;(6)算法结束。请按照算法设计程序:提示:先定义变量,再编写算法,最后输出t和total的结果,结果保留两位小数。变量均定义为:float型输出时保留两位小数:printf(“%.21f%.21产,t,total);语句实现,其中%.21f就是float型保留两位小数格式。调程时,输入:20529输出结果:4.0090.00顺序结构程序设计实例 (2013年6月2日)【实例2-7-11日期写法(data)问题描述:对于年、月、日的描述,不同国家有不同的描述方式,按年、月、日的形式读入日期,输出中国式的写法(年、月、日),英国式的写法(日/月Z年)和美国式的写法(月Z日7年)。输入:从键盘输入正确的年、月、日。输出:中、英、美式的日期写法。问题分析:问题涉及的变量有三个,设year表示年,month表示月,day表示天,类型均为整形。算法描述:(1)输入年、月、日给变量year、month,day;(2)输出中国式的日期写法;(3)输出英国式的日期写法;(4)输出美国式的日期写法。请自己设计程序。调式结果:201362China:201362English:262013America:622013请按任意键继续...【实例2-7-2】数字分离(splitnum)问题描述:小明刚学会1位数字的加法运算,小明妈妈想考核小明的运算能力,于是每次给ー个四位整数,让小明求各位数字和。小明妈妈让你帮她写ー个程序,能随机产生一个四位整数,同时给出各位数字和。这样她ー边做自己的事,ー边考核小明。输入:随机产生一个四位整数。输出:产生的整数和各位数字和。问题分析:1、用库函数中的随机函数rand〇产生一个随机整数产生a到b中的任意整数方法k=rand()%(b-a+1)+a;在执行随机函数时,需要进行初始化。方法:srand((unsigned)time(NULL));也可以直接写成srand(time(NULL));初始化函数是srand().使用srand()函数设置随机数生成器的种子,就可以生成seed参数对应列表顺序中的随机数了。因此,想要真正实现随机化,关键在于能够在每次执行程序的时候传给strandい参数要不同オ行。那么什么是在运行程序的时候一直变化呢?当然,就是时间。可以借助time.h库中的time(NULL)返回机器当前的时间。2、如何拆分ー数可以利用%和/运算符实现。C语言运算范围很广,由一系列数字、运算符组成表达式,而表达式的组合,可以解决很多现实问题。1、算术运算加(+)、减(一)、乘(X)、除(ハ和模(%)运算符含义说明例子+加常规的加法运算3+1的结果是4—减常规的减法运算3.0-1.0的结果是2.。X乘常规的乘法运算4*4的结果是16/除两个整数相除的结果是整数:其准确的小数部分被完全割掉1.0/2.0的结果是0.5,1/2的结果是0,5/2的结果是2%模模运算的结果符号取决于被除数的符号-7%3的值为ー17%-3的值为!,-7%-3的值为ー1在上述运算中,操作数中有一个是实数时,运算结果就是double型(双精度型)。上述运算符的优先级与数学中相同:・、/、%髙于+、运用%和/实现数字分离方法:设a,b,c,d分别代表number的个、十、百、千位,则用赋值语句表示:a=nmber%10(%10就是模10,取余数)b=number/10%10;c=number/l00%10;d=number/1000;还有其它的表达式构造形式,请大家自己想想。算法描述:随机产生一个四位数存放在number变量中;strand(time(NULL)); 〃初始化number=rand()%9000+1000 〃随机产生-个四位数将number变量中的数各位数字拆分出来存放在a,b,c,d变量中;求各位数字的和s;输出number和s;【实例2-7-3】时间戳(times)国家安全局获得了一份珍贵的材料,上面记载了一个即将进行的恐怖活动的一切。不过,国家安全局没法得到实施的时间!材料上的时间使用的是LINUX时间戳,即是从1970报1月1日。时。分0秒开始到该时刻总共过了多少秒。此等重大的责任终于落到你的肩上了,给你该时间戳,你要写个程序计算出恐怖活动在哪一天实施(这里为了简单起见,规定一年12个月,每个月固定为3。天)。输入:ー个整数n(OWnW2147483647),表示从197。年1月1日。时。分。秒开始到该时刻过了n秒。输出:一行:三个整数y,m,d,表示恐怖活动在y年m月d日实施。问题分析:根据问题中的n的数据范围,本题要特别注意数据类型的设计,显然,n的数据类型应设计为long。(因为int型的取值范围为ー32768到32767,上面要求的取值范围int范围,所以设计为!ongint(-2147483648-2147483647)。根据问题中的设定,一年12个月每个月固定为3。天,可以算出一年为31104。。。秒。一个月为259200。秒,一天为864。。秒,将n秒整除年的秒数转换年年y,将转换成年的余数整除月的秒数转换成月m,再将转换成月的余数整除天的秒数转换成天d.算法描述:输入n的值;

(2)求y的值;y=n/year;(3)求m的值;ys=n%year;m=ys/month+l(4)求d的值;d=ys%month/day+1;(5)输出y+1970,m,do顺序结构程序练习(2013年7月2日)1、写出下列程序的运行结果(1)#include<stdio.h>main()charchl,ch2,ch3;inti;scanf(H%cn,&chl);ch2=chl-l;ch3=chl+l;第2读程题i=ch1;printf(Mordcharpredsucc\nn);printf(n%d%c %c %c\nn,i,ch1,ch2,ch3);return0;}运行后输入:E(2)#include<stdio.h>main()miJ25314KIK2Xy(x»i)(y»j(x»i)A(y»j)(intm,x,y,k,kl,k2;intij;scanf(H%d%d%d”,&m,&i,&j);kl=l«i;k2=l«j;x=m&kl;y=m&k2;printf(M%d\n';(x»i)A(y»j));return0;mij25347KIK2Xy(x»i)(y»j(x»i)A(y»j)运行后输入:(1)25314 (2)25347第2道读程题涉及到逻辑运算知识:位运算运算符含义说明例子&按位与把参与运算的两个数各个对应的二进制位相与,只要对应的两个二进制位均为1时,结果的对应位オ为1,否则为09&5中9可以写成(00001001),5可以写成(00000101),那么9&5的运算结果为00000001,输出结果是11按位或把参与运算的两个数各个对应的二进制位相或,也就是,只要对应的两个二进制位有一个为1时,其结果就为1915相当于00001001100000101,运算结果就是00001101,输出结果是13A按位异或把参与运算的两个数各个对应的二进1ハ1=0,1ハ0=1,0ハ0=0,0ハ1=1制位相异或,当对应的二进制位上的数字不相同时,结果的对应位为1,否则为〇。相同为0,不同为1〜取反把运算数的各个二进制位按位求反〜9相当于〜(00001001)»运算结果为:11110110,输出结果为ー10«左移把,(«“左边的运算数的各二进制位向左移若干位,“〈グ‘右边的数是指定移动位数,高位丢弃,低位用。补齐a«4指把a的各二进位向左移动4位,如a=00000011(十进制3),左移4位后为00110000(十进制48)»右移把“>>”左边的运算数的各二进制位全部右移若干位,'’》"右边的数是指定移动位数设a=15,a>>2表示把000001111右移为00000011(十进制3)2、补充完善下列程序。己知a,b,c是三角形的三条边的长度,由键盘输入合法的a,b,c的值,利用海伦公式求三角形的面枳,输出保留小数后两位。海伦公式:p=(a+b+c)/2.0;S=yJp*(p-a)*(p-b)*(p-c) 提示:使用y=sqrt(x)这个语句可以使y的值为x的平方根。#include<stdlio.h>#include<stdlib.h>main(){一①a,b,c,p,s;scanf("%d%d%d”,&a,&b,&c);p=(a+b+c)/2.0;s=②;print(③);}©3.编程题》(1)从健盘上读入长方形的边长a,b,计算它的面积和周长,输出。输入:用时、分、秒表示时间长度,把它转换为秒数。按年利率R%存入本钱X,存入P年后的本利合计为丫=X((1OO+R)ハ00)P,请根据输入的R、X和P值输出,求丫的值。农夫与石头憨厚的老农夫昨天检到了3块小石头,他想再去检ー块石头,让这4块石头正好一共重20千克,请问他应该支检一块多少千克的石头?要求输入这三块石头的重量(千克),输出一个数,表示农夫应该去检ー块多少千克的三种石头。2013-8-29信息学奥赛讲义(2013-8-30)ー、复习①输入语句:scanf(格式控制,地址列表);例如:scanf("%d%d”,&a,&b);②输出语句:printf("variableais%d”,a);其中,“variableais”会原样输出,%d的位置上会显示a的值。实际上,%在是一种格式控制字符,它不能原样显示,在它的位置上会显示第二个参数的值。③定义变量int定义整型 float定义浮点型号 double定义双精度型!ong定义长整型@C语言结构#include<stdio.h>#include<stdlib.h>main(){(1)定义变量,判断此题运用什么类型的变量?(2)给变量输入数据,运用输入语句。(3)根据题意运用算法计算(4)运用输出语句输出结果。system("pause");return0;例题:(1)从健盘上读入长方形的边长a,b,计算它的面积和周长,输出算法:#include<stdio.h>#include<stdlib.h>main(){(1)定义变量,判断此题运用什么类型的变量?(2)给变量输入数据,运用输入语句。(3)根据题意计算周长和面积,运用赋值语句。(4)输出周长和面积,运用输出语句。system("pause");return0;}输入:用时、分、秒表示时间长度,把它转换为秒数。解释:输入秒数,将他转换为用小时分钟秒来表示算法;#include<stdio.h>#include<stdlib.h>main()(1)定义变量,根据数据范围,定义成长整型变量;运用long变量名;(2)输入妙数,运用输入语句(3)秒转换成小时,h=t/3600%24;(4)秒转换成分钟,m=t%3600/60;(5)秒转换成秒,s=t%60;(6)按小时;分钟;妙输出printf("%ld:%ld:%ld”,h,m,s);system(,'pausen);return0;)按年利率R%存入本钱X,存入P年后的本利合计为丫=X((100+R)"00)P,请根据输入的R、X和P值输出,求丫的值。年利率真3.25%函数pow(底数,指数);返冋乘方值pow需要调用#include<math.h>文件。voidmain。初始化程序思路:#include<stdlib.h>#include<math.h>voidmain(){(1)定义变量,有小数,定义成float型(2)输入语句给变量r,x,p输入值s=(100+r)/100;y=x*pow(s,p);(5)输出y的值,保保留两位小数。system("pause");return0;)预习第3章选择结构程序设计问题引导分析选择结构程序设计就是ー种根据当前情况确定下ー步所做操作的控制结构。它强调当条件成立时,进行某种操作,而条件不成立时不进行操作或进行另外…种操作。在选择结构程序中,程序执行流程将不再像顺序结构那样,从上至下,一条一条地执行所有的语句,而是根据条件的成立与否走向同的分支,所以,选择结构也被形象地称为分支结构。问题引导【问题3-1】给定两个整数a与b,输出其中较小值。【问题分析】首先读入两个整数a和b,然后比较a和b的大小:如果a<b,则输出a;否则输出b。算法描述:(1)输入a和b:(2)如果a<b成立,则输出a,否则,输出b;(待续)信息学奥赛讲义(2013-9-6)【问题3-2]已知三条线段的长度(均为正整数),判断这三条线段是否构成三角形;若能构成三解形,判断所构成三角形的形状。【分析问题3-2】读入三条线段的长度,依次记为a、b、Co如果(a+tx=c)或(a+c<=b)或(b+c<=a),则可以判断这三条线段不可能构成三角形,否则对所构成三角形的形状进判断。构成等边三角形的条件是(a=b)并且(b=c)成立。构成等腰三角形的条件是(a=b)或者(a=c)或者(b=c)成立。构成直角三角形的条件是(a*a+b*b=c*c)或者(a*a+c*c=b*b)或者(b*b+c*c=a*a)成立。为提高程序的效率,再作一些细致分析:(1)如果三条线段能构成等边三解形,则不必判断它们能否构成等腰三角形。(2)如果三边均为正整数时,这个三角形不可能是等腰直角三形。算法描述:(1)输入三条边的长度a、b、c;(2)如果(a+b<=c)11((a+c<=b)II(b+c<=a)成立,则提示不能构成三角形,否则如果(a=b)&&(b=c)成立,则提示构成等边三角形,否则如果(a=b)ll(a=c)ll(b=c)成立,则提示构成等腰三角形,否则如果(a*a+b*b=c*c)II(a*a+c*c=b*b)ll(b*b+c*c=a*a)成立,则提示构成直角三角形,否则构成普通三角形。(3)结束。【问题3-3]为保密,QS星球使用了特殊的指令,指令以字符的形式发出,并且应用了加密策略。日前,他们加密的规则被我们获悉,原来规则如此有趣:将每ー个字母变成它的后继,例如“A”变成“B”、“Z”变成“A”,"z”变成“a",其它字符不变。现在请你破译接收到的ー个指令。【分析问题3-3]破译指令,只要按加密的逆规则转换即可。于是,根据题意,对于字母,要将它转换成它的前驱,特殊处理:'A’转换成,Z’、H转换成,z,;其他字符保持不变。由于字符很多,因此应该分多种情况进行处理。算法描述:(1)输入指令字符;(2)如果字符是‘A',则转换成‘Z';(3)如果字符是,’,则转换成‘z';(4)如果字符是其他字母,则转换成它的前驱;如果字符不是字母,则不转换:结束。

以上三个问题都是按照某个条件的成立与否转向执行不同的语句。而解决上述问题的关键恰在于如何建立有效的条件。根据条件执行不同分支,是选择结构程序的功能。在c语言中,为实现选择结构程序设计,提供了两种语句:条件语句和开关语句。3.2条件语句条件语句是根据指定条件的判断结果来决定程序走向的语句。当条件成立(即判断结果的值非〇)时,执行一个操作序列;当条件不成立(即判断结果值为0)时,不执行任何操作或者执行另外一个操作序列,于是,形成了程序的两个分支。条件语句的格式与功能格式1:Ifく条件〉语句1;格式2:Ifく条件〉语句1;else语句2;功能:(1)(2)对于格式1,功能:(1)(2)对于格式1,下:对于格式2,所示。说明:(1)〈条件〉可以是整形常量、整形变量,也可以是关系表达式和逻辑表达式。关系表达式和逻辑表达式如下:运算符含义说明例子&&且运算在运算符两端的表达式都成立的时侯,返回1(只要有一个不成立,返回。值(1=3)&&(3==3)的值为〇(1<5)&&(2〈3)的值为1II或运算运算符两端的表达式只要有一个成立,就返回1,只有在两端的表达式都不成立的情况下返回。(1<2)11(1〈-1)的值为1(3<1)II(4>12)的值为0!非运算运算符后边的表达式不成立的时侯,返回1,否则返回〇!(3=5)的值为1!(3=3)的值为〇当〈条件〉中同时出现了关系运算符、逻辑运算符、算术运算符时,其运算的伏特关系如下:括号—>1^!数、!一►・、/、%—►+、ーー►〈、〉、!=、〈=、〉=、==&&、II -►(2)对于格式1,语句1有可能不被执行;对于格式2,语句1和else后的语句2不可能同时被执行,每(3)语句1和语句2只能为一条语句,若实际功能不是一条语句所能完成,就必须将这些语句写成一个复合语句。复合语句用“ド和“ド将若干条语句括起来,作为一条语句使用。复合语句中,各语句之间用分号隔开。程序执行时,按书写顺序执行复合语句中的每条语句。次只能选择一个来执行。例如:次只能选择一个来执行。例如:if(a<0)a=-a;if(x==y)print("good");elseprintf(“bad”);〃当a小于0时,则执行a=-a〃当x等于y时,输出good〃当x不等于y时,输出bad例如:if(a>b){temp二a;a=b;b=temp;}(4)if语句允许嵌套,即语句1和语句2还可以是if语句,当if语句嵌套时,约定else总是和最近的ー个if配对。例如:if(a>b)if(b>c)y=a;elsey=c;else部分否定的是条件b>c,即它与第二个if语句配对;若想让else部分与第一个if语句配对,则要引入ー个复合语句,将上述语句写成如下形式;if(a>b)(if(b>c)y=a;)elsey=c;这时尽管复合语句内只有一条语句,但是复合语句界定了第二个if语句的范围,因此else部分否定的不再是第二个条件b>c,而是第一个条件下a>b。⑸对于在条件中判断的是输入字符的情况时,可以将输入与判断合并在一起出现。例如,判断输入字符是否为‘#',可以写成如下形式:if((ch=getchar())==,#')//ch是字符型条件语句的应用【例3・1】设计问题3」程序。依据问题3-1的算法描述,程序设计如ド:#include<stdio.h>#include<stdlib.h>main()(inta,b;printf(Ma,b=M);scanfC*%d%d”,&a,&b);printf("Theminofaandbis:");if(a<b)printf("%d\n”,a);elseprimf("%d\n”,b);system("pause’');return0;【例3-2】输入任意三个互不相等的整数,将其按从大到小的顺序输出。问题分析:在例3-1的基础上,很容易实现两个数字的从大到小输出。而三个数字的大小排序,会复杂ー些。三个数字a,b,c的大小排列有六种不同情况:a>b>c,a>c>b,b>a>c,b>c>a,c>a>b,0b>a。算法描述1:(1)输入a、b、c;(2)如果((a>b)&&(b>c))成立,则输入a,b,c;(3)如果(a>c)&&(c>b)成立,则输入a,c,b;(4)如果(b>a)&&(a>c)成立,则输入b,a,c;(5)如果(b>c)&&(c>a)成立,则输入b,c,a:(6)如果(c>a)&&(a>b)成立,则输入c,a,b;(7)如果(c>b)&&(b>a)成立,则输入c,b,a;(8)结束依据算法描述1可以,写出程序代码:(请同学们自己写);这种算法直观,但是感觉缺乏技巧性,当数字较多时,复合条件就会很长。这种方法不宜推广和迁移。换个角度,可以两两比较。算法描述2:输入a,b,c;如果a>b成立,则如果b>c成立,则输出a,b,c,否则(即bv=c)如果a>c成立,则输出a,c,b,否则输出c,a,b否则(即a<=b)如果a>c成立,则输出b,a,c,否则(即a<=c)如果bx成立,则输出b,c,a,否则输出c,b,a;结束。在分支下还有分支,这就需要应用嵌套的if语句来解决。写出对应的程序代码如下:请用钢笔写在下方。If(a>b)If(bx)printf(*l%d>%d>%d,\a,b,c;ElseIf(a>c)printf(t4%d>%d>%dv,a,c,b;ElseprintfCt%d>%d>%d,\c,a,b;ElseIf(a>c)printf(4t%d>%d>%d,\b,a,c;ElseIf(b>c)printf(44%d>%d>%d,,,b,c,a;Elseprintf(44%d>%d>%dM,c,b,a;算法2比算法更符合人类的思维习惯,但是程序的代码长度和书写的复杂度都提高了。再换ー种角度思考:无论输入数字的大小顺序如何,我们都将第一个数a和其后的每个数比较,发现有比它大的数,就交换过来,与最后ー个数比较完,a中存放的一定是最大数;再用第二个数b和其后的数进行比较,发现比它大的,就交换,于是,也保证了b中存放的是第二大数:对于只有三个数据的比较(多于三个数据的比较,继续按照上述方法向后比较),至此,c中存放的必然是最小值。输出a,b,c的当前值即可完成任务。算法描述3:输入a,b,c;

比较a和b:如果a<b成立,则交换a和b的值;比较a和c:如果a<c成立,则交换a和c的值;比较b和c:如果b〈c成立,则交换b和c的值;输出a、b、c;结束#include<stdio.h>#include<stdlib.h>main(){inta,b,c,temp;scanf(M%d%d%d”,&a,&b,&c);if(a<b){temp=a;a=b;b=temp;if(a<c)if(b<c)printf(',%d>%d>%d\n,',a,b,c);system(npauseH);return0;if(b<c)printf(',%d>%d>%d\n,',a,b,c);system(npauseH);return0;依据问题3-2算法描述,程序设计如下;#include<stdio.h>#include<stdlib.h>main()If(()H( )H())printf(t4If(()H( )H())printf(t4notasanjiaoxing\nM);elseif((a==b)&&(b==c)printfC'dengbiansanjiaoxing\n’');elseif((a==b)11(b==c)11(a==cprintf("dengyaosanjiaoxing\n");elseif((a*a+b*b==c*c )11(了嵌套if语句printf("zhijiaosanjiaoxing\n“);elseprintf("sanjiaoxing\n’');system("pause‘');return0;}【例3-4】超市为了促销,经常打折销售。〃给a,b,c输入数据〃不能构成三角形〃此处出现了嵌套if语句〃构成等边三角形)) 〃此处出现了嵌套if语句〃构成等腰三角形)11( ))〃构成直角三角形〃构成普通三角形购物超过50元,即可打折优惠:〃此处出现超过50元,打,9.5折;if(s<=50)f=s;〃此处出现超过100元,则打9折;elseif(s<100)f=s*0.95超过200元,则打8折;elseif(s<200)f=s*0.9超过300元,则打7折。Elseif(s.<300)f=s*0.8Elsef=s*0.7当购物满s元时,实际付费多少呢?printf(“%.21『,り问题分析:题目的叙述很清楚,当消费额不同时,将享受不同的优惠。因此,只要设计好条件,就可以按不同的方法计算实际付费值了。算法描述:(1) 输入消费额s;(2)如果s未超过50元,则不打折,付费值等于s否则,如果s未超过100元,则按第(1)条,付费等于s*0.95否则,如果s未超过200元,按第(2)条,付费等于s*0.9否则,如果s未超过300元,按第(3)条,付费等于s*0.8否则,s一定超过300元,按第(4)条,付费等于s*0.7;⑶输出付费值;请同学按算法写出程序。3.3开关语句应用条件语句可以很方便地使程序实现两个分支,但是出现多分支的时候,C语言提供了开关语句。开关语句尤其擅长处理一些分支较多且很有规律的问题,代码描述起来不仅方便而且直观。开关语句的格式与功能开关语句由一个表达式和众多可选择的操作序列组成。格式:switch(表达式){case值1:语句序列1;case值2:语句序列2;case值n:语句序列n;[default:语句序列n+1;])功能:运行开关语句时,根据表达式的求值结果,在众多分支中选取ー个分支执行。当表达式的值等到于值i时,则程序执行值i对应的语句序列i,如果表达式的值没出现在任何值表中,那么对没有default部分的开关语句就执行开关语句的后续语句,有default的就执行default后面的语句。在某种情况的case后面语句序列中,必须出现break,否则,程序将自动执行下・个case后面的语句。说明:表达式只能是顺序类型(除了实型以外的简单类型),它的一个取值只能在所有值表中出现一次。例如:switch(a)(casel:printf(4tlevel1M);case2:printf(4tlevel2");case3:printf(4tlevel3")case2:printf(4tlevel〇”);}在值表中,2出现了两次,这就是错误的。值表的排列无大小顺序的差别,值表中数值的类型必须和表达式类型相同。如果希望程序在执行过某个分支的语句后,跳出开关语句,执行开关语句后面的语句,则应在这个分支中出break语句。如果某个分支没有出现break语句,则会自动执行后续的语句。例如:switch(a){easel:printf(44levell");break;case2:printf(44level2");case3:printf(44level3");case4:printf(44level4");break;case5:printf(44level5");break;}当a=2时,将输出level2、level3、level4三项内容;当a=3时,将输出Ivel3、level4两项内容。(4)多个case可以共用ー组语句,即某些分支语句可以为空。例如:switch(a)(printf(44level1");break;case4:printf(44level4");break;case5:printf(44level5");break;}其中,a=2>a=3>a=4时,执行相同的语句:、:printf(44level45,);break;3.3.2开关语句的应用【例3-5】设计问题3・3的程序。include<stdio.h>include<stdlib.h>main()charch;scanf(t<c%,,,&ch);switch(ch) 〃根据ch的值,分情况处理(case'':printf("z\n");break;case'A':printf("Z\n'');break;default:if((ch<='z,&&ch>='b')II(ch<='Z'&&ch>=,B'))printfC%c\n",ch-l;elseprintf(44%c\n',,ch);break;}system(kfcpause");return0;【例3-6】对于给定的两个操作数,输入运算符,即可计算其值。这里假设运算符只有+、ー、・、Z,且两个运算数均为整数。问题分析:算术表达式的计算本身不是难题,但是不知道输入的是ー个怎样的表达式的时候,就需要设计ー个对任何运算都通用的程序。即运算符只有四种,只需分别列出四种运算即可。算法描述:(1)读入两个操作数;(2) 读入运算符:(3)根据运算符,分情况计算:①运算符为“+”,则输出两个运算数的和;②运算符为“一”,则输出两个运算数的差;③运算符为“*”,则输出两个运算数的积;④运算符为“/”,,需要讨论数的两种情况:若除数为零,则输出错误信息,否则输出两个运算数的商:⑤出现其他运算符,则显示输入错误;程序设计:#include<stdio.h>#include<stdlib.h>main()(; 〃定义a,b为整型; 〃定义c为字符型; /Z输入a,b的值; 〃给c输入运算符switch(c)( 〃根据运算符的不同,进行不同的情况处理case'+':printf("%d\nM,a+b);break;case'・':casecaseソ':if(b==0)printf("dividedbyzero!"); 〃考虑除数为零的情况elseif(a%b==0)printfC4%d\n",a/b);elseprintf("%.4f\n”,(double)a/b);break;default:printf(44inputerror!\n");break;}systemC'pause");return0;}【例3-7】给定年份和月份,求该月共有多少天。问题分析:一年有12个月,而每个月的天数在我们的头脑中都有固定的概念。但是有一个月份需要思考一下:那就是每一年的二月份。闰年的二月份有29天,平年的二月份有28天。那么如何判断某一年是否闫年呢?公历纪年法中,能被4整除的年份大多是闰年,除了那些能被100整除而不能被400整除的年份以外,如1900年是平年。‘‘四年一闰,百年不闰,四百年闰。”算法描述:(1) 输入年份和月份;(2)根据月份的数值,分情况处理:①月份为1、3、5、7、8、10、12中的ー个,则输出31;②月份为4、6、9、11中的ー个,则输出31;③月份为2,则判断该年是否为闰年:是闰年,则输出29,是平年,则输出28;(4) 结束。#include<stdio.h>#include<stdlib.h>Main()(intyear,month;scanf("%d%d”,&year,&month);switch(month)(case1:case3:case5:case10:case12:printf("Thereare31daysinthismonth.\n");break;case2:ir(((year%4=0)&&(year%100!=0))ll(year%400=0)) 是闰年的条件printf("Thereare29daysinthismonth.\n");elseprintf("thereare28daysinthismonthAn");break;case4:case6:case9:case11:printf("Thereare30daysinthismonth.\n");break;default:printf("inputerror!\n");

((year%4!=0)11((year%100==0)&&(year%400!=0)))不是用年的条件。例3-8:现在学生档案中经常采用等级评价,于是李老师想将百分制成绩转化为等级。李老师的成绩单上的成绩都是整数,他约定等级与百分制之间的对应关系如下:A:90-100B:80-89C:60-79D:0-59请编程将任意给定的分数转化为等级。问题分析:问题中出现了四个分支,因此,考虑应用开关语句解决。如果直接用分数作为表达式,将有101个数值与其对应。那么,如何构造表达式,使得值表更简単呢?请同学思考一下。我们采取什么算法,将百分制分数分隔成0-10百分制分数分隔成0-10之间的数字。算法描述:(1)输入分数X;(2)按照x/10 的结果分情况执行:①9,10 ,输出A;②8,输出B;③6,7,输出C;④ 0,1,2,3,4,5则输出D;(3)结束。练习题:1、写出下列程序的运行结果。(1)#include<stdio.h>main()longn;scanf("%d”,&n);if(n>0)printf(l*%d\n",n);elseprintf(**%d\n,,,-n);return0;)运行后输入:①〇②-24③4main()ILongn;scanf("%d",&n);switch(n%5)(case0:printf("%d\n,,,n);n=n+1;break;case1:printf("%d\n",n);n=n+l;break;case2:printf('*%d\n",n);n=n+l;break;case3:printf(*4%d\n",n);n=n+l;break;case4:printf(4i%d\n",n);n=n+1;break;)printf("%d\n",n);return0;)输入;11 11122、#include<stdio.h>2、#include<stdio.h>3、补充完善下列程序。(1)对于ー个三位数来说,如果它个位数字的立方加上十位数字的立方再加上百位数字的立方等于它本身,那么就称它为水仙花数。输入ー个三位数n,判断它是否是水仙花数,如果是,输出‘yes',否则输出<no'.#include<stdio.h>#include<stdlib.h>main()longa,b,c,n;scanf("%d",&n);a=n%10;b=①;(n-a)/10%10n%100/10;n/10%10c=②;n/100if(B)printf("yes\n)M;elseprintf("no\n");return0;)(2)A与return0;)(2)A与B在玩剪子石头布这个游戏。记剪子为〇,石头为!,布为2»己知A、B本轮各自的出法(输入两个整数a,b),请判断本轮中A、B谁获胜:“Awin",,Bwin,或’Thesame,〇#include<stdio.h>main(){longa,b;scanf(w%d%d",&a,&b);case2:printf(winw);break;};break;case1:switch(b)(应豆};break;Case2:switch(b){case0:printf("Bwin");case1:printf("Awin");if(①);空;else③{case0:switch(b){easel:printf(WBwin");break;Return0;}在解决一些复杂问题时,常常需要做很多相似的甚至重复的工作。而这些工作转化为程序,就是若干重复的程序段。同样的程序段反复执行多次,这就是循环的概念。顺序结构、选择结构和循环结构并不是彼此孤立的,在实际编程中经常将这三种结构相互结合以实现各种算法,设计出相应的程序。For循环语句For循环语句的格式与功能格式:for(循环变量初始化:循环条件;循环变量增量){循环体)其中for为保留字,不能自己定义。功能:对使循环条件成立的每一个循环变量的取值,都要执行一次循环体。For循环语句的执行过程可以描述如下:(1)循环变量取初值:(2)判断循环条件是否成立(非〇),如果为真,执行循环体内的语句:如果不成立,直接转到(5);(3)执行循环变量增量语句;(4)转(2)(5)循环结束,执行for循环语句下面的ー个语句。循环流程如图4T例如;下面程序段将输出1到100之间的所有整数。inti;for(i=0;i<=100;++i)printf(a%d\n",i);说明:(1)循环变量(如上例i)必须在循环语句之前被声明过,否则不能通过编译。(2)循环条件一般用来约束循环变量的范围,当循环变量超出范围的时候,这个循环就会结束。如:i<=100就是这样的作用。(3)当不写循环条件,或者在某种情况下循环条件的值永远为真,这时我们称循环进入了一个死循环,最简单的死循环就是for(;;)。死循环是ー个最常见也最容易被忽略的错误,而且非算法的死循环—编译仍然是会通过的,比如for(;;),编译器是不会有任何报错的。(4)循环体中不是单ー语句时,要将多个语句括起来,写成复合语句的形式。4.2.2for循环语句的应用 ▼例:计算!+2+3+ +100,,问题分析:利用加法本身的特性:ー步ー步将加数加到己有的和上,反复累加之后,就可以得到最后的结果。本题特殊在每次累加的数字很有规律:第一次累加的数字是1,第二次累中的数字是2.第三次累加的数字是3……每次的加数递增1,第i次累加的数字是i«

加法重复性很容易让人想到应用循环,而本题加数的特殊性又符合循环变量的特点,因此,应用for循环语句来解决问题:利用for循环产生む100之间的数字(即加数),ー边产生数字,ー边累加数字。算法描述:(1)设定和的初值s为0;(2)用i来控制累加次数,同时表示当前的加数,i的初值为1;-s+i;i<—i+1;循环变量i加数i和S0111(0+1)1+1223(1+2)336(3+3)4410(6+4)5515(10+5)・・・・・・・・・for(i=0;i<=100;++i)s=s+i;(5)如果i>100,则转(6),否则转(3);for(i=0;i<=100;++i)s=s+i;(6)输出s;(7)结束。程序设计:#include<stdio.h>#include<stdlib.h>main()inti,s;s=0;for(i=l;i<=100;++i)s+=i;printf("s=%d\n”,s);system("pause”);return0;这里,变量s表示累加之后的和,称之为累加器。类似地,还有统计次数的变量,我们称之为计数器。累加器和计数器是程序设计中常用到的变量,在进入循环前,它们通常被初始化为〇。以上方法还可以进行以下运算:S=l+l/2+l/3+l/4-+1/100S=l*2*3*4-*100【问题4-1】宰相的麦子相传古印度宰相达依尔是国际象棋的发明者。有一次,国王因为他的贡献要奖励他,问他想要什么。达依尔说:'’只要在国际象棋棋盘上(共64格)摆上这么些麦子就行了:第一格一粒,第二格两粒,……,后面一格的麦子总是前一格麦子数的两倍,摆满整个棋盘,我就感恩不尽了。''这还不容易。于是令人扛来ー袋子麦子,可很快用完了,又扛来ー袋,还是很快用完了……国王对此很奇怪。现在,请你帮国王计算ー下,需要多少麦子(1立方米的麦子约为1.42X108粒)?【分析问题4-1]根据题意,可以建立数学模型:第一格放麦子20粒,第二格放麦子グ粒,第三格放麦子2,粒,,第64格放麦子ザ粒。设64个格中共放麦子麦子2,粒,S=20+2'+22+23+ +263由题知,1立方米的麦子约为1.42X10S粒,那么s粒麦子的体积t就是:t=s/(L42X10>立方米。于是,我们将原始问题转化为ー个一般的数学模型——求一个有规律数列的和。循环变量i加数nSn02°(0+1)=1n=1*2=21221(s+2)=3n=n*2=42422(s+4)=7n=n*2=8

算法描述:算法描述:(1)设麦子总数S的初值为〇,每一格子里的麦子数n初值为!;(2)重复操作64次:@s^—s+n;②n—n*2;(3)tx—s/(1.42Xl00000000);(4)输出s,t;(5)结束。3823(s+8)=15n=n*2=16416 2'(15+16)=31525••••••循环结构程序设计(2)2013-9-19【例4.3]找出n个同学身高的最大值。问题分析:回忆队列操作中选排头过程:我们先假定一个较低的期望值,队列中身高比这个值大的人,就是初定的排头,然后让其他人和他比身高,若有人超过他的身高,就以新人做排头,再让其他人和新人比身高,有高出者,再设定新排头……全班都比过了,排头的人就一定是身高最高者。我们可以借鉴这种思想,求ー批数据中的最大值和最小值。针对本题,要找的是最大值。算法描描述:初始化身高最大值highest为0;重复操作n次:①输入身高x;②如果x>highest成立,则highest1<—x;③输出highest;结束程序:^include<stdio.h>#include<stdlib.h>{intn,i;doublehigest,x;〃初始化身高〃输入学生人数,及多少个学生中找最高的for( ; ; )〃初始化循环变量;循环条件;循环变量增值(〃输入身高if( ) ノ/比身髙)printf(w%.21f\nB,highest);system("pause");return0;)程序中,在初始化最大值变量时,为便于被后面出现

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论